Merge "Resolving auto migration issue where SQLite keywords are failed to be escaped in column names." into androidx-main
diff --git a/.github/workflows/jbpresubmit.yml b/.github/workflows/jbpresubmit.yml
new file mode 100644
index 0000000..a1a9b22
--- /dev/null
+++ b/.github/workflows/jbpresubmit.yml
@@ -0,0 +1,194 @@
+# This workflow is intended to be used by JB-compose team in https://github.com/JetBrains/androidx
+# which is a fork of androidx repo.
+# By having this file in the AndroidX upstream we (JB-compose team) avoid the need to
+# rebase/cherry-pick the workflow file for every CL we want to submit upstream.
+
+# The aim of this workflow is to run checks and some tests before submitting the CL upstream.
+name: JB-COMPOSE-variant of AndroidX Presubmits
+on:
+  push:
+    branches:
+      - jb_cl*
+      - jb_presubmit*
+
+  pull_request:
+    branches:
+      - jb-main
+      - jb_presubmit*
+      - jb_cl*
+    types:
+      - opened
+      - reopened
+      - synchronize
+
+  # Allows to run this workflow manually from the Actions tab
+  workflow_dispatch:
+
+jobs:
+  setup:
+    runs-on: ubuntu-latest
+    outputs:
+      gradlew_flags: ${{ steps.global-constants.outputs.gradlew_flags }}
+      checkout_ref: ${{ steps.checkout-args.outputs.ref }}
+      checkout_repo: ${{ steps.checkout-args.outputs.repository }}
+    steps:
+      - name: "Setup global constants"
+        id: global-constants
+        run: |
+          set -x
+          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"
+          echo "::set-output name=gradlew_flags::$GRADLEW_FLAGS"
+      - name: "Compute actions/checkout arguments"
+        id: checkout-args
+        run: |
+          set -x
+
+          REF=${{ github.event.pull_request.head.ref }}
+          if [ -z "$REF" ]; then
+            REF=${{ github.event.ref }}
+          fi
+          echo "::set-output name=ref::$REF"
+
+          REPOSITORY=${{ github.event.pull_request.head.repo.full_name }}
+          if [ -z "$REPOSITORY" ]; then
+            REPOSITORY=${{ github.repository }}
+          fi
+          echo "::set-output name=repository::$REPOSITORY"
+
+  lint:
+    runs-on: ubuntu-latest
+    needs: [setup]
+    outputs:
+      status: ${{ steps.output-status.outputs.status }}
+      affectedFileArgs: ${{ steps.affected-file-args.outputs.files }}
+      java: ${{ steps.setup-java.outputs.path }}
+    steps:
+      - name: Pull request format
+        if: ${{ false }} #
+        uses: 'androidx/check-pr-format-action@main'
+        with:
+          # Enforces a `Test: <stanza>` in the pull request
+          checks: '["(.*)?Test:(.*)?"]'
+
+      - name: "Setup JDK 11"
+        id: setup-java
+        uses: actions/setup-java@v1
+        with:
+          java-version: "11"
+
+      - name: "Set environment variables"
+        shell: bash
+        run: |
+          set -x
+          echo "ANDROID_SDK_ROOT=$HOME/Library/Android/sdk" >> $GITHUB_ENV
+          echo "DIST_DIR=$HOME/dist" >> $GITHUB_ENV
+
+      - name: "Checkout androidx repo"
+        uses: actions/checkout@v2
+        with:
+          ref: ${{ needs.setup.outputs.checkout_ref }}
+          repository: ${{ needs.setup.outputs.checkout_repo }}
+          fetch-depth: 1
+
+      - name: "Get changed files in push or pull_request"
+        id: changed-files
+        uses: androidx/changed-files-action@main
+        with:
+          github-token: ${{ secrets.GITHUB_TOKEN }}
+
+      - name: "Warn on missing updateApi"
+        env:
+          ENABLE_UPDATEAPI_WARNING: ${{ true }}
+        run: |
+          set -x
+          ./development/apilint.py -f ${{ steps.changed-files.outputs.files }}
+
+      - name: "Parse changed-files as ktlint args"
+        id: ktlint-file-args
+        run: |
+          set -x
+          KTLINT_FILES=`echo "${{ steps.changed-files.outputs.files }}" | sed 's|[^ ]* *|--file=../&|g' | grep -v "*.txt"`
+          echo "::set-output name=ktlint-file-args::$KTLINT_FILES"
+
+      - name: "Parse changed-files as affected files args"
+        id: affected-file-args
+        run: |
+          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=compose-jb # 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
+        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: false
+          dependencies-cache-enabled: false
+          gradle-executable: activity/gradlew
+          wrapper-directory: activity/gradle/wrapper
+          distributions-cache-enabled: false
+
+  tests:
+    runs-on: ubuntu-latest
+    needs: [ setup, lint ]
+    steps:
+      - name: "Setup JDK 11"
+        id: setup-java
+        uses: actions/setup-java@v1
+        with:
+          java-version: "11"
+
+      - name: "checkout dependencies"
+        shell: bash
+        # checkout compose-jb repo containing scripts for running tests.
+        # note: this step also downloads Android sdk because we don't do full `repo sync` but
+        # install/checkout only what's needed for testing scripts.
+        run: |
+          if [ "$GITHUB_EVENT_NAME" == "pull_request" ]; then
+              GITHUB_SHA=$(cat $GITHUB_EVENT_PATH | jq -r .pull_request.head.sha)
+          fi
+          git clone -n https://github.com/JetBrains/compose-jb
+          cd compose-jb
+          git checkout origin/master
+          git submodule update --init --recursive
+
+          pushd compose/frameworks/support
+          git fetch
+          git checkout $GITHUB_SHA
+          git log -1 --oneline
+          popd
+
+          ./compose/scripts/downloadAndroidSdk
+
+      - name: "run tests"
+        shell: bash
+        env:
+          JAVA_HOME: ${{ steps.setup-java.outputs.path }}
+        run: |
+          cd compose-jb
+          unset ANDROID_SDK_HOME
+          export ANDROID_HOME=$PWD/compose/prebuilts/fullsdk-linux
+          ./compose/scripts/testComposeModules
\ No newline at end of file
diff --git a/activity/activity/api/current.ignore b/activity/activity/api/current.ignore
deleted file mode 100644
index 241af99..0000000
--- a/activity/activity/api/current.ignore
+++ /dev/null
@@ -1,39 +0,0 @@
-// Baseline format: 1.0
-ChangedType: androidx.activity.result.contract.ActivityResultContract#getSynchronousResult(android.content.Context, I):
-    Method androidx.activity.result.contract.ActivityResultContract.getSynchronousResult has changed return type from androidx.activity.result.contract.ActivityResultContract.SynchronousResult<O!> to androidx.activity.result.contract.ActivityResultContract.SynchronousResult<O>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.CaptureVideo#getSynchronousResult(android.content.Context, android.net.Uri):
-    Method androidx.activity.result.contract.ActivityResultContracts.CaptureVideo.getSynchronousResult has changed return type from androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean!> to androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.CreateDocument#getSynchronousResult(android.content.Context, String):
-    Method androidx.activity.result.contract.ActivityResultContracts.CreateDocument.getSynchronousResult has changed return type from androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri!> to androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.GetContent#getSynchronousResult(android.content.Context, String):
-    Method androidx.activity.result.contract.ActivityResultContracts.GetContent.getSynchronousResult has changed return type from androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri!> to androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.GetMultipleContents#getSynchronousResult(android.content.Context, String):
-    Method androidx.activity.result.contract.ActivityResultContracts.GetMultipleContents.getSynchronousResult has changed return type from androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri!>!> to androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.GetMultipleContents#parseResult(int, android.content.Intent):
-    Method androidx.activity.result.contract.ActivityResultContracts.GetMultipleContents.parseResult has changed return type from java.util.List<android.net.Uri!> to java.util.List<android.net.Uri>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.OpenDocument#getSynchronousResult(android.content.Context, String[]):
-    Method androidx.activity.result.contract.ActivityResultContracts.OpenDocument.getSynchronousResult has changed return type from androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri!> to androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.OpenDocumentTree#getSynchronousResult(android.content.Context, android.net.Uri):
-    Method androidx.activity.result.contract.ActivityResultContracts.OpenDocumentTree.getSynchronousResult has changed return type from androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri!> to androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.OpenMultipleDocuments#getSynchronousResult(android.content.Context, String[]):
-    Method androidx.activity.result.contract.ActivityResultContracts.OpenMultipleDocuments.getSynchronousResult has changed return type from androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri!>!> to androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.OpenMultipleDocuments#parseResult(int, android.content.Intent):
-    Method androidx.activity.result.contract.ActivityResultContracts.OpenMultipleDocuments.parseResult has changed return type from java.util.List<android.net.Uri!> to java.util.List<android.net.Uri>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions#getSynchronousResult(android.content.Context, String[]):
-    Method androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions.getSynchronousResult has changed return type from androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.Map<java.lang.String!,java.lang.Boolean!>!> to androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.Map<java.lang.String,java.lang.Boolean>>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions#parseResult(int, android.content.Intent):
-    Method androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions.parseResult has changed return type from java.util.Map<java.lang.String!,java.lang.Boolean!> to java.util.Map<java.lang.String,java.lang.Boolean>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.RequestPermission#getSynchronousResult(android.content.Context, String):
-    Method androidx.activity.result.contract.ActivityResultContracts.RequestPermission.getSynchronousResult has changed return type from androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean!> to androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.TakePicture#getSynchronousResult(android.content.Context, android.net.Uri):
-    Method androidx.activity.result.contract.ActivityResultContracts.TakePicture.getSynchronousResult has changed return type from androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean!> to androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.TakePicturePreview#getSynchronousResult(android.content.Context, Void):
-    Method androidx.activity.result.contract.ActivityResultContracts.TakePicturePreview.getSynchronousResult has changed return type from androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap!> to androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.TakeVideo#getSynchronousResult(android.content.Context, android.net.Uri):
-    Method androidx.activity.result.contract.ActivityResultContracts.TakeVideo.getSynchronousResult has changed return type from androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap!> to androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap>
-
-
-InvalidNullConversion: androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions#getSynchronousResult(android.content.Context, String[]) parameter #1:
-    Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter input in androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions.getSynchronousResult(android.content.Context context, String[] input)
-InvalidNullConversion: androidx.activity.result.contract.ActivityResultContracts.RequestPermission#getSynchronousResult(android.content.Context, String) parameter #1:
-    Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter input in androidx.activity.result.contract.ActivityResultContracts.RequestPermission.getSynchronousResult(android.content.Context context, String input)
diff --git a/activity/activity/api/restricted_current.ignore b/activity/activity/api/restricted_current.ignore
deleted file mode 100644
index 241af99..0000000
--- a/activity/activity/api/restricted_current.ignore
+++ /dev/null
@@ -1,39 +0,0 @@
-// Baseline format: 1.0
-ChangedType: androidx.activity.result.contract.ActivityResultContract#getSynchronousResult(android.content.Context, I):
-    Method androidx.activity.result.contract.ActivityResultContract.getSynchronousResult has changed return type from androidx.activity.result.contract.ActivityResultContract.SynchronousResult<O!> to androidx.activity.result.contract.ActivityResultContract.SynchronousResult<O>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.CaptureVideo#getSynchronousResult(android.content.Context, android.net.Uri):
-    Method androidx.activity.result.contract.ActivityResultContracts.CaptureVideo.getSynchronousResult has changed return type from androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean!> to androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.CreateDocument#getSynchronousResult(android.content.Context, String):
-    Method androidx.activity.result.contract.ActivityResultContracts.CreateDocument.getSynchronousResult has changed return type from androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri!> to androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.GetContent#getSynchronousResult(android.content.Context, String):
-    Method androidx.activity.result.contract.ActivityResultContracts.GetContent.getSynchronousResult has changed return type from androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri!> to androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.GetMultipleContents#getSynchronousResult(android.content.Context, String):
-    Method androidx.activity.result.contract.ActivityResultContracts.GetMultipleContents.getSynchronousResult has changed return type from androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri!>!> to androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.GetMultipleContents#parseResult(int, android.content.Intent):
-    Method androidx.activity.result.contract.ActivityResultContracts.GetMultipleContents.parseResult has changed return type from java.util.List<android.net.Uri!> to java.util.List<android.net.Uri>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.OpenDocument#getSynchronousResult(android.content.Context, String[]):
-    Method androidx.activity.result.contract.ActivityResultContracts.OpenDocument.getSynchronousResult has changed return type from androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri!> to androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.OpenDocumentTree#getSynchronousResult(android.content.Context, android.net.Uri):
-    Method androidx.activity.result.contract.ActivityResultContracts.OpenDocumentTree.getSynchronousResult has changed return type from androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri!> to androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.OpenMultipleDocuments#getSynchronousResult(android.content.Context, String[]):
-    Method androidx.activity.result.contract.ActivityResultContracts.OpenMultipleDocuments.getSynchronousResult has changed return type from androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri!>!> to androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.OpenMultipleDocuments#parseResult(int, android.content.Intent):
-    Method androidx.activity.result.contract.ActivityResultContracts.OpenMultipleDocuments.parseResult has changed return type from java.util.List<android.net.Uri!> to java.util.List<android.net.Uri>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions#getSynchronousResult(android.content.Context, String[]):
-    Method androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions.getSynchronousResult has changed return type from androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.Map<java.lang.String!,java.lang.Boolean!>!> to androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.Map<java.lang.String,java.lang.Boolean>>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions#parseResult(int, android.content.Intent):
-    Method androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions.parseResult has changed return type from java.util.Map<java.lang.String!,java.lang.Boolean!> to java.util.Map<java.lang.String,java.lang.Boolean>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.RequestPermission#getSynchronousResult(android.content.Context, String):
-    Method androidx.activity.result.contract.ActivityResultContracts.RequestPermission.getSynchronousResult has changed return type from androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean!> to androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.TakePicture#getSynchronousResult(android.content.Context, android.net.Uri):
-    Method androidx.activity.result.contract.ActivityResultContracts.TakePicture.getSynchronousResult has changed return type from androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean!> to androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.TakePicturePreview#getSynchronousResult(android.content.Context, Void):
-    Method androidx.activity.result.contract.ActivityResultContracts.TakePicturePreview.getSynchronousResult has changed return type from androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap!> to androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap>
-ChangedType: androidx.activity.result.contract.ActivityResultContracts.TakeVideo#getSynchronousResult(android.content.Context, android.net.Uri):
-    Method androidx.activity.result.contract.ActivityResultContracts.TakeVideo.getSynchronousResult has changed return type from androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap!> to androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap>
-
-
-InvalidNullConversion: androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions#getSynchronousResult(android.content.Context, String[]) parameter #1:
-    Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter input in androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions.getSynchronousResult(android.content.Context context, String[] input)
-InvalidNullConversion: androidx.activity.result.contract.ActivityResultContracts.RequestPermission#getSynchronousResult(android.content.Context, String) parameter #1:
-    Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter input in androidx.activity.result.contract.ActivityResultContracts.RequestPermission.getSynchronousResult(android.content.Context context, String input)
diff --git a/annotation/annotation/api/current.txt b/annotation/annotation/api/current.txt
index 263ed26..1aa6464 100644
--- a/annotation/annotation/api/current.txt
+++ b/annotation/annotation/api/current.txt
@@ -211,8 +211,9 @@
     method public abstract androidx.annotation.RequiresPermission value() default @androidx.annotation.RequiresPermission;
   }
 
-  @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PACKAGE}) public @interface RestrictTo {
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PACKAGE}) @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface RestrictTo {
     method public abstract androidx.annotation.RestrictTo.Scope[] value();
+    property public abstract androidx.annotation.RestrictTo.Scope![] value;
   }
 
   public enum RestrictTo.Scope {
diff --git a/annotation/annotation/api/public_plus_experimental_current.txt b/annotation/annotation/api/public_plus_experimental_current.txt
index 263ed26..1aa6464 100644
--- a/annotation/annotation/api/public_plus_experimental_current.txt
+++ b/annotation/annotation/api/public_plus_experimental_current.txt
@@ -211,8 +211,9 @@
     method public abstract androidx.annotation.RequiresPermission value() default @androidx.annotation.RequiresPermission;
   }
 
-  @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PACKAGE}) public @interface RestrictTo {
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PACKAGE}) @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface RestrictTo {
     method public abstract androidx.annotation.RestrictTo.Scope[] value();
+    property public abstract androidx.annotation.RestrictTo.Scope![] value;
   }
 
   public enum RestrictTo.Scope {
diff --git a/annotation/annotation/api/restricted_current.txt b/annotation/annotation/api/restricted_current.txt
index 263ed26..1aa6464 100644
--- a/annotation/annotation/api/restricted_current.txt
+++ b/annotation/annotation/api/restricted_current.txt
@@ -211,8 +211,9 @@
     method public abstract androidx.annotation.RequiresPermission value() default @androidx.annotation.RequiresPermission;
   }
 
-  @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PACKAGE}) public @interface RestrictTo {
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PACKAGE}) @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface RestrictTo {
     method public abstract androidx.annotation.RestrictTo.Scope[] value();
+    property public abstract androidx.annotation.RestrictTo.Scope![] value;
   }
 
   public enum RestrictTo.Scope {
diff --git a/annotation/annotation/build.gradle b/annotation/annotation/build.gradle
index 5bd52ea..5da0467 100644
--- a/annotation/annotation/build.gradle
+++ b/annotation/annotation/build.gradle
@@ -5,6 +5,11 @@
 plugins {
     id("AndroidXPlugin")
     id("java-library")
+    id("kotlin")
+}
+
+dependencies {
+    api(libs.kotlinStdlib)
 }
 
 jar {
diff --git a/annotation/annotation/src/main/java/androidx/annotation/RestrictTo.java b/annotation/annotation/src/main/java/androidx/annotation/RestrictTo.java
deleted file mode 100644
index 9404b41..0000000
--- a/annotation/annotation/src/main/java/androidx/annotation/RestrictTo.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (C) 2016 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.annotation;
-
-import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
-import static java.lang.annotation.ElementType.CONSTRUCTOR;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PACKAGE;
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.RetentionPolicy.CLASS;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * Denotes that the annotated element should only be accessed from within a
- * specific scope (as defined by {@link Scope}).
- * <p>
- * Example of restricting usage within a library (based on gradle group ID):
- * <pre><code>
- *   &#64;RestrictTo(GROUP_ID)
- *   public void resetPaddingToInitialValues() { ...
- * </code></pre>
- * Example of restricting usage to tests:
- * <pre><code>
- *   &#64;RestrictScope(TESTS)
- *   public abstract int getUserId();
- * </code></pre>
- * Example of restricting usage to subclasses:
- * <pre><code>
- *   &#64;RestrictScope(SUBCLASSES)
- *   public void onDrawForeground(Canvas canvas) { ...
- * </code></pre>
- */
-@Documented
-@Retention(CLASS)
-@Target({ANNOTATION_TYPE, TYPE, METHOD, CONSTRUCTOR, FIELD, PACKAGE})
-public @interface RestrictTo {
-
-    /**
-     * The scope to which usage should be restricted.
-     */
-    Scope[] value();
-
-    enum Scope {
-        /**
-         * Restrict usage to code within the same library (e.g. the same
-         * gradle group ID and artifact ID).
-         */
-        LIBRARY,
-
-        /**
-         * Restrict usage to code within the same group of libraries.
-         * This corresponds to the gradle group ID.
-         */
-        LIBRARY_GROUP,
-
-        /**
-         * Restrict usage to code within packages whose groups share
-         * the same library group prefix up to the last ".", so for
-         * example libraries foo.bar:lib1 and foo.baz:lib2 share
-         * the prefix "foo." and so they can use each other's
-         * apis that are restricted to this scope. Similarly for
-         * com.foo.bar:lib1 and com.foo.baz:lib2 where they share
-         * "com.foo.". Library com.bar.qux:lib3 however will not
-         * be able to use the restricted api because it only
-         * shares the prefix "com." and not all the way until the
-         * last ".".
-         */
-        LIBRARY_GROUP_PREFIX,
-
-        /**
-         * Restrict usage to code within the same group ID (based on gradle
-         * group ID). This is an alias for {@link #LIBRARY_GROUP_PREFIX}.
-         *
-         * @deprecated Use {@link #LIBRARY_GROUP_PREFIX} instead
-         */
-        @Deprecated
-        GROUP_ID,
-
-        /**
-         * Restrict usage to tests.
-         */
-        TESTS,
-
-        /**
-         * Restrict usage to subclasses of the enclosing class.
-         * <p>
-         * <strong>Note:</strong> This scope should not be used to annotate
-         * packages.
-         */
-        SUBCLASSES,
-    }
-}
diff --git a/annotation/annotation/src/main/java/androidx/annotation/RestrictTo.kt b/annotation/annotation/src/main/java/androidx/annotation/RestrictTo.kt
new file mode 100644
index 0000000..be84d7a
--- /dev/null
+++ b/annotation/annotation/src/main/java/androidx/annotation/RestrictTo.kt
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2016 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.annotation
+
+import androidx.annotation.RestrictTo.Scope
+import java.lang.annotation.ElementType.ANNOTATION_TYPE
+import java.lang.annotation.ElementType.CONSTRUCTOR
+import java.lang.annotation.ElementType.FIELD
+import java.lang.annotation.ElementType.METHOD
+import java.lang.annotation.ElementType.PACKAGE
+import java.lang.annotation.ElementType.TYPE
+
+/**
+ * Denotes that the annotated element should only be accessed from within a
+ * specific scope (as defined by [Scope]).
+ *
+ *
+ * Example of restricting usage within a library (based on gradle group ID):
+ * ```
+ * @RestrictTo(GROUP_ID)
+ * public void resetPaddingToInitialValues() { ...
+ * ```
+ * Example of restricting usage to tests:
+ * ```
+ * @RestrictTo(Scope.TESTS)
+ * public abstract int getUserId();
+ * ```
+ * Example of restricting usage to subclasses:
+ * ```
+ * @RestrictTo(Scope.SUBCLASSES)
+ * public void onDrawForeground(Canvas canvas) { ...
+ * ```
+ */
+@MustBeDocumented
+@kotlin.annotation.Retention(AnnotationRetention.BINARY)
+@Target(
+    AnnotationTarget.ANNOTATION_CLASS,
+    AnnotationTarget.CLASS,
+    AnnotationTarget.FUNCTION,
+    AnnotationTarget.PROPERTY_GETTER,
+    AnnotationTarget.PROPERTY_SETTER,
+    AnnotationTarget.CONSTRUCTOR,
+    AnnotationTarget.FIELD,
+    AnnotationTarget.FILE
+)
+// Needed due to Kotlin's lack of PACKAGE annotation target
+// https://youtrack.jetbrains.com/issue/KT-45921
+@Suppress("DEPRECATED_JAVA_ANNOTATION")
+@java.lang.annotation.Target(
+    ANNOTATION_TYPE, TYPE, METHOD, CONSTRUCTOR, FIELD, PACKAGE
+)
+public annotation class RestrictTo(
+    /**
+     * The scope to which usage should be restricted.
+     */
+    vararg val value: Scope
+) {
+    public enum class Scope {
+        /**
+         * Restrict usage to code within the same library (e.g. the same
+         * gradle group ID and artifact ID).
+         */
+        LIBRARY,
+
+        /**
+         * Restrict usage to code within the same group of libraries.
+         * This corresponds to the gradle group ID.
+         */
+        LIBRARY_GROUP,
+
+        /**
+         * Restrict usage to code within packages whose groups share
+         * the same library group prefix up to the last ".", so for
+         * example libraries foo.bar:lib1 and foo.baz:lib2 share
+         * the prefix "foo." and so they can use each other's
+         * apis that are restricted to this scope. Similarly for
+         * com.foo.bar:lib1 and com.foo.baz:lib2 where they share
+         * "com.foo.". Library com.bar.qux:lib3 however will not
+         * be able to use the restricted api because it only
+         * shares the prefix "com." and not all the way until the
+         * last ".".
+         */
+        LIBRARY_GROUP_PREFIX,
+
+        /**
+         * Restrict usage to code within the same group ID (based on gradle
+         * group ID). This is an alias for [LIBRARY_GROUP_PREFIX].
+         *
+         * @deprecated Use [LIBRARY_GROUP_PREFIX] instead
+         */
+        @Deprecated("Use LIBRARY_GROUP_PREFIX instead.")
+        GROUP_ID,
+
+        /**
+         * Restrict usage to tests.
+         */
+        TESTS,
+
+        /**
+         * Restrict usage to subclasses of the enclosing class.
+         *
+         * **Note:** This scope should not be used to annotate
+         * packages.
+         */
+        SUBCLASSES,
+    }
+}
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatEditTextReceiveContentTest.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatEditTextReceiveContentTest.java
index 01565c0e..63f6541a 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatEditTextReceiveContentTest.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatEditTextReceiveContentTest.java
@@ -378,11 +378,15 @@
         // Setup: Configure the receiver to a custom impl.
         ViewCompat.setOnReceiveContentListener(mEditText, MIME_TYPES_IMAGES, mMockReceiver);
 
-        // Trigger the IME's commitContent() call and assert that the custom receiver was not
-        // executed. This is because InputConnectionCompat.commitContent() checks the supported MIME
-        // types before proceeding.
+        // Trigger the IME's commitContent() call via the support lib and assert that the custom
+        // receiver was executed. This confirms that the receiver is invoked (give a chance to
+        // handle the content via some fallback) even if the MIME type of the content is not one
+        // of the receiver's declared MIME types.
         triggerImeCommitContentViaCompat("video/mp4");
-        verifyZeroInteractions(mMockReceiver);
+        ClipData clip = ClipData.newRawUri("", SAMPLE_CONTENT_URI);
+        verify(mMockReceiver, times(1)).onReceiveContent(
+                eq(mEditText), payloadEq(clip, SOURCE_INPUT_METHOD, 0));
+        verifyNoMoreInteractions(mMockReceiver);
     }
 
     @SdkSuppress(minSdkVersion = 25) // InputConnection.commitContent() was added in SDK 25.
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AlwaysSupportedCapabilities.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AlwaysSupportedCapabilities.java
new file mode 100644
index 0000000..34c4084
--- /dev/null
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AlwaysSupportedCapabilities.java
@@ -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.appsearch.localstorage;
+
+import androidx.annotation.RestrictTo;
+import androidx.appsearch.app.Capabilities;
+
+/**
+ * An implementation of {@link Capabilities}. This implementation always returns true. This is
+ * sufficient for the use in the local backend because all features are always available on the
+ * local backend.
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public class AlwaysSupportedCapabilities implements Capabilities {
+
+    @Override
+    public boolean isSubmatchSupported() {
+        return true;
+    }
+}
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/GlobalSearchSessionImpl.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/GlobalSearchSessionImpl.java
index 23c07925..3406886 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/GlobalSearchSessionImpl.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/GlobalSearchSessionImpl.java
@@ -21,6 +21,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.appsearch.app.AppSearchResult;
+import androidx.appsearch.app.Capabilities;
 import androidx.appsearch.app.GlobalSearchSession;
 import androidx.appsearch.app.ReportSystemUsageRequest;
 import androidx.appsearch.app.SearchResults;
@@ -43,6 +44,7 @@
 class GlobalSearchSessionImpl implements GlobalSearchSession {
     private final AppSearchImpl mAppSearchImpl;
     private final Executor mExecutor;
+    private final Capabilities mCapabilities;
     private final Context mContext;
 
     private boolean mIsClosed = false;
@@ -53,10 +55,12 @@
     GlobalSearchSessionImpl(
             @NonNull AppSearchImpl appSearchImpl,
             @NonNull Executor executor,
+            @NonNull Capabilities capabilities,
             @NonNull Context context,
             @Nullable AppSearchLogger logger) {
         mAppSearchImpl = Preconditions.checkNotNull(appSearchImpl);
         mExecutor = Preconditions.checkNotNull(executor);
+        mCapabilities = Preconditions.checkNotNull(capabilities);
         mContext = Preconditions.checkNotNull(context);
         mLogger = logger;
     }
@@ -96,6 +100,12 @@
         });
     }
 
+    @NonNull
+    @Override
+    public Capabilities getCapabilities() {
+        return mCapabilities;
+    }
+
     @Override
     public void close() {
         mIsClosed = true;
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/LocalStorage.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/LocalStorage.java
index b09aba0..1bdb76b 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/LocalStorage.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/LocalStorage.java
@@ -381,6 +381,7 @@
         return new SearchSessionImpl(
                 mAppSearchImpl,
                 context.mExecutor,
+                new AlwaysSupportedCapabilities(),
                 context.mContext.getPackageName(),
                 context.mDatabaseName,
                 context.mLogger);
@@ -389,7 +390,7 @@
     @NonNull
     private GlobalSearchSession doCreateGlobalSearchSession(
             @NonNull GlobalSearchContext context) {
-        return new GlobalSearchSessionImpl(mAppSearchImpl, context.mExecutor, context.mContext,
-                context.mLogger);
+        return new GlobalSearchSessionImpl(mAppSearchImpl, context.mExecutor,
+                new AlwaysSupportedCapabilities(), context.mContext, context.mLogger);
     }
 }
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/SearchSessionImpl.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/SearchSessionImpl.java
index f2b98e5..ebdfe96 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/SearchSessionImpl.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/SearchSessionImpl.java
@@ -25,6 +25,7 @@
 import androidx.annotation.Nullable;
 import androidx.appsearch.app.AppSearchBatchResult;
 import androidx.appsearch.app.AppSearchSession;
+import androidx.appsearch.app.Capabilities;
 import androidx.appsearch.app.GenericDocument;
 import androidx.appsearch.app.GetByDocumentIdRequest;
 import androidx.appsearch.app.GetSchemaResponse;
@@ -70,6 +71,7 @@
     private static final String TAG = "AppSearchSessionImpl";
     private final AppSearchImpl mAppSearchImpl;
     private final Executor mExecutor;
+    private final Capabilities mCapabilities;
     private final String mPackageName;
     private final String mDatabaseName;
     private volatile boolean mIsMutated = false;
@@ -79,11 +81,13 @@
     SearchSessionImpl(
             @NonNull AppSearchImpl appSearchImpl,
             @NonNull Executor executor,
+            @NonNull Capabilities capabilities,
             @NonNull String packageName,
             @NonNull String databaseName,
             @Nullable AppSearchLogger logger) {
         mAppSearchImpl = Preconditions.checkNotNull(appSearchImpl);
         mExecutor = Preconditions.checkNotNull(executor);
+        mCapabilities = Preconditions.checkNotNull(capabilities);
         mPackageName = packageName;
         mDatabaseName = Preconditions.checkNotNull(databaseName);
         mLogger = logger;
@@ -433,6 +437,12 @@
         });
     }
 
+    @NonNull
+    @Override
+    public Capabilities getCapabilities() {
+        return mCapabilities;
+    }
+
     @Override
     @SuppressWarnings("FutureReturnValueIgnored")
     public void close() {
diff --git a/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/CapabilitiesImpl.java b/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/CapabilitiesImpl.java
new file mode 100644
index 0000000..4d21fbad
--- /dev/null
+++ b/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/CapabilitiesImpl.java
@@ -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.appsearch.platformstorage;
+
+import androidx.appsearch.app.Capabilities;
+
+/**
+ * An implementation of {@link Capabilities}. Feature availability is dependent on Android API
+ * level.
+ */
+final class CapabilitiesImpl implements Capabilities {
+
+    @Override
+    public boolean isSubmatchSupported() {
+        // TODO(b/201316758) : Update to reflect support in Android T+ once this feature is synced
+        // over into service-appsearch.
+        return false;
+    }
+}
diff --git a/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/GlobalSearchSessionImpl.java b/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/GlobalSearchSessionImpl.java
index b5b7cc0..102cf91 100644
--- a/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/GlobalSearchSessionImpl.java
+++ b/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/GlobalSearchSessionImpl.java
@@ -20,6 +20,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
+import androidx.appsearch.app.Capabilities;
 import androidx.appsearch.app.GlobalSearchSession;
 import androidx.appsearch.app.ReportSystemUsageRequest;
 import androidx.appsearch.app.SearchResults;
@@ -44,12 +45,15 @@
 class GlobalSearchSessionImpl implements GlobalSearchSession {
     private final android.app.appsearch.GlobalSearchSession mPlatformSession;
     private final Executor mExecutor;
+    private final Capabilities mCapabilities;
 
     GlobalSearchSessionImpl(
             @NonNull android.app.appsearch.GlobalSearchSession platformSession,
-            @NonNull Executor executor) {
+            @NonNull Executor executor,
+            @NonNull Capabilities capabilities) {
         mPlatformSession = Preconditions.checkNotNull(platformSession);
         mExecutor = Preconditions.checkNotNull(executor);
+        mCapabilities = Preconditions.checkNotNull(capabilities);
     }
 
     @Override
@@ -79,6 +83,12 @@
         return future;
     }
 
+    @NonNull
+    @Override
+    public Capabilities getCapabilities() {
+        return mCapabilities;
+    }
+
     @Override
     public void close() {
         mPlatformSession.close();
diff --git a/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/PlatformStorage.java b/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/PlatformStorage.java
index b07782b..9cd4b06 100644
--- a/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/PlatformStorage.java
+++ b/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/PlatformStorage.java
@@ -221,7 +221,8 @@
                 result -> {
                     if (result.isSuccess()) {
                         future.set(
-                                new SearchSessionImpl(result.getResultValue(), context.mExecutor));
+                                new SearchSessionImpl(result.getResultValue(), context.mExecutor,
+                                new CapabilitiesImpl()));
                     } else {
                         future.setException(
                                 new AppSearchException(
@@ -246,7 +247,8 @@
                 result -> {
                     if (result.isSuccess()) {
                         future.set(new GlobalSearchSessionImpl(
-                                result.getResultValue(), context.mExecutor));
+                                result.getResultValue(), context.mExecutor,
+                                new CapabilitiesImpl()));
                     } else {
                         future.setException(
                                 new AppSearchException(
diff --git a/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/SearchSessionImpl.java b/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/SearchSessionImpl.java
index 14484c0..25b137c 100644
--- a/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/SearchSessionImpl.java
+++ b/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/SearchSessionImpl.java
@@ -22,6 +22,7 @@
 import androidx.annotation.RestrictTo;
 import androidx.appsearch.app.AppSearchBatchResult;
 import androidx.appsearch.app.AppSearchSession;
+import androidx.appsearch.app.Capabilities;
 import androidx.appsearch.app.GenericDocument;
 import androidx.appsearch.app.GetByDocumentIdRequest;
 import androidx.appsearch.app.GetSchemaResponse;
@@ -47,6 +48,7 @@
 
 import com.google.common.util.concurrent.ListenableFuture;
 
+import java.util.List;
 import java.util.Set;
 import java.util.concurrent.Executor;
 
@@ -60,12 +62,15 @@
 class SearchSessionImpl implements AppSearchSession {
     private final android.app.appsearch.AppSearchSession mPlatformSession;
     private final Executor mExecutor;
+    private final Capabilities mCapabilities;
 
     SearchSessionImpl(
             @NonNull android.app.appsearch.AppSearchSession platformSession,
-            @NonNull Executor executor) {
+            @NonNull Executor executor,
+            @NonNull Capabilities capabilities) {
         mPlatformSession = Preconditions.checkNotNull(platformSession);
         mExecutor = Preconditions.checkNotNull(executor);
+        mCapabilities = Preconditions.checkNotNull(capabilities);
     }
 
     @Override
@@ -207,12 +212,50 @@
         Preconditions.checkNotNull(queryExpression);
         Preconditions.checkNotNull(searchSpec);
         ResolvableFuture<Void> future = ResolvableFuture.create();
-        mPlatformSession.remove(
-                queryExpression,
-                SearchSpecToPlatformConverter.toPlatformSearchSpec(searchSpec),
-                mExecutor,
-                result -> AppSearchResultToPlatformConverter.platformAppSearchResultToFuture(
-                        result, future));
+
+        if (Build.VERSION.SDK_INT == Build.VERSION_CODES.S
+                && !searchSpec.getFilterNamespaces().isEmpty()) {
+            // This is a patch for b/197361770, framework-appsearch in Android S will
+            // disable the given namespace filter if it is not empty and none of given namespaces
+            // exist.
+            // And that will result in Icing remove documents under all namespaces if it matches
+            // query express and schema filter.
+            mPlatformSession.getNamespaces(
+                    mExecutor,
+                    namespaceResult -> {
+                        if (namespaceResult.isSuccess()) {
+                            Set<String> existingNamespaces = namespaceResult.getResultValue();
+                            List<String> filterNamespaces = searchSpec.getFilterNamespaces();
+                            for (int i = 0; i < filterNamespaces.size(); i++) {
+                                if (existingNamespaces.contains(filterNamespaces.get(i))) {
+                                    // There is a given namespace exist in AppSearch, we are fine.
+                                    mPlatformSession.remove(
+                                            queryExpression,
+                                            SearchSpecToPlatformConverter
+                                                    .toPlatformSearchSpec(searchSpec),
+                                            mExecutor,
+                                            removeResult -> AppSearchResultToPlatformConverter
+                                                    .platformAppSearchResultToFuture(removeResult,
+                                                            future));
+                                    return;
+                                }
+                            }
+                            // None of the namespace in the given namespace filter exists. Return
+                            // early.
+                            future.set(null);
+                        } else {
+                            handleFailedPlatformResult(namespaceResult, future);
+                        }
+                    });
+        } else {
+            // Handle normally for Android T and above.
+            mPlatformSession.remove(
+                    queryExpression,
+                    SearchSpecToPlatformConverter.toPlatformSearchSpec(searchSpec),
+                    mExecutor,
+                    removeResult -> AppSearchResultToPlatformConverter
+                            .platformAppSearchResultToFuture(removeResult, future));
+        }
         return future;
     }
 
@@ -245,6 +288,12 @@
         return future;
     }
 
+    @NonNull
+    @Override
+    public Capabilities getCapabilities() {
+        return mCapabilities;
+    }
+
     @Override
     public void close() {
         mPlatformSession.close();
diff --git a/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/converter/SearchResultToPlatformConverter.java b/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/converter/SearchResultToPlatformConverter.java
index fc7b70e..841cbe7 100644
--- a/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/converter/SearchResultToPlatformConverter.java
+++ b/appsearch/appsearch-platform-storage/src/main/java/androidx/appsearch/platformstorage/converter/SearchResultToPlatformConverter.java
@@ -43,8 +43,8 @@
         Preconditions.checkNotNull(platformResult);
         GenericDocument document = GenericDocumentToPlatformConverter.toJetpackGenericDocument(
                 platformResult.getGenericDocument());
-        SearchResult.Builder builder = new SearchResult.Builder(
-                platformResult.getPackageName(), platformResult.getDatabaseName())
+        SearchResult.Builder builder = new SearchResult.Builder(platformResult.getPackageName(),
+                platformResult.getDatabaseName())
                 .setGenericDocument(document)
                 .setRankingSignal(platformResult.getRankingSignal());
         List<android.app.appsearch.SearchResult.MatchInfo> platformMatches =
@@ -60,6 +60,8 @@
     private static SearchResult.MatchInfo toJetpackMatchInfo(
             @NonNull android.app.appsearch.SearchResult.MatchInfo platformMatchInfo) {
         Preconditions.checkNotNull(platformMatchInfo);
+        // TODO(b/201316758) : Copy over submatch range info once it is added to
+        //  framework-appsearch.
         return new SearchResult.MatchInfo.Builder(platformMatchInfo.getPropertyPath())
                 .setExactMatchRange(
                         new SearchResult.MatchRange(
diff --git a/appsearch/appsearch/api/current.txt b/appsearch/appsearch/api/current.txt
index d3583ab..c375403 100644
--- a/appsearch/appsearch/api/current.txt
+++ b/appsearch/appsearch/api/current.txt
@@ -178,6 +178,7 @@
   public interface AppSearchSession extends java.io.Closeable {
     method public void close();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.AppSearchBatchResult<java.lang.String!,androidx.appsearch.app.GenericDocument!>!> getByDocumentId(androidx.appsearch.app.GetByDocumentIdRequest);
+    method public androidx.appsearch.app.Capabilities getCapabilities();
     method public com.google.common.util.concurrent.ListenableFuture<java.util.Set<java.lang.String!>!> getNamespaces();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.GetSchemaResponse!> getSchema();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.StorageInfo!> getStorageInfo();
@@ -190,6 +191,10 @@
     method public com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.SetSchemaResponse!> setSchema(androidx.appsearch.app.SetSchemaRequest);
   }
 
+  public interface Capabilities {
+    method public boolean isSubmatchSupported();
+  }
+
   public interface DocumentClassFactory<T> {
     method public T fromGenericDocument(androidx.appsearch.app.GenericDocument) throws androidx.appsearch.exceptions.AppSearchException;
     method public androidx.appsearch.app.AppSearchSchema getSchema() throws androidx.appsearch.exceptions.AppSearchException;
@@ -272,6 +277,7 @@
 
   public interface GlobalSearchSession extends java.io.Closeable {
     method public void close();
+    method public androidx.appsearch.app.Capabilities getCapabilities();
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> reportSystemUsage(androidx.appsearch.app.ReportSystemUsageRequest);
     method public androidx.appsearch.app.SearchResults search(String, androidx.appsearch.app.SearchSpec);
   }
diff --git a/appsearch/appsearch/api/public_plus_experimental_current.txt b/appsearch/appsearch/api/public_plus_experimental_current.txt
index d3583ab..c375403 100644
--- a/appsearch/appsearch/api/public_plus_experimental_current.txt
+++ b/appsearch/appsearch/api/public_plus_experimental_current.txt
@@ -178,6 +178,7 @@
   public interface AppSearchSession extends java.io.Closeable {
     method public void close();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.AppSearchBatchResult<java.lang.String!,androidx.appsearch.app.GenericDocument!>!> getByDocumentId(androidx.appsearch.app.GetByDocumentIdRequest);
+    method public androidx.appsearch.app.Capabilities getCapabilities();
     method public com.google.common.util.concurrent.ListenableFuture<java.util.Set<java.lang.String!>!> getNamespaces();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.GetSchemaResponse!> getSchema();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.StorageInfo!> getStorageInfo();
@@ -190,6 +191,10 @@
     method public com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.SetSchemaResponse!> setSchema(androidx.appsearch.app.SetSchemaRequest);
   }
 
+  public interface Capabilities {
+    method public boolean isSubmatchSupported();
+  }
+
   public interface DocumentClassFactory<T> {
     method public T fromGenericDocument(androidx.appsearch.app.GenericDocument) throws androidx.appsearch.exceptions.AppSearchException;
     method public androidx.appsearch.app.AppSearchSchema getSchema() throws androidx.appsearch.exceptions.AppSearchException;
@@ -272,6 +277,7 @@
 
   public interface GlobalSearchSession extends java.io.Closeable {
     method public void close();
+    method public androidx.appsearch.app.Capabilities getCapabilities();
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> reportSystemUsage(androidx.appsearch.app.ReportSystemUsageRequest);
     method public androidx.appsearch.app.SearchResults search(String, androidx.appsearch.app.SearchSpec);
   }
diff --git a/appsearch/appsearch/api/restricted_current.txt b/appsearch/appsearch/api/restricted_current.txt
index d3583ab..c375403 100644
--- a/appsearch/appsearch/api/restricted_current.txt
+++ b/appsearch/appsearch/api/restricted_current.txt
@@ -178,6 +178,7 @@
   public interface AppSearchSession extends java.io.Closeable {
     method public void close();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.AppSearchBatchResult<java.lang.String!,androidx.appsearch.app.GenericDocument!>!> getByDocumentId(androidx.appsearch.app.GetByDocumentIdRequest);
+    method public androidx.appsearch.app.Capabilities getCapabilities();
     method public com.google.common.util.concurrent.ListenableFuture<java.util.Set<java.lang.String!>!> getNamespaces();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.GetSchemaResponse!> getSchema();
     method public com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.StorageInfo!> getStorageInfo();
@@ -190,6 +191,10 @@
     method public com.google.common.util.concurrent.ListenableFuture<androidx.appsearch.app.SetSchemaResponse!> setSchema(androidx.appsearch.app.SetSchemaRequest);
   }
 
+  public interface Capabilities {
+    method public boolean isSubmatchSupported();
+  }
+
   public interface DocumentClassFactory<T> {
     method public T fromGenericDocument(androidx.appsearch.app.GenericDocument) throws androidx.appsearch.exceptions.AppSearchException;
     method public androidx.appsearch.app.AppSearchSchema getSchema() throws androidx.appsearch.exceptions.AppSearchException;
@@ -272,6 +277,7 @@
 
   public interface GlobalSearchSession extends java.io.Closeable {
     method public void close();
+    method public androidx.appsearch.app.Capabilities getCapabilities();
     method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> reportSystemUsage(androidx.appsearch.app.ReportSystemUsageRequest);
     method public androidx.appsearch.app.SearchResults search(String, androidx.appsearch.app.SearchSpec);
   }
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionCtsTestBase.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionCtsTestBase.java
index 424b25a..765b4f3 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionCtsTestBase.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionCtsTestBase.java
@@ -16,8 +16,6 @@
 
 package androidx.appsearch.cts.app;
 
-import static android.os.Build.VERSION_CODES;
-
 import static androidx.appsearch.app.AppSearchResult.RESULT_INVALID_SCHEMA;
 import static androidx.appsearch.app.AppSearchResult.RESULT_NOT_FOUND;
 import static androidx.appsearch.testutil.AppSearchTestUtils.checkIsBatchResultSuccess;
@@ -83,9 +81,6 @@
     protected abstract ListenableFuture<AppSearchSession> createSearchSession(
             @NonNull String dbName, @NonNull ExecutorService executor);
 
-    // Returns the Android version that the current instance of AppSearchSession is based on.
-    protected abstract int getAppSearchApiTarget();
-
     @Before
     public void setUp() throws Exception {
         Context context = ApplicationProvider.getApplicationContext();
@@ -1906,13 +1901,14 @@
                 new SearchResult.MatchRange(/*lower=*/26,  /*upper=*/33));
         assertThat(matchInfo.getSnippet()).isEqualTo("is foo.");
 
-        if (getAppSearchApiTarget() <= VERSION_CODES.S) {
-            // Submatch is not support on any backend that targets a platform S or lower.
-            assertThat(matchInfo.getSubmatchRange()).isEqualTo(
-                    new SearchResult.MatchRange(/*lower=*/0,  /*upper=*/0));
-            assertThat(matchInfo.getSubmatch().length()).isEqualTo(0);
+        if (!mDb1.getCapabilities().isSubmatchSupported()) {
+            assertThrows(
+                    UnsupportedOperationException.class,
+                    () -> matchInfo.getSubmatchRange());
+            assertThrows(
+                    UnsupportedOperationException.class,
+                    () -> matchInfo.getSubmatch());
         } else {
-            // Submatch is enabled on any backend that targets a platform beyond S.
             assertThat(matchInfo.getSubmatchRange()).isEqualTo(
                     new SearchResult.MatchRange(/*lower=*/29,  /*upper=*/31));
             assertThat(matchInfo.getSubmatch()).isEqualTo("fo");
@@ -2040,13 +2036,14 @@
                 new SearchResult.MatchRange(/*lower=*/44,  /*upper=*/45));
         assertThat(matchInfo.getExactMatch()).isEqualTo("は");
 
-        if (getAppSearchApiTarget() <= VERSION_CODES.S) {
-            // Submatch is not support on any backend that targets a platform S or lower.
-            assertThat(matchInfo.getSubmatchRange()).isEqualTo(
-                    new SearchResult.MatchRange(/*lower=*/0,  /*upper=*/0));
-            assertThat(matchInfo.getSubmatch().length()).isEqualTo(0);
+        if (!mDb1.getCapabilities().isSubmatchSupported()) {
+            assertThrows(
+                    UnsupportedOperationException.class,
+                    () -> matchInfo.getSubmatchRange());
+            assertThrows(
+                    UnsupportedOperationException.class,
+                    () -> matchInfo.getSubmatch());
         } else {
-            // Submatch is enabled on any backend that targets a platform beyond S.
             assertThat(matchInfo.getSubmatchRange()).isEqualTo(
                     new SearchResult.MatchRange(/*lower=*/44,  /*upper=*/45));
             assertThat(matchInfo.getSubmatch()).isEqualTo("は");
@@ -2199,6 +2196,44 @@
                 .isEqualTo(AppSearchResult.RESULT_NOT_FOUND);
     }
 
+
+    @Test
+    public void testRemoveByQuery_nonExistNamespace() throws Exception {
+        // Schema registration
+        mDb1.setSchema(
+                new SetSchemaRequest.Builder().addSchemas(AppSearchEmail.SCHEMA).build()).get();
+
+        // Index documents
+        AppSearchEmail email1 =
+                new AppSearchEmail.Builder("namespace1", "id1")
+                        .setFrom("from@example.com")
+                        .setTo("to1@example.com", "to2@example.com")
+                        .setSubject("foo")
+                        .setBody("This is the body of the testPut email")
+                        .build();
+        AppSearchEmail email2 =
+                new AppSearchEmail.Builder("namespace2", "id2")
+                        .setFrom("from@example.com")
+                        .setTo("to1@example.com", "to2@example.com")
+                        .setSubject("bar")
+                        .setBody("This is the body of the testPut second email")
+                        .build();
+        checkIsBatchResultSuccess(mDb1.put(
+                new PutDocumentsRequest.Builder().addGenericDocuments(email1, email2).build()));
+
+        // Check the presence of the documents
+        assertThat(doGet(mDb1, "namespace1", "id1")).hasSize(1);
+        assertThat(doGet(mDb1, "namespace2", "id2")).hasSize(1);
+
+        // Delete the email by nonExist namespace.
+        mDb1.remove("",
+                new SearchSpec.Builder().setTermMatch(SearchSpec.TERM_MATCH_PREFIX)
+                        .addFilterNamespaces("nonExistNamespace").build()).get();
+        // None of these emails will be deleted.
+        assertThat(doGet(mDb1, "namespace1", "id1")).hasSize(1);
+        assertThat(doGet(mDb1, "namespace2", "id2")).hasSize(1);
+    }
+
     @Test
     public void testRemoveByQuery_packageFilter() throws Exception {
         // Schema registration
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionLocalCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionLocalCtsTest.java
index f675483..f987118 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionLocalCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionLocalCtsTest.java
@@ -67,12 +67,6 @@
                         .setWorkerExecutor(executor).build());
     }
 
-    @Override
-    protected int getAppSearchApiTarget() {
-        // Any feature available in AppSearchSession is always available in the local backend.
-        return Integer.MAX_VALUE;
-    }
-
     // TODO(b/194207451) This test can be moved to CtsTestBase if customized logger is
     //  supported for platform backend.
     @Test
@@ -493,4 +487,13 @@
         assertThat(result.getFailures().get("id1").getErrorMessage())
                 .contains("was too large to write. Max is 16777215");
     }
+
+    @Test
+    public void testCapabilities() throws Exception {
+        Context context = ApplicationProvider.getApplicationContext();
+        AppSearchSession db2 = LocalStorage.createSearchSession(
+                new LocalStorage.SearchContext.Builder(context, DB_NAME_2).build()).get();
+
+        assertThat(db2.getCapabilities().isSubmatchSupported()).isTrue();
+    }
 }
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionPlatformCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionPlatformCtsTest.java
index e3f4770..2490a03 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionPlatformCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionPlatformCtsTest.java
@@ -16,7 +16,7 @@
 // @exportToFramework:skipFile()
 package androidx.appsearch.cts.app;
 
-import static android.os.Build.VERSION;
+import static com.google.common.truth.Truth.assertThat;
 
 import android.content.Context;
 import android.os.Build;
@@ -29,6 +29,8 @@
 
 import com.google.common.util.concurrent.ListenableFuture;
 
+import org.junit.Test;
+
 import java.util.concurrent.ExecutorService;
 
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.S)
@@ -49,9 +51,14 @@
                         .setWorkerExecutor(executor).build());
     }
 
-    @Override
-    protected int getAppSearchApiTarget() {
-        // Feature availability in the platform backend depends on the device's API level.
-        return VERSION.SDK_INT;
+    @Test
+    public void testCapabilities() throws Exception {
+        Context context = ApplicationProvider.getApplicationContext();
+        AppSearchSession db2 = PlatformStorage.createSearchSession(
+                new PlatformStorage.SearchContext.Builder(context, DB_NAME_2).build()).get();
+
+        // TODO(b/201316758) Update to reflect support in Android T+ once this feature is synced
+        // over into service-appsearch.
+        assertThat(db2.getCapabilities().isSubmatchSupported()).isFalse();
     }
 }
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SearchResultCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SearchResultCtsTest.java
index 2db5a7a..575a37b 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SearchResultCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SearchResultCtsTest.java
@@ -18,6 +18,8 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.junit.Assert.assertThrows;
+
 import androidx.appsearch.app.SearchResult;
 import androidx.appsearch.testutil.AppSearchEmail;
 
@@ -67,4 +69,38 @@
         assertThat(matchRange.getStart()).isEqualTo(13);
         assertThat(matchRange.getEnd()).isEqualTo(47);
     }
+
+    @Test
+    public void testSubmatchRangeNotSet() {
+        AppSearchEmail email = new AppSearchEmail.Builder("namespace1", "id1")
+                .setBody("Hello World.")
+                .build();
+        SearchResult.MatchInfo matchInfo =
+                new SearchResult.MatchInfo.Builder("body").build();
+        SearchResult searchResult = new SearchResult.Builder("packageName", "databaseName")
+                .setGenericDocument(email)
+                .addMatchInfo(matchInfo)
+                .build();
+
+        // When submatch isn't set, calling getSubmatch and getSubmatchRange should throw.
+        final SearchResult.MatchInfo actualMatchInfoNoSubmatch =
+                searchResult.getMatchInfos().get(0);
+        assertThrows(UnsupportedOperationException.class,
+                () -> actualMatchInfoNoSubmatch.getSubmatch());
+        assertThrows(UnsupportedOperationException.class,
+                () -> actualMatchInfoNoSubmatch.getSubmatchRange());
+
+        // When submatch is set, calling getSubmatch and getSubmatchRange should return the
+        // submatch without any problems.
+        SearchResult.MatchRange submatchRange = new SearchResult.MatchRange(3, 5);
+        matchInfo = new SearchResult.MatchInfo.Builder("body").setSubmatchRange(
+                submatchRange).build();
+        searchResult = new SearchResult.Builder("packageName", "databaseName")
+                .setGenericDocument(email)
+                .addMatchInfo(matchInfo)
+                .build();
+        final SearchResult.MatchInfo actualMatchInfo = searchResult.getMatchInfos().get(0);
+        assertThat(actualMatchInfo.getSubmatch()).isEqualTo("lo");
+        assertThat(actualMatchInfo.getSubmatchRange()).isEqualTo(submatchRange);
+    }
 }
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchSession.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchSession.java
index 4c4c8c8..c1279d39 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchSession.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchSession.java
@@ -262,6 +262,12 @@
     ListenableFuture<Void> requestFlush();
 
     /**
+     * Returns the {@link Capabilities} to check for the availability of certain features
+     * for this session.
+     */
+    @NonNull Capabilities getCapabilities();
+
+    /**
      * Closes the {@link AppSearchSession} to persist all schema and document updates, additions,
      * and deletes to disk.
      */
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/Capabilities.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/Capabilities.java
new file mode 100644
index 0000000..445f91f
--- /dev/null
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/Capabilities.java
@@ -0,0 +1,30 @@
+/*
+ * 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.appsearch.app;
+
+/**
+ * A class that encapsulates all features that are only supported with certain combinations of
+ * backend and Android API Level.
+ * <!--@exportToFramework:hide-->
+ */
+public interface Capabilities {
+
+    /**
+     * Returns whether or not {@link SearchResult.MatchInfo#getSubmatchRange} and
+     * {@link SearchResult.MatchInfo#getSubmatch} are available.
+     */
+    boolean isSubmatchSupported();
+}
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/GlobalSearchSession.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/GlobalSearchSession.java
index 8b7dbe9..1d8f921 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/GlobalSearchSession.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/GlobalSearchSession.java
@@ -77,6 +77,12 @@
     @NonNull
     ListenableFuture<Void> reportSystemUsage(@NonNull ReportSystemUsageRequest request);
 
+    /**
+     * Returns the {@link Capabilities} to check for the availability of certain features
+     * for this session.
+     */
+    @NonNull Capabilities getCapabilities();
+
     /** Closes the {@link GlobalSearchSession}. */
     @Override
     void close();
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/PackageIdentifier.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/PackageIdentifier.java
index 5d54f23..4a8402d 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/PackageIdentifier.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/PackageIdentifier.java
@@ -33,8 +33,17 @@
     /**
      * Creates a unique identifier for a package.
      *
+     * <p>SHA-256 certificate digests for a signed application can be retrieved with the
+     * <a href="{@docRoot}studio/command-line/apksigner/">apksigner tool</a> that is part of the
+     * Android SDK build tools. Use {@code apksigner verify --print-certs path/to/apk.apk} to
+     * retrieve the SHA-256 certificate digest for the target application. Once retrieved, the
+     * SHA-256 certificate digest should be converted to a {@code byte[]} by decoding it in base16:
+     * <pre>
+     * new android.content.pm.Signature(outputDigest).toByteArray();
+     * </pre>
+     *
      * @param packageName Name of the package.
-     * @param sha256Certificate SHA256 certificate digest of the package.
+     * @param sha256Certificate SHA-256 certificate digest of the package.
      */
     public PackageIdentifier(@NonNull String packageName, @NonNull byte[] sha256Certificate) {
         mBundle = new Bundle();
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/SearchResult.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/SearchResult.java
index 556c9b0..f27addc 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/SearchResult.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/SearchResult.java
@@ -423,9 +423,18 @@
          * <p>Class example 1: this returns [29, 32].
          * <p>Class example 2: for the first {@link MatchInfo}, this returns [0, 4] and, for the
          * second {@link MatchInfo}, this returns [0, 4].
+         *
+         * <!--@exportToFramework:ifJetpack()-->
+         * <p>This information may not be available depending on the backend and Android API
+         * level. To ensure it is available, call {@link Capabilities#isSubmatchSupported}.
+         *
+         * @throws UnsupportedOperationException if {@link Capabilities#isSubmatchSupported} is
+         * false.
+         * <!--@exportToFramework:else()-->
          */
         @NonNull
         public MatchRange getSubmatchRange() {
+            checkSubmatchSupported();
             if (mSubmatchRange == null) {
                 mSubmatchRange = new MatchRange(
                         mBundle.getInt(SUBMATCH_RANGE_LOWER_FIELD),
@@ -439,9 +448,18 @@
          * <p>Class example 1: this returns "foo".
          * <p>Class example 2: for the first {@link MatchInfo}, this returns "Test" and, for the
          * second {@link MatchInfo}, this returns "Test".
+         *
+         * <!--@exportToFramework:ifJetpack()-->
+         * <p>This information may not be available depending on the backend and Android API
+         * level. To ensure it is available, call {@link Capabilities#isSubmatchSupported}.
+         *
+         * @throws UnsupportedOperationException if {@link Capabilities#isSubmatchSupported} is
+         * false.
+         * <!--@exportToFramework:else()-->
          */
         @NonNull
         public CharSequence getSubmatch() {
+            checkSubmatchSupported();
             return getSubstring(getSubmatchRange());
         }
 
@@ -482,6 +500,14 @@
             return getFullText().substring(range.getStart(), range.getEnd());
         }
 
+        private void checkSubmatchSupported() {
+            if (!mBundle.containsKey(SUBMATCH_RANGE_LOWER_FIELD)) {
+                throw new UnsupportedOperationException(
+                        "Submatch is not supported with this backend/Android API level "
+                                + "combination");
+            }
+        }
+
         /** Extracts the matching string from the document. */
         private static String getPropertyValues(GenericDocument document, String propertyName) {
             // In IcingLib snippeting is available for only 3 data types i.e String, double and
@@ -499,7 +525,7 @@
         public static final class Builder {
             private final String mPropertyPath;
             private MatchRange mExactMatchRange = new MatchRange(0, 0);
-            private MatchRange mSubmatchRange = new MatchRange(0, 0);
+            @Nullable private MatchRange mSubmatchRange;
             private MatchRange mSnippetRange = new MatchRange(0, 0);
 
             /**
@@ -548,8 +574,11 @@
                 bundle.putString(SearchResult.MatchInfo.PROPERTY_PATH_FIELD, mPropertyPath);
                 bundle.putInt(MatchInfo.EXACT_MATCH_RANGE_LOWER_FIELD, mExactMatchRange.getStart());
                 bundle.putInt(MatchInfo.EXACT_MATCH_RANGE_UPPER_FIELD, mExactMatchRange.getEnd());
-                bundle.putInt(MatchInfo.SUBMATCH_RANGE_LOWER_FIELD, mSubmatchRange.getStart());
-                bundle.putInt(MatchInfo.SUBMATCH_RANGE_UPPER_FIELD, mSubmatchRange.getEnd());
+                if (mSubmatchRange != null) {
+                    // Only populate the submatch fields if it was actually set.
+                    bundle.putInt(MatchInfo.SUBMATCH_RANGE_LOWER_FIELD, mSubmatchRange.getStart());
+                    bundle.putInt(MatchInfo.SUBMATCH_RANGE_UPPER_FIELD, mSubmatchRange.getEnd());
+                }
                 bundle.putInt(MatchInfo.SNIPPET_RANGE_LOWER_FIELD, mSnippetRange.getStart());
                 bundle.putInt(MatchInfo.SNIPPET_RANGE_UPPER_FIELD, mSnippetRange.getEnd());
                 return new MatchInfo(bundle, /*document=*/ null);
diff --git a/appsearch/exportToFramework.py b/appsearch/exportToFramework.py
index 7bfc923..e3d4c59 100755
--- a/appsearch/exportToFramework.py
+++ b/appsearch/exportToFramework.py
@@ -16,10 +16,10 @@
 # Exports AppSearch Androidx code to Framework
 #
 # NOTE: This will remove and replace all files in the
-# frameworks/base/apex/appsearch path.
+# packages/modules/AppSearch path.
 #
 # Example usage (from root dir of androidx workspace):
-# $ ./frameworks/support/appsearch/exportToFramework.py "$HOME/android/master" "<jetpack changeid>"
+# $ ./frameworks/support/appsearch/exportToFramework.py "$HOME/android/master" "<jetpack git sha>"
 
 # Special directives supported by this script:
 #
@@ -54,19 +54,21 @@
 # Jetpack paths relative to frameworks/support/appsearch
 JETPACK_API_ROOT = 'appsearch/src/main/java/androidx/appsearch'
 JETPACK_API_TEST_ROOT = 'appsearch/src/androidTest/java/androidx/appsearch'
-JETPACK_IMPL_ROOT = 'local-storage/src/main/java/androidx/appsearch'
-JETPACK_IMPL_TEST_ROOT = 'local-storage/src/androidTest/java/androidx/appsearch'
+JETPACK_IMPL_ROOT = 'appsearch-local-storage/src/main/java/androidx/appsearch'
+JETPACK_IMPL_TEST_ROOT = 'appsearch-local-storage/src/androidTest/java/androidx/appsearch'
+JETPACK_TEST_UTIL_ROOT = 'appsearch-test-util/src/main/java/androidx/appsearch'
+JETPACK_TEST_UTIL_TEST_ROOT = 'appsearch-test-util/src/androidTest/java/androidx/appsearch'
 
-# Framework paths relative to frameworks/base/apex/appsearch
+# Framework paths relative to packages/modules/AppSearch
 FRAMEWORK_API_ROOT = 'framework/java/external/android/app/appsearch'
-FRAMEWORK_API_TEST_ROOT = '../../core/tests/coretests/src/android/app/appsearch/external'
+FRAMEWORK_API_TEST_ROOT = 'testing/coretests/src/android/app/appsearch/external'
 FRAMEWORK_IMPL_ROOT = 'service/java/com/android/server/appsearch/external'
-FRAMEWORK_IMPL_TEST_ROOT = (
-        '../../services/tests/servicestests/src/com/android/server/appsearch/external')
-FRAMEWORK_TEST_UTIL_ROOT = 'testing/java/com/android/server/appsearch/testing/external/'
-FRAMEWORK_CTS_TEST_ROOT = '../../../../cts/tests/appsearch/src/com/android/cts/appsearch/external'
+FRAMEWORK_IMPL_TEST_ROOT = 'testing/servicestests/src/com/android/server/appsearch/external'
+FRAMEWORK_TEST_UTIL_ROOT = 'testing/testutils/src/android/app/appsearch/testutil/external'
+FRAMEWORK_TEST_UTIL_TEST_ROOT = 'testing/servicestests/src/android/app/appsearch/testutil/external'
+FRAMEWORK_CTS_TEST_ROOT = '../../../cts/tests/appsearch/src/com/android/cts/appsearch/external'
 GOOGLE_JAVA_FORMAT = (
-        '../../../../prebuilts/tools/common/google-java-format/google-java-format')
+        '../../../prebuilts/tools/common/google-java-format/google-java-format')
 
 # Miscellaneous constants
 CHANGEID_FILE_NAME = 'synced_jetpack_changeid.txt'
@@ -167,10 +169,10 @@
 
     def _TransformTestCode(self, contents):
         contents = (contents
-            .replace('androidx.appsearch.app.util.', 'com.android.server.appsearch.testing.')
+            .replace('androidx.appsearch.testutil.', 'android.app.appsearch.testutil.')
             .replace(
-                    'package androidx.appsearch.app.util;',
-                    'package com.android.server.appsearch.testing;')
+                    'package androidx.appsearch.testutil;',
+                    'package android.app.appsearch.testutil;')
             .replace(
                     'androidx.appsearch.localstorage.LocalStorage',
                     'android.app.appsearch.AppSearchManager')
@@ -180,12 +182,6 @@
             contents = re.sub(r"([^a-zA-Z])(%s)([^a-zA-Z0-9])" % shim, r'\1\2Shim\3', contents)
         return self._TransformCommonCode(contents)
 
-    def _TransformCtsTestCode(self, contents):
-        contents = self._TransformTestCode(contents)
-        return (contents
-                .replace('android.app.appsearch.test', 'com.android.cts.appsearch')
-        )
-
     def _TransformAndCopyFolder(self, source_dir, dest_dir, transform_func=None):
         for currentpath, folders, files in os.walk(source_dir):
             dir_rel_to_root = os.path.relpath(currentpath, source_dir)
@@ -208,7 +204,7 @@
         cts_test_dest_dir = os.path.join(self._framework_appsearch_root, FRAMEWORK_CTS_TEST_ROOT)
 
         # Test utils
-        test_util_source_dir = os.path.join(api_test_source_dir, 'app/util')
+        test_util_source_dir = os.path.join(self._jetpack_appsearch_root, JETPACK_TEST_UTIL_ROOT)
         test_util_dest_dir = os.path.join(self._framework_appsearch_root, FRAMEWORK_TEST_UTIL_ROOT)
 
         # Prune existing files
@@ -253,7 +249,7 @@
         # Copy CTS tests
         print('~~~ Copying CTS tests ~~~')
         self._TransformAndCopyFolder(
-                cts_test_source_dir, cts_test_dest_dir, transform_func=self._TransformCtsTestCode)
+                cts_test_source_dir, cts_test_dest_dir, transform_func=self._TransformTestCode)
 
         # Copy test utils
         print('~~~ Copying test utils ~~~')
@@ -273,10 +269,15 @@
         impl_test_source_dir = os.path.join(self._jetpack_appsearch_root, JETPACK_IMPL_TEST_ROOT)
         impl_dest_dir = os.path.join(self._framework_appsearch_root, FRAMEWORK_IMPL_ROOT)
         impl_test_dest_dir = os.path.join(self._framework_appsearch_root, FRAMEWORK_IMPL_TEST_ROOT)
+        test_util_test_source_dir = os.path.join(
+                self._jetpack_appsearch_root, JETPACK_TEST_UTIL_TEST_ROOT)
+        test_util_test_dest_dir = os.path.join(
+                self._framework_appsearch_root, FRAMEWORK_TEST_UTIL_TEST_ROOT)
 
         # Prune
         self._PruneDir(impl_dest_dir)
         self._PruneDir(impl_test_dest_dir)
+        self._PruneDir(test_util_test_dest_dir)
 
         # Copy impl classes
         def _TransformImplCode(contents):
@@ -302,6 +303,10 @@
             return self._TransformTestCode(contents)
         self._TransformAndCopyFolder(
                 impl_test_source_dir, impl_test_dest_dir, transform_func=_TransformImplTestCode)
+        self._TransformAndCopyFolder(
+                test_util_test_source_dir,
+                test_util_test_dest_dir,
+                transform_func=self._TransformTestCode)
 
     def _FormatWrittenFiles(self):
         google_java_format_cmd = [GOOGLE_JAVA_FORMAT, '--aosp', '-i'] + self._written_files
@@ -330,20 +335,16 @@
 
 if __name__ == '__main__':
     if len(sys.argv) != 3:
-        print('Usage: %s <path/to/frameworks/base> <changeId of head jetpack commit>' % sys.argv[0],
+        print('Usage: %s <path/to/framework/checkout> <git sha of head jetpack commit>' % (
+                  sys.argv[0]),
               file=sys.stderr)
         sys.exit(1)
     source_dir = os.path.normpath(os.path.dirname(sys.argv[0]))
     dest_dir = os.path.normpath(sys.argv[1])
-    if os.path.basename(dest_dir) == 'appsearch':
-        pass
-    elif os.path.basename(dest_dir) == 'base':
-        dest_dir = os.path.join(dest_dir, 'apex/appsearch')
-    else:
-        dest_dir = os.path.join(dest_dir, 'frameworks/base/apex/appsearch')
+    dest_dir = os.path.join(dest_dir, 'packages/modules/AppSearch')
     if not os.path.isdir(dest_dir):
         print('Destination path "%s" does not exist or is not a directory' % (
-                dest_dir),
+                  dest_dir),
               file=sys.stderr)
         sys.exit(1)
     exporter = ExportToFramework(source_dir, dest_dir)
diff --git a/arch/core/core-runtime/src/main/java/androidx/arch/core/executor/DefaultTaskExecutor.java b/arch/core/core-runtime/src/main/java/androidx/arch/core/executor/DefaultTaskExecutor.java
index 8244ce1..28c63ea 100644
--- a/arch/core/core-runtime/src/main/java/androidx/arch/core/executor/DefaultTaskExecutor.java
+++ b/arch/core/core-runtime/src/main/java/androidx/arch/core/executor/DefaultTaskExecutor.java
@@ -39,14 +39,14 @@
     private final Object mLock = new Object();
 
     private final ExecutorService mDiskIO = Executors.newFixedThreadPool(4, new ThreadFactory() {
-        private static final String THREAD_NAME_STEM = "arch_disk_io_%d";
+        private static final String THREAD_NAME_STEM = "arch_disk_io_";
 
         private final AtomicInteger mThreadId = new AtomicInteger(0);
 
         @Override
         public Thread newThread(Runnable r) {
             Thread t = new Thread(r);
-            t.setName(String.format(THREAD_NAME_STEM, mThreadId.getAndIncrement()));
+            t.setName(THREAD_NAME_STEM + mThreadId.getAndIncrement());
             return t;
         }
     });
diff --git a/autofill/autofill/src/androidTest/java/androidx/autofill/inline/RendererTest.java b/autofill/autofill/src/androidTest/java/androidx/autofill/inline/RendererTest.java
index cb51c64..4db3eb0 100644
--- a/autofill/autofill/src/androidTest/java/androidx/autofill/inline/RendererTest.java
+++ b/autofill/autofill/src/androidTest/java/androidx/autofill/inline/RendererTest.java
@@ -72,7 +72,8 @@
         mContext = mInstrumentation.getContext();
         mLinearLayout = mActivityTestRule.getActivity().findViewById(
                 androidx.autofill.test.R.id.linear_layout);
-        mAttributionIntent = PendingIntent.getActivity(mContext, 0, new Intent(), 0);
+        mAttributionIntent = PendingIntent.getActivity(
+                mContext, 0, new Intent(), PendingIntent.FLAG_IMMUTABLE);
     }
 
     @Test
diff --git a/autofill/autofill/src/androidTest/java/androidx/autofill/inline/v1/InlineSuggestionUiTest.java b/autofill/autofill/src/androidTest/java/androidx/autofill/inline/v1/InlineSuggestionUiTest.java
index 943322b..0c3c371 100644
--- a/autofill/autofill/src/androidTest/java/androidx/autofill/inline/v1/InlineSuggestionUiTest.java
+++ b/autofill/autofill/src/androidTest/java/androidx/autofill/inline/v1/InlineSuggestionUiTest.java
@@ -87,7 +87,8 @@
         mContext = mInstrumentation.getContext();
         mLinearLayout = mActivityTestRule.getActivity().findViewById(
                 androidx.autofill.test.R.id.linear_layout);
-        mAttributionIntent = PendingIntent.getActivity(mContext, 0, new Intent(), 0);
+        mAttributionIntent = PendingIntent.getActivity(
+                mContext, 0, new Intent(), PendingIntent.FLAG_IMMUTABLE);
     }
 
     /** Below are tests for the end to end style/content building and rendering */
diff --git a/benchmark/benchmark-common/src/androidTest/java/androidx/benchmark/perfetto/UiStateTest.kt b/benchmark/benchmark-common/src/androidTest/java/androidx/benchmark/perfetto/UiStateTest.kt
index 5199c56..101ea48 100644
--- a/benchmark/benchmark-common/src/androidTest/java/androidx/benchmark/perfetto/UiStateTest.kt
+++ b/benchmark/benchmark-common/src/androidTest/java/androidx/benchmark/perfetto/UiStateTest.kt
@@ -101,7 +101,7 @@
 
     @Test
     public fun actualTraceAppend() {
-        val traceFile = createTempFileFromAsset("WarmStartup", ".trace")
+        val traceFile = createTempFileFromAsset("api31_startup_warm", ".perfetto-trace")
         val initialSize = traceFile.readBytes().size
         traceFile.appendUiState(
             UiState(
diff --git a/benchmark/benchmark-common/src/main/AndroidManifest.xml b/benchmark/benchmark-common/src/main/AndroidManifest.xml
index 8acfc28..4f7502e 100644
--- a/benchmark/benchmark-common/src/main/AndroidManifest.xml
+++ b/benchmark/benchmark-common/src/main/AndroidManifest.xml
@@ -26,7 +26,8 @@
         <!-- Activity used to block background content while benchmarks are running -->
         <activity
             android:name="androidx.benchmark.IsolationActivity"
-            android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen">
+            android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen"
+            android:exported="true" >
         </activity>
     </application>
 </manifest>
diff --git a/benchmark/benchmark-common/src/main/java/androidx/benchmark/Outputs.kt b/benchmark/benchmark-common/src/main/java/androidx/benchmark/Outputs.kt
index b29ea5b..2920535 100644
--- a/benchmark/benchmark-common/src/main/java/androidx/benchmark/Outputs.kt
+++ b/benchmark/benchmark-common/src/main/java/androidx/benchmark/Outputs.kt
@@ -16,6 +16,7 @@
 
 package androidx.benchmark
 
+import android.annotation.SuppressLint
 import android.os.Build
 import android.util.Log
 import androidx.annotation.RestrictTo
@@ -49,9 +50,10 @@
         formatter.timeZone = TimeZone.getTimeZone("UTC")
 
         @Suppress("DEPRECATION")
+        @SuppressLint("NewApi")
         dirUsableByAppAndShell = when {
-            Build.VERSION.SDK_INT == 30 -> {
-                // On Android R, we are using the media directory because that is the directory
+            Build.VERSION.SDK_INT in 30..31 -> {
+                // On Android R, S we are using the media directory because that is the directory
                 // that the shell has access to. Context: b/181601156
                 InstrumentationRegistry.getInstrumentation().context.getFirstMountedMediaDir()
             }
diff --git a/benchmark/benchmark-junit4/build.gradle b/benchmark/benchmark-junit4/build.gradle
index cd30ba8..fc05b26 100644
--- a/benchmark/benchmark-junit4/build.gradle
+++ b/benchmark/benchmark-junit4/build.gradle
@@ -35,8 +35,8 @@
     api(libs.junit)
     api(libs.kotlinStdlib)
 
-    implementation("androidx.test:rules:1.3.0")
-    implementation("androidx.test:runner:1.3.0")
+    implementation("androidx.test:rules:1.4.0")
+    implementation("androidx.test:runner:1.4.0")
     implementation("androidx.tracing:tracing-ktx:1.0.0")
     api("androidx.annotation:annotation:1.1.0")
 
diff --git a/benchmark/benchmark-macro-junit4/api/1.1.0-beta01.txt b/benchmark/benchmark-macro-junit4/api/1.1.0-beta01.txt
deleted file mode 100644
index cdd2265..0000000
--- a/benchmark/benchmark-macro-junit4/api/1.1.0-beta01.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-// Signature format: 4.0
-package androidx.benchmark.macro.junit4 {
-
-  @RequiresApi(23) public final class MacrobenchmarkRule implements org.junit.rules.TestRule {
-    ctor public MacrobenchmarkRule();
-    method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
-    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, optional androidx.benchmark.macro.StartupMode? startupMode, @IntRange(from=1) int iterations, optional kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> setupBlock, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
-    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, optional androidx.benchmark.macro.StartupMode? startupMode, @IntRange(from=1) int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
-    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, @IntRange(from=1) int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
-    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, @IntRange(from=1) int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
-  }
-
-}
-
diff --git a/benchmark/benchmark-macro-junit4/api/api_lint.ignore b/benchmark/benchmark-macro-junit4/api/api_lint.ignore
new file mode 100644
index 0000000..60bb212e
--- /dev/null
+++ b/benchmark/benchmark-macro-junit4/api/api_lint.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+MissingJvmstatic: androidx.benchmark.macro.junit4.MacrobenchmarkRule#measureRepeated(String, java.util.List<? extends androidx.benchmark.macro.Metric>, androidx.benchmark.macro.CompilationMode, androidx.benchmark.macro.StartupMode, int, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,? extends kotlin.Unit>, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,? extends kotlin.Unit>):
+    A Kotlin method with default parameter values should be annotated with @JvmOverloads for better Java interoperability; see https://android.github.io/kotlin-guides/interop.html#function-overloads-for-defaults
diff --git a/benchmark/benchmark-macro-junit4/api/current.txt b/benchmark/benchmark-macro-junit4/api/current.txt
index cdd2265..3fb0176 100644
--- a/benchmark/benchmark-macro-junit4/api/current.txt
+++ b/benchmark/benchmark-macro-junit4/api/current.txt
@@ -1,13 +1,14 @@
 // Signature format: 4.0
 package androidx.benchmark.macro.junit4 {
 
-  @RequiresApi(23) public final class MacrobenchmarkRule implements org.junit.rules.TestRule {
+  public final class MacrobenchmarkRule implements org.junit.rules.TestRule {
     ctor public MacrobenchmarkRule();
     method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
-    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, optional androidx.benchmark.macro.StartupMode? startupMode, @IntRange(from=1) int iterations, optional kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> setupBlock, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
-    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, optional androidx.benchmark.macro.StartupMode? startupMode, @IntRange(from=1) int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
-    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, @IntRange(from=1) int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
-    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, @IntRange(from=1) int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
+    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, optional androidx.benchmark.macro.StartupMode? startupMode, @IntRange(from=1) int iterations, optional androidx.core.util.Consumer<androidx.benchmark.macro.MacrobenchmarkScope> setupFn, androidx.core.util.Consumer<androidx.benchmark.macro.MacrobenchmarkScope> measureFn);
+    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, optional androidx.benchmark.macro.StartupMode? startupMode, @IntRange(from=1) int iterations, androidx.core.util.Consumer<androidx.benchmark.macro.MacrobenchmarkScope> measureFn);
+    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, @IntRange(from=1) int iterations, androidx.core.util.Consumer<androidx.benchmark.macro.MacrobenchmarkScope> measureFn);
+    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, @IntRange(from=1) int iterations, androidx.core.util.Consumer<androidx.benchmark.macro.MacrobenchmarkScope> measureFn);
+    method @kotlin.jvm.JvmSynthetic public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, optional androidx.benchmark.macro.StartupMode? startupMode, @IntRange(from=1) int iterations, optional kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,? extends kotlin.Unit> setupBlock, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,? extends kotlin.Unit> measureBlock);
   }
 
 }
diff --git a/benchmark/benchmark-macro-junit4/api/public_plus_experimental_1.1.0-beta01.txt b/benchmark/benchmark-macro-junit4/api/public_plus_experimental_1.1.0-beta01.txt
deleted file mode 100644
index cdd2265..0000000
--- a/benchmark/benchmark-macro-junit4/api/public_plus_experimental_1.1.0-beta01.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-// Signature format: 4.0
-package androidx.benchmark.macro.junit4 {
-
-  @RequiresApi(23) public final class MacrobenchmarkRule implements org.junit.rules.TestRule {
-    ctor public MacrobenchmarkRule();
-    method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
-    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, optional androidx.benchmark.macro.StartupMode? startupMode, @IntRange(from=1) int iterations, optional kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> setupBlock, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
-    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, optional androidx.benchmark.macro.StartupMode? startupMode, @IntRange(from=1) int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
-    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, @IntRange(from=1) int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
-    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, @IntRange(from=1) int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
-  }
-
-}
-
diff --git a/benchmark/benchmark-macro-junit4/api/public_plus_experimental_current.txt b/benchmark/benchmark-macro-junit4/api/public_plus_experimental_current.txt
index cdd2265..77eb43a 100644
--- a/benchmark/benchmark-macro-junit4/api/public_plus_experimental_current.txt
+++ b/benchmark/benchmark-macro-junit4/api/public_plus_experimental_current.txt
@@ -1,13 +1,21 @@
 // Signature format: 4.0
 package androidx.benchmark.macro.junit4 {
 
-  @RequiresApi(23) public final class MacrobenchmarkRule implements org.junit.rules.TestRule {
+  @RequiresApi(28) @androidx.benchmark.macro.ExperimentalBaselineProfilesApi public final class BaselineProfileRule implements org.junit.rules.TestRule {
+    ctor public BaselineProfileRule();
+    method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
+    method public void collectBaselineProfile(String packageName, optional kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> setupBlock, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> profileBlock);
+    method public void collectBaselineProfile(String packageName, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> profileBlock);
+  }
+
+  public final class MacrobenchmarkRule implements org.junit.rules.TestRule {
     ctor public MacrobenchmarkRule();
     method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
-    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, optional androidx.benchmark.macro.StartupMode? startupMode, @IntRange(from=1) int iterations, optional kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> setupBlock, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
-    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, optional androidx.benchmark.macro.StartupMode? startupMode, @IntRange(from=1) int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
-    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, @IntRange(from=1) int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
-    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, @IntRange(from=1) int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
+    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, optional androidx.benchmark.macro.StartupMode? startupMode, @IntRange(from=1) int iterations, optional androidx.core.util.Consumer<androidx.benchmark.macro.MacrobenchmarkScope> setupFn, androidx.core.util.Consumer<androidx.benchmark.macro.MacrobenchmarkScope> measureFn);
+    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, optional androidx.benchmark.macro.StartupMode? startupMode, @IntRange(from=1) int iterations, androidx.core.util.Consumer<androidx.benchmark.macro.MacrobenchmarkScope> measureFn);
+    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, @IntRange(from=1) int iterations, androidx.core.util.Consumer<androidx.benchmark.macro.MacrobenchmarkScope> measureFn);
+    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, @IntRange(from=1) int iterations, androidx.core.util.Consumer<androidx.benchmark.macro.MacrobenchmarkScope> measureFn);
+    method @kotlin.jvm.JvmSynthetic public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, optional androidx.benchmark.macro.StartupMode? startupMode, @IntRange(from=1) int iterations, optional kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,? extends kotlin.Unit> setupBlock, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,? extends kotlin.Unit> measureBlock);
   }
 
 }
diff --git a/benchmark/benchmark-macro-junit4/api/restricted_1.1.0-beta01.txt b/benchmark/benchmark-macro-junit4/api/restricted_1.1.0-beta01.txt
deleted file mode 100644
index 05cc38e..0000000
--- a/benchmark/benchmark-macro-junit4/api/restricted_1.1.0-beta01.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-// Signature format: 4.0
-package androidx.benchmark.macro.junit4 {
-
-  @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class BaselineProfileRule implements org.junit.rules.TestRule {
-    method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
-    method public void collectBaselineProfile(String packageName, optional kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> setupBlock, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> profileBlock);
-  }
-
-  @RequiresApi(23) public final class MacrobenchmarkRule implements org.junit.rules.TestRule {
-    ctor public MacrobenchmarkRule();
-    method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
-    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, optional androidx.benchmark.macro.StartupMode? startupMode, @IntRange(from=1) int iterations, optional kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> setupBlock, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
-    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, optional androidx.benchmark.macro.StartupMode? startupMode, @IntRange(from=1) int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
-    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, @IntRange(from=1) int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
-    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, @IntRange(from=1) int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
-  }
-
-}
-
diff --git a/benchmark/benchmark-macro-junit4/api/restricted_current.txt b/benchmark/benchmark-macro-junit4/api/restricted_current.txt
index 05cc38e..3fb0176 100644
--- a/benchmark/benchmark-macro-junit4/api/restricted_current.txt
+++ b/benchmark/benchmark-macro-junit4/api/restricted_current.txt
@@ -1,18 +1,14 @@
 // Signature format: 4.0
 package androidx.benchmark.macro.junit4 {
 
-  @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class BaselineProfileRule implements org.junit.rules.TestRule {
-    method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
-    method public void collectBaselineProfile(String packageName, optional kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> setupBlock, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> profileBlock);
-  }
-
-  @RequiresApi(23) public final class MacrobenchmarkRule implements org.junit.rules.TestRule {
+  public final class MacrobenchmarkRule implements org.junit.rules.TestRule {
     ctor public MacrobenchmarkRule();
     method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
-    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, optional androidx.benchmark.macro.StartupMode? startupMode, @IntRange(from=1) int iterations, optional kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> setupBlock, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
-    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, optional androidx.benchmark.macro.StartupMode? startupMode, @IntRange(from=1) int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
-    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, @IntRange(from=1) int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
-    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, @IntRange(from=1) int iterations, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,kotlin.Unit> measureBlock);
+    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, optional androidx.benchmark.macro.StartupMode? startupMode, @IntRange(from=1) int iterations, optional androidx.core.util.Consumer<androidx.benchmark.macro.MacrobenchmarkScope> setupFn, androidx.core.util.Consumer<androidx.benchmark.macro.MacrobenchmarkScope> measureFn);
+    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, optional androidx.benchmark.macro.StartupMode? startupMode, @IntRange(from=1) int iterations, androidx.core.util.Consumer<androidx.benchmark.macro.MacrobenchmarkScope> measureFn);
+    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, @IntRange(from=1) int iterations, androidx.core.util.Consumer<androidx.benchmark.macro.MacrobenchmarkScope> measureFn);
+    method public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, @IntRange(from=1) int iterations, androidx.core.util.Consumer<androidx.benchmark.macro.MacrobenchmarkScope> measureFn);
+    method @kotlin.jvm.JvmSynthetic public void measureRepeated(String packageName, java.util.List<? extends androidx.benchmark.macro.Metric> metrics, optional androidx.benchmark.macro.CompilationMode compilationMode, optional androidx.benchmark.macro.StartupMode? startupMode, @IntRange(from=1) int iterations, optional kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,? extends kotlin.Unit> setupBlock, kotlin.jvm.functions.Function1<? super androidx.benchmark.macro.MacrobenchmarkScope,? extends kotlin.Unit> measureBlock);
   }
 
 }
diff --git a/benchmark/benchmark-macro-junit4/build.gradle b/benchmark/benchmark-macro-junit4/build.gradle
index 410e04e..77d6df4 100644
--- a/benchmark/benchmark-macro-junit4/build.gradle
+++ b/benchmark/benchmark-macro-junit4/build.gradle
@@ -16,6 +16,7 @@
 
 import androidx.build.LibraryGroups
 import androidx.build.Publish
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
 plugins {
     id("AndroidXPlugin")
@@ -25,8 +26,7 @@
 
 android {
     defaultConfig {
-        // 21 is perfetto min API, and required for shell commands
-        minSdkVersion 21
+        minSdkVersion 23
         multiDexEnabled true
     }
 }
@@ -35,6 +35,7 @@
     api(libs.junit)
     api(libs.kotlinStdlib)
     api("androidx.annotation:annotation:1.1.0")
+    api("androidx.core:core:1.6.0")
     api(project(":benchmark:benchmark-macro"))
     implementation(project(":benchmark:benchmark-common"))
     implementation("androidx.test:rules:1.3.0")
@@ -61,3 +62,10 @@
     inceptionYear = "2020"
     description = "Android Benchmark - Macrobenchmark JUnit4"
 }
+
+// Allow usage of Kotlin's @OptIn.
+tasks.withType(KotlinCompile).configureEach {
+    kotlinOptions {
+        freeCompilerArgs += [ '-Xopt-in=kotlin.RequiresOptIn' ]
+    }
+}
diff --git a/benchmark/benchmark-macro-junit4/src/main/java/androidx/benchmark/macro/junit4/BaselineProfileRule.kt b/benchmark/benchmark-macro-junit4/src/main/java/androidx/benchmark/macro/junit4/BaselineProfileRule.kt
index 1fc9aa2..f4b4bc1 100644
--- a/benchmark/benchmark-macro-junit4/src/main/java/androidx/benchmark/macro/junit4/BaselineProfileRule.kt
+++ b/benchmark/benchmark-macro-junit4/src/main/java/androidx/benchmark/macro/junit4/BaselineProfileRule.kt
@@ -18,7 +18,7 @@
 
 import android.Manifest
 import androidx.annotation.RequiresApi
-import androidx.annotation.RestrictTo
+import androidx.benchmark.macro.ExperimentalBaselineProfilesApi
 import androidx.benchmark.macro.MacrobenchmarkScope
 import androidx.benchmark.macro.collectBaselineProfile
 import androidx.test.rule.GrantPermissionRule
@@ -28,13 +28,12 @@
 import org.junit.runners.model.Statement
 
 /**
- * A [TestRule] that helps collect baseline profiles.
+ * A [TestRule] that collects Baseline Profiles to be embedded in your APK.
  *
- * @suppress
+ * These rules are used at install time to partially pre-compile your application code.
  */
 @RequiresApi(28)
-// Ideally we want to restrict this to tests, but this is the next best thing.
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@ExperimentalBaselineProfilesApi
 class BaselineProfileRule : TestRule {
     private lateinit var currentDescription: Description
 
@@ -52,6 +51,14 @@
         }
     }
 
+    /**
+     * Collects baseline profiles for a critical user journey.
+     * @param packageName Package name of the app for which profiles are to be generated.
+     * @param setupBlock The block performing app actions prior to the critical user journey.
+     * For example navigating to an Activity where scrolling will be measured.
+     * @param [profileBlock] defines the critical user journey.
+     */
+    @JvmOverloads
     public fun collectBaselineProfile(
         packageName: String,
         setupBlock: MacrobenchmarkScope.() -> Unit = {},
diff --git a/benchmark/benchmark-macro-junit4/src/main/java/androidx/benchmark/macro/junit4/MacrobenchmarkRule.kt b/benchmark/benchmark-macro-junit4/src/main/java/androidx/benchmark/macro/junit4/MacrobenchmarkRule.kt
index 6086762..b2382b6 100644
--- a/benchmark/benchmark-macro-junit4/src/main/java/androidx/benchmark/macro/junit4/MacrobenchmarkRule.kt
+++ b/benchmark/benchmark-macro-junit4/src/main/java/androidx/benchmark/macro/junit4/MacrobenchmarkRule.kt
@@ -18,12 +18,12 @@
 
 import android.Manifest
 import androidx.annotation.IntRange
-import androidx.annotation.RequiresApi
 import androidx.benchmark.macro.CompilationMode
 import androidx.benchmark.macro.MacrobenchmarkScope
 import androidx.benchmark.macro.Metric
 import androidx.benchmark.macro.StartupMode
 import androidx.benchmark.macro.macrobenchmarkWithStartupMode
+import androidx.core.util.Consumer
 import androidx.test.rule.GrantPermissionRule
 import org.junit.rules.RuleChain
 import org.junit.rules.TestRule
@@ -33,12 +33,52 @@
 /**
  * JUnit rule for benchmarking large app operations like startup.
  */
-@RequiresApi(23)
 public class MacrobenchmarkRule : TestRule {
     private lateinit var currentDescription: Description
 
     /**
      * Measure behavior of the specified [packageName] given a set of [metrics].
+     * Kotlin developers should use an overload of [measureRepeated] which uses a
+     * `MacrobenchmarkScope.() -> Unit` instead.
+     *
+     * @param packageName Package name of the app being measured.
+     * @param metrics List of metrics to measure.
+     * @param compilationMode Mode of compilation used before capturing measurement, such as
+     * [CompilationMode.SpeedProfile].
+     * @param startupMode Optional mode to force app launches performed with
+     * [MacrobenchmarkScope.startActivityAndWait] (and similar variants) to be of the assigned
+     * type. For example, `COLD` launches kill the process before the measureBlock, to ensure
+     * startups will go through full process creation. Generally, leave as null for non-startup
+     * benchmarks.
+     * @param iterations Number of times the [measureFn] will be run during measurement.
+     * @param setupFn The function performing app actions prior to the benchmark, for example,
+     * navigating to a UI where scrolling will be measured.
+     * @param measureFn The function performing app actions to benchmark.
+     */
+    @JvmOverloads
+    public fun measureRepeated(
+        packageName: String,
+        metrics: List<Metric>,
+        compilationMode: CompilationMode = CompilationMode.SpeedProfile(),
+        startupMode: StartupMode? = null,
+        @IntRange(from = 1)
+        iterations: Int,
+        setupFn: Consumer<MacrobenchmarkScope> = Consumer { },
+        measureFn: Consumer<MacrobenchmarkScope>
+    ) {
+        measureRepeated(
+            packageName,
+            metrics,
+            compilationMode,
+            startupMode,
+            iterations,
+            setupFn.toScopedFunction(),
+            measureFn.toScopedFunction()
+        )
+    }
+
+    /**
+     * Measure behavior of the specified [packageName] given a set of [metrics].
      *
      * @param packageName Package name of the app being measured.
      * @param metrics List of metrics to measure.
@@ -54,7 +94,7 @@
      * navigating to a UI where scrolling will be measured.
      * @param measureBlock The block performing app actions to benchmark.
      */
-    @JvmOverloads
+    @JvmSynthetic
     public fun measureRepeated(
         packageName: String,
         metrics: List<Metric>,
@@ -95,4 +135,10 @@
     }
 
     private fun Description.toUniqueName() = testClass.simpleName + "_" + methodName
+
+    private fun Consumer<MacrobenchmarkScope>.toScopedFunction(): MacrobenchmarkScope.() -> Unit {
+        return {
+            accept(this)
+        }
+    }
 }
diff --git a/benchmark/benchmark-macro/api/1.1.0-beta01.txt b/benchmark/benchmark-macro/api/1.1.0-beta01.txt
index b5ba91e..d8978e2 100644
--- a/benchmark/benchmark-macro/api/1.1.0-beta01.txt
+++ b/benchmark/benchmark-macro/api/1.1.0-beta01.txt
@@ -49,13 +49,18 @@
     method public void dropKernelPageCache();
     method public void killProcess();
     method public void pressHome(optional long delayDurationMs);
+    method public void pressHome();
     method public void startActivityAndWait(optional kotlin.jvm.functions.Function1<? super android.content.Intent,kotlin.Unit> block);
+    method public void startActivityAndWait();
     method public void startActivityAndWait(android.content.Intent intent);
   }
 
   public abstract sealed class Metric {
   }
 
+  public final class MetricKt {
+  }
+
   public final class MetricResultExtensionsKt {
   }
 
@@ -65,7 +70,7 @@
     enum_constant public static final androidx.benchmark.macro.StartupMode WARM;
   }
 
-  @RequiresApi(29) public final class StartupTimingMetric extends androidx.benchmark.macro.Metric {
+  @RequiresApi(23) public final class StartupTimingMetric extends androidx.benchmark.macro.Metric {
     ctor public StartupTimingMetric();
   }
 
diff --git a/benchmark/benchmark-macro/api/current.txt b/benchmark/benchmark-macro/api/current.txt
index b5ba91e..0143b9a 100644
--- a/benchmark/benchmark-macro/api/current.txt
+++ b/benchmark/benchmark-macro/api/current.txt
@@ -49,13 +49,18 @@
     method public void dropKernelPageCache();
     method public void killProcess();
     method public void pressHome(optional long delayDurationMs);
+    method public void pressHome();
     method public void startActivityAndWait(optional kotlin.jvm.functions.Function1<? super android.content.Intent,kotlin.Unit> block);
+    method public void startActivityAndWait();
     method public void startActivityAndWait(android.content.Intent intent);
   }
 
   public abstract sealed class Metric {
   }
 
+  public final class MetricKt {
+  }
+
   public final class MetricResultExtensionsKt {
   }
 
@@ -65,7 +70,7 @@
     enum_constant public static final androidx.benchmark.macro.StartupMode WARM;
   }
 
-  @RequiresApi(29) public final class StartupTimingMetric extends androidx.benchmark.macro.Metric {
+  public final class StartupTimingMetric extends androidx.benchmark.macro.Metric {
     ctor public StartupTimingMetric();
   }
 
diff --git a/benchmark/benchmark-macro/api/public_plus_experimental_1.1.0-beta01.txt b/benchmark/benchmark-macro/api/public_plus_experimental_1.1.0-beta01.txt
index b5ba91e..d8978e2 100644
--- a/benchmark/benchmark-macro/api/public_plus_experimental_1.1.0-beta01.txt
+++ b/benchmark/benchmark-macro/api/public_plus_experimental_1.1.0-beta01.txt
@@ -49,13 +49,18 @@
     method public void dropKernelPageCache();
     method public void killProcess();
     method public void pressHome(optional long delayDurationMs);
+    method public void pressHome();
     method public void startActivityAndWait(optional kotlin.jvm.functions.Function1<? super android.content.Intent,kotlin.Unit> block);
+    method public void startActivityAndWait();
     method public void startActivityAndWait(android.content.Intent intent);
   }
 
   public abstract sealed class Metric {
   }
 
+  public final class MetricKt {
+  }
+
   public final class MetricResultExtensionsKt {
   }
 
@@ -65,7 +70,7 @@
     enum_constant public static final androidx.benchmark.macro.StartupMode WARM;
   }
 
-  @RequiresApi(29) public final class StartupTimingMetric extends androidx.benchmark.macro.Metric {
+  @RequiresApi(23) public final class StartupTimingMetric extends androidx.benchmark.macro.Metric {
     ctor public StartupTimingMetric();
   }
 
diff --git a/benchmark/benchmark-macro/api/public_plus_experimental_current.txt b/benchmark/benchmark-macro/api/public_plus_experimental_current.txt
index b5ba91e..07f38c8 100644
--- a/benchmark/benchmark-macro/api/public_plus_experimental_current.txt
+++ b/benchmark/benchmark-macro/api/public_plus_experimental_current.txt
@@ -31,6 +31,9 @@
   public final class CompilationModeKt {
   }
 
+  @kotlin.RequiresOptIn(message="The Baseline profile generation API is experimental.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ExperimentalBaselineProfilesApi {
+  }
+
   public final class FrameTimingMetric extends androidx.benchmark.macro.Metric {
     ctor public FrameTimingMetric();
   }
@@ -49,13 +52,18 @@
     method public void dropKernelPageCache();
     method public void killProcess();
     method public void pressHome(optional long delayDurationMs);
+    method public void pressHome();
     method public void startActivityAndWait(optional kotlin.jvm.functions.Function1<? super android.content.Intent,kotlin.Unit> block);
+    method public void startActivityAndWait();
     method public void startActivityAndWait(android.content.Intent intent);
   }
 
   public abstract sealed class Metric {
   }
 
+  public final class MetricKt {
+  }
+
   public final class MetricResultExtensionsKt {
   }
 
@@ -65,7 +73,7 @@
     enum_constant public static final androidx.benchmark.macro.StartupMode WARM;
   }
 
-  @RequiresApi(29) public final class StartupTimingMetric extends androidx.benchmark.macro.Metric {
+  public final class StartupTimingMetric extends androidx.benchmark.macro.Metric {
     ctor public StartupTimingMetric();
   }
 
diff --git a/benchmark/benchmark-macro/api/restricted_1.1.0-beta01.txt b/benchmark/benchmark-macro/api/restricted_1.1.0-beta01.txt
index f7121a1e..7717a56 100644
--- a/benchmark/benchmark-macro/api/restricted_1.1.0-beta01.txt
+++ b/benchmark/benchmark-macro/api/restricted_1.1.0-beta01.txt
@@ -58,13 +58,18 @@
     method public void dropKernelPageCache();
     method public void killProcess();
     method public void pressHome(optional long delayDurationMs);
+    method public void pressHome();
     method public void startActivityAndWait(optional kotlin.jvm.functions.Function1<? super android.content.Intent,kotlin.Unit> block);
+    method public void startActivityAndWait();
     method public void startActivityAndWait(android.content.Intent intent);
   }
 
   public abstract sealed class Metric {
   }
 
+  public final class MetricKt {
+  }
+
   public final class MetricResultExtensionsKt {
   }
 
@@ -74,7 +79,11 @@
     enum_constant public static final androidx.benchmark.macro.StartupMode WARM;
   }
 
-  @RequiresApi(29) public final class StartupTimingMetric extends androidx.benchmark.macro.Metric {
+  @RequiresApi(29) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class StartupTimingLegacyMetric extends androidx.benchmark.macro.Metric {
+    ctor public StartupTimingLegacyMetric();
+  }
+
+  @RequiresApi(23) public final class StartupTimingMetric extends androidx.benchmark.macro.Metric {
     ctor public StartupTimingMetric();
   }
 
diff --git a/benchmark/benchmark-macro/api/restricted_current.txt b/benchmark/benchmark-macro/api/restricted_current.txt
index f7121a1e..e7f39fc9 100644
--- a/benchmark/benchmark-macro/api/restricted_current.txt
+++ b/benchmark/benchmark-macro/api/restricted_current.txt
@@ -58,13 +58,18 @@
     method public void dropKernelPageCache();
     method public void killProcess();
     method public void pressHome(optional long delayDurationMs);
+    method public void pressHome();
     method public void startActivityAndWait(optional kotlin.jvm.functions.Function1<? super android.content.Intent,kotlin.Unit> block);
+    method public void startActivityAndWait();
     method public void startActivityAndWait(android.content.Intent intent);
   }
 
   public abstract sealed class Metric {
   }
 
+  public final class MetricKt {
+  }
+
   public final class MetricResultExtensionsKt {
   }
 
@@ -74,7 +79,11 @@
     enum_constant public static final androidx.benchmark.macro.StartupMode WARM;
   }
 
-  @RequiresApi(29) public final class StartupTimingMetric extends androidx.benchmark.macro.Metric {
+  @RequiresApi(29) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class StartupTimingLegacyMetric extends androidx.benchmark.macro.Metric {
+    ctor public StartupTimingLegacyMetric();
+  }
+
+  public final class StartupTimingMetric extends androidx.benchmark.macro.Metric {
     ctor public StartupTimingMetric();
   }
 
diff --git a/benchmark/benchmark-macro/build.gradle b/benchmark/benchmark-macro/build.gradle
index 4bf1022..1a0de1c 100644
--- a/benchmark/benchmark-macro/build.gradle
+++ b/benchmark/benchmark-macro/build.gradle
@@ -17,6 +17,7 @@
 import androidx.build.LibraryGroups
 import androidx.build.Publish
 import androidx.build.SupportConfigKt
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
 plugins {
     id("AndroidXPlugin")
@@ -26,8 +27,7 @@
 
 android {
     defaultConfig {
-        // 21 is perfetto min API, and required for shell commands
-        minSdkVersion 21
+        minSdkVersion 23
     }
     sourceSets {
         main.assets.srcDirs += new File(
@@ -68,6 +68,13 @@
     description = "Android Benchmark - Macrobenchmark"
 }
 
+// Allow usage of Kotlin's @OptIn.
+tasks.withType(KotlinCompile).configureEach {
+    kotlinOptions {
+        freeCompilerArgs += [ '-Xopt-in=kotlin.RequiresOptIn' ]
+    }
+}
+
 // Define a task dependency so the app is installed before we run macro benchmarks.
 tasks.getByPath(":benchmark:benchmark-macro-junit4:connectedCheck")
         .dependsOn(
diff --git a/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/MacrobenchmarkTest.kt b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/MacrobenchmarkTest.kt
index 77f691f..46bceab 100644
--- a/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/MacrobenchmarkTest.kt
+++ b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/MacrobenchmarkTest.kt
@@ -17,7 +17,6 @@
 package androidx.benchmark.macro
 
 import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SdkSuppress
 import androidx.test.filters.SmallTest
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -64,24 +63,4 @@
         }
         assertTrue(exception.message!!.contains("Require iterations > 0"))
     }
-
-    @SdkSuppress(maxSdkVersion = 22)
-    @Test
-    fun macrobenchmarkWithStartupMode_sdkVersion() {
-        val exception = assertFailsWith<IllegalArgumentException> {
-            macrobenchmarkWithStartupMode(
-                uniqueName = "uniqueName", // ignored, uniqueness not important
-                className = "className",
-                testName = "testName",
-                packageName = "com.ignored",
-                metrics = listOf(FrameTimingMetric()),
-                compilationMode = CompilationMode.None,
-                iterations = 1,
-                startupMode = null,
-                setupBlock = {},
-                measureBlock = {}
-            )
-        }
-        assertTrue(exception.message!!.contains("requires Android 6 (API 23) or greater"))
-    }
 }
\ No newline at end of file
diff --git a/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/StartupTimingMetricTest.kt b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/StartupTimingMetricTest.kt
index 6098833..874f1e0 100644
--- a/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/StartupTimingMetricTest.kt
+++ b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/StartupTimingMetricTest.kt
@@ -16,7 +16,9 @@
 
 package androidx.benchmark.macro
 
+import android.annotation.SuppressLint
 import android.content.Intent
+import android.os.Build
 import androidx.annotation.RequiresApi
 import androidx.benchmark.Outputs
 import androidx.benchmark.perfetto.PerfettoCaptureWrapper
@@ -37,7 +39,7 @@
 import kotlin.test.assertNotNull
 import kotlin.test.assertTrue
 
-@SdkSuppress(minSdkVersion = 29)
+@SdkSuppress(minSdkVersion = 23)
 @RunWith(AndroidJUnit4::class)
 class StartupTimingMetricTest {
     @MediumTest
@@ -45,7 +47,7 @@
     fun noResults() {
         assumeTrue(isAbiSupported())
         val packageName = "fake.package.fiction.nostartups"
-        val iterationResult = measureStartup(packageName) {
+        val iterationResult = measureStartup(packageName, StartupMode.COLD) {
             // Do nothing
         }
         assertEquals(true, iterationResult.singleMetrics.isEmpty())
@@ -53,11 +55,15 @@
 
     @LargeTest
     @Test
+    // Disabled pre-29, as other process may not have tracing for reportFullyDrawn pre-29, due to
+    // lack of profileable. Within our test process (other startup tests in this class), we use
+    // reflection to force reportFullyDrawn() to be traced. See b/182386956
+    @SdkSuppress(minSdkVersion = 29)
     fun validateStartup() {
         assumeTrue(isAbiSupported())
         val packageName = "androidx.benchmark.integration.macrobenchmark.target"
         val scope = MacrobenchmarkScope(packageName = packageName, launchWithClearTask = true)
-        val metrics = measureStartup(packageName) {
+        val iterationResult = measureStartup(packageName, StartupMode.COLD) {
             // Simulate a cold start
             scope.killProcess()
             scope.dropKernelPageCache()
@@ -68,44 +74,56 @@
                     "androidx.benchmark.integration.macrobenchmark.target.TRIVIAL_STARTUP_ACTIVITY"
             }
         }
-        val hasStartupMetrics = "startupMs" in metrics.singleMetrics
-        assertEquals(hasStartupMetrics, true)
-        assertNotNull(metrics.timelineRangeNs)
+
+        assertEquals(
+            setOf("timeToInitialDisplayMs", "timeToFullDisplayMs"),
+            iterationResult.singleMetrics.keys
+        )
+        assertNotNull(iterationResult.timelineRangeNs)
     }
 
-    private fun validateStartup_fullyDrawn(delay: Long) {
+    private fun validateStartup_fullyDrawn(delayMs: Long) {
         assumeTrue(isAbiSupported())
-        val packageName = "androidx.benchmark.macro.test"
-        val scope = MacrobenchmarkScope(packageName = packageName, launchWithClearTask = true)
-        val iterationResult = measureStartup(packageName) {
+        val scope = MacrobenchmarkScope(packageName = Packages.TEST, launchWithClearTask = true)
+        val iterationResult = measureStartup(Packages.TEST, StartupMode.WARM) {
             // Simulate a warm start, since it's our own process
             scope.pressHome()
             scope.startActivityAndWait(
                 ConfigurableActivity.createIntent(
                     text = "ORIGINAL TEXT",
-                    reportFullyDrawnWithDelay = delay
+                    reportFullyDrawnWithDelay = delayMs
                 )
             )
 
-            if (delay > 0) {
+            if (delayMs > 0) {
                 UiDevice
                     .getInstance(InstrumentationRegistry.getInstrumentation())
                     .wait(Until.findObject(By.text(ConfigurableActivity.FULLY_DRAWN_TEXT)), 3000)
             }
         }
-        assertTrue("startupMs" in iterationResult.singleMetrics)
-        assertTrue("fullyDrawnMs" in iterationResult.singleMetrics)
 
-        val startupMs = iterationResult.singleMetrics["startupMs"]!!
-        val fullyDrawnMs = iterationResult.singleMetrics["fullyDrawnMs"]!!
-
-        val startupShouldBeFaster = delay > 0
         assertEquals(
-            startupShouldBeFaster,
-            startupMs < fullyDrawnMs,
-            "startup $startupMs, fully drawn $fullyDrawnMs"
+            setOf("timeToInitialDisplayMs", "timeToFullDisplayMs"),
+            iterationResult.singleMetrics.keys
         )
         assertNotNull(iterationResult.timelineRangeNs)
+
+        val timeToInitialDisplayMs = iterationResult.singleMetrics["timeToInitialDisplayMs"]!!
+        val timeToFullDisplayMs = iterationResult.singleMetrics["timeToFullDisplayMs"]!!
+
+        if (delayMs == 0L) {
+            // since reportFullyDrawn is dispatched before startup is complete,
+            // timeToInitialDisplay and timeToFullDisplay should match
+            assertEquals(timeToFullDisplayMs, timeToInitialDisplayMs, 0.0001)
+        } else {
+            // expect to see at a gap of around delayMs or more between two metrics
+            assertTrue(
+                timeToFullDisplayMs > timeToInitialDisplayMs,
+                "Didn't see full draw delayed after initial display: " +
+                    "ttid $timeToInitialDisplayMs, ttfd $timeToFullDisplayMs"
+            )
+        }
+        assertNotNull(iterationResult.timelineRangeNs)
     }
 
     @LargeTest
@@ -116,41 +134,116 @@
 
     @LargeTest
     @Test
+    @SdkSuppress(minSdkVersion = 29) // TODO: fullydrawn behavior pre-profileable tag
     fun validateStartup_fullyDrawn_delayed() {
         validateStartup_fullyDrawn(100)
     }
 
+    private fun getApi31WarmMetrics(metric: Metric): IterationResult {
+        assumeTrue(isAbiSupported())
+        val traceFile = createTempFileFromAsset("api31_startup_warm", ".perfetto-trace")
+        val packageName = "androidx.benchmark.integration.macrobenchmark.target"
+        metric.configure(packageName)
+        return metric.getMetrics(
+            captureInfo = Metric.CaptureInfo(
+                targetPackageName = "androidx.benchmark.integration.macrobenchmark.target",
+                testPackageName = "androidx.benchmark.integration.macrobenchmark.test",
+                startupMode = StartupMode.WARM,
+                apiLevel = 31
+            ),
+            tracePath = traceFile.absolutePath
+        )
+    }
+
+    @MediumTest
+    @Test
+    fun fixedStartupTraceMetricsReport_fullyDrawnBeforeFirstFrame() {
+        assumeTrue(isAbiSupported())
+        val traceFile = createTempFileFromAsset(
+            prefix = "api24_startup_sameproc_immediatefullydrawn",
+            suffix = ".perfetto-trace"
+        )
+        val metric = StartupTimingMetric()
+        metric.configure(Packages.TEST)
+        val metrics = metric.getMetrics(
+            captureInfo = Metric.CaptureInfo(
+                targetPackageName = Packages.TEST,
+                testPackageName = Packages.TEST,
+                startupMode = StartupMode.WARM,
+                apiLevel = 24
+            ),
+            tracePath = traceFile.absolutePath
+        )
+
+        // check known values
+        assertEquals(
+            setOf("timeToInitialDisplayMs", "timeToFullDisplayMs"),
+            metrics.singleMetrics.keys
+        )
+        assertEquals(169.67427, metrics.singleMetrics["timeToInitialDisplayMs"]!!, 0.0001)
+        assertEquals(169.67427, metrics.singleMetrics["timeToFullDisplayMs"]!!, 0.0001)
+        assertEquals(477547965787..477717640057, metrics.timelineRangeNs)
+    }
+
     @MediumTest
     @Test
     fun fixedStartupTraceMetrics() {
-        assumeTrue(isAbiSupported())
-        val traceFile = createTempFileFromAsset("WarmStartup", ".trace")
-        val metric = StartupTimingMetric()
-        val packageName = "androidx.benchmark.integration.macrobenchmark.target"
-        metric.configure(packageName)
-        val metrics = metric.getMetrics(packageName, traceFile.absolutePath)
+        val metrics = getApi31WarmMetrics(StartupTimingMetric())
 
         // check known values
-        val hasStartupMetrics = "startupMs" in metrics.singleMetrics
-        assertEquals(hasStartupMetrics, true)
-        assertEquals(54.82037, metrics.singleMetrics["startupMs"]!!, 0.0001)
-        assertEquals(4131145997215L, metrics.timelineRangeNs?.first)
-        assertEquals(4131200817585L, metrics.timelineRangeNs?.last)
+        assertEquals(
+            setOf("timeToInitialDisplayMs", "timeToFullDisplayMs"),
+            metrics.singleMetrics.keys
+        )
+        assertEquals(64.748027, metrics.singleMetrics["timeToInitialDisplayMs"]!!, 0.0001)
+        assertEquals(555.968701, metrics.singleMetrics["timeToFullDisplayMs"]!!, 0.0001)
+        assertEquals(186982050780778..186982606749479, metrics.timelineRangeNs)
+    }
+
+    @SuppressLint("NewApi") // suppressed for StartupTimingLegacyMetric, since data is fixed
+    @MediumTest
+    @Test
+    fun fixedStartupTraceMetrics_legacy() {
+        val metrics = getApi31WarmMetrics(StartupTimingLegacyMetric())
+
+        // check known values
+        assertEquals(setOf("startupMs", "fullyDrawnMs"), metrics.singleMetrics.keys)
+        assertEquals(64.748027, metrics.singleMetrics["startupMs"]!!, 0.0001)
+        assertEquals(543.742658, metrics.singleMetrics["fullyDrawnMs"]!!, 0.0001)
+        assertEquals(186982050780778..186982115528805, metrics.timelineRangeNs)
     }
 }
 
-@RequiresApi(29)
-internal fun measureStartup(packageName: String, measureBlock: () -> Unit): IterationResult {
+@RequiresApi(23)
+internal fun measureStartup(
+    packageName: String,
+    startupMode: StartupMode,
+    measureBlock: () -> Unit
+): IterationResult {
     val wrapper = PerfettoCaptureWrapper()
     val metric = StartupTimingMetric()
     metric.configure(packageName)
     val tracePath = wrapper.record(
         benchmarkName = packageName,
         iteration = 1,
-        packages = listOf(packageName),
+        // note - packageName may be this package, so we convert to set then list to make unique
+        // and on API 23 and below, we use reflection to trace instead within this process
+        packages = if (Build.VERSION.SDK_INT >= 24 && packageName != Packages.TEST) {
+            listOf(packageName, Packages.TEST)
+        } else {
+            listOf(packageName)
+        },
         block = measureBlock
     )!!
-    return metric.getMetrics(packageName, tracePath)
+    return metric.getMetrics(
+        captureInfo = Metric.CaptureInfo(
+            targetPackageName = packageName,
+            testPackageName = Packages.TEST,
+            startupMode = startupMode,
+            apiLevel = Build.VERSION.SDK_INT
+        ),
+        tracePath = tracePath
+    )
 }
 
 @Suppress("SameParameterValue")
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
index 4f6af3c..d79c157 100644
--- 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
@@ -18,7 +18,7 @@
 
 import androidx.benchmark.macro.createTempFileFromAsset
 import androidx.benchmark.macro.perfetto.FrameTimingQuery.SubMetric.FrameCpuTime
-import androidx.benchmark.macro.perfetto.FrameTimingQuery.SubMetric.FrameNegativeSlackTime
+import androidx.benchmark.macro.perfetto.FrameTimingQuery.SubMetric.FrameOverrunTime
 import androidx.benchmark.macro.perfetto.FrameTimingQuery.SubMetric.FrameUiTime
 import androidx.benchmark.perfetto.PerfettoHelper.Companion.isAbiSupported
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -73,7 +73,7 @@
             expected = mapOf(
                 FrameCpuTime to listOf(6881407L, 5648542L, 3830261L, 4343438L),
                 FrameUiTime to listOf(2965052L, 3246407L, 1562188L, 1945469L),
-                FrameNegativeSlackTime to listOf(-5207137L, -11699862L, -14025295L, -12300155L)
+                FrameOverrunTime to listOf(-5207137L, -11699862L, -14025295L, -12300155L)
             ),
             actual = frameSubMetrics.mapValues {
                 it.value.subList(0, 4)
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 5bcd11c..210fe48 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
@@ -76,13 +76,13 @@
     fun querySlices() {
         // check known slice content is queryable
         assumeTrue(isAbiSupported())
-        val traceFile = createTempFileFromAsset("WarmStartup", ".trace")
+        val traceFile = createTempFileFromAsset("api31_startup_cold", ".perfetto-trace")
         assertEquals(
             expected = listOf(
                 Slice(
                     name = "activityStart",
-                    ts = 4131162160602,
-                    dur = 17779012
+                    ts = 186975009436431,
+                    dur = 29580628
                 )
             ),
             actual = PerfettoTraceProcessor.querySlices(traceFile.absolutePath, "activityStart")
@@ -91,13 +91,13 @@
             expected = listOf(
                 Slice(
                     name = "activityStart",
-                    ts = 4131162160602,
-                    dur = 17779012
+                    ts = 186975009436431,
+                    dur = 29580628
                 ),
                 Slice(
                     name = "activityResume",
-                    ts = 4131180586020,
-                    dur = 3398750
+                    ts = 186975039764298,
+                    dur = 6570418
                 )
             ),
             actual = PerfettoTraceProcessor.querySlices(
diff --git a/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/StartupTimingQueryTest.kt b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/StartupTimingQueryTest.kt
index 54dd8a0..4590470 100644
--- a/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/StartupTimingQueryTest.kt
+++ b/benchmark/benchmark-macro/src/androidTest/java/androidx/benchmark/macro/perfetto/StartupTimingQueryTest.kt
@@ -57,7 +57,7 @@
         StartupTimingQuery.SubMetrics(
             timeToInitialDisplayNs = 358237760,
             timeToFullDisplayNs = 784769167,
-            timelineRange = 269543917431669..269544702200836
+            timelineRangeNs = 269543917431669..269544702200836
         )
     )
 
@@ -68,7 +68,7 @@
         StartupTimingQuery.SubMetrics(
             timeToInitialDisplayNs = 135008333,
             timeToFullDisplayNs = 598500833,
-            timelineRange = 268757401479247..268757999980080
+            timelineRangeNs = 268757401479247..268757999980080
         )
     )
 
@@ -79,7 +79,7 @@
         StartupTimingQuery.SubMetrics(
             timeToInitialDisplayNs = 54248802,
             timeToFullDisplayNs = 529336511,
-            timelineRange = 268727533977218..268728063313729
+            timelineRangeNs = 268727533977218..268728063313729
         )
     )
 
@@ -88,9 +88,9 @@
         api = 31,
         startupMode = StartupMode.COLD,
         StartupTimingQuery.SubMetrics(
-            timeToInitialDisplayNs = 137401159,
-            timeToFullDisplayNs = 612424592,
-            timelineRange = 186974946587883..186975559012475
+            timeToInitialDisplayNs = 145792410,
+            timeToFullDisplayNs = 620815843,
+            timelineRangeNs = 186974938196632..186975559012475
         )
     )
 
@@ -99,9 +99,9 @@
         api = 31,
         startupMode = StartupMode.WARM,
         StartupTimingQuery.SubMetrics(
-            timeToInitialDisplayNs = 55378859,
-            timeToFullDisplayNs = 546599533,
-            timelineRange = 186982060149946..186982606749479
+            timeToInitialDisplayNs = 64748027,
+            timeToFullDisplayNs = 555968701,
+            timelineRangeNs = 186982050780778..186982606749479
         )
     )
 
@@ -110,9 +110,9 @@
         api = 31,
         startupMode = StartupMode.HOT,
         StartupTimingQuery.SubMetrics(
-            timeToInitialDisplayNs = 42757609,
-            timeToFullDisplayNs = 537651148,
-            timelineRange = 186969446545095..186969984196243
+            timeToInitialDisplayNs = 47329015,
+            timeToFullDisplayNs = 542222554,
+            timelineRangeNs = 186969441973689..186969984196243
         )
     )
 }
\ No newline at end of file
diff --git a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/BaselineProfiles.kt b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/BaselineProfiles.kt
index d5cd1c1..20694f0 100644
--- a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/BaselineProfiles.kt
+++ b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/BaselineProfiles.kt
@@ -19,28 +19,12 @@
 import android.os.Build
 import android.util.Log
 import androidx.annotation.RestrictTo
-import androidx.benchmark.ConfigurationError
-import androidx.benchmark.DeviceInfo
 import androidx.benchmark.InstrumentationResults
 import androidx.benchmark.Outputs
 import androidx.benchmark.Shell
-import androidx.benchmark.checkAndGetSuppressionState
-import androidx.benchmark.conditionalError
 import androidx.benchmark.userspaceTrace
 
 /**
- * A list of configuration errors applicable for baseline profile collection.
- */
-private val errors: List<ConfigurationError> = listOfNotNull(
-    conditionalError(
-        hasError = !DeviceInfo.isRooted,
-        id = "NEEDS-ROOT",
-        summary = "Run on a rooted device",
-        message = "Baseline Profile Collection needs to run on a rooted device."
-    )
-)
-
-/**
  * Collects baseline profiles using a given [profileBlock].
  *
  * @suppress
@@ -57,11 +41,10 @@
     }
 
     require(Shell.isSessionRooted()) {
-        "Baseline Profile Collection requires a rooted session. Use `adb root`."
+        "Baseline Profile Collection requires a rooted device, and a rooted adb session." +
+            " Use `adb root`."
     }
 
-    errors.checkAndGetSuppressionState(emptySet())
-
     val startTime = System.nanoTime()
     val scope = MacrobenchmarkScope(packageName, /* launchWithClearTask */ true)
     val speedProfile = CompilationMode.SpeedProfile(warmupIterations = 3)
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/ExperimentalBaselineProfilesApi.kt
similarity index 64%
copy from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt
copy to benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/ExperimentalBaselineProfilesApi.kt
index e5bb607..eb51206 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt
+++ b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/ExperimentalBaselineProfilesApi.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 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,13 +14,9 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.platform
+package androidx.benchmark.macro
 
-import java.awt.Desktop
-import java.net.URI
-
-internal class DesktopUriHandler : UriHandler {
-    override fun openUri(uri: String) {
-        Desktop.getDesktop().browse(URI(uri))
-    }
-}
\ No newline at end of file
+@RequiresOptIn(message = "The Baseline profile generation API is experimental.")
+@Retention(AnnotationRetention.BINARY)
+@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
+annotation class ExperimentalBaselineProfilesApi
diff --git a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/IterationResult.kt b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/IterationResult.kt
index be38860..1adf20f 100644
--- a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/IterationResult.kt
+++ b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/IterationResult.kt
@@ -58,6 +58,14 @@
             }
         }
     }
+
+    companion object {
+        val EMPTY = IterationResult(
+            singleMetrics = emptyMap(),
+            sampledMetrics = emptyMap(),
+            timelineRangeNs = null
+        )
+    }
 }
 
 internal fun List<IterationResult>.mergeIterationMeasurements() = BenchmarkResult.Measurements(
diff --git a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/Macrobenchmark.kt b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/Macrobenchmark.kt
index 34b557d..52cd0ef 100644
--- a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/Macrobenchmark.kt
+++ b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/Macrobenchmark.kt
@@ -107,6 +107,7 @@
     compilationMode: CompilationMode = CompilationMode.SpeedProfile(),
     iterations: Int,
     launchWithClearTask: Boolean,
+    startupModeMetricHint: StartupMode?,
     setupBlock: MacrobenchmarkScope.(Boolean) -> Unit,
     measureBlock: MacrobenchmarkScope.() -> Unit
 ) {
@@ -116,10 +117,6 @@
     require(metrics.isNotEmpty()) {
         "Empty list of metrics passed to metrics param, must pass at least one Metric"
     }
-    require(Build.VERSION.SDK_INT >= 23) {
-        "Macrobenchmark currently requires Android 6 (API 23) or greater."
-    }
-
     // skip benchmark if not supported by vm settings
     compilationMode.assumeSupportedWithVmSettings()
 
@@ -199,7 +196,12 @@
             val iterationResult = userspaceTrace("extract metrics") {
                 metrics
                     // capture list of Map<String,Long> per metric
-                    .map { it.getMetrics(packageName, tracePath) }
+                    .map { it.getMetrics(Metric.CaptureInfo(
+                        targetPackageName = packageName,
+                        testPackageName = macrobenchPackageName,
+                        startupMode = startupModeMetricHint,
+                        apiLevel = Build.VERSION.SDK_INT
+                    ), tracePath) }
                     // merge into one map
                     .reduce { sum, element -> sum + element }
             }
@@ -295,6 +297,7 @@
         metrics = metrics,
         compilationMode = compilationMode,
         iterations = iterations,
+        startupModeMetricHint = startupMode,
         setupBlock = { firstIterationAfterCompile ->
             if (startupMode == StartupMode.COLD) {
                 killProcess()
diff --git a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/MacrobenchmarkScope.kt b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/MacrobenchmarkScope.kt
index e15d0cd..c516178 100644
--- a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/MacrobenchmarkScope.kt
+++ b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/MacrobenchmarkScope.kt
@@ -55,6 +55,7 @@
      *
      * @param block Allows customization of the intent used to launch the activity.
      */
+    @JvmOverloads
     public fun startActivityAndWait(
         block: (Intent) -> Unit = {}
     ) {
@@ -115,6 +116,7 @@
      * Useful for resetting the test to a base condition in cases where the app isn't killed in
      * each iteration.
      */
+    @JvmOverloads
     public fun pressHome(delayDurationMs: Long = 300) {
         device.pressHome()
         Thread.sleep(delayDurationMs)
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 d1128a6..2dc1310 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,6 +16,7 @@
 
 package androidx.benchmark.macro
 
+import android.annotation.SuppressLint
 import android.os.Build
 import androidx.annotation.RequiresApi
 import androidx.annotation.RestrictTo
@@ -24,6 +25,7 @@
 import androidx.benchmark.macro.perfetto.FrameTimingQuery.SubMetric
 import androidx.benchmark.macro.perfetto.PerfettoResultsParser.parseStartupResult
 import androidx.benchmark.macro.perfetto.PerfettoTraceProcessor
+import androidx.benchmark.macro.perfetto.StartupTimingQuery
 import androidx.test.platform.app.InstrumentationRegistry
 
 /**
@@ -41,9 +43,18 @@
      * TODO: takes package for package level filtering, but probably want a
      *  general config object coming into [start].
      */
-    internal abstract fun getMetrics(packageName: String, tracePath: String): IterationResult
+    internal abstract fun getMetrics(captureInfo: CaptureInfo, tracePath: String): IterationResult
+
+    internal data class CaptureInfo(
+        val apiLevel: Int,
+        val targetPackageName: String,
+        val testPackageName: String,
+        val startupMode: StartupMode?
+    )
 }
 
+private fun Long.nsToDoubleMs(): Double = this / 1_000_000.0
+
 /**
  * Legacy version of FrameTimingMetric, based on 'dumpsys gfxinfo' instead of trace data.
  *
@@ -125,7 +136,7 @@
         "totalFrameCount"
     )
 
-    internal override fun getMetrics(packageName: String, tracePath: String) = IterationResult(
+    internal override fun getMetrics(captureInfo: CaptureInfo, tracePath: String) = IterationResult(
         singleMetrics = helper.metrics
             .map {
                 val prefix = "gfxinfo_${packageName}_"
@@ -147,6 +158,15 @@
 /**
  * Metric which captures timing information from frames produced by a benchmark, such as
  * a scrolling or animation benchmark.
+ *
+ * This outputs the following measurements:
+ *
+ * * `frameOverrunMs` (Requires API 29) - How much time a given frame missed its deadline by.
+ * Positive numbers indicate a dropped frame and visible jank / stutter, negative numbers indicate
+ * how much faster than the deadline a frame was.
+ *
+ * * `frameCpuTimeMs` - How much time the frame took to be produced on the CPU - on both the UI
+ * Thread, and RenderThread.
  */
 @Suppress("CanSealedSubClassBeObject")
 public class FrameTimingMetric : Metric() {
@@ -154,20 +174,19 @@
     internal override fun start() {}
     internal override fun stop() {}
 
-    internal override fun getMetrics(packageName: String, tracePath: String): IterationResult {
+    @SuppressLint("SyntheticAccessor")
+    internal override fun getMetrics(captureInfo: CaptureInfo, tracePath: String): IterationResult {
         val subMetricsMsMap = FrameTimingQuery.getFrameSubMetrics(
             absoluteTracePath = tracePath,
             captureApiLevel = Build.VERSION.SDK_INT,
-            packageName = packageName
+            packageName = captureInfo.targetPackageName
         )
-            .filterKeys { it == SubMetric.FrameCpuTime || it == SubMetric.FrameNegativeSlackTime }
+            .filterKeys { it == SubMetric.FrameCpuTime || it == SubMetric.FrameOverrunTime }
             .mapKeys {
-                if (it.key == SubMetric.FrameCpuTime) "frameCpuTimeMs" else "frameNegativeSlackMs"
+                if (it.key == SubMetric.FrameCpuTime) "frameCpuTimeMs" else "frameOverrunMs"
             }
             .mapValues { entry ->
-                entry.value.map { timeNs ->
-                    timeNs / 1_000_000.0 // Convert to ms
-                }
+                entry.value.map { timeNs -> timeNs.nsToDoubleMs() }
             }
         return IterationResult(
             singleMetrics = emptyMap(),
@@ -179,9 +198,18 @@
 
 /**
  * Captures app startup timing metrics.
+ *
+ * This outputs the following measurements:
+ *
+ * * `timeToInitialDisplayMs` - Time from the system receiving a launch intent to rendering the
+ * first frame of the destination Activity.
+ *
+ * * `timeToFullDisplayMs` - Time from the system receiving a launch intent until the application
+ * reports fully drawn via [android.app.Activity.reportFullyDrawn]. The measurement stops at the
+ * completion of rendering the first frame after (or containing) the `reportFullyDrawn()` call. This
+ * measurement may not be available prior to API 29.
  */
 @Suppress("CanSealedSubClassBeObject")
-@RequiresApi(29)
 public class StartupTimingMetric : Metric() {
     internal override fun configure(packageName: String) {
     }
@@ -192,8 +220,49 @@
     internal override fun stop() {
     }
 
-    internal override fun getMetrics(packageName: String, tracePath: String): IterationResult {
+    @SuppressLint("SyntheticAccessor")
+    internal override fun getMetrics(captureInfo: CaptureInfo, tracePath: String): IterationResult {
+        return StartupTimingQuery.getFrameSubMetrics(
+            absoluteTracePath = tracePath,
+            captureApiLevel = captureInfo.apiLevel,
+            targetPackageName = captureInfo.targetPackageName,
+            testPackageName = captureInfo.testPackageName,
+
+            // Pick an arbitrary startup mode if unspecified. In the future, consider throwing an
+            // error if startup mode not defined
+            startupMode = captureInfo.startupMode ?: StartupMode.COLD
+        )?.run {
+            @Suppress("UNCHECKED_CAST")
+            IterationResult(
+                singleMetrics = mapOf(
+                    "timeToInitialDisplayMs" to timeToInitialDisplayNs.nsToDoubleMs(),
+                    "timeToFullDisplayMs" to timeToFullDisplayNs?.nsToDoubleMs()
+                ).filterValues { it != null } as Map<String, Double>,
+                sampledMetrics = emptyMap(),
+                timelineRangeNs = timelineRangeNs
+            )
+        } ?: IterationResult.EMPTY
+    }
+}
+
+/**
+ * Captures app startup timing metrics.
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
+@Suppress("CanSealedSubClassBeObject")
+@RequiresApi(29)
+public class StartupTimingLegacyMetric : Metric() {
+    internal override fun configure(packageName: String) {
+    }
+
+    internal override fun start() {
+    }
+
+    internal override fun stop() {
+    }
+
+    internal override fun getMetrics(captureInfo: CaptureInfo, tracePath: String): IterationResult {
         val json = PerfettoTraceProcessor.getJsonMetrics(tracePath, "android_startup")
-        return parseStartupResult(json, packageName)
+        return parseStartupResult(json, captureInfo.targetPackageName)
     }
 }
diff --git a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/perfetto/ForceTracing.kt b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/perfetto/ForceTracing.kt
index 2f0c372..bfae5e1 100644
--- a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/perfetto/ForceTracing.kt
+++ b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/perfetto/ForceTracing.kt
@@ -34,15 +34,14 @@
         android.os.Trace::class.java.getMethod(
             "traceBegin",
             Long::class.javaPrimitiveType,
-            String::class.javaPrimitiveType
+            String::class.java
         )
     } else null
 
     private val traceEndMethod = if (Build.VERSION.SDK_INT < 24) {
         android.os.Trace::class.java.getMethod(
             "traceEnd",
-            Long::class.javaPrimitiveType,
-            String::class.javaPrimitiveType
+            Long::class.javaPrimitiveType
         )
     } else null
 
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
index f4c5bf0..1ef7b01 100644
--- 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
@@ -57,10 +57,10 @@
     enum class SubMetric {
         FrameCpuTime,
         FrameUiTime,
-        FrameNegativeSlackTime;
+        FrameOverrunTime;
 
         fun supportedOnApiLevel(apiLevel: Int): Boolean {
-            return apiLevel >= 31 || this != FrameNegativeSlackTime
+            return apiLevel >= 31 || this != FrameOverrunTime
         }
     }
 
@@ -86,7 +86,7 @@
             return when (subMetric) {
                 SubMetric.FrameCpuTime -> rtSlice.endTs - uiSlice.ts
                 SubMetric.FrameUiTime -> uiSlice.dur
-                SubMetric.FrameNegativeSlackTime -> actualSlice!!.endTs - expectedSlice!!.endTs
+                SubMetric.FrameOverrunTime -> actualSlice!!.endTs - expectedSlice!!.endTs
             }
         }
         companion object {
diff --git a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/perfetto/StartupTimingQuery.kt b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/perfetto/StartupTimingQuery.kt
index 91d194b..1071219 100644
--- a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/perfetto/StartupTimingQuery.kt
+++ b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/perfetto/StartupTimingQuery.kt
@@ -17,6 +17,7 @@
 package androidx.benchmark.macro.perfetto
 
 import androidx.benchmark.macro.StartupMode
+import kotlin.math.max
 
 internal object StartupTimingQuery {
 
@@ -52,6 +53,11 @@
                     (slice.name LIKE "reportFullyDrawn() for %" AND process.pid LIKE thread.tid) OR
                     (slice.name LIKE "DrawFrame%" AND thread.name LIKE "RenderThread")
                 )
+            ) OR
+            (
+                -- Signals beginning of launch event, only present in API 29+
+                process.name LIKE "system_server" AND
+                slice.name LIKE "MetricsLogger:launchObserverNotifyIntentStarted"
             )
         )
         ------ Add in async slices
@@ -73,6 +79,7 @@
 
     enum class StartupSliceType {
         StartActivityAndWait,
+        NotifyStarted,
         Launching,
         ReportFullyDrawn,
         FrameUiThread,
@@ -83,7 +90,7 @@
     data class SubMetrics(
         val timeToInitialDisplayNs: Long,
         val timeToFullDisplayNs: Long?,
-        val timelineRange: LongRange
+        val timelineRangeNs: LongRange
     ) {
         constructor(
             startTs: Long,
@@ -92,7 +99,7 @@
         ) : this(
             timeToInitialDisplayNs = initialDisplayTs - startTs,
             timeToFullDisplayNs = fullDisplayTs?.let { it - startTs },
-            timelineRange = startTs..(fullDisplayTs ?: initialDisplayTs),
+            timelineRangeNs = startTs..(fullDisplayTs ?: initialDisplayTs),
         )
     }
 
@@ -137,6 +144,8 @@
                     it.name.startsWith("DrawFrame") -> StartupSliceType.FrameRenderThread
                     it.name.startsWith("launching") -> StartupSliceType.Launching
                     it.name.startsWith("reportFullyDrawn") -> StartupSliceType.ReportFullyDrawn
+                    it.name == "MetricsLogger:launchObserverNotifyIntentStarted" ->
+                        StartupSliceType.NotifyStarted
                     it.name == "activityResume" -> StartupSliceType.ActivityResume
                     it.name == "startActivityAndWait" -> StartupSliceType.StartActivityAndWait
                     else -> throw IllegalStateException("Unexpected slice $it")
@@ -158,8 +167,28 @@
                 startActivityAndWaitSlice.contains(it.ts) &&
                     (captureApiLevel < 23 || it.name == "launching: $targetPackageName")
             } ?: return null
-            startTs = launchingSlice.ts
-            initialDisplayTs = launchingSlice.endTs
+
+            startTs = if (captureApiLevel >= 29) {
+                // Starting on API 29, expect to see 'notify started' system_server slice
+                val notifyStartedSlice = groupedData[StartupSliceType.NotifyStarted]?.lastOrNull {
+                    it.ts < launchingSlice.ts
+                } ?: return null
+                notifyStartedSlice.ts
+            } else {
+                launchingSlice.ts
+            }
+
+            initialDisplayTs = max(
+                // conservative end - end of launching slice
+                launchingSlice.endTs,
+                // in some cases, 'launching' slice doesn't account for rendering response,
+                // so we do that manually - look for first frame starting within launch slice
+                // TODO: investigate where this happens (e.g. which APIs/StartupModes)
+                // TODO: would last frame that starts during launch be better?
+                findEndRenderTimeForUiFrame(uiSlices, rtSlices) { uiSlice ->
+                    uiSlice.ts > launchingSlice.ts
+                }
+            )
         } else {
             // Prior to API 29, hot starts weren't traced with the launching slice, so we do a best
             // guess - the time taken to Activity#onResume, and then produce the next frame.
diff --git a/benchmark/integration-tests/macrobenchmark/build.gradle b/benchmark/integration-tests/macrobenchmark/build.gradle
index e0a8ffe..b19f3fa 100644
--- a/benchmark/integration-tests/macrobenchmark/build.gradle
+++ b/benchmark/integration-tests/macrobenchmark/build.gradle
@@ -1,3 +1,5 @@
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
 /*
  * Copyright (C) 2020 The Android Open Source Project
  *
@@ -37,6 +39,13 @@
     androidTestImplementation(libs.testUiautomator)
 }
 
+// Allow usage of Kotlin's @OptIn.
+tasks.withType(KotlinCompile).configureEach {
+    kotlinOptions {
+        freeCompilerArgs += [ '-Xopt-in=kotlin.RequiresOptIn' ]
+    }
+}
+
 // Define a task dependency so the app is installed before we run macro benchmarks.
 tasks.getByPath(":benchmark:integration-tests:macrobenchmark:connectedCheck")
     .dependsOn(
diff --git a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/GithubBrowserBaselineProfile.kt b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/GithubBrowserBaselineProfile.kt
index 8c87dc6..ad70b84 100644
--- a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/GithubBrowserBaselineProfile.kt
+++ b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/GithubBrowserBaselineProfile.kt
@@ -17,6 +17,7 @@
 package androidx.benchmark.integration.macrobenchmark
 
 import android.graphics.Point
+import androidx.benchmark.macro.ExperimentalBaselineProfilesApi
 import androidx.benchmark.macro.junit4.BaselineProfileRule
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
@@ -31,6 +32,7 @@
 
 @LargeTest
 @SdkSuppress(minSdkVersion = 29)
+@OptIn(ExperimentalBaselineProfilesApi::class)
 @Ignore
 class GithubBrowserBaselineProfile {
 
diff --git a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/SmallListStartupBenchmark.kt b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/SmallListStartupBenchmark.kt
index a94d7da..98b8cfb20 100644
--- a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/SmallListStartupBenchmark.kt
+++ b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/SmallListStartupBenchmark.kt
@@ -20,7 +20,6 @@
 import androidx.benchmark.macro.StartupMode
 import androidx.benchmark.macro.junit4.MacrobenchmarkRule
 import androidx.test.filters.LargeTest
-import androidx.test.filters.SdkSuppress
 import androidx.testutils.createStartupCompilationParams
 import androidx.testutils.measureStartup
 import org.junit.Rule
@@ -29,7 +28,6 @@
 import org.junit.runners.Parameterized
 
 @LargeTest
-@SdkSuppress(minSdkVersion = 29)
 @RunWith(Parameterized::class)
 class SmallListStartupBenchmark(
     private val startupMode: StartupMode,
diff --git a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialListScrollBaselineProfile.kt b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialListScrollBaselineProfile.kt
index 3fb560a..b85d69c 100644
--- a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialListScrollBaselineProfile.kt
+++ b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialListScrollBaselineProfile.kt
@@ -18,6 +18,7 @@
 
 import android.content.Intent
 import android.graphics.Point
+import androidx.benchmark.macro.ExperimentalBaselineProfilesApi
 import androidx.benchmark.macro.junit4.BaselineProfileRule
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
@@ -30,6 +31,7 @@
 
 @LargeTest
 @SdkSuppress(minSdkVersion = 29)
+@OptIn(ExperimentalBaselineProfilesApi::class)
 class TrivialListScrollBaselineProfile {
     @get:Rule
     val baselineRule = BaselineProfileRule()
diff --git a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialStartupBenchmark.kt b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialStartupBenchmark.kt
index 16ca16b..856badf 100644
--- a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialStartupBenchmark.kt
+++ b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialStartupBenchmark.kt
@@ -20,7 +20,6 @@
 import androidx.benchmark.macro.StartupMode
 import androidx.benchmark.macro.junit4.MacrobenchmarkRule
 import androidx.test.filters.LargeTest
-import androidx.test.filters.SdkSuppress
 import androidx.testutils.createStartupCompilationParams
 import androidx.testutils.measureStartup
 import org.junit.Rule
@@ -29,7 +28,6 @@
 import org.junit.runners.Parameterized
 
 @LargeTest
-@SdkSuppress(minSdkVersion = 29)
 @RunWith(Parameterized::class)
 class TrivialStartupBenchmark(
     private val startupMode: StartupMode,
diff --git a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialStartupFullyDrawnBenchmark.kt b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialStartupFullyDrawnBenchmark.kt
index 22a5431..a49a418 100644
--- a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialStartupFullyDrawnBenchmark.kt
+++ b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialStartupFullyDrawnBenchmark.kt
@@ -19,15 +19,14 @@
 import android.content.Intent
 import androidx.benchmark.macro.CompilationMode
 import androidx.benchmark.macro.StartupMode
-import androidx.benchmark.macro.StartupTimingMetric
 import androidx.benchmark.macro.junit4.MacrobenchmarkRule
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
-import androidx.test.filters.SdkSuppress
 import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.uiautomator.By
 import androidx.test.uiautomator.UiDevice
 import androidx.test.uiautomator.Until
+import androidx.testutils.getStartupMetrics
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -41,7 +40,6 @@
  */
 @LargeTest
 @RunWith(AndroidJUnit4::class)
-@SdkSuppress(minSdkVersion = 29)
 class TrivialStartupFullyDrawnBenchmark {
     @get:Rule
     val benchmarkRule = MacrobenchmarkRule()
@@ -49,7 +47,7 @@
     fun startup(startupMode: StartupMode) = benchmarkRule.measureRepeated(
         compilationMode = CompilationMode.None,
         packageName = TARGET_PACKAGE_NAME,
-        metrics = listOf(StartupTimingMetric()),
+        metrics = getStartupMetrics(),
         startupMode = startupMode,
         iterations = 1
     ) {
diff --git a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialStartupJavaBenchmark.java b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialStartupJavaBenchmark.java
new file mode 100644
index 0000000..1ff96e0
--- /dev/null
+++ b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/TrivialStartupJavaBenchmark.java
@@ -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.
+ */
+
+package androidx.benchmark.integration.macrobenchmark;
+
+import androidx.benchmark.macro.CompilationMode;
+import androidx.benchmark.macro.StartupMode;
+import androidx.benchmark.macro.StartupTimingMetric;
+import androidx.benchmark.macro.junit4.MacrobenchmarkRule;
+import androidx.test.filters.SdkSuppress;
+
+import org.junit.Rule;
+import org.junit.Test;
+
+import java.util.Collections;
+
+public class TrivialStartupJavaBenchmark {
+    @Rule
+    public MacrobenchmarkRule mBenchmarkRule = new MacrobenchmarkRule();
+
+    @Test
+    @SdkSuppress(minSdkVersion = 29)
+    public void startup() {
+        mBenchmarkRule.measureRepeated(
+                "androidx.benchmark.integration.macrobenchmark.target",
+                Collections.singletonList(new StartupTimingMetric()),
+                new CompilationMode.SpeedProfile(),
+                StartupMode.COLD,
+                3,
+                scope -> {
+                    scope.pressHome();
+                    scope.startActivityAndWait();
+                }
+        );
+    }
+}
diff --git a/benchmark/integration-tests/test-module-sample/src/main/java/androidx/benchmark/integration/macrobenchmark/TrivialTestModuleTest.kt b/benchmark/integration-tests/test-module-sample/src/main/java/androidx/benchmark/integration/macrobenchmark/TrivialTestModuleTest.kt
index 1c82866..5f84e75 100644
--- a/benchmark/integration-tests/test-module-sample/src/main/java/androidx/benchmark/integration/macrobenchmark/TrivialTestModuleTest.kt
+++ b/benchmark/integration-tests/test-module-sample/src/main/java/androidx/benchmark/integration/macrobenchmark/TrivialTestModuleTest.kt
@@ -22,6 +22,7 @@
 import androidx.test.filters.LargeTest
 import androidx.test.platform.app.InstrumentationRegistry
 import org.junit.Assert.assertEquals
+import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
 
@@ -46,6 +47,7 @@
         )
     }
 
+    @Ignore // b/202321897
     @Test
     fun targetPackageInstalled() {
         val pm = InstrumentationRegistry.getInstrumentation().context.packageManager
diff --git a/biometric/biometric/src/androidTest/java/androidx/biometric/DeviceUtilsTest.java b/biometric/biometric/src/androidTest/java/androidx/biometric/DeviceUtilsTest.java
index 396f47e..d3cbbc0 100644
--- a/biometric/biometric/src/androidTest/java/androidx/biometric/DeviceUtilsTest.java
+++ b/biometric/biometric/src/androidTest/java/androidx/biometric/DeviceUtilsTest.java
@@ -134,25 +134,35 @@
 
     @Test
     public void testShouldUseKeyguardManagerForBiometricAndCredential() {
-        final String[] vendors = {"buy-n-large", "pizza planet"};
+        final String[] excludeVendors = {"buy-n-large", "pizza planet"};
         when(mContext.getResources()).thenReturn(mResources);
-        when(mResources.getStringArray(R.array.keyguard_biometric_and_credential_vendors))
-                .thenReturn(vendors);
+        when(mResources.getStringArray(R.array.keyguard_biometric_and_credential_exclude_vendors))
+                .thenReturn(excludeVendors);
 
         final boolean isApi29 = Build.VERSION.SDK_INT == Build.VERSION_CODES.Q;
         assertThat(DeviceUtils.shouldUseKeyguardManagerForBiometricAndCredential(
-                mContext, "buy-n-large")).isEqualTo(isApi29);
+                mContext, "buy-n-large")).isFalse();
         assertThat(DeviceUtils.shouldUseKeyguardManagerForBiometricAndCredential(
-                mContext, "BUY-N-LARGE")).isEqualTo(isApi29);
+                mContext, "BUY-N-LARGE")).isFalse();
         assertThat(DeviceUtils.shouldUseKeyguardManagerForBiometricAndCredential(
-                mContext, "pizza planet")).isEqualTo(isApi29);
+                mContext, "pizza planet")).isFalse();
         assertThat(DeviceUtils.shouldUseKeyguardManagerForBiometricAndCredential(
-                mContext, "Pizza Planet")).isEqualTo(isApi29);
+                mContext, "Pizza Planet")).isFalse();
         assertThat(DeviceUtils.shouldUseKeyguardManagerForBiometricAndCredential(
-                mContext, "dinoco")).isFalse();
+                mContext, "dinoco")).isEqualTo(isApi29);
         assertThat(DeviceUtils.shouldUseKeyguardManagerForBiometricAndCredential(
-                mContext, "buy n large")).isFalse();
+                mContext, "buy n large")).isEqualTo(isApi29);
         assertThat(DeviceUtils.shouldUseKeyguardManagerForBiometricAndCredential(
-                mContext, "pizza planet plus")).isFalse();
+                mContext, "pizza planet plus")).isEqualTo(isApi29);
+
+        // Test result on some known affected vendors.
+        assertThat(DeviceUtils.shouldUseKeyguardManagerForBiometricAndCredential(
+                mContext, "Google")).isEqualTo(isApi29);
+        assertThat(DeviceUtils.shouldUseKeyguardManagerForBiometricAndCredential(
+                mContext, "google")).isEqualTo(isApi29);
+        assertThat(DeviceUtils.shouldUseKeyguardManagerForBiometricAndCredential(
+                mContext, "Samsung")).isEqualTo(isApi29);
+        assertThat(DeviceUtils.shouldUseKeyguardManagerForBiometricAndCredential(
+                mContext, "samsung")).isEqualTo(isApi29);
     }
 }
diff --git a/biometric/biometric/src/main/java/androidx/biometric/BiometricFragment.java b/biometric/biometric/src/main/java/androidx/biometric/BiometricFragment.java
index 3895905..9562de2 100644
--- a/biometric/biometric/src/main/java/androidx/biometric/BiometricFragment.java
+++ b/biometric/biometric/src/main/java/androidx/biometric/BiometricFragment.java
@@ -477,9 +477,7 @@
 
         // Fall back to device credential immediately if no known biometrics are available.
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP
-                && isManagingDeviceCredentialButton()
-                && BiometricManager.from(host).canAuthenticate(Authenticators.BIOMETRIC_WEAK)
-                        != BiometricManager.BIOMETRIC_SUCCESS) {
+                && isKeyguardManagerNeededForCredential()) {
             viewModel.setAwaitingResult(true);
             launchConfirmCredentialActivity();
             return;
@@ -510,7 +508,7 @@
             viewModel.setPromptShowing(true);
             viewModel.setAwaitingResult(true);
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP
-                    && isKeyguardManagerNeededForAuthentication()) {
+                    && isKeyguardManagerNeededForBiometricAndCredential()) {
                 launchConfirmCredentialActivity();
             } else if (isUsingFingerprintDialog()) {
                 showFingerprintDialogForAuthentication();
@@ -1206,6 +1204,24 @@
                 && !mInjector.isFingerprintHardwarePresent(getContext());
     }
 
+    private boolean isKeyguardManagerNeededForCredential() {
+        final Context context = getContext();
+
+        // On API 29, BiometricPrompt fails to launch the confirm device credential Settings
+        // activity if no biometric hardware is present.
+        if (Build.VERSION.SDK_INT == Build.VERSION_CODES.Q
+                && !mInjector.isFingerprintHardwarePresent(context)
+                && !mInjector.isFaceHardwarePresent(context)
+                && !mInjector.isIrisHardwarePresent(context)) {
+            return true;
+        }
+
+        // Launch CDC activity if managing the credential button and if no biometrics are available.
+        return isManagingDeviceCredentialButton()
+                && BiometricManager.from(context).canAuthenticate(Authenticators.BIOMETRIC_WEAK)
+                        != BiometricManager.BIOMETRIC_SUCCESS;
+    }
+
     /**
      * Checks if this fragment should invoke {@link
      * KeyguardManager#createConfirmDeviceCredentialIntent(CharSequence, CharSequence)} directly to
@@ -1213,11 +1229,10 @@
      *
      * @return Whether this fragment should use {@link KeyguardManager} directly.
      */
-    private boolean isKeyguardManagerNeededForAuthentication() {
-        final Context context = getContext();
-
+    private boolean isKeyguardManagerNeededForBiometricAndCredential() {
         // Devices from some vendors should use KeyguardManager for authentication if both biometric
         // and credential authenticator types are allowed (on API 29).
+        final Context context = getContext();
         if (context != null && DeviceUtils.shouldUseKeyguardManagerForBiometricAndCredential(
                 context, Build.MANUFACTURER)) {
 
@@ -1234,12 +1249,7 @@
             }
         }
 
-        // On API 29, BiometricPrompt fails to launch the confirm device credential Settings
-        // activity if no biometric hardware is present.
-        return Build.VERSION.SDK_INT == Build.VERSION_CODES.Q
-                && !mInjector.isFingerprintHardwarePresent(context)
-                && !mInjector.isFaceHardwarePresent(context)
-                && !mInjector.isIrisHardwarePresent(context);
+        return false;
     }
 
     /**
diff --git a/biometric/biometric/src/main/java/androidx/biometric/DeviceUtils.java b/biometric/biometric/src/main/java/androidx/biometric/DeviceUtils.java
index 899f7d1..b60573e 100644
--- a/biometric/biometric/src/main/java/androidx/biometric/DeviceUtils.java
+++ b/biometric/biometric/src/main/java/androidx/biometric/DeviceUtils.java
@@ -118,7 +118,8 @@
             // This workaround is only needed for API 29.
             return false;
         }
-        return isVendorInList(context, vendor, R.array.keyguard_biometric_and_credential_vendors);
+        return !isVendorInList(
+                context, vendor, R.array.keyguard_biometric_and_credential_exclude_vendors);
     }
 
     /**
diff --git a/biometric/biometric/src/main/res/values-af/strings.xml b/biometric/biometric/src/main/res/values-af/strings.xml
index 54ec3ec..9e9aecd 100644
--- a/biometric/biometric/src/main/res/values-af/strings.xml
+++ b/biometric/biometric/src/main/res/values-af/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Geen PIN, patroon of wagwoord is gestel nie."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Hierdie toestel ondersteun nie PIN, patroon of wagwoord nie."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Vingerafdrukikoon"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Gebruik vingerafdruk"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Gebruik gesig"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Gebruik biometrie"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Gebruik skermslot"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Gebruik vingerafdruk of skermslot"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Gebruik gesigslot of skermslot"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Gebruik biometrie of skermslot"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Gebruik jou vingerafdruk om voort te gaan"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Gebruik jou gesig om voort te gaan"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Gebruik jou biometrie om voort te gaan"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Voer jou skermslot in om voort te gaan"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Gebruik jou vingerafdruk of skermslot om voort te gaan"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Gebruik jou gesig of skermslot om voort te gaan"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Gebruik jou biometriese data of skermslot om voort te gaan"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-am/strings.xml b/biometric/biometric/src/main/res/values-am/strings.xml
index 445bbf9..a32005d 100644
--- a/biometric/biometric/src/main/res/values-am/strings.xml
+++ b/biometric/biometric/src/main/res/values-am/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"ምንም ፒን፣ ሥርዓተ ጥለት ወይም የይለፍ ቃል አልተቀናበረም።"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"ይህ መሣሪያ ፒን፣ ስርዓተ-ጥለት ወይም የይለፍ ቃል አይደግፍም።"</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"የጣት አሻራ አዶ"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"የጣት አሻራን ተጠቀም"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"መልክን ተጠቀም"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"ባዮሜትሪኮችን ተጠቀም"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"የማያ ገጽ መቆለፊያን ተጠቀም"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"የጣት አሻራን ወይም የማያ ገጽ መቆለፊያን ይጠቀሙ"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"የመልክ ወይም የማያ ገጽ መቆለፊያን ተጠቀም"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"ባዮሜትሪኮችን ወይም ማያ ገጽ መቆለፊያን ይጠቀሙ"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"ለመቀጠል የእርስዎን የጣት አሻራ ይጠቀሙ"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"ለመቀጠል የእርስዎን መልክ ይጠቀሙ"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"ለመቀጠል የእርስዎን ባዮሜትሪክ ይጠቀሙ"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"ለመቀጠል የእርስዎን የማያ ገጽ ቁልፍ ያስገቡ"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"ለመቀጠል የእርስዎን የጣት አሻራ ወይም የማያ ገጽ መቆለፊያ ይጠቀሙ"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"ለመቀጠል የእርስዎን መልክ ወይም የማያ ገጽ መቆለፊያ ይጠቀሙ"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"ለመቀጠል የእርስዎን የባዮሜትሪክ ወይም የማያ ገጽ መቆለፊያ ይጠቀሙ"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-ar/strings.xml b/biometric/biometric/src/main/res/values-ar/strings.xml
index 5f03af6..40b5283 100644
--- a/biometric/biometric/src/main/res/values-ar/strings.xml
+++ b/biometric/biometric/src/main/res/values-ar/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"لم يتم ضبط رقم تعريف شخصي أو نقش أو كلمة مرور."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"هذا الجهاز لا يتيح استخدام رقم تعريف شخصي أو نقش أو كلمة مرور."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"رمز بصمة الإصبع"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"استخدام بصمة الإصبع"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"استخدام الوجه"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"استخدام المقاييس الحيوية"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"استخدام قفل الشاشة"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"استخدام بصمة الإصبع أو قفل الشاشة"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"استخدام الوجه أو قفل الشاشة"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"استخدام المقاييس الحيوية أو قفل الشاشة"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"استخدِم بصمة الإصبع للمتابعة."</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"استخدِم الوجه للمتابعة."</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"استخدِم المقاييس الحيوية للمتابعة."</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"أدخِل قفل الشاشة للمتابعة."</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"استخدِم بصمة الإصبع أو قفل الشاشة للمتابعة."</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"استخدِم الوجه أو قفل الشاشة للمتابعة."</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"استخدِم المقاييس الحيوية أو قفل الشاشة للمتابعة."</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-as/strings.xml b/biometric/biometric/src/main/res/values-as/strings.xml
index 7ffcf66f..f9ae012 100644
--- a/biometric/biometric/src/main/res/values-as/strings.xml
+++ b/biometric/biometric/src/main/res/values-as/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"কোনো পিন, আৰ্হি অথবা পাছৱৰ্ড ছেট কৰা হোৱা নাই।"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"এই ডিভাইচটোত পিন, আৰ্হি অথবা পাছৱৰ্ড ব্যৱহাৰ কৰিব নোৱাৰি।"</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"ফিংগাৰপ্ৰিণ্টৰ চিহ্ন"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"ফিংগাৰপ্ৰিণ্ট ব্যৱহাৰ কৰক"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"মুখাৱয়ব ব্যৱহাৰ কৰক"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"বায়’মেট্ৰিক ব্যৱহাৰ কৰক"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"স্ক্ৰীন লক ব্যৱহাৰ কৰক"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"ফিংগাৰপ্ৰিণ্ট অথবা স্ক্ৰীন লক ব্যৱহাৰ কৰক"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"ফেচ আনলক অথবা স্ক্ৰীন লক ব্যৱহাৰ কৰক"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"বায়’মেট্ৰিক অথবা স্ক্ৰীন লক ব্যৱহাৰ কৰক"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"অব্যাহত ৰাখিবলৈ আপোনাৰ ফিংগাৰপ্ৰিণ্ট ব্যৱহাৰ কৰক"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"অব্যাহত ৰাখিবলৈ নিজৰ মুখাৱয়ব ব্যৱহাৰ কৰক"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"অব্যাহত ৰাখিবলৈ আপোনাৰ বায়’মেট্ৰিক ব্যৱহাৰ কৰক"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"অব্যাহত ৰাখিবলৈ আপোনাৰ স্ক্ৰীন লক দিয়ক"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"অব্যাহত ৰাখিবলৈ আপোনাৰ ফিংগাৰপ্ৰিণ্ট অথবা স্ক্ৰীন লক ব্যৱহাৰ কৰক"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"অব্যাহত ৰাখিবলৈ আপোনাৰ মুখাৱয়ব অথবা স্ক্ৰীন লক ব্যৱহাৰ কৰক"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"অব্যাহত ৰাখিবলৈ আপোনাৰ বায়’মেট্ৰিক অথবা স্ক্ৰীন লক ব্যৱহাৰ কৰক"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-az/strings.xml b/biometric/biometric/src/main/res/values-az/strings.xml
index 73bcb61..9dc4e0a 100644
--- a/biometric/biometric/src/main/res/values-az/strings.xml
+++ b/biometric/biometric/src/main/res/values-az/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"PIN, model və ya parol ayarlanmayıb."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Bu cihaz PIN, model və ya parolu dəstəkləmir."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Barmaq izi ikonası"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Barmaq izindən istifadə edin"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Üzdən istifadə edin"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Biometrik məlumatlardan istifadə edin"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Ekran kilidi istifadə edin"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Barmaq izi və ya ekran kilidindən istifadə edin"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Üz və ya ekran kilidindən istifadə edin"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Biometrik məlumatlardan və ya ekran kilidindən istifadə edin"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Davam etmək üçün barmaq izinizi istifadə edin"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Davam etmək üçün üzünüzdən istifadə edin"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Davam etmək üçün biometrik məlumatlarınızdan istifadə edin"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Davam etmək üçün ekran kilidinizi daxil edin"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Davam etmək üçün barmaq izi və ya ekran kilidinizdən istifadə edin"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Davam etmək üçün üz və ya ekran kilidinizdən istifadə edin"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Davam etmək üçün biometrik məlumatlar və ya ekran kilidinizdən istifadə edin"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-b+sr+Latn/strings.xml b/biometric/biometric/src/main/res/values-b+sr+Latn/strings.xml
index e8b2961..de4ee97 100644
--- a/biometric/biometric/src/main/res/values-b+sr+Latn/strings.xml
+++ b/biometric/biometric/src/main/res/values-b+sr+Latn/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Niste podesili ni PIN, ni šablon, ni lozinku."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Ovaj uređaj ne podržava PIN, šablon ili lozinku."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ikona otiska prsta"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Koristite otisak prsta"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Koristite lice"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Koristite biometriju"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Koristi zaključavanje ekrana"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Koristite otisak prsta ili zaključavanje ekrana"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Koristite zaključavanje licem ili zaključavanje ekrana"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Koristite biometriju ili zaključavanje ekrana"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Nastavite pomoću otiska prsta"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Potvrdite identitet licem da biste nastavili"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Koristite biometrijski podatak da biste nastavili"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Upotrebite zaključavanje ekrana da biste nastavili"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Koristite otisak prsta ili zaključavanje ekrana da biste nastavili"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Koristite lice ili zaključavanje ekrana da biste nastavili"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Koristite biometrijski podatak ili zaključavanje ekrana da biste nastavili"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-be/strings.xml b/biometric/biometric/src/main/res/values-be/strings.xml
index de8ff2b..e3b00f7 100644
--- a/biometric/biometric/src/main/res/values-be/strings.xml
+++ b/biometric/biometric/src/main/res/values-be/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Не заданы PIN-код, узор разблакіроўкі ці пароль."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Гэта прылада не падтрымлівае PIN-код, узор разблакіроўкі ці пароль."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Значок адбітка пальца"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Выкарыстоўваць адбітак пальца"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Выкарыстоўваць распазнаванне твару"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Выкарыстоўваць біяметрыю"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Выкарыстоўваць сродак разблакіроўкі экрана"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Выкарыстоўваць адбітак пальца ці сродак разблакіроўкі экрана"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Выкарыстоўваць распазнаванне твару ці сродак разблакіроўкі экрана"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Выкарыстоўваць біяметрыю ці сродак разблакіроўкі экрана"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Каб працягнуць, скарыстайце адбітак пальца"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Каб працягнуць, скарыстайце распазнаванне твару"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Каб працягнуць, скарыстайце біяметрычныя даныя"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Каб працягнуць, скарыстайце сродак разблакіроўкі экрана"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Каб працягнуць, скарыстайце адбітак пальца ці сродак разблакіроўкі экрана"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Каб працягнуць, скарыстайце распазнаванне твару ці сродак разблакіроўкі экрана"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Каб працягнуць, скарыстайце біяметрычныя даныя ці сродак разблакіроўкі экрана"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-bg/strings.xml b/biometric/biometric/src/main/res/values-bg/strings.xml
index 7d65941..7c8f2e0 100644
--- a/biometric/biometric/src/main/res/values-bg/strings.xml
+++ b/biometric/biometric/src/main/res/values-bg/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Няма зададен ПИН код, фигура или парола."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Устройството не поддържа ПИН код, фигура или парола."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Икона за отпечатък"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Използване на отпечатък"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Използване на отключването с лице"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Използване на биометрични данни"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Използване на опцията за заключване на екрана"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Използване на отпечатък или опцията за заключване на екрана"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Използване на отключването с лице или опцията за заключване на екрана"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Използване на биометрични данни или опцията за заключване на екрана"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Използвайте отпечатъка си, за да продължите"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Използвайте лицето си, за да продължите"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Използвайте биометричните си данни, за да продължите"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Въведете опцията си за заключване на екрана, за да продължите"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Използвайте отпечатъка си или опцията за заключване на екрана, за да продължите"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Използвайте лицето си или опцията за заключване на екрана, за да продължите"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Използвайте биометричните си данни или опцията за заключване на екрана, за да продължите"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-bn/strings.xml b/biometric/biometric/src/main/res/values-bn/strings.xml
index f5bcf6a..5a1b952 100644
--- a/biometric/biometric/src/main/res/values-bn/strings.xml
+++ b/biometric/biometric/src/main/res/values-bn/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"পিন, প্যাটার্ন অথবা পাসওয়ার্ড সেট করা নেই।"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"এই ডিভাইসে পিন, প্যাটার্ন বা পাসওয়ার্ড ব্যবহার করা যাবে না।"</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"ফিঙ্গারপ্রিন্ট আইকন"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"আঙুলের ছাপ ব্যবহার করুন"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"মুখ ব্যবহার করুন"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"বায়োমেট্রিক্স ব্যবহার করুন"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"স্ক্রিন লক ব্যবহার করুন"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"আঙুলের ছাপ বা স্ক্রিন লক ব্যবহার করুন"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"মুখ বা স্ক্রিন লক ব্যবহার করুন"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"বায়োমেট্রিক্স বা স্ক্রিন লক ব্যবহার করুন"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"চালিয়ে যেতে আপনার আঙুলের ছাপ ব্যবহার করুন"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"চালিয়ে যেতে আপনার মুখ ব্যবহার করুন"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"চালিয়ে যেতে আপনার বায়োমেট্রিক ব্যবহার করুন"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"চালিয়ে যেতে আপনার স্ক্রিন লক দিন"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"চালিয়ে যেতে আপনার আঙুলের ছাপ বা স্ক্রিন লক ব্যবহার করুন"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"চালিয়ে যেতে আপনার মুখ বা স্ক্রিন লক ব্যবহার করুন"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"চালিয়ে যেতে আপনার বায়োমেট্রিক বা স্ক্রিন লক ব্যবহার করুন"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-bs/strings.xml b/biometric/biometric/src/main/res/values-bs/strings.xml
index c03ae0e..0ff8b32 100644
--- a/biometric/biometric/src/main/res/values-bs/strings.xml
+++ b/biometric/biometric/src/main/res/values-bs/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Nije postavljen PIN, uzorak niti lozinka."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Ovaj uređaj ne podržava PIN, uzorak ili lozinku."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ikona za otisak prsta"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Koristi otisak prsta"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Koristi otključavanje licem"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Koristi biometriju"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Koristi zaključavanje ekrana"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Koristi otisak prsta ili zaključavanje ekrana"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Koristi otključavanje licem ili zaključavanje ekrana"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Koristi biometriju ili zaključavanje ekrana"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Koristite otisak prsta da nastavite"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Koristite otključavanje licem da nastavite"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Koristite biometriju da nastavite"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Unesite zaključavanje ekrana da nastavite"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Koristite otisak prsta ili zaključavanje ekrana da nastavite"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Koristite otključavanje licem ili zaključavanje ekrana da nastavite"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Koristite biometriju ili zaključavanje ekrana da nastavite"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-ca/strings.xml b/biometric/biometric/src/main/res/values-ca/strings.xml
index b31856e..bfd98a4 100644
--- a/biometric/biometric/src/main/res/values-ca/strings.xml
+++ b/biometric/biometric/src/main/res/values-ca/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"No s\'ha definit cap PIN, patró o contrasenya."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Aquest dispositiu no admet utilitzar cap PIN, patró ni contrasenya."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Icona d\'empremta digital"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Utilitza l\'empremta digital"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Utilitza la cara"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Utilitza la biometria"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Utilitza el bloqueig de pantalla"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Utilitza l\'empremta digital o el bloqueig de pantalla"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Utilitza el desbloqueig facial o el bloqueig de pantalla"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Utilitza la biometria o el bloqueig de pantalla"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Utilitza l\'empremta digital per continuar"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Utilitza la cara per continuar"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Utilitza la biometria per continuar"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Introdueix el bloqueig de pantalla per continuar"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Utilitza l\'empremta digital o el bloqueig de pantalla per continuar"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Utilitza la cara o el bloqueig de pantalla per continuar"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Utilitza la biometria o el bloqueig de pantalla per continuar"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-cs/strings.xml b/biometric/biometric/src/main/res/values-cs/strings.xml
index e8ec9c1..cae1e25 100644
--- a/biometric/biometric/src/main/res/values-cs/strings.xml
+++ b/biometric/biometric/src/main/res/values-cs/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Není nastaven žádný PIN, gesto ani heslo."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Toto zařízení nepodporuje kódy PIN, hesla ani gesta."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ikona otisku prstů"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Použít otisk prstu"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Použít obličej"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Použít biometrii"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Použít zámek obrazovky"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Použít otisk prstu nebo zámek obrazovky"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Použít odemknutí obličejem nebo zámek obrazovky"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Použít biometrii nebo zámek obrazovky"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Pokračujte přiložením prstu"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Pokračujte ověřením obličeje"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Pokračujte biometrickým ověřením"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Pokračujte zadáním zámku obrazovky"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Pokračujte ověřením pomocí otisku prstu nebo zámku obrazovky"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Pokračujte ověřením pomocí obličeje nebo zámku obrazovky"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Pokračujte ověřením pomocí biometrických údajů nebo zámku obrazovky"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-da/strings.xml b/biometric/biometric/src/main/res/values-da/strings.xml
index 5dab45b..41fe471 100644
--- a/biometric/biometric/src/main/res/values-da/strings.xml
+++ b/biometric/biometric/src/main/res/values-da/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Der er ikke angivet pinkode, mønster eller adgangskode."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Denne enhed understøtter ikke pinkode, mønster eller adgangskode."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ikon for fingeraftryk"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Brug fingeraftryk"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Brug ansigt"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Brug biometri"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Brug skærmlås"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Brug fingeraftryk eller skærmlås"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Brug ansigts- eller skærmlås"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Brug biometri eller skærmlås"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Brug dit fingeraftryk for at fortsætte"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Brug dit ansigt for at fortsætte"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Brug biometri for at fortsætte"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Angiv din skærmlås for at fortsætte"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Brug dit fingeraftryk eller din skærmlås for at fortsætte"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Brug din ansigts- eller skærmlås for at fortsætte"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Brug biometri eller din skærmlås for at fortsætte"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-de/strings.xml b/biometric/biometric/src/main/res/values-de/strings.xml
index 9064a21..e32a059 100644
--- a/biometric/biometric/src/main/res/values-de/strings.xml
+++ b/biometric/biometric/src/main/res/values-de/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Keine PIN, kein Muster und kein Passwort festgelegt."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Dieses Gerät kann nicht mit einer PIN, einem Muster oder einem Passwort gesperrt bzw. entsperrt werden."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Fingerabdruck-Symbol"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Fingerabdruck verwenden"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Gesichtserkennung verwenden"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Biometrisches Verfahren verwenden"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Displaysperre verwenden"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Fingerabdruck oder Displaysperre verwenden"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Gesichtserkennung oder Displaysperre verwenden"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Biometrisches Verfahren oder Displaysperre verwenden"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Verwende den Fingerabdruck, um fortzufahren"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Verwende die Gesichtserkennung, um fortzufahren"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Verwende das biometrische Verfahren, um fortzufahren"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Gib die Displaysperre ein, um fortzufahren"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Verwende den Fingerabdruck oder die Displaysperre, um fortzufahren"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Verwende die Gesichtserkennung oder die Displaysperre, um fortzufahren"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Verwende das biometrische Verfahren oder die Displaysperre, um fortzufahren"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-el/strings.xml b/biometric/biometric/src/main/res/values-el/strings.xml
index fe34039..53fc106 100644
--- a/biometric/biometric/src/main/res/values-el/strings.xml
+++ b/biometric/biometric/src/main/res/values-el/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Δεν έχει οριστεί PIN, μοτίβο ή κωδικός πρόσβασης."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Αυτή η συσκευή δεν υποστηρίζει PIN, μοτίβο ή κωδικό πρόσβασης."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Εικονίδιο δακτυλικών αποτυπωμάτων"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Χρήση δακτυλικού αποτυπώματος"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Χρήση προσώπου"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Χρήση βιομετρικών"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Χρήση κλειδώματος οθόνης"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Χρήση δακτυλικού αποτυπώματος ή κλειδώματος οθόνης"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Χρήση προσώπου ή κλειδώματος οθόνης"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Χρήση βιομετρικών ή κλειδώματος οθόνης"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Χρησιμοποιήστε το δακτυλικό σας αποτύπωμα για συνέχεια."</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Χρησιμοποιήστε το πρόσωπό σας για συνέχεια."</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Χρησιμοποιήστε βιομετρικά για συνέχεια."</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Χρησιμοποιήστε το κλείδωμα οθόνης για συνέχεια."</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Χρησιμοποιήστε το δακτυλικό σας αποτύπωμα ή το κλείδωμα οθόνης για συνέχεια."</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Χρησιμοποιήστε το πρόσωπό σας ή το κλείδωμα οθόνης για συνέχεια."</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Χρησιμοποιήστε βιομετρικά ή κλείδωμα οθόνης για συνέχεια."</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-en-rAU/strings.xml b/biometric/biometric/src/main/res/values-en-rAU/strings.xml
index 2941203..732ed1b 100644
--- a/biometric/biometric/src/main/res/values-en-rAU/strings.xml
+++ b/biometric/biometric/src/main/res/values-en-rAU/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"No PIN, pattern or password set."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"This device does not support PIN, pattern or password."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Fingerprint icon"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Use fingerprint"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Use face"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Use biometrics"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Use screen lock"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Use fingerprint or screen lock"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Use face or screen lock"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Use biometrics or screen lock"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Use your fingerprint to continue"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Use your face to continue"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Use your biometric to continue"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Enter your screen lock to continue"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Use your fingerprint or screen lock to continue"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Use your face or screen lock to continue"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Use your biometric or screen lock to continue"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-en-rCA/strings.xml b/biometric/biometric/src/main/res/values-en-rCA/strings.xml
index 2941203..732ed1b 100644
--- a/biometric/biometric/src/main/res/values-en-rCA/strings.xml
+++ b/biometric/biometric/src/main/res/values-en-rCA/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"No PIN, pattern or password set."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"This device does not support PIN, pattern or password."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Fingerprint icon"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Use fingerprint"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Use face"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Use biometrics"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Use screen lock"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Use fingerprint or screen lock"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Use face or screen lock"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Use biometrics or screen lock"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Use your fingerprint to continue"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Use your face to continue"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Use your biometric to continue"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Enter your screen lock to continue"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Use your fingerprint or screen lock to continue"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Use your face or screen lock to continue"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Use your biometric or screen lock to continue"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-en-rGB/strings.xml b/biometric/biometric/src/main/res/values-en-rGB/strings.xml
index 2941203..732ed1b 100644
--- a/biometric/biometric/src/main/res/values-en-rGB/strings.xml
+++ b/biometric/biometric/src/main/res/values-en-rGB/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"No PIN, pattern or password set."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"This device does not support PIN, pattern or password."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Fingerprint icon"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Use fingerprint"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Use face"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Use biometrics"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Use screen lock"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Use fingerprint or screen lock"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Use face or screen lock"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Use biometrics or screen lock"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Use your fingerprint to continue"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Use your face to continue"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Use your biometric to continue"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Enter your screen lock to continue"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Use your fingerprint or screen lock to continue"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Use your face or screen lock to continue"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Use your biometric or screen lock to continue"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-en-rIN/strings.xml b/biometric/biometric/src/main/res/values-en-rIN/strings.xml
index 2941203..732ed1b 100644
--- a/biometric/biometric/src/main/res/values-en-rIN/strings.xml
+++ b/biometric/biometric/src/main/res/values-en-rIN/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"No PIN, pattern or password set."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"This device does not support PIN, pattern or password."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Fingerprint icon"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Use fingerprint"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Use face"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Use biometrics"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Use screen lock"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Use fingerprint or screen lock"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Use face or screen lock"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Use biometrics or screen lock"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Use your fingerprint to continue"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Use your face to continue"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Use your biometric to continue"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Enter your screen lock to continue"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Use your fingerprint or screen lock to continue"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Use your face or screen lock to continue"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Use your biometric or screen lock to continue"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-en-rXC/strings.xml b/biometric/biometric/src/main/res/values-en-rXC/strings.xml
index 37a588c..854e256 100644
--- a/biometric/biometric/src/main/res/values-en-rXC/strings.xml
+++ b/biometric/biometric/src/main/res/values-en-rXC/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‎‏‏‏‏‏‎‎‏‎‎‎‎‎‏‎‏‎‏‎‎‎‎‏‏‏‏‎‎‎‏‎‏‏‏‏‏‏‎‎‏‎‎‏‎‏‏‏‎‎‏‎‎‏‎No PIN, pattern, or password set.‎‏‎‎‏‎"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‎‎‎‏‎‏‎‏‎‏‎‎‏‏‎‏‏‏‎‎‏‏‎‏‎‎‎‏‎‎‏‏‏‏‎‎‏‏‎‏‎‎‏‏‏‏‎‎‎‏‎‏‏‏‎‎‎This device does not support PIN, pattern, or password.‎‏‎‎‏‎"</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‏‎‎‏‏‎‏‎‎‎‎‎‎‏‎‎‎‎‏‎‏‎‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‏‏‎‏‎‎‎‏‏‎‏‏‎‎‏‏‎‏‎Fingerprint icon‎‏‎‎‏‎"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‎‏‏‏‎‏‎‎‏‏‏‏‎‏‏‎‏‏‏‏‏‎‎‎‎‏‏‎‏‎‎‏‏‏‎‎‎‏‏‏‏‏‏‎‎‏‎‏‎‎‎‎‎‏‎Use fingerprint‎‏‎‎‏‎"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‏‎‏‎‏‏‏‎‏‏‎‎‏‏‎‎‏‏‎‎‎‏‎‎‏‎‎‎‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‏‎‎‏‎‏‎‏‏‎‎Use face‎‏‎‎‏‎"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‎‎‏‎‏‎‎‏‏‎‏‏‎‎‎‎‏‏‎‏‏‎‎‎‎‎‎‎‏‏‎‏‏‏‎‏‎‎‎‏‏‎‏‎‎‏‏‎‏‎‎‏‎‎‎Use biometrics‎‏‎‎‏‎"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‏‎‎‎‏‎‏‎‏‎‏‏‎‏‎‎‎‏‏‏‎‏‏‏‏‎‎‎‎‏‎‏‏‏‎‏‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‏‎‎‎‎Use screen lock‎‏‎‎‏‎"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‏‎‏‎‎‏‎‏‎‏‏‏‎‏‎‏‎‎‎‏‎‏‎‎‎‏‎‏‎‎‎‏‎‏‏‎‏‎‎‎‎‎‎‎‎‎‎‏‏‏‎‎‏‏‎Use fingerprint or screen lock‎‏‎‎‏‎"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‏‏‏‎‎‎‏‎‏‏‏‎‏‎‏‎‏‎‏‏‎‎‎‏‎‎‎‎‎‏‎‏‏‎‏‏‏‏‎‏‎‎‏‎‏‎‏‏‎‏‎‎‎Use face or screen lock‎‏‎‎‏‎"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‎‏‏‏‏‎‎‏‏‏‏‎‏‎‎‏‎‏‎‏‏‎‏‎‏‏‎‏‏‎‏‏‏‏‏‎‏‏‎‎‎‏‎‏‎‎‎‏‏‏‎‏‎‎‎‎Use biometrics or screen lock‎‏‎‎‏‎"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‏‏‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‏‎‏‏‎‎‏‎‏‏‏‏‏‎‎‎‎‎‏‎‏‎‎‏‏‏‎‏‏‎‏‏‏‏‎‎‎‎Use your fingerprint to continue‎‏‎‎‏‎"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‎‏‏‎‎‏‎‏‎‏‏‎‎‏‏‏‎‏‏‏‎‎‎‎‎‏‏‎‏‏‏‏‎‏‎‏‎‏‎‏‎‎‏‎‎‏‏‏‏‎‎‏‎‎Use your face to continue‎‏‎‎‏‎"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‎‎‎‏‏‎‏‏‎‏‏‎‎‏‏‏‏‎‏‏‎‎‎‎‏‏‎‏‎‏‏‎‏‎‏‏‎‏‎‎‎‎‎‏‎‎‏‏‏‏‎‎‎‎‎‎‎Use your biometric to continue‎‏‎‎‏‎"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‏‎‎‎‏‎‏‎‏‏‎‏‎‏‎‏‏‎‎‏‏‏‏‎‎‏‎‎‎‎‎‏‏‏‎‏‏‎‏‏‏‎‎‏‏‎‏‏‏‎‏‎‏‏‎‏‎Enter your screen lock to continue‎‏‎‎‏‎"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‏‎‎‏‏‏‎‎‏‎‏‎‎‏‏‏‏‎‏‎‏‏‏‎‎‎‎‏‎‏‏‏‏‎‎‏‎‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎Use your fingerprint or screen lock to continue‎‏‎‎‏‎"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‎‏‎‏‎‎‎‏‎‏‏‏‎‏‎‏‏‎‎‎‏‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‎‎‎‎‎‎‎‏‎‏‎‏‎‏‏‎‎Use your face or screen lock to continue‎‏‎‎‏‎"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‎‏‎‏‏‎‏‎‏‎‏‎‏‎‎‏‏‎‏‏‎‏‎‏‏‏‎‎‏‏‏‏‎‏‏‏‎‎‏‏‎‏‏‎‎‎‏‎‏‎‎‏‏‎‏‎Use your biometric or screen lock to continue‎‏‎‎‏‎"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-es-rUS/strings.xml b/biometric/biometric/src/main/res/values-es-rUS/strings.xml
index eea350b..e8aab89 100644
--- a/biometric/biometric/src/main/res/values-es-rUS/strings.xml
+++ b/biometric/biometric/src/main/res/values-es-rUS/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"No se estableció ningún PIN, patrón ni contraseña."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Este dispositivo no admite PIN, patrón ni contraseña."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ícono de huella dactilar"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Usar huella dactilar"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Usar rostro"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Usar datos biométricos"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Usar bloqueo de pantalla"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Usar huella dactilar o bloqueo de pantalla"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Usar rostro o bloqueo de pantalla"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Usar datos biométricos o bloqueo de pantalla"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Usa tu huella dactilar para continuar"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Usa tu rostro para continuar"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Usa tus datos biométricos para continuar"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Ingresa tu bloqueo de pantalla para continuar"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Usa tu huella dactilar o bloqueo de pantalla para continuar"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Usa tu rostro o bloqueo de pantalla para continuar"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Usa tus datos biométricos o el bloqueo de pantalla para continuar"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-es/strings.xml b/biometric/biometric/src/main/res/values-es/strings.xml
index 45a35ea..447c1fe 100644
--- a/biometric/biometric/src/main/res/values-es/strings.xml
+++ b/biometric/biometric/src/main/res/values-es/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"No se ha definido el PIN, el patrón o la contraseña."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Este dispositivo no admite PINs, patrones ni contraseñas."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Icono de huella digital"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Usar huella digital"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Usar cara"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Usar biometría"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Usar bloqueo de pantalla"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Usar huella digital o bloqueo de pantalla"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Usar cara o bloqueo de pantalla"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Usar biometría o bloqueo de pantalla"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Usa la huella digital para continuar"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Usa la cara para continuar"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Usa la biometría para continuar"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Introduce tu bloqueo de pantalla para continuar"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Usa la huella digital o tu bloqueo de pantalla para continuar"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Usa la cara o tu bloqueo de pantalla para continuar"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Usa la biometría o tu bloqueo de pantalla para continuar"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-et/strings.xml b/biometric/biometric/src/main/res/values-et/strings.xml
index 966be71..a5c66f7 100644
--- a/biometric/biometric/src/main/res/values-et/strings.xml
+++ b/biometric/biometric/src/main/res/values-et/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"PIN-koodi, mustrit ega parooli pole määratud."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"See seade ei toeta PIN-koodi, mustrit ega parooli."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Sõrmejälje ikoon"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Kasuta sõrmejälge"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Kasuta nägu"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Kasuta biomeetrilisi andmeid"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Kasuta ekraanilukku"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Kasuta sõrmejälge või ekraanilukku"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Kasuta nägu või ekraanilukku"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Kasuta biomeetrilisi andmeid või ekraanilukku"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Jätkamiseks kasutage oma sõrmejälge"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Jätkamiseks kasutage oma nägu"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Jätkamiseks kasutage oma biomeetrilisi andmeid"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Jätkamiseks sisestage oma ekraanilukk"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Jätkamiseks kasutage oma sõrmejälge või ekraanilukku"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Jätkamiseks kasutage oma nägu või ekraanilukku"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Jätkamiseks kasutage oma biomeetrilisi andmeid või ekraanilukku"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-eu/strings.xml b/biometric/biometric/src/main/res/values-eu/strings.xml
index 3374c6f..2109aac 100644
--- a/biometric/biometric/src/main/res/values-eu/strings.xml
+++ b/biometric/biometric/src/main/res/values-eu/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Ez da ezarri PIN koderik, eredurik edo pasahitzik."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Gailuak ez du onartzen PIN, eredu edo pasahitzik."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Hatz-markaren ikonoa"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Erabili hatz-marka"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Erabili aurpegia"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Erabili sistema biometrikoak"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Erabili pantailaren blokeoa"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Erabili hatz-marka edo pantailaren blokeoa"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Erabili aurpegia edo pantailaren blokeoa"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Erabili sistema biometrikoak edo pantailaren blokeoa"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Aurrera egiteko, erabili hatz-marka"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Aurrera egiteko, erabili aurpegia"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Aurrera egiteko, erabili sistema biometrikoak"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Aurrera egiteko, desblokeatu pantailaren blokeoa"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Aurrera egiteko, erabili hatz-marka edo pantailaren blokeoa"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Aurrera egiteko, erabili aurpegia edo pantailaren blokeoa"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Aurrera egiteko, erabili sistema biometrikoak edo pantailaren blokeoa"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-fa/strings.xml b/biometric/biometric/src/main/res/values-fa/strings.xml
index c1f485e..ac22959 100644
--- a/biometric/biometric/src/main/res/values-fa/strings.xml
+++ b/biometric/biometric/src/main/res/values-fa/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"پین، الگو، یا گذرواژه‌ای تنظیم نشده است."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"این دستگاه از پین، الگو، یا گذرواژه پشتیبانی نمی‌کند."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"نماد اثر انگشت"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"استفاده از اثر انگشت"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"استفاده از چهره"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"استفاده از زیست‌سنجشی"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"از قفل صفحه استفاده کنید"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"استفاده از اثر انگشت یا قفل صفحه"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"استفاده از قفل صفحه یا چهره"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"استفاده از زیست‌سنجشی یا قفل صفحه"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"برای ادامه، از اثر انگشتتان استفاده کنید"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"برای ادامه، از چهره‌تان استفاده کنید"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"برای ادامه، از زیست‌سنجشی استفاده کنید"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"برای ادامه، قفل صفحه‌تان را وارد کنید"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"برای ادامه، از اثر انگشت یا قفل صفحه استفاده کنید"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"برای ادامه، از تشخیص چهره یا قفل صفحه استفاده کنید"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"برای ادامه، از زیست‌سنجشی یا قفل صفحه استفاده کنید"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-fi/strings.xml b/biometric/biometric/src/main/res/values-fi/strings.xml
index 2cf51ce..b2ea386 100644
--- a/biometric/biometric/src/main/res/values-fi/strings.xml
+++ b/biometric/biometric/src/main/res/values-fi/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"PIN-koodia, kuviota tai salasanaa ei ole lisätty."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Tämä laite ei tue PIN-koodia, kuviota eikä salasanaa."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Sormenjälkikuvake"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Käytä sormenjälkeä"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Käytä kasvoja"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Käytä biometriikkaa"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Käytä näytön lukitusta"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Käytä sormenjälkeä tai näytön lukitusta"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Käytä kasvojentunnistusavausta tai näytön lukitusta"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Käytä biometriikkaa tai näytön lukitusta"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Jatka sormenjäljen avulla"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Jatka kasvojesi avulla"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Jatka biometriikan avulla"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Jatka lisäämällä näytön lukituksen avaustapa"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Jatka sormenjäljen tai näytön lukituksen avulla"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Jatka kasvojentunnistuksen tai näytön lukituksen avulla"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Jatka biometriikan tai näytön lukituksen avulla"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-fr-rCA/strings.xml b/biometric/biometric/src/main/res/values-fr-rCA/strings.xml
index a4c0691..8db83b6 100644
--- a/biometric/biometric/src/main/res/values-fr-rCA/strings.xml
+++ b/biometric/biometric/src/main/res/values-fr-rCA/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Aucun NIP, schéma ni mot de passe défini"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Cet appareil ne prend pas en charge les NIP, les schémas ni les mots de passe."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Icône d\'empreinte digitale"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Utiliser l\'empreinte digitale"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Utiliser le visage"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Utiliser les données biométriques"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Utiliser le verrouillage d\'écran"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Utiliser l\'empreinte digitale ou le verrouillage de l\'écran"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Utiliser le visage ou le verrouillage de l\'écran"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Utiliser les données biométriques ou le verrouillage de l\'écran"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Utilisez votre empreinte digitale pour continuer"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Utilisez votre visage pour continuer"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Utilisez vos données biométriques pour continuer"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Entrez votre verrouillage d\'écran pour continuer"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Utilisez votre empreinte digitale ou le verrouillage de l\'écran pour continuer"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Utilisez votre visage ou le verrouillage de l\'écran pour continuer"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Utilisez vos données biométriques ou le verrouillage de l\'écran pour continuer"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-fr/strings.xml b/biometric/biometric/src/main/res/values-fr/strings.xml
index 90fc5a8..9a561db 100644
--- a/biometric/biometric/src/main/res/values-fr/strings.xml
+++ b/biometric/biometric/src/main/res/values-fr/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Aucun code, schéma ni mot de passe n\'est défini."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Cet appareil n\'est pas compatible avec les codes, schémas ni mots de passe."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Icône d\'empreinte digitale"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Utiliser votre empreinte digitale"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Utiliser la reconnaissance faciale"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Utiliser la biométrie"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Utiliser le verrouillage de l\'écran"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Utiliser votre empreinte digitale ou le verrouillage de l\'écran"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Utiliser la reconnaissance faciale ou le verrouillage de l\'écran"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Utiliser la biométrie ou le verrouillage de l\'écran"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Utilisez votre empreinte pour continuer"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Utilisez la reconnaissance faciale pour continuer"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Utilisez la biométrie pour continuer"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Utilisez le verrouillage de l\'écran pour continuer"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Utilisez votre empreinte digitale ou le verrouillage de l\'écran pour continuer"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Utilisez la reconnaissance faciale ou le verrouillage de l\'écran pour continuer"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Utilisez la biométrie ou le verrouillage de l\'écran pour continuer"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-gl/strings.xml b/biometric/biometric/src/main/res/values-gl/strings.xml
index 9ae8069..841b8fd 100644
--- a/biometric/biometric/src/main/res/values-gl/strings.xml
+++ b/biometric/biometric/src/main/res/values-gl/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Non se estableceu ningún PIN, padrón nin contrasinal."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Este dispositivo non permite usar un PIN, padrón ou contrasinal."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Icona de impresión dixital"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Utilizar impresión dixital"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Utilizar desbloqueo facial"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Utilizar desbloqueo biométrico"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Utilizar bloqueo de pantalla"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Utilizar impresión dixital ou bloqueo de pantalla"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Utilizar desbloqueo facial ou bloqueo de pantalla"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Utilizar desbloqueo biométrico ou bloqueo de pantalla"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Utiliza a túa impresión dixital para continuar"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Usa a cara para continuar"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Para continuar, utiliza o desbloqueo biométrico"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Desbloquea a pantalla para continuar"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Para continuar, utiliza a impresión dixital ou o bloqueo de pantalla"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Para continuar, utiliza o desbloqueo facial ou o bloqueo de pantalla"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Para continuar, utiliza o desbloqueo biométrico ou o bloqueo de pantalla"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-gu/strings.xml b/biometric/biometric/src/main/res/values-gu/strings.xml
index 4ee936a..24ab09f 100644
--- a/biometric/biometric/src/main/res/values-gu/strings.xml
+++ b/biometric/biometric/src/main/res/values-gu/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"કોઈ પિન, પૅટર્ન અથવા પાસવર્ડ સેટ કરેલો નથી."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"આ ડિવાઇસ પિન, પૅટર્ન અથવા પાસવર્ડને સપોર્ટ કરતું નથી."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"ફિંગરપ્રિન્ટ આઇકન"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"ફિંગરપ્રિન્ટનો ઉપયોગ કરો"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"ચહેરાનો ઉપયોગ કરો"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"બાયોમેટ્રિક્સનો ઉપયોગ કરો"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"સ્ક્રીન લૉકનો ઉપયોગ કરો"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"ફિંગરપ્રિન્ટ અથવા સ્ક્રીન લૉકનો ઉપયોગ કરો"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"ફેસ લૉક અથવા સ્ક્રીન લૉકનો ઉપયોગ કરો"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"બાયોમેટ્રિક્સ અથવા સ્ક્રીન લૉકનો ઉપયોગ કરો"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"આગળ વધવા માટે તમારી ફિંગરપ્રિન્ટનો ઉપયોગ કરો"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"આગળ વધવા માટે તમારા ચહેરાનો ઉપયોગ કરો"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"આગળ વધવા માટે બાયોમેટ્રિકનો ઉપયોગ કરો"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"આગળ વધવા માટે તમારું સ્ક્રીન લૉક દાખલ કરો"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"આગળ વધવા માટે તમારી ફિંગરપ્રિન્ટ અથવા સ્ક્રીન લૉકનો ઉપયોગ કરો"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"આગળ વધવા માટે તમારા ફેસ લૉક અથવા સ્ક્રીન લૉકનો ઉપયોગ કરો"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"આગળ વધવા માટે તમારા બાયોમેટ્રિક અથવા સ્ક્રીન લૉકનો ઉપયોગ કરો"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-hi/strings.xml b/biometric/biometric/src/main/res/values-hi/strings.xml
index 3fcc142..fdae943 100644
--- a/biometric/biometric/src/main/res/values-hi/strings.xml
+++ b/biometric/biometric/src/main/res/values-hi/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"पिन, पैटर्न या पासवर्ड सेट नहीं है."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"इस डिवाइस को पिन, पैटर्न या पासवर्ड की मदद से लॉक/अनलॉक नहीं किया जा सकता."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"फ़िंगरप्रिंट आइकॉन"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"फ़िंगरप्रिंट का इस्तेमाल करें"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"चेहरा दिखाएं"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"बायोमेट्रिक्स का इस्तेमाल करें"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"स्क्रीन लॉक क्रेडेंशियल का इस्तेमाल करें"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"फ़िंगरप्रिंट या स्क्रीन लॉक क्रेडेंशियल का इस्तेमाल करें"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"चेहरा दिखाएं या स्क्रीन लॉक क्रेडेंशियल का इस्तेमाल करें"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"बायोमेट्रिक्स या स्क्रीन लॉक क्रेडेंशियल का इस्तेमाल करें"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"जारी रखने के लिए, फ़िंगरप्रिंट का इस्तेमाल करें"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"जारी रखने के लिए, अपना चेहरा दिखाएं"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"जारी रखने के लिए, बायोमेट्रिक का इस्तेमाल करें"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"जारी रखने के लिए, अपना स्क्रीन लॉक क्रेडेंशियल डालें"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"जारी रखने के लिए, फ़िंगरप्रिंट या स्क्रीन लॉक क्रेडेंशियल का इस्तेमाल करें"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"जारी रखने के लिए, अपना चेहरा दिखाएं या स्क्रीन लॉक क्रेडेंशियल का इस्तेमाल करें"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"जारी रखने के लिए, बायोमेट्रिक या स्क्रीन लॉक क्रेडेंशियल का इस्तेमाल करें"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-hr/strings.xml b/biometric/biometric/src/main/res/values-hr/strings.xml
index ebd49c0..9768a0a 100644
--- a/biometric/biometric/src/main/res/values-hr/strings.xml
+++ b/biometric/biometric/src/main/res/values-hr/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Nisu postavljeni PIN, uzorak ni zaporka."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Ovaj uređaj ne podržava PIN, uzorak ili zaporku."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ikona otiska prsta"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Upotreba otiska prsta"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Upotreba autentifikacije licem"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Upotreba biometrijske autentifikacije"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Upotreba zaključavanja zaslona"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Upotreba otiska prsta ili zaključavanja zaslona"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Upotreba autentifikacije licem ili zaključavanja zaslona"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Upotreba biometrijske autentifikacije ili zaključavanja zaslona"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Za nastavak upotrijebite otisak prsta"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Za nastavak se identificirajte licem"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Za nastavak upotrijebite svoju biometrijsku autentifikaciju"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Za nastavak upotrijebite zaključavanje zaslona"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Za nastavak se identificirajte otiskom prsta ili vjerodajnicom zaključavanja zaslona"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Za nastavak se identificirajte licem ili vjerodajnicom zaključavanja zaslona"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Za nastavak se identificirajte biometrijski ili vjerodajnicom zaključavanja zaslona"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-hu/strings.xml b/biometric/biometric/src/main/res/values-hu/strings.xml
index 89ef351..cc43984 100644
--- a/biometric/biometric/src/main/res/values-hu/strings.xml
+++ b/biometric/biometric/src/main/res/values-hu/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Nem állított be PIN-kódot, mintát vagy jelszót."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Ez az eszköz nem támogatja PIN-kód, minta vagy jelszó használatát."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ujjlenyomat ikon"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Ujjlenyomat használata"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Arcalapú feloldás használata"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Biometriai feloldás használata"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Képernyőzár használata"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Ujjlenyomat vagy képernyőzár használata"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Arcalapú feloldás vagy képernyőzár használata"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Biometriai feloldás vagy képernyőzár használata"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"A folytatáshoz használja ujjlenyomatát"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"A folytatáshoz használja az arcalapú feloldást"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"A folytatás biometriai feloldással lehetséges"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"A folytatáshoz adja meg a képernyőzár hitelesítési adatait"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"A folytatás ujjlenyomattal vagy a képernyőzár feloldásával lehetséges"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"A folytatás arcalapú feloldással vagy a képernyőzár feloldásával lehetséges"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"A folytatás biometriai feloldással vagy a képernyőzár feloldásával lehetséges"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-hy/strings.xml b/biometric/biometric/src/main/res/values-hy/strings.xml
index fde0228..22c30ce 100644
--- a/biometric/biometric/src/main/res/values-hy/strings.xml
+++ b/biometric/biometric/src/main/res/values-hy/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Ավելացրեք PIN կոդ, նախշ կամ գաղտնաբառ։"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Այս սարքը չի աջակցում PIN կոդ, նախշ կամ գաղտնաբառ։"</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Մատնահետքի պատկերակ"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Օգտագործել մատնահետք"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Օգտագործել դեմքի նույնականացում"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Կենսաչափական համակարգեր"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Էկրանի կողպում"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Օգտագործել մատնահետք կամ էկրանի կողպում"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Օգտագործել դեմքի նույնականացում կամ էկրանի կողպում"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Օգտագործել կենսաչափական համակարգեր կամ էկրանի կողպում"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Շարունակելու համար անհրաժեշտ է ձեր մատնահետքը"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Շարունակելու համար օգտագործեք դեմքի նույնականացումը"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Շարունակելու համար օգտագործեք կենսաչափական համակարգեր"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Շարունակելու համար ապակողպեք էկրանը"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Շարունակելու համար օգտագործեք ձեր մատնահետքը կամ էկրանի կողպումը"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Շարունակելու համար օգտագործեք դեմքի նույնականացումը կամ էկրանի կողպումը"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Շարունակելու համար օգտագործեք կենսաչափական համակարգեր կամ էկրանի կողպումը"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-in/strings.xml b/biometric/biometric/src/main/res/values-in/strings.xml
index ef7272c..19c4404 100644
--- a/biometric/biometric/src/main/res/values-in/strings.xml
+++ b/biometric/biometric/src/main/res/values-in/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Tidak ada PIN, pola, atau sandi yang disetel."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Perangkat ini tidak mendukung PIN, pola, atau sandi."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ikon sidik jari"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Gunakan sidik jari"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Gunakan wajah"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Gunakan biometrik"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Gunakan kunci layar"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Gunakan sidik jari atau kunci layar"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Gunakan wajah atau kunci layar"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Gunakan biometrik atau kunci layar"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Gunakan sidik jari untuk melanjutkan"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Gunakan wajah untuk melanjutkan"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Gunakan biometrik untuk melanjutkan"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Masukkan kunci layar untuk melanjutkan"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Gunakan sidik jari atau kunci layar untuk melanjutkan"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Gunakan wajah atau kunci layar untuk melanjutkan"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Gunakan biometrik atau kunci layar untuk melanjutkan"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-is/strings.xml b/biometric/biometric/src/main/res/values-is/strings.xml
index 6354a23..c95d5e2 100644
--- a/biometric/biometric/src/main/res/values-is/strings.xml
+++ b/biometric/biometric/src/main/res/values-is/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Ekkert PIN-númer, mynstur eða aðgangsorð stillt."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Þetta tæki styður ekki PIN-númer, mynstur eða aðgangsorð."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Fingrafaratákn"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Nota fingrafar"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Nota andlit"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Nota lífkenni"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Nota skjálás"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Nota fingrafar eða skjálás"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Nota andlit eða skjálás"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Nota lífkenni eða skjálás"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Notaðu fingrafarið til að halda áfram"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Notaðu andlitið til að halda áfram"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Notaðu lífkenni til að halda áfram"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Sláðu inn skjálásinn til að halda áfram"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Notaðu fingrafar eða skjálás til að halda áfram"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Notaðu andlitið eða skjálás til að halda áfram"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Notaðu lífkenni eða skjálás til að halda áfram"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-it/strings.xml b/biometric/biometric/src/main/res/values-it/strings.xml
index 6465ef50..1a3cf4d 100644
--- a/biometric/biometric/src/main/res/values-it/strings.xml
+++ b/biometric/biometric/src/main/res/values-it/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Non hai impostato PIN, sequenza o password."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Questo dispositivo non supporta il PIN, la sequenza o la password."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Icona dell\'impronta"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Usa l\'impronta"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Usa il volto"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Usa i dati biometrici"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Usa il blocco schermo"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Usa l\'impronta o il blocco schermo"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Usa il volto o il blocco schermo"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Usa i dati biometrici o il blocco schermo"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Usa la tua impronta per continuare"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Usa il tuo volto per continuare"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Usa i tuoi dati biometrici per continuare"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Inserisci il tuo blocco schermo per continuare"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Per continuare, devi usare la tua impronta o il tuo blocco schermo"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Per continuare, devi usare il tuo volto o il tuo blocco schermo"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Per continuare, devi usare i tuoi dati biometrici o il tuo blocco schermo"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-iw/strings.xml b/biometric/biometric/src/main/res/values-iw/strings.xml
index 170d50f..c5e57f8 100644
--- a/biometric/biometric/src/main/res/values-iw/strings.xml
+++ b/biometric/biometric/src/main/res/values-iw/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"עוד לא הוגדרו קוד אימות, קו ביטול נעילה או סיסמה."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"המכשיר הזה לא תומך בקוד אימות, בקו ביטול נעילה או בסיסמה."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"סמל טביעת אצבע"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"שימוש בטביעת אצבע"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"שימוש בזיהוי פנים"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"שימוש במידע ביומטרי"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"שימוש בנעילת מסך"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"שימוש בטביעת אצבע או בנעילת מסך"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"שימוש בזיהוי פנים או בנעילת מסך"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"שימוש במידע ביומטרי או בנעילת מסך"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"צריך להשתמש בטביעת האצבע כדי להמשיך"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"צריך להשתמש בזיהוי הפנים כדי להמשיך"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"צריך להשתמש במידע ביומטרי כדי להמשיך"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"צריך לבטל את נעילת המסך כדי להמשיך"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"צריך להשתמש בטביעת האצבע או בנעילת המסך כדי להמשיך"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"צריך להשתמש בזיהוי הפנים או בנעילת המסך כדי להמשיך"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"צריך להשתמש במידע הביומטרי או בנעילת המסך כדי להמשיך"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-ja/strings.xml b/biometric/biometric/src/main/res/values-ja/strings.xml
index 2187bed..8fb1180 100644
--- a/biometric/biometric/src/main/res/values-ja/strings.xml
+++ b/biometric/biometric/src/main/res/values-ja/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"PIN、パターン、パスワードが設定されていません。"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"このデバイスは PIN、パターン、パスワードをサポートしていません。"</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"指紋アイコン"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"指紋を使用"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"顔を使用"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"生体認証を使用"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"画面ロックを使用"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"指紋または画面ロックを使用"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"顔認証または画面ロックを使用"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"生体認証または画面ロックを使用"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"続行するには指紋認証を使用してください"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"続行するには顔認証を使用してください"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"続行するには生体認証を使用してください"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"続行するには画面ロックを入力してください"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"続行するには指紋認証または画面ロックを使用してください"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"続行するには顔認証または画面ロックを使用してください"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"続行するには生体認証または画面ロックを使用してください"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-ka/strings.xml b/biometric/biometric/src/main/res/values-ka/strings.xml
index aaa08e1..6435252 100644
--- a/biometric/biometric/src/main/res/values-ka/strings.xml
+++ b/biometric/biometric/src/main/res/values-ka/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"PIN-კოდი, განმბლოკავი ნიმუში ან პაროლი დაყენებული არ არის."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"ამ მოწყობილობას არ აქვს PIN-კოდის, ნიმუშის ან პაროლის მხარდაჭერა."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"თითის ანაბეჭდის ხატულა"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"გამოიყენეთ თითის ანაბეჭდი"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"გამოიყენეთ სახე"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"გამოიყენეთ ბიომეტრიული სისტემა"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"გამოიყენეთ ეკრანის დაბლოკვა"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"გამოიყენეთ თითის ანაბეჭდი ან ეკრანის დაბლოკვა"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"გამოიყენეთ სახე ან ეკრანის დაბლოკვა"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"გამოიყენეთ ბიომეტრიული სისტემა ან ეკრანის დაბლოკვა"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"გასაგრძელებლად გამოიყენეთ თქვენი თითის ანაბეჭდი"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"გასაგრძელებლად გამოიყენეთ თქვენი სახე"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"გასაგრძელებლად გამოიყენეთ თქვენი ბიომეტრიული მონაცემები"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"გასაგრძელებლად შედით ეკრანის დაბლოკვაში"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"გასაგრძელებლად გამოიყენეთ თქვენი თითის ანაბეჭდი ან ეკრანის განბლოკვის ნიმუში"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"გასაგრძელებლად გამოიყენეთ თქვენი სახე ან ეკრანის განბლოკვის ნიმუში"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"გასაგრძელებლად გამოიყენეთ თქვენი ბიომეტრიული მონაცემები ან ეკრანის განბლოკვის ნიმუში"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-kk/strings.xml b/biometric/biometric/src/main/res/values-kk/strings.xml
index 8e698cb8..24ae7d4 100644
--- a/biometric/biometric/src/main/res/values-kk/strings.xml
+++ b/biometric/biometric/src/main/res/values-kk/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Ешқандай PIN коды, өрнек немесе құпия сөз орнатылмаған."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Бұл құрылғы PIN кодын, өрнекті не құпия сөзді қолдамайды."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Саусақ ізі белгішесі"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Саусақ ізін пайдалану"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Бетті анықтау функциясын пайдалану"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Биометриканы пайдалану"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Экран құлпын пайдалану"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Саусақ ізін немесе экран құлпын пайдалану"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Бетті анықтау функциясын немесе экран құлпын пайдалану"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Биометриканы немесе экран құлпын пайдалану"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Жалғастыру үшін саусақ ізін пайдаланыңыз."</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Жалғастыру үшін бетті анықтау функциясын пайдаланыңыз."</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Жалғастыру үшін биометрикаңызды пайдаланыңыз."</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Жалғастыру үшін экран құлпын енгізіңіз."</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Жалғастыру үшін саусақ ізін немесе экран құлпын пайдаланыңыз."</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Жалғастыру үшін бетті анықтау функциясын немесе экран құлпын пайдаланыңыз."</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Жалғастыру үшін биометриканы немесе экран құлпын пайдаланыңыз."</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-km/strings.xml b/biometric/biometric/src/main/res/values-km/strings.xml
index 6445f20..3b84b05 100644
--- a/biometric/biometric/src/main/res/values-km/strings.xml
+++ b/biometric/biometric/src/main/res/values-km/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"គ្មាន​ការកំណត់​កូដ PIN លំនាំ ឬពាក្យសម្ងាត់​ទេ។"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"ឧបករណ៍នេះ​មិនអាចប្រើកូដ PIN លំនាំ ឬពាក្យ​សម្ងាត់បានទេ។"</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"រូបស្នាមម្រាមដៃ"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"ប្រើស្នាមម្រាមដៃ"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"ប្រើមុខ"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"ប្រើ​ជីវមាត្រ"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"ប្រើ​ការ​ចាក់​សោ​អេក្រង់"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"ប្រើស្នាមម្រាមដៃ ឬ​ការចាក់សោអេក្រង់"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"ប្រើមុខ ឬ​ការចាក់សោអេក្រង់"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"ប្រើជីវមាត្រ ឬ​ការចាក់សោអេក្រង់"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"ប្រើ​ស្នាមម្រាមដៃ​របស់អ្នក ដើម្បីបន្ត"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"ប្រើមុខរបស់អ្នក ដើម្បីបន្ត"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"ប្រើជីវមាត្រ​របស់អ្នក ដើម្បីបន្ត"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"បញ្ចូលការចាក់សោអេក្រង់របស់អ្នក ដើម្បីបន្ត"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"ប្រើការចាក់សោអេក្រង់ ឬស្នាមម្រាមដៃរបស់អ្នក ដើម្បីបន្ត"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"ប្រើការចាក់សោអេក្រង់ ឬមុខរបស់អ្នក ដើម្បីបន្ត"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"ប្រើការចាក់សោអេក្រង់ ឬជីវមាត្ររបស់អ្នក ដើម្បីបន្ត"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-kn/strings.xml b/biometric/biometric/src/main/res/values-kn/strings.xml
index 76cfa56..fa614d1 100644
--- a/biometric/biometric/src/main/res/values-kn/strings.xml
+++ b/biometric/biometric/src/main/res/values-kn/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"ಯಾವುದೇ ಪಿನ್, ಪ್ಯಾಟರ್ನ್ ಅಥವಾ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಹೊಂದಿಸಿಲ್ಲ."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"ಈ ಸಾಧನವು ಪಿನ್, ಪ್ಯಾಟರ್ನ್ ಅಥವಾ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಐಕಾನ್"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"ಫಿಂಗರ್ ಪ್ರಿಂಟ್ ಬಳಸಿ"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"ಮುಖವನ್ನು ಬಳಸಿ"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"ಬಯೋಮೆಟ್ರಿಕ್ಸ್ ಬಳಸಿ"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಬಳಸಿ"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"ಫಿಂಗರ್‌ ಪ್ರಿಂಟ್ ಅಥವಾ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ಬಳಸಿ"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"ಮುಖ ಅಥವಾ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ಬಳಸಿ"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"ಬಯೋಮೆಟ್ರಿಕ್ಸ್ ಅಥವಾ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ಬಳಸಿ"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"ಮುಂದುವರಿಸಲು ನಿಮ್ಮ ಫಿಂಗರ್ ಪ್ರಿಂಟ್ ಅನ್ನು ಬಳಸಿ"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"ಮುಂದುವರಿಸಲು ನಿಮ್ಮ ಮುಖವನ್ನು ಬಳಸಿ"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"ಮುಂದುವರಿಸಲು ನಿಮ್ಮ ಬಯೋಮೆಟ್ರಿಕ್ ಬಳಸಿ"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"ಮುಂದುವರಿಯಲು ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಲಾಕ್‌ ಅನ್ನು ನಮೂದಿಸಿ"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"ಮುಂದುವರಿಸಲು ಫಿಂಗರ್ ಪ್ರಿಂಟ್ ಅಥವಾ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ಬಳಸಿ"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"ಮುಂದುವರಿಸಲು ನಿಮ್ಮ ಮುಖ ಅಥವಾ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ಬಳಸಿ"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"ಮುಂದುವರಿಸಲು ನಿಮ್ಮ ಬಯೋಮೆಟ್ರಿಕ್ ಅಥವಾ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ಬಳಸಿ"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-ko/strings.xml b/biometric/biometric/src/main/res/values-ko/strings.xml
index a41b145..a6826b4 100644
--- a/biometric/biometric/src/main/res/values-ko/strings.xml
+++ b/biometric/biometric/src/main/res/values-ko/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"PIN, 패턴, 비밀번호가 설정되지 않았습니다."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"PIN, 패턴, 비밀번호를 지원하지 않는 기기입니다."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"지문 아이콘"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"지문 사용"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"얼굴 인식 사용"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"생체 인식 사용"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"화면 잠금 사용"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"지문 또는 화면 잠금 사용"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"얼굴 또는 화면 잠금 사용"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"생체 인식 또는 화면 잠금 사용"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"계속하려면 지문을 사용하세요."</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"계속하려면 얼굴 인식을 사용하세요."</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"계속하려면 생체 인식을 사용하세요."</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"계속하려면 화면 잠금용 사용자 인증 정보를 입력하세요."</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"계속하려면 지문이나 화면 잠금을 사용하세요."</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"계속하려면 얼굴 또는 화면 잠금을 사용하세요."</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"계속하려면 생체 인식이나 화면 잠금을 사용하세요."</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-ky/strings.xml b/biometric/biometric/src/main/res/values-ky/strings.xml
index 5cb22f0..4c50879 100644
--- a/biometric/biometric/src/main/res/values-ky/strings.xml
+++ b/biometric/biometric/src/main/res/values-ky/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"PIN код, графикалык ачкыч же сырсөз коюлган жок."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Бул түзмөктө PIN кодду, графикалык ачкычты же сырсөздү колдонууга болбойт."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Манжа изинин сүрөтчөсү"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Манжа изин колдонуу"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Жүзүнөн таанып ачууну колдонуу"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Биометрикалык жөндөөлөрдү колдонуу"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Экран кулпусун колдонуу"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Манжа изин же экрандын кулпусун колдонуу"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Жүзүнөн таанып ачууну же экрандын кулпусун колдонуу"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Биометрикалык жөндөөнү же экрандын кулпусун колдонуу"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Улантуу үчүн манжаңызды сканерге тийгизиңиз"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Улантуу үчүн жүзүңүздү көрсөтүңүз"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Улантуу үчүн биометрикалык жөндөөнү колдонуу"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Улантуу үчүн экрандын кулпусун киргизиңиз"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Улантуу үчүн манжа изин же экрандын кулпусун колдонуңуз"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Улантуу үчүн жүзүңүздү же экрандын кулпусун колдонуңуз"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Улантуу үчүн биометрикалык маалыматты же экрандын кулпусун колдонуңуз"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-lo/strings.xml b/biometric/biometric/src/main/res/values-lo/strings.xml
index 969f107..0d499ae 100644
--- a/biometric/biometric/src/main/res/values-lo/strings.xml
+++ b/biometric/biometric/src/main/res/values-lo/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"ບໍ່ໄດ້ຕັ້ງ PIN, ຮູບແບບປົດລັອກ ຫຼື ລະຫັດຜ່ານ."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"ອຸປະກອນນີ້ບໍ່ຮອງຮັບ PIN, ຮູບແບບ ຫຼື ລະຫັດຜ່ານ."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"ໄອຄອນລາຍນິ້ວມື"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"ໃຊ້ລາຍນິ້ວມື"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"ໃຊ້ໜ້າ"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"ໃຊ້ລະບົບຊີວະມິຕິ"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"ໃຊ້ການລັອກໜ້າຈໍ"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"ໃຊ້ລາຍນິ້ວມື ຫຼື ການລັອກໜ້າຈໍ"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"ໃຊ້ໜ້າ ຫຼື ການລັອກໜ້າຈໍ"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"ໃຊ້ລະບົບຊີວະມິຕິ ຫຼື ການລັອກໜ້າຈໍ"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"ກະລຸນາໃຊ້ລາຍນິ້ວມືຂອງທ່ານເພື່ອດຳເນີນການຕໍ່"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"ໃຊ້ໜ້າທ່ານເພື່ອດຳເນີນການຕໍ່"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"ໃຊ້ລະບົບຊີວະມິຕິຂອງທ່ານເພື່ອດຳເນີນການຕໍ່"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"ໃສ່ການລັອກໜ້າຈໍຂອງທ່ານເພື່ອດຳເນີນການຕໍ່"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"ໃຊ້ລາຍນິ້ວມື ຫຼື ການລັອກໜ້າຈໍຂອງທ່ານເພື່ອດຳເນີນການຕໍ່"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"ໃຊ້ໜ້າ ຫຼື ການລັອກໜ້າຈໍຂອງທ່ານເພື່ອດຳເນີນການຕໍ່"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"ໃຊ້ລະບົບຊີວະມິຕິ ຫຼື ການລັອກໜ້າຈໍຂອງທ່ານເພື່ອດຳເນີນການຕໍ່"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-lt/strings.xml b/biometric/biometric/src/main/res/values-lt/strings.xml
index bde9932..180b3fe 100644
--- a/biometric/biometric/src/main/res/values-lt/strings.xml
+++ b/biometric/biometric/src/main/res/values-lt/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Nenustatytas PIN kodas, atrakinimo piešinys arba slaptažodis."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Šis įrenginys nepalaiko PIN kodo, šablono ar slaptažodžio."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Kontrolinio kodo piktograma"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Naudoti kontrolinį kodą"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Naudoti veido atpažinimo funkciją"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Naudoti biometrinius duomenis"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Naudoti ekrano užraktą"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Naudoti kontrolinį kodą arba ekrano užraktą"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Naudoti veido atpažinimo funkciją arba ekrano užraktą"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Naudoti biometrinius duomenis arba ekrano užraktą"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Jei norite tęsti, naudokite kontrolinį kodą"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Jei norite tęsti, naudokite veido atpažinimo funkciją"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Norėdami tęsti, naudokite biometrinius duomenis"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Jei norite tęsti, įveskite ekrano užraktą"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Jei norite tęsti, naudokite kontrolinį kodą arba ekrano užraktą"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Jei norite tęsti, naudokite veido atpažinimo funkciją arba ekrano užraktą"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Jei norite tęsti, naudokite biometrinius duomenis arba ekrano užraktą"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-lv/strings.xml b/biometric/biometric/src/main/res/values-lv/strings.xml
index 659166e..be4eac9 100644
--- a/biometric/biometric/src/main/res/values-lv/strings.xml
+++ b/biometric/biometric/src/main/res/values-lv/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Nav iestatīts PIN, kombinācija vai parole."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Šajā ierīcē netiek atbalstīta autentifikācija ar PIN, kombināciju vai paroli."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Pirksta nospieduma ikona"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Izmantot pirksta nospiedumu"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Izmantot autorizāciju pēc sejas"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Izmantot biometrijas datus"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Izmantot ekrāna bloķēšanas opciju"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Izmantot pirksta nospiedumu vai ekrāna bloķēšanas opciju"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Izmantot autorizāciju pēc sejas vai ekrāna bloķēšanas opciju"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Izmantot biometrijas datus vai ekrāna bloķēšanas opciju"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Izmantojiet pirksta nospiedumu, lai turpinātu"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Izmantojiet autorizāciju pēc sejas, lai turpinātu"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Izmantojiet biometrijas datus, lai turpinātu"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Ievadiet ekrāna bloķēšanas informāciju, lai turpinātu"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Izmantojiet pirksta nospiedumu vai ekrāna bloķēšanas opciju, lai turpinātu"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Izmantojiet autorizāciju pēc sejas vai ekrāna bloķēšanas opciju, lai turpinātu"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Izmantojiet biometrijas datus vai ekrāna bloķēšanas opciju, lai turpinātu"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-mk/strings.xml b/biometric/biometric/src/main/res/values-mk/strings.xml
index ebdbf0b..06cbd75 100644
--- a/biometric/biometric/src/main/res/values-mk/strings.xml
+++ b/biometric/biometric/src/main/res/values-mk/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Не е поставен PIN, шема или лозинка."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Уредов не поддржува PIN, шема или лозинка."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Икона за отпечаток"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Користи отпечаток"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Користи лик"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Користи биометрика"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Користи заклучување екран"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Користи отпечаток или заклучување екран"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Користи лик или заклучување екран"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Користи биометрика или заклучен екран"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Користете го отпечатокот за да продолжите"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Користете го вашиот лик за да продолжите"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Користете ја вашата биометрика за да продолжите"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Внесете го заклучувањето на екранот за да продолжите"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Користете го вашиот отпечаток или заклучување екран за да продолжите"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Користете отклучување со лик или заклучување екран за да продолжите"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Користете ја вашата биометрика или заклучување екран за да продолжите"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-ml/strings.xml b/biometric/biometric/src/main/res/values-ml/strings.xml
index dbfd039..9d485be 100644
--- a/biometric/biometric/src/main/res/values-ml/strings.xml
+++ b/biometric/biometric/src/main/res/values-ml/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"പിൻ, പാറ്റേൺ, അല്ലെങ്കിൽ പാസ്‍വേഡ് ഇവയൊന്നും സജ്ജീകരിച്ചിട്ടില്ല."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"പിൻ, പാറ്റേൺ, പാസ്‌വേഡ് എന്നിവ ഈ ഉപകരണം പിന്തുണയ്ക്കുന്നില്ല."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"ഫിംഗർപ്രിന്റ് ഐക്കൺ"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"ഫിംഗർപ്രിന്റ് ഉപയോഗിക്കുക"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"മുഖം ഉപയോഗിക്കുക"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"ബയോമെട്രിക്‌സ് ഉപയോഗിക്കുക"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"സ്‌ക്രീൻ ലോക്ക് ഉപയോഗിക്കുക"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"ഫിംഗർപ്രിന്റോ സ്‌ക്രീൻ ലോക്കോ ഉപയോഗിക്കുക"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"മുഖമോ സ്‌ക്രീൻ ലോക്കോ ഉപയോഗിക്കുക"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"ബയോമെട്രിക്‌സോ സ്‌ക്രീൻ ലോക്കോ ഉപയോഗിക്കുക"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"തുടരുന്നതിന് നിങ്ങളുടെ ഫിംഗർപ്രിന്റ് ഉപയോഗിക്കുക"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"തുടരാൻ നിങ്ങളുടെ മുഖം ഉപയോഗിക്കുക"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"തുടരാൻ ബയോമെട്രിക് ഉപയോഗിക്കുക"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"തുടരാൻ നിങ്ങളുടെ സ്‌ക്രീൻ ലോക്ക് നൽകുക"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"തുടരാൻ നിങ്ങളുടെ ഫിംഗർപ്രിന്റോ സ്‌ക്രീൻ ലോക്കോ ഉപയോഗിക്കുക"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"തുടരാൻ നിങ്ങളുടെ മുഖമോ സ്‌ക്രീൻ ലോക്കോ ഉപയോഗിക്കുക"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"തുടരാൻ നിങ്ങളുടെ ബയോമെട്രിക്‌ അല്ലെങ്കിൽ സ്‌ക്രീൻ ലോക്ക് ഉപയോഗിക്കുക"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-mn/strings.xml b/biometric/biometric/src/main/res/values-mn/strings.xml
index 4ad08b0..aac9621 100644
--- a/biometric/biometric/src/main/res/values-mn/strings.xml
+++ b/biometric/biometric/src/main/res/values-mn/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Тохируулсан ПИН, хээ эсвэл нууц үг алга."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Энэ төхөөрөмж ПИН, хээ эсвэл нууц үгийг дэмждэггүй."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Хурууны хээний дүрс тэмдэг"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Хурууны хээг ашиглах"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Царайг ашиглах"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Биометрыг ашиглах"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Дэлгэцийн түгжээг ашиглах"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Хурууны хээ эсвэл дэлгэцийн түгжээг ашиглах"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Царай эсвэл дэлгэцийн түгжээг ашиглах"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Биометр эсвэл дэлгэцийн түгжээг ашиглах"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Үргэлжлүүлэхийн тулд хурууны хээгээ ашиглана уу"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Үргэлжлүүлэхийн тулд царайгаа ашиглана уу"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Үргэлжлүүлэхийн тулд биометрээ ашиглана уу"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Үргэлжлүүлэхийн тулд дэлгэцийн түгжээгээ оруулна уу"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Үргэлжлүүлэхийн тулд хурууны хээ эсвэл дэлгэцийн түгжээгээ ашиглана уу"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Үргэлжлүүлэхийн тулд царай эсвэл дэлгэцийн түгжээгээ ашиглана уу"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Үргэлжлүүлэхийн тулд биометр эсвэл дэлгэцийн түгжээгээ ашиглана уу"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-mr/strings.xml b/biometric/biometric/src/main/res/values-mr/strings.xml
index e76ff00..1e07a28 100644
--- a/biometric/biometric/src/main/res/values-mr/strings.xml
+++ b/biometric/biometric/src/main/res/values-mr/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"कोणताही पिन, पॅटर्न किंवा पासवर्ड सेट केलेला नाही."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"हे डिव्हाइस पिन, पॅटर्न किंवा पासवर्ड यांना सपोर्ट करत नाही."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"फिंगरप्रिंटचा आयकन"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"फिंगरप्रिंट वापरा"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"चेहरा वापरा"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"बायोमेट्रिक वापरा"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"स्क्रीन लॉक वापरा"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"फिंगरप्रिंट किंवा स्क्रीन लॉक वापरा"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"चेहरा किंवा स्क्रीन लॉक वापरा"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"बायोमेट्रिक किंवा स्क्रीन लॉक वापरा"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"पुढे सुरू ठेवण्‍यासाठी तुमची फिंगरप्रिंट वापरा"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"पुढे सुरू ठेवण्यासाठी तुमचा चेहरा वापरा"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"पुढे सुरू ठेवण्यासाठी तुमचे बायोमेट्रिक वापरा"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"पुढे सुरू ठेवण्यासाठी तुमचे स्क्रीन लॉक एंटर करा"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"पुढे सुरू ठेवण्यासाठी तुमची फिंगरप्रिंट किंवा स्क्रीन लॉक वापरा"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"पुढे सुरू ठेवण्यासाठी तुमचा चेहरा किंवा स्क्रीन लॉक वापरा"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"पुढे सुरू ठेवण्यासाठी तुमचे बायोमेट्रिक किंवा स्क्रीन लॉक वापरा"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-ms/strings.xml b/biometric/biometric/src/main/res/values-ms/strings.xml
index da98421..464441f 100644
--- a/biometric/biometric/src/main/res/values-ms/strings.xml
+++ b/biometric/biometric/src/main/res/values-ms/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"PIN, corak atau kata laluan tidak ditetapkan."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Peranti ini tidak menyokong PIN, corak atau kata laluan."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ikon cap jari"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Gunakan cap jari"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Gunakan wajah"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Gunakan biometrik"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Gunakan kunci skrin"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Gunakan cap jari atau kunci skrin"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Gunakan kunci wajah atau skrin"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Gunakan biometrik atau kunci skrin"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Gunakan cap jari anda untuk meneruskan"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Gunakan wajah untuk meneruskan"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Gunakan biometrik anda untuk meneruskan"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Masukkan kunci skrin untuk meneruskan"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Gunakan cap jari atau kunci skrin anda untuk meneruskan"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Gunakan wajah atau kunci skrin anda untuk meneruskan"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Gunakan biometrik atau kunci skrin anda untuk meneruskan"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-my/strings.xml b/biometric/biometric/src/main/res/values-my/strings.xml
index 6495635..06608ba 100644
--- a/biometric/biometric/src/main/res/values-my/strings.xml
+++ b/biometric/biometric/src/main/res/values-my/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"ပင်နံပါတ်၊ လော့ခ်ပုံစံ သို့မဟုတ် စကားဝှက် သတ်မှတ်မထားပါ။"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"ဤစက်သည် ပင်နံပါတ်၊ ပုံစံ သို့မဟုတ် စကားဝှက်ကို မပံ့ပိုးပါ။"</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"လက်ဗွေ သင်္ကေတ"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"လက်ဗွေ သုံးရန်"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"မျက်နှာမှတ်သော့ဖွင့်ခြင်းကို သုံးရန်"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"ဇီဝမက်ထရစ် အချက်အလက်များ သုံးရန်"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"ဖန်သားပြင်လော့ခ်ကို သုံးရန်"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"လက်ဗွေ (သို့) ဖန်သားပြင်လော့ခ်ကို သုံးရန်"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"မျက်နှာမှတ်သော့ဖွင့်ခြင်း (သို့) ဖန်သားပြင်လော့ခ်ကို သုံးရန်"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"ဇီဝမက်ထရစ် အချက်အလက်များ (သို့) ဖန်သားပြင်လော့ခ်ကို သုံးရန်"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"ရှေ့ဆက်ရန် သင့်လက်ဗွေကို သုံးပါ"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"ရှေ့ဆက်ရန် သင့်မျက်နှာမှတ်သော့ဖွင့်ခြင်းကို သုံးပါ"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"ရှေ့ဆက်ရန် သင်၏ ဇီဝမက်ထရစ် အချက်အလက်ကို သုံးပါ"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"ရှေ့ဆက်ရန် ဖန်သားပြင်လော့ခ်ကို ထည့်ပါ"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"ရှေ့ဆက်ရန် သင့်လက်ဗွေ (သို့) ဖန်သားပြင်လော့ခ်ကို သုံးပါ"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"ရှေ့ဆက်ရန် သင့်မျက်နှာမှတ်သော့ဖွင့်ခြင်း (သို့) ဖန်သားပြင်လော့ခ်ကို သုံးပါ"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"ရှေ့ဆက်ရန် သင်၏ ဇီဝမက်ထရစ် အချက်အလက် (သို့) ဖန်သားပြင်လော့ခ်ကို သုံးပါ"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-nb/strings.xml b/biometric/biometric/src/main/res/values-nb/strings.xml
index 3b8a7bc..18f6108 100644
--- a/biometric/biometric/src/main/res/values-nb/strings.xml
+++ b/biometric/biometric/src/main/res/values-nb/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"PIN-kode, mønster eller passord er ikke angitt."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Denne enheten støtter ikke PIN-kode, mønster eller passord."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ikon for fingeravtrykk"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Bruk fingeravtrykket"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Bruk ansiktet"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Bruk biometri"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Bruk skjermlåsen"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Bruk fingeravtrykket eller skjermlåsen"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Bruk ansiktet eller skjermlåsen"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Bruk biometri eller skjermlåsen"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Bruk fingeravtrykket for å fortsette"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Bruk ansiktet for å fortsette"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Bruk biometri for å fortsette"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Skriv inn skjermlåsen for å fortsette"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Bruk fingeravtrykket eller skjermlåsen for å fortsette"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Bruk ansiktet eller skjermlåsen for å fortsette"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Bruk biometri eller skjermlåsen for å fortsette"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-ne/strings.xml b/biometric/biometric/src/main/res/values-ne/strings.xml
index 86727dc..f4ec4c3 100644
--- a/biometric/biometric/src/main/res/values-ne/strings.xml
+++ b/biometric/biometric/src/main/res/values-ne/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"कुनै पनि PIN, ढाँचा वा पासवर्ड सेट गरिएको छैन।"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"यस डिभाइसमा PIN, ढाँचा वा पासवर्ड प्रयोग गर्न मिल्दैन।"</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"फिंगरप्रिन्ट जनाउने आइकन"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"फिंगरप्रिन्ट प्रयोग गरी पुष्टि गर्नुहोस्"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"फेस प्रयोग गरी पुष्टि गर्नुहोस्"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"बायोमेट्रिक्स प्रयोग गरी पुष्टि गर्नुहोस्"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"स्क्रिन लक प्रयोग गरी पुष्टि गर्नुहोस्"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"फिंगरप्रिन्ट वा स्क्रिन लक प्रयोग गरी पुष्टि गर्नुहोस्"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"फेस वा स्क्रिन लक प्रयोग गरी पुष्टि गर्नुहोस्"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"बायोमेट्रिक्स वा स्क्रिन लक प्रयोग गरी पुष्टि गर्नुहोस्"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"जारी राख्न आफ्नो फिंगरप्रिन्ट प्रयोग गरी पुष्टि गर्नुहोस्"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"जारी राख्न आफ्नो फेस प्रयोग गरी पुष्टि गर्नुहोस्"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"जारी राख्न आफ्नो बायोमेट्रिक प्रयोग गरी पुष्टि गर्नुहोस्"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"जारी राख्न आफ्नो स्क्रिन लक प्रयोग गरी पुष्टि गर्नुहोस्"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"जारी राख्न आफ्नो फिंगरप्रिन्ट वा स्क्रिन लक प्रयोग गरी पुष्टि गर्नुहोस्"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"जारी राख्न आफ्नो फेस वा स्क्रिन लक प्रयोग गरी पुष्टि गर्नुहोस्"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"जारी राख्न आफ्नो बायोमेट्रिक वा स्क्रिन लक प्रयोग गरी पुष्टि गर्नुहोस्"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-nl/strings.xml b/biometric/biometric/src/main/res/values-nl/strings.xml
index 7f39eef..8195c1f 100644
--- a/biometric/biometric/src/main/res/values-nl/strings.xml
+++ b/biometric/biometric/src/main/res/values-nl/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Geen pincode, patroon of wachtwoord ingesteld."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Dit apparaat ondersteunt geen pincode, patroon of wachtwoord."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Vingerafdrukicoon"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Vingerafdruk gebruiken"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Gezicht gebruiken"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Biometrische gegevens gebruiken"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Schermvergrendeling gebruiken"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Vingerafdruk of schermvergrendeling gebruiken"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Gezicht of schermgrendeling gebruiken"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Biometrische gegevens of schermvergrendeling gebruiken"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Gebruik je vingerafdruk om door te gaan"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Gebruik je gezicht om door te gaan"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Gebruik je biometrische gegevens om door te gaan"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Geef je schermvergrendeling op om door te gaan"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Gebruik je vingerafdruk of schermvergrendeling om door te gaan"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Gebruik je gezicht of schermvergrendeling om door te gaan"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Gebruik je biometrische gegevens of schermvergrendeling om door te gaan"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-or/strings.xml b/biometric/biometric/src/main/res/values-or/strings.xml
index a64e17f..b80bb0f 100644
--- a/biometric/biometric/src/main/res/values-or/strings.xml
+++ b/biometric/biometric/src/main/res/values-or/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"କୌଣସି PIN, ପାଟର୍ନ ବା ପାସୱାର୍ଡ ସେଟ୍ ହୋଇନାହିଁ।"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"ଏହି ଡିଭାଇସ୍ PIN, ପାଟର୍ନ କିମ୍ବା ପାସୱାର୍ଡକୁ ସମର୍ଥନ କରେ ନାହିଁ।"</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"ଟିପଚିହ୍ନ ଆଇକନ୍"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"ଟିପଚିହ୍ନ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"ଫେସ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"ବାୟୋମେଟ୍ରିକ୍ସ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"ସ୍କ୍ରିନ ଲକ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"ଟିପଚିହ୍ନ କିମ୍ବା ସ୍କ୍ରିନ ଲକ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"ଫେସ କିମ୍ବା ସ୍କ୍ରିନ ଲକ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"ବାୟୋମେଟ୍ରିକ୍ସ କିମ୍ବା ସ୍କ୍ରିନ ଲକ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"ଜାରି ରଖିବାକୁ ଆପଣଙ୍କ ଟିପଚିହ୍ନ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"ଜାରି ରଖିବାକୁ ଆପଣଙ୍କ ଫେସ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"ଜାରି ରଖିବାକୁ ଆପଣଙ୍କ ବାୟୋମେଟ୍ରିକ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"ଜାରି ରଖିବାକୁ ଆପଣଙ୍କ ସ୍କ୍ରିନ ଲକ ଏଣ୍ଟର କରନ୍ତୁ"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"ଜାରି ରଖିବାକୁ ଆପଣଙ୍କ ଟିପଚିହ୍ନ କିମ୍ବା ସ୍କ୍ରିନ ଲକ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"ଜାରି ରଖିବାକୁ ଆପଣଙ୍କ ଫେସ କିମ୍ବା ସ୍କ୍ରିନ ଲକ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"ଜାରି ରଖିବାକୁ ଆପଣଙ୍କ ବାୟୋମେଟ୍ରିକ କିମ୍ବା ସ୍କ୍ରିନ ଲକ ବ୍ୟବହାର କରନ୍ତୁ"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-pa/strings.xml b/biometric/biometric/src/main/res/values-pa/strings.xml
index 7cea4a3..195a804 100644
--- a/biometric/biometric/src/main/res/values-pa/strings.xml
+++ b/biometric/biometric/src/main/res/values-pa/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"ਕੋਈ ਪਿੰਨ, ਪੈਟਰਨ ਜਾਂ ਪਾਸਵਰਡ ਸੈੱਟ ਨਹੀਂ ਕੀਤਾ ਗਿਆ।"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"ਇਹ ਡੀਵਾਈਸ ਪਿੰਨ, ਪੈਟਰਨ ਜਾਂ ਪਾਸਵਰਡ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦਾ।"</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਪ੍ਰਤੀਕ"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਵਰਤੋ"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"ਚਿਹਰੇ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"ਬਾਇਓਮੈਟ੍ਰਿਕ ਵਰਤੋ"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"ਸਕ੍ਰੀਨ ਲਾਕ ਵਰਤੋ"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਜਾਂ ਸਕ੍ਰੀਨ ਲਾਕ ਵਰਤੋ"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"ਚਿਹਰਾ ਜਾਂ ਸਕ੍ਰੀਨ ਲਾਕ ਵਰਤੋ"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"ਬਾਇਓਮੈਟ੍ਰਿਕ ਜਾਂ ਸਕ੍ਰੀਨ ਲਾਕ ਵਰਤੋ"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"ਜਾਰੀ ਰੱਖਣ ਲਈ ਆਪਣਾ ਫਿੰਗਰਪ੍ਰਿੰਟ ਵਰਤੋ"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"ਜਾਰੀ ਰੱਖਣ ਲਈ ਆਪਣੇ ਚਿਹਰੇ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"ਜਾਰੀ ਰੱਖਣ ਲਈ ਆਪਣਾ ਬਾਇਓਮੈਟ੍ਰਿਕ ਵਰਤੋ"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"ਜਾਰੀ ਰੱਖਣ ਲਈ ਆਪਣਾ ਸਕ੍ਰੀਨ ਲਾਕ ਦਾਖਲ ਕਰੋ"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"ਜਾਰੀ ਰੱਖਣ ਲਈ ਆਪਣਾ ਫਿੰਗਰਪ੍ਰਿੰਟ ਜਾਂ ਸਕ੍ਰੀਨ ਲਾਕ ਵਰਤੋ"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"ਜਾਰੀ ਰੱਖਣ ਲਈ ਆਪਣਾ ਚਿਹਰਾ ਜਾਂ ਸਕ੍ਰੀਨ ਲਾਕ ਵਰਤੋ"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"ਜਾਰੀ ਰੱਖਣ ਲਈ ਆਪਣਾ ਬਾਇਓਮੈਟ੍ਰਿਕ ਜਾਂ ਸਕ੍ਰੀਨ ਲਾਕ ਵਰਤੋ"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-pl/strings.xml b/biometric/biometric/src/main/res/values-pl/strings.xml
index 531d5bd..1b4dba8 100644
--- a/biometric/biometric/src/main/res/values-pl/strings.xml
+++ b/biometric/biometric/src/main/res/values-pl/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Nie ustawiono kodu PIN, wzoru ani hasła."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"To urządzenie nie obsługuje kodu PIN, wzoru ani hasła."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ikona odcisku palca"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Użyj odcisku palca"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Użyj rozpoznawania twarzy"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Użyj biometrii"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Użyj blokady ekranu"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Użyj odcisku palca lub blokady ekranu"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Użyj rozpoznawania twarzy lub blokady ekranu"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Użyj biometrii lub blokady ekranu"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Aby kontynuować, użyj odcisku palca"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Aby kontynuować, użyj rozpoznawania twarzy"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Aby kontynuować, użyj biometrii"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Aby kontynuować, użyj blokady ekranu"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Aby kontynuować, użyj odcisku palca lub blokady ekranu"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Aby kontynuować, użyj rozpoznawania twarzy lub blokady ekranu"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Aby kontynuować, użyj biometrii lub blokady ekranu"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-pt-rBR/strings.xml b/biometric/biometric/src/main/res/values-pt-rBR/strings.xml
index d280c96..6950e40 100644
--- a/biometric/biometric/src/main/res/values-pt-rBR/strings.xml
+++ b/biometric/biometric/src/main/res/values-pt-rBR/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Nenhum PIN, padrão ou senha configurado."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Este dispositivo não é compatível com PIN, padrão ou senha."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ícone de impressão digital"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Usar impressão digital"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Usar rosto"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Usar biometria"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Usar bloqueio de tela"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Usar impressão digital ou bloqueio de tela"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Usar reconhecimento facial ou bloqueio de tela"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Usar biometria ou bloqueio de tela"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Use sua impressão digital para continuar"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Use seu rosto para continuar"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Use a biometria para continuar"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Insira seu bloqueio de tela para continuar"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Use sua impressão digital ou o bloqueio de tela para continuar"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Use seu rosto ou o bloqueio de tela para continuar"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Use a biometria ou o bloqueio de tela para continuar"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-pt-rPT/strings.xml b/biometric/biometric/src/main/res/values-pt-rPT/strings.xml
index 2ffaa41..aea0278 100644
--- a/biometric/biometric/src/main/res/values-pt-rPT/strings.xml
+++ b/biometric/biometric/src/main/res/values-pt-rPT/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Nenhum PIN, padrão ou palavra-passe definidos."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Este dispositivo não suporta o PIN, o padrão ou a palavra-passe."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ícone de impressão digital"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Utilizar a impressão digital"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Utilizar o rosto"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Utilizar a biometria"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Utilizar o bloqueio de ecrã"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Utilizar o bloqueio de ecrã ou a impressão digital"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Utilizar o rosto ou o bloqueio de ecrã"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Utilizar a biometria ou o bloqueio de ecrã"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Utilize a impressão digital para continuar"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Utilize o rosto para continuar"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Utilize a biometria para continuar"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Introduza o bloqueio de ecrã para continuar"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Utilize a impressão digital ou o bloqueio de ecrã para continuar"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Utilize o rosto ou o bloqueio de ecrã para continuar"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Utilize a biometria ou o bloqueio de ecrã para continuar"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-pt/strings.xml b/biometric/biometric/src/main/res/values-pt/strings.xml
index d280c96..6950e40 100644
--- a/biometric/biometric/src/main/res/values-pt/strings.xml
+++ b/biometric/biometric/src/main/res/values-pt/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Nenhum PIN, padrão ou senha configurado."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Este dispositivo não é compatível com PIN, padrão ou senha."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ícone de impressão digital"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Usar impressão digital"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Usar rosto"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Usar biometria"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Usar bloqueio de tela"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Usar impressão digital ou bloqueio de tela"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Usar reconhecimento facial ou bloqueio de tela"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Usar biometria ou bloqueio de tela"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Use sua impressão digital para continuar"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Use seu rosto para continuar"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Use a biometria para continuar"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Insira seu bloqueio de tela para continuar"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Use sua impressão digital ou o bloqueio de tela para continuar"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Use seu rosto ou o bloqueio de tela para continuar"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Use a biometria ou o bloqueio de tela para continuar"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-ro/strings.xml b/biometric/biometric/src/main/res/values-ro/strings.xml
index 291ea47..eb20d02 100644
--- a/biometric/biometric/src/main/res/values-ro/strings.xml
+++ b/biometric/biometric/src/main/res/values-ro/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Nu este setat niciun cod PIN, model sau parolă."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Dispozitivul nu acceptă codul PIN, modelul sau parola."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Pictograma amprentă"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Folosiți amprenta"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Folosiți chipul"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Folosiți sistemele biometrice"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Folosiți blocarea ecranului"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Folosiți amprenta sau blocarea ecranului"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Folosiți deblocarea facială sau ecranul de blocare"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Folosiți sistemele biometrice sau blocarea ecranului"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Folosiți amprenta pentru a continua"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Folosiți-vă chipul ca să continuați"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Folosiți sistemele biometrice pentru a continua"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Introduceți blocarea ecranului ca să continuați"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Folosiți amprenta sau blocarea ecranului pentru a continua"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Folosiți-vă chipul sau blocarea ecranului pentru a continua"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Folosiți sistemele biometrice sau blocarea ecranului pentru a continua"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-ru/strings.xml b/biometric/biometric/src/main/res/values-ru/strings.xml
index c6aaf6d..269341a 100644
--- a/biometric/biometric/src/main/res/values-ru/strings.xml
+++ b/biometric/biometric/src/main/res/values-ru/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Не заданы PIN-код, пароль или графический ключ."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"На этом устройстве не поддерживаются PIN-код, графический ключ и пароль."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Значок отпечатка пальца"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Использовать отпечаток пальца"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Использовать фейсконтроль"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Использовать биометрию"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Использовать пароль, графический ключ или PIN-код"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Использовать отпечаток пальца или другой способ разблокировки"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Использовать фейсконтроль или другой способ разблокировки"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Использовать биометрию или другие данные для разблокировки"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Чтобы продолжить, прикоснитесь пальцем к сканеру."</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Чтобы продолжить, используйте фейсконтроль."</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Чтобы продолжить, используйте биометрические данные."</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Чтобы продолжить, введите данные для разблокировки экрана."</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Чтобы продолжить, используйте отпечаток пальца или другой способ разблокировки экрана."</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Чтобы продолжить, используйте фейсконтроль или другой способ разблокировки экрана."</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Чтобы продолжить, разблокируйте экран с помощью биометрических данных или другого способа."</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-si/strings.xml b/biometric/biometric/src/main/res/values-si/strings.xml
index 6939205..60dd641 100644
--- a/biometric/biometric/src/main/res/values-si/strings.xml
+++ b/biometric/biometric/src/main/res/values-si/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"PIN, රටා, හෝ මුරපද කිසිවක් සකසා නැත"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"මෙම උපාංගය PIN, රටාව හෝ මුරපදය සඳහා සහාය නොදක්වයි."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"ඇඟිලි සලකුණු නිරූපකය"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"ඇඟිලි සලකුණ භාවිත කරන්න"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"මුහුණ භාවිත කරන්න"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"ජෛවමිතික භාවිත කරන්න"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"තිර අගුල භාවිත කරන්න"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"ඇඟිලි සලකුණ හෝ තිර අගුල භාවිත කරන්න"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"මුහුණ හෝ තිර අගුල භාවිත කරන්න"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"ජෛවමිතික හෝ තිර අගුල භාවිත කරන්න"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"ඉදිරියට යාමට ඔබගේ ඇඟිලි සලකුණ භාවිත කරන්න"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"ඉදිරියට යාමට ඔබගේ මුහුණ භාවිත කරන්න"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"ඉදිරියට යාමට ඔබගේ ජෛවමිතික භාවිත කරන්න"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"ඉදිරියට යාමට ඔබගේ තිර අගුල ඇතුළත් කරන්න"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"ඉදිරියට යාමට ඔබගේ ඇඟිලි සලකුණ හෝ තිර අගුල භාවිත කරන්න"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"ඉදිරියට යාමට ඔබගේ මුහුණු හෝ තිර අගුල භාවිත කරන්න"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"ඉදිරියට යාමට ඔබගේ ජෛවමිතික හෝ තිර අගුල භාවිත කරන්න"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-sk/strings.xml b/biometric/biometric/src/main/res/values-sk/strings.xml
index 9d7b73c..734b076 100644
--- a/biometric/biometric/src/main/res/values-sk/strings.xml
+++ b/biometric/biometric/src/main/res/values-sk/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Nie je nastavený kód PIN, vzor ani heslo."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Toto zariadenie nepodporuje PIN, vzor ani heslo."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ikona odtlačku prsta"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Použiť odtlačok prsta"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Použiť tvár"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Použiť biometrické údaje"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Použiť zámku obrazovky"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Použiť odtlačok prsta alebo zámku obrazovky"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Použiť tvár alebo zámku obrazovky"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Použiť biometrické údaje alebo zámku obrazovky"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Pokračujte nasnímaním odtlačku prsta"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Pokračujte pomocou tváre"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Ak chcete pokračovať, použite biometrický údaj"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Pokračujte zadaním zámky obrazovky"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Pokračujte použitím odtlačku prsta alebo zámky obrazovky"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Pokračujte použitím tváre alebo zámky obrazovky"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Pokračujte použitím biometrie alebo zámky obrazovky"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-sl/strings.xml b/biometric/biometric/src/main/res/values-sl/strings.xml
index f8198b0..52bff0c 100644
--- a/biometric/biometric/src/main/res/values-sl/strings.xml
+++ b/biometric/biometric/src/main/res/values-sl/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Nastavljena ni nobena koda PIN, vzorec ali geslo."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Ta naprava ne podpira kode PIN, vzorca ali gesla."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ikona prstnih odtisov"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Uporabi prstni odtis"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Uporabi obraz"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Uporabi biometriko"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Uporabi možnost za zaklepanje zaslona"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Uporabi prstni odtis ali možnost za zaklepanje zaslona"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Uporabi obraz ali možnost za zaklepanje zaslona"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Uporabi biometriko ali možnost za zaklepanje zaslona"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Za nadaljevanje uporabite prstni odtis."</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Za nadaljevanje uporabite obraz."</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Za nadaljevanje uporabite biometrični podatek."</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Za nadaljevanje vnesite možnost za zaklepanje zaslona."</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Za nadaljevanje uporabite prstni odtis ali možnost za zaklepanje zaslona."</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Za nadaljevanje uporabite obraz ali možnost za zaklepanje zaslona."</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Za nadaljevanje uporabite biometrični podatek ali možnost za zaklepanje zaslona."</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-sq/strings.xml b/biometric/biometric/src/main/res/values-sq/strings.xml
index 1c5eb78..d52a2ec 100644
--- a/biometric/biometric/src/main/res/values-sq/strings.xml
+++ b/biometric/biometric/src/main/res/values-sq/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Nuk është vendosur kod PIN, motiv ose fjalëkalim."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Kjo pajisje nuk e mbështet kodin PIN, motivin ose fjalëkalimin."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ikona e gjurmës së gishtit"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Përdor gjurmën e gishtit"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Përdor fytyrën"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Përdor sistemet biometrike"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Përdor kyçjen e ekranit"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Përdor gjurmën e gishtit ose kyçjen e ekranit"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Përdor fytyrën ose kyçjen e ekranit"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Përdor sistemet biometrike ose kyçjen e ekranit"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Përdor gjurmën e gishtit për të vazhduar"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Përdor fytyrën tënde për të vazhduar"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Përdor sistemet e tua biometrike për të vazhduar"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Fut kyçjen e ekranit për të vazhduar"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Përdor gjurmën tënde të gishtit ose kyçjen e ekranit për të vazhduar"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Përdor fytyrën tënde ose kyçjen e ekranit për të vazhduar"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Përdor sistemet e tua biometrike ose kyçjen e ekranit për të vazhduar"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-sr/strings.xml b/biometric/biometric/src/main/res/values-sr/strings.xml
index 4feeca8..3b8204b 100644
--- a/biometric/biometric/src/main/res/values-sr/strings.xml
+++ b/biometric/biometric/src/main/res/values-sr/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Нисте подесили ни PIN, ни шаблон, ни лозинку."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Овај уређај не подржава PIN, шаблон или лозинку."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Икона отиска прста"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Користите отисак прста"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Користите лице"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Користите биометрију"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Користи закључавање екрана"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Користите отисак прста или закључавање екрана"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Користите закључавање лицем или закључавање екрана"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Користите биометрију или закључавање екрана"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Наставите помоћу отиска прста"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Потврдите идентитет лицем да бисте наставили"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Користите биометријски податак да бисте наставили"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Употребите закључавање екрана да бисте наставили"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Користите отисак прста или закључавање екрана да бисте наставили"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Користите лице или закључавање екрана да бисте наставили"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Користите биометријски податак или закључавање екрана да бисте наставили"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-sv/strings.xml b/biometric/biometric/src/main/res/values-sv/strings.xml
index d5146b2..48119ed 100644
--- a/biometric/biometric/src/main/res/values-sv/strings.xml
+++ b/biometric/biometric/src/main/res/values-sv/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Pinkod, mönster eller lösenord har inte angetts."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Enheten har inte stöd för pinkod, lösenord eller mönster."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Ikon för fingeravtryck"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Använd ditt fingeravtryck"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Använd ditt ansikte"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Använd biometri"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Använd skärmlåset"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Använd ditt fingeravtryck eller skärmlåset"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Använd ditt ansikte eller skärmlåset"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Använd biometrisk data eller skärmlåset"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Fortsätt med hjälp av ditt fingeravtryck"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Fortsätt med hjälp av ditt ansikte"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Fortsätt med hjälp av din biometriska data"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Fortsätt med hjälp av skärmlåset"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Fortsätt med hjälp av ditt fingeravtryck eller skärmlåset"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Fortsätt med hjälp av ditt ansikte eller skärmlåset"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Fortsätt med hjälp av din biometriska data eller skärmlåset"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-sw/strings.xml b/biometric/biometric/src/main/res/values-sw/strings.xml
index 9c7b24b..3eb193b4 100644
--- a/biometric/biometric/src/main/res/values-sw/strings.xml
+++ b/biometric/biometric/src/main/res/values-sw/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Hujaweka PIN, mchoro au nenosiri."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Kifaa hiki hakitumii PIN, mchoro au nenosiri."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Aikoni ya alama ya kidole"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Tumia alama ya kidole"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Tumia uso"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Tumia bayometriki"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Tumia skrini iliyofungwa"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Tumia alama ya kidole au mbinu ya kufunga skrini"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Tumia uso au mbinu ya kufunga skrini"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Tumia bayometriki au mbinu ya kufunga skrini"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Tumia alama ya kidole chako ili uendelee"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Tumia uso wako ili uendelee"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Tumia bayometriki yako ili uendelee"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Weka mbinu yako ya kufunga skrini ili uendelee"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Tumia alama ya kidole au mbinu yako ya kufunga skrini ili uendelee"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Tumia uso au mbinu yako ya kufunga skrini ili uendelee"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Tumia bayometriki au mbinu yako ya kufunga skrini ili uendelee"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-ta/strings.xml b/biometric/biometric/src/main/res/values-ta/strings.xml
index 49dcd40..7c0fa3e 100644
--- a/biometric/biometric/src/main/res/values-ta/strings.xml
+++ b/biometric/biometric/src/main/res/values-ta/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"பின்னோ பேட்டர்னோ கடவுச்சொல்லோ அமைக்கப்படவில்லை."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"பின், பேட்டர்ன், கடவுச்சொல் ஆகியவற்றை இந்தச் சாதனம் ஆதரிக்கவில்லை."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"கைரேகை ஐகான்"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"கைரேகையைப் பயன்படுத்து"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"முகத்தைப் பயன்படுத்து"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"பயோமெட்ரிக்ஸைப் பயன்படுத்து"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"திரைப் பூட்டைப் பயன்படுத்து"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"கைரேகை அல்லது திரைப் பூட்டைப் பயன்படுத்து"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"முகத்தையோ திரைப் பூட்டையோ பயன்படுத்து"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"பயோமெட்ரிக்ஸையோ திரைப் பூட்டையோ பயன்படுத்து"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"தொடர்வதற்கு உங்கள் கைரேகையைப் பயன்படுத்தவும்"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"தொடர்வதற்கு உங்கள் முகத்தைப் பயன்படுத்துங்கள்"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"தொடர்வதற்கு உங்கள் பயோமெட்ரிக்கைப் பயன்படுத்துங்கள்"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"தொடர்வதற்கு உங்கள் திரைப் பூட்டை உள்ளிடவும்"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"தொடர்வதற்கு உங்கள் கைரேகை அல்லது திரைப் பூட்டைப் பயன்படுத்துங்கள்"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"தொடர்வதற்கு உங்கள் முகத்தையோ திரைப் பூட்டையோ பயன்படுத்துங்கள்"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"தொடர்வதற்கு உங்கள் பயோமெட்ரிக்கையோ திரைப் பூட்டையோ பயன்படுத்துங்கள்"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-te/strings.xml b/biometric/biometric/src/main/res/values-te/strings.xml
index 07712d5..7ee0178 100644
--- a/biometric/biometric/src/main/res/values-te/strings.xml
+++ b/biometric/biometric/src/main/res/values-te/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"పిన్‌ను గానీ, ఆకృతిని గానీ, పాస్‌వర్డ్‌ను గానీ‌ సెట్ చేయలేదు."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"ఈ పరికరం పిన్, ఆకృతి లేదా పాస్‌వర్డ్‌‌ను సపోర్ట్ చేయదు."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"వేలిముద్ర చిహ్నం"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"వేలిముద్రను ఉపయోగించండి"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"ముఖాన్ని ఉపయోగించండి"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"బయోమెట్రిక్స్‌ను ఉపయోగించండి"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"స్క్రీన్ లాక్‌ను ఉపయోగించండి"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"వేలిముద్రను లేదా స్క్రీన్ లాక్‌ను ఉపయోగించండి"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"ముఖాన్ని లేదా స్క్రీన్ లాక్‌ను ఉపయోగించండి"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"బయోమెట్రిక్స్‌ను లేదా స్క్రీన్ లాక్‌ను ఉపయోగించండి"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"కొనసాగించడానికి మీ వేలిముద్రను ఉపయోగించండి"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"కొనసాగించడానికి మీ ముఖాన్ని ఉపయోగించండి"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"కొనసాగించడానికి, మీ బయోమెట్రిక్‌ను ఉపయోగించండి"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"కొనసాగించడానికి మీ స్క్రీన్ లాక్‌ను ఎంటర్ చేయండి"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"కొనసాగించడానికి మీ వేలిముద్రను లేదా స్క్రీన్ లాక్‌ను ఉపయోగించండి"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"కొనసాగించడానికి మీ ముఖాన్ని లేదా స్క్రీన్ లాక్‌ను ఉపయోగించండి"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"కొనసాగించడానికి మీ బయోమెట్రిక్‌ను లేదా స్క్రీన్ లాక్‌ను ఉపయోగించండి"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-th/strings.xml b/biometric/biometric/src/main/res/values-th/strings.xml
index 2f64c59..8a07501 100644
--- a/biometric/biometric/src/main/res/values-th/strings.xml
+++ b/biometric/biometric/src/main/res/values-th/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"ไม่ได้ตั้ง PIN, รูปแบบ หรือรหัสผ่าน"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"อุปกรณ์นี้ไม่รองรับ PIN, รูปแบบ หรือรหัสผ่าน"</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"ไอคอนลายนิ้วมือ"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"ใช้ลายนิ้วมือ"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"ใช้ใบหน้า"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"ใช้ข้อมูลไบโอเมตริก"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"ใช้การล็อกหน้าจอ"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"ใช้ลายนิ้วมือหรือการล็อกหน้าจอ"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"ใช้ใบหน้าหรือการล็อกหน้าจอ"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"ใช้ข้อมูลไบโอเมตริกหรือการล็อกหน้าจอ"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"ใช้ลายนิ้วมือของคุณเพื่อดำเนินการต่อ"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"ใช้ใบหน้าของคุณเพื่อดำเนินการต่อ"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"ใช้ข้อมูลไบโอเมตริกเพื่อดำเนินการต่อ"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"ป้อนข้อมูลการล็อกหน้าจอเพื่อดำเนินการต่อ"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"ใช้ลายนิ้วมือหรือการล็อกหน้าจอเพื่อดำเนินการต่อ"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"ใช้ใบหน้าหรือการล็อกหน้าจอเพื่อดำเนินการต่อ"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"ใช้ข้อมูลไบโอเมตริกหรือการล็อกหน้าจอเพื่อดำเนินการต่อ"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-tl/strings.xml b/biometric/biometric/src/main/res/values-tl/strings.xml
index f144bb6..17464d7 100644
--- a/biometric/biometric/src/main/res/values-tl/strings.xml
+++ b/biometric/biometric/src/main/res/values-tl/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Walang itinakdang PIN, pattern, o password."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Hindi sinusuportahan ng device na ito ang PIN, pattern, o password."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Icon ng fingerprint"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Gumamit ng fingerprint"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Gumamit ng mukha"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Gumamit ng biometrics"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Gumamit ng lock ng screen"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Gumamit ng fingerprint o lock ng screen"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Gumamit ng mukha o lock ng screen"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Gumamit ng biometrics o lock ng screen"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Gamitin ang iyong fingerprint para magpatuloy"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Gamitin ang iyong mukha para magpatuloy"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Gamitin ang iyong biometric para magpatuloy"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Ilagay ang iyong lock ng screen para magpatuloy"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Gamitin ang iyong fingerprint o lock ng screen para magpatuloy"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Gamitin ang iyong mukha o lock ng screen para magpatuloy"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Gamitin ang iyong biometric o lock ng screen para magpatuloy"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-tr/strings.xml b/biometric/biometric/src/main/res/values-tr/strings.xml
index b2c4d32..a8f73fb 100644
--- a/biometric/biometric/src/main/res/values-tr/strings.xml
+++ b/biometric/biometric/src/main/res/values-tr/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"PIN, desen veya şifre seti yok"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Bu cihaz PIN, desen veya şifre kullanımını desteklemiyor"</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Parmak izi simgesi"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Parmak izi kullan"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Yüz tanıma kullan"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Biyometri kullan"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Ekran kilidi kullan"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Parmak izi veya ekran kilidi kullan"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Yüz tanıma veya ekran kilidi kullan"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Biyometri veya ekran kilidi kullan"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Devam etmek için parmak izinizi kullanın"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Devam etmek için yüzünüzü kullanın"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Devam etmek için biyometrik kimlik bilginizi kullanın"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Devam etmek için ekran kilidinizi girin"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Devam etmek için parmak izi veya ekran kilidinizi kullanın"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Devam etmek için yüz veya ekran kilidinizi kullanın"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Devam etmek için biyometrik kimlik bilginizi veya ekran kilidinizi kullanın"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-uk/strings.xml b/biometric/biometric/src/main/res/values-uk/strings.xml
index 65aff16..66996ca 100644
--- a/biometric/biometric/src/main/res/values-uk/strings.xml
+++ b/biometric/biometric/src/main/res/values-uk/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Не вказано PIN-код, ключ або пароль."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Пристрій не підтримує PIN-код, ключ або пароль."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Значок відбитка пальця"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Використовувати відбиток пальця"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Використовувати фейсконтроль"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Використовувати біометрію"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Використовувати дані для розблокування екрана"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Використовувати відбиток пальця або дані для розблокування екрана"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Використовувати фейсконтроль або дані для розблокування екрана"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Використовувати біометрію або дані для розблокування екрана"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Щоб продовжити, скористайтеся відбитком пальця"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Щоб продовжити, скористайтеся фейсконтролем"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Щоб продовжити, скористайтеся біометрією"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Щоб продовжити, введіть дані для розблокування екрана"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Щоб продовжити, скористайтеся відбитком пальця або даними для розблокування екрана"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Щоб продовжити, скористайтеся фейсконтролем або даними для розблокування екрана"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Щоб продовжити, скористайтеся біометрією або даними для розблокування екрана"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-ur/strings.xml b/biometric/biometric/src/main/res/values-ur/strings.xml
index aad5ef7..a797b50 100644
--- a/biometric/biometric/src/main/res/values-ur/strings.xml
+++ b/biometric/biometric/src/main/res/values-ur/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"کوئی پن، پیٹرن، یا پاس ورڈ سیٹ نہیں ہے۔"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"‏یہ آلہ PIN، پیٹرن یا پاس ورڈ کو سپورٹ نہیں کرتا ہے۔"</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"فنگر پرنٹ آئیکن"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"فنگر پرنٹ استعمال کریں"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"چہرے کا استعمال کریں"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"بایو میٹرکس استعمال کریں"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"اسکرین لاک استعمال کریں"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"فنگر پرنٹ یا اسکرین لاک استعمال کریں"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"چہرہ یا اسکرین لاک استعمال کریں"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"بایو میٹرکس یا اسکرین لاک استعمال کریں"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"جاری رکھنے کے لیے اپنا فنگر پرنٹ استعمال کریں"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"جاری رکھنے کے لیے اپنے چہرے کا استعمال کریں"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"جاری رکھنے کے لیے اپنا بایو میٹرک استعمال کریں"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"جاری رکھنے کے لیے اپنا اسکرین لاک درج کریں"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"جاری رکھنے کے لیے اپنے فنگر پرنٹ یا اسکرین لاک کا استعمال کریں"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"جاری رکھنے کے لیے اپنے چہرے یا اسکرین لاک کا استعمال کریں"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"جاری رکھنے کے لیے اپنے بایو میٹرک یا اسکرین لاک کا استعمال کریں"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-uz/strings.xml b/biometric/biometric/src/main/res/values-uz/strings.xml
index 051a933..3629ca5 100644
--- a/biometric/biometric/src/main/res/values-uz/strings.xml
+++ b/biometric/biometric/src/main/res/values-uz/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"PIN kod, grafik kalit yoki parol sozlanmagan."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Bu qurilmada PIN kod, grafik kalit va parol ishlamaydi."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Barmoq izi belgisi"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Barmoq izi ishlatish"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Yuzdan foydalanish"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Biometrik tasdiqlash"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Ekran qulfi"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Barmoq izi yoki ekran qulfi"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Yuz bilan ochish yoki ekran qulfi"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Biometrika yoki ekran qulfi"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Davom etish uchun barmoq izingizdan foydalaning"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Yuz tekshiruvi bilan davom eting"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Davom etish uchun biometrik tasdiqlang"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Ekran qulfini kiritish bilan davom eting"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Davom etish uchun barmoq izi yoki ekran qulfidan foydalaning"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Davom etish uchun yuz tekshiruvi yoki ekran qulfidan foydalaning"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Davom etish uchun biometrika yoki ekran qulfidan foydalaning"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-vi/strings.xml b/biometric/biometric/src/main/res/values-vi/strings.xml
index 8258a1a..7802ab7 100644
--- a/biometric/biometric/src/main/res/values-vi/strings.xml
+++ b/biometric/biometric/src/main/res/values-vi/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Chưa đặt mã PIN, hình mở khóa hoặc mật khẩu."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Thiết bị này không hỗ trợ mã PIN, hình mở khóa hoặc mật khẩu."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Biểu tượng vân tay"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Dùng vân tay"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Dùng khuôn mặt"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Dùng dữ liệu sinh trắc học"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Dùng phương thức khóa màn hình"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Dùng vân tay hoặc phương thức khóa màn hình"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Dùng khuôn mặt hoặc phương thức khóa màn hình"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Dùng dữ liệu sinh trắc học hoặc phương thức khóa màn hình"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Dùng vân tay để tiếp tục"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Dùng khuôn mặt để tiếp tục"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Dùng dữ liệu sinh trắc học để tiếp tục"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Nhập phương thức khóa màn hình để tiếp tục"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Dùng vân tay hoặc phương thức khóa màn hình để tiếp tục"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Dùng khuôn mặt hoặc phương thức khóa màn hình để tiếp tục"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Dùng dữ liệu sinh trắc học hoặc phương thức khóa màn hình để tiếp tục"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-zh-rCN/strings.xml b/biometric/biometric/src/main/res/values-zh-rCN/strings.xml
index 6cc769a..73451cb 100644
--- a/biometric/biometric/src/main/res/values-zh-rCN/strings.xml
+++ b/biometric/biometric/src/main/res/values-zh-rCN/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"未设置 PIN 码、解锁图案或密码。"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"此设备不支持 PIN 码、解锁图案或密码。"</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"指纹图标"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"使用指纹"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"刷脸验证"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"使用生物识别"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"使用屏幕锁定解锁凭据"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"使用指纹或屏幕锁定解锁凭据"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"刷脸验证或使用屏幕锁定解锁凭据"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"使用生物识别或屏幕锁定解锁凭据"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"使用指纹验证身份后,才能继续"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"刷脸验证身份后,才能继续"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"使用生物识别验证身份后,才能继续"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"输入屏幕锁定解锁凭据后,才能继续"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"使用指纹或屏幕锁定解锁凭据验证身份后,才能继续"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"刷脸验证或使用屏幕锁定解锁凭据验证身份后,才能继续"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"使用生物识别或屏幕锁定解锁凭据验证身份后,才能继续"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-zh-rHK/strings.xml b/biometric/biometric/src/main/res/values-zh-rHK/strings.xml
index 4fcf1b0..c732b33 100644
--- a/biometric/biometric/src/main/res/values-zh-rHK/strings.xml
+++ b/biometric/biometric/src/main/res/values-zh-rHK/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"未設定 PIN、圖案或密碼。"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"這部裝置不支援 PIN、圖案或密碼。"</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"指紋圖示"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"使用指紋"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"使用面孔"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"使用生物識別"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"使用螢幕鎖定"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"使用指紋或螢幕鎖定"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"使用面孔或螢幕鎖定"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"使用生物識別或螢幕鎖定"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"請使用指紋驗證身分,才能繼續操作"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"請使用您的面孔驗證身分,才能繼續操作"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"請使用使用生物識別驗證身分,才能繼續操作"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"請輸入螢幕鎖定解鎖憑證,才能繼續操作"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"請使用指紋解鎖或螢幕鎖定功能驗證身分,才能繼續操作"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"請使用面孔解鎖或螢幕鎖定功能驗證身分,才能繼續操作"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"請使用生物識別或螢幕鎖定功能驗證身分,才能繼續操作"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-zh-rTW/strings.xml b/biometric/biometric/src/main/res/values-zh-rTW/strings.xml
index eba1918..bf63d4f 100644
--- a/biometric/biometric/src/main/res/values-zh-rTW/strings.xml
+++ b/biometric/biometric/src/main/res/values-zh-rTW/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"未設定 PIN 碼、解鎖圖案或密碼。"</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"這部裝置不支援 PIN 碼、解鎖圖案或密碼。"</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"指紋圖示"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"使用指紋解鎖功能"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"使用人臉解鎖功能"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"使用生物特徵辨識功能"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"使用螢幕鎖定功能"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"使用指紋解鎖或螢幕鎖定功能"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"使用人臉解鎖或螢幕鎖定功能"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"使用生物特徵辨識或螢幕鎖定功能"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"請使用指紋驗證身分,才能繼續操作"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"請使用你的臉驗證身分,才能繼續操作"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"請使用生物特徵辨識功能驗證身分,才能繼續操作"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"請解除螢幕鎖定,才能繼續操作"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"請使用螢幕鎖定功能或指紋驗證身分,才能繼續操作"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"請使用螢幕鎖定功能或你的臉驗證身分,才能繼續操作"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"請使用生物特徵辨識或螢幕鎖定功能驗證身分,才能繼續操作"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values-zu/strings.xml b/biometric/biometric/src/main/res/values-zu/strings.xml
index c940f4ec..f6d4806 100644
--- a/biometric/biometric/src/main/res/values-zu/strings.xml
+++ b/biometric/biometric/src/main/res/values-zu/strings.xml
@@ -30,4 +30,18 @@
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Ayikho iphinikhodi, iphethini, noma iphasiwedi esethiwe."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Le divayisi ayisekeli Iphinikhodi, iphethini, noma iphasiwedi"</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Isithonjana sezigxivizo zeminwe"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Sebenzisa isigxivizo somunwe"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Sebenzisa ubuso"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Sebenzisa i-biometrics"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Sebenzisa isikhiya sesikrini"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Sebenzisa isigxivizo somunwe noma ukukhiya isikrini"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Sebenzisa i-face lock noma ukukhiya isikrini"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Sebenzisa i-biometrics noma ukukhiya isikrini"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Sebenzisa isigxivizo sakho somunwe ukuze uqhubeke"</string>
+    <string name="face_prompt_message" msgid="2282389249605674226">"Sebenzisa ubuso bakho ukuze uqhubeke"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Sebenzisa i-biometric yakho ukuze uqhubeke"</string>
+    <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Faka ukukhiya isikrini kwakho ukuze uqhubeke"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Sebenzisa izigxivizo zakho zomunwe noma ukukhiya isikrini ukuze uqhubeke"</string>
+    <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Sebenzisa ubuso bakho noma ukukhiya isikrini ukuze uqhubeke"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Sebenzisa i-biometric noma ukukhiya isikrini ukuze uqhubeke"</string>
 </resources>
diff --git a/biometric/biometric/src/main/res/values/devices.xml b/biometric/biometric/src/main/res/values/devices.xml
index b152e78..a924623 100644
--- a/biometric/biometric/src/main/res/values/devices.xml
+++ b/biometric/biometric/src/main/res/values/devices.xml
@@ -85,11 +85,9 @@
 
     <!--
     List of known device vendors for which authentication with both Class 2 (Weak) biometrics
-    and device credential (PIN/pattern/password) as allowed authenticator types should use
+    and device credential (PIN/pattern/password) as allowed authenticator types should NOT use
     KeyguardManager#createConfirmDeviceCredentialIntent(CharSequence, CharSequence) on API 29.
     -->
-    <string-array name="keyguard_biometric_and_credential_vendors">
-        <item>google</item>
-        <item>samsung</item>
+    <string-array name="keyguard_biometric_and_credential_exclude_vendors">
     </string-array>
 </resources>
diff --git a/browser/browser/lint-baseline.xml b/browser/browser/lint-baseline.xml
index 99ae271..977cb32 100644
--- a/browser/browser/lint-baseline.xml
+++ b/browser/browser/lint-baseline.xml
@@ -1,158 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.1.0-alpha02" type="baseline" client="cli" name="Lint" variant="all" version="7.1.0-alpha02">
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 18 (current min is 16): `android.os.Bundle#getBinder`"
-        errorLine1="                intent.getExtras().getBinder(CustomTabsIntent.EXTRA_SESSION));"
-        errorLine2="                                   ~~~~~~~~~">
-        <location
-            file="src/test/java/androidx/browser/customtabs/CustomTabsIntentTest.java"
-            line="280"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 18 (current min is 16): `android.os.Bundle#getBinder`"
-        errorLine1="                intent.getExtras().getBinder(CustomTabsIntent.EXTRA_SESSION));"
-        errorLine2="                                   ~~~~~~~~~">
-        <location
-            file="src/test/java/androidx/browser/customtabs/CustomTabsIntentTest.java"
-            line="289"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 18 (current min is 16): `android.os.Bundle#getBinder`"
-        errorLine1="        assertNull(intent.getExtras().getBinder(CustomTabsIntent.EXTRA_SESSION));"
-        errorLine2="                                      ~~~~~~~~~">
-        <location
-            file="src/test/java/androidx/browser/customtabs/CustomTabsIntentTest.java"
-            line="304"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 18 (current min is 16): `android.os.Bundle#getBinder`"
-        errorLine1="        assertEquals(session.getBinder(), intent.getExtras().getBinder("
-        errorLine2="                                                             ~~~~~~~~~">
-        <location
-            file="src/test/java/androidx/browser/customtabs/TestUtil.java"
-            line="56"
-            column="62"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 17; however, the containing class androidx.browser.browseractions.BrowserActionsIntent is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                return pendingIntent.getCreatorPackage();"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/browser/browseractions/BrowserActionsIntent.java"
-            line="470"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.browser.trusted.NotificationApiHelperForM is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        return manager.getActiveNotifications();"
-        errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/browser/trusted/NotificationApiHelperForM.java"
-            line="46"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.browser.trusted.NotificationApiHelperForO is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        NotificationChannel channel = manager.getNotificationChannel(channelId);"
-        errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/browser/trusted/NotificationApiHelperForO.java"
-            line="41"
-            column="47"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.browser.trusted.NotificationApiHelperForO is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        return channel == null || channel.getImportance() != NotificationManager.IMPORTANCE_NONE;"
-        errorLine2="                                          ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/browser/trusted/NotificationApiHelperForO.java"
-            line="43"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.browser.trusted.NotificationApiHelperForO is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        manager.createNotificationChannel(new NotificationChannel(channelId,"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/browser/trusted/NotificationApiHelperForO.java"
-            line="51"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.browser.trusted.NotificationApiHelperForO is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        manager.createNotificationChannel(new NotificationChannel(channelId,"
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/browser/trusted/NotificationApiHelperForO.java"
-            line="51"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.browser.trusted.NotificationApiHelperForO is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        if (manager.getNotificationChannel(channelId).getImportance()"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/browser/trusted/NotificationApiHelperForO.java"
-            line="55"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.browser.trusted.NotificationApiHelperForO is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        if (manager.getNotificationChannel(channelId).getImportance()"
-        errorLine2="                                                      ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/browser/trusted/NotificationApiHelperForO.java"
-            line="55"
-            column="55"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.browser.trusted.NotificationApiHelperForO is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        Notification.Builder builder = Notification.Builder.recoverBuilder(context, notification);"
-        errorLine2="                                                            ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/browser/trusted/NotificationApiHelperForO.java"
-            line="61"
-            column="61"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.browser.trusted.NotificationApiHelperForO is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        builder.setChannelId(channelId);"
-        errorLine2="                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/browser/trusted/NotificationApiHelperForO.java"
-            line="62"
-            column="17"/>
-    </issue>
+<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">
 
 </issues>
diff --git a/browser/browser/src/main/java/androidx/browser/browseractions/BrowserActionsIntent.java b/browser/browser/src/main/java/androidx/browser/browseractions/BrowserActionsIntent.java
index 24592b7..3e80ac84 100644
--- a/browser/browser/src/main/java/androidx/browser/browseractions/BrowserActionsIntent.java
+++ b/browser/browser/src/main/java/androidx/browser/browseractions/BrowserActionsIntent.java
@@ -26,7 +26,6 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.net.Uri;
-import android.os.Build;
 import android.os.Bundle;
 import android.text.TextUtils;
 
@@ -466,11 +465,7 @@
     public static String getUntrustedCreatorPackageName(@NonNull Intent intent) {
         PendingIntent pendingIntent = intent.getParcelableExtra(BrowserActionsIntent.EXTRA_APP_ID);
         if (pendingIntent != null) {
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
-                return pendingIntent.getCreatorPackage();
-            } else {
-                return pendingIntent.getTargetPackage();
-            }
+            return pendingIntent.getTargetPackage();
         }
         return null;
     }
diff --git a/browser/browser/src/main/java/androidx/browser/trusted/NotificationApiHelperForM.java b/browser/browser/src/main/java/androidx/browser/trusted/NotificationApiHelperForM.java
index ead14a2..8c4b080 100644
--- a/browser/browser/src/main/java/androidx/browser/trusted/NotificationApiHelperForM.java
+++ b/browser/browser/src/main/java/androidx/browser/trusted/NotificationApiHelperForM.java
@@ -32,6 +32,7 @@
  *
  * @hide
  */
+@RequiresApi(Build.VERSION_CODES.M)
 @RestrictTo(RestrictTo.Scope.LIBRARY)
 public class NotificationApiHelperForM {
 
@@ -40,7 +41,6 @@
      * added in API 18, returning the result as StatusBarNotification[] would prevent classes from
      * being verified on earlier Jellybean builds.
      */
-    @RequiresApi(Build.VERSION_CODES.M)
     @NonNull
     static Parcelable[] getActiveNotifications(NotificationManager manager) {
         return manager.getActiveNotifications();
diff --git a/browser/browser/src/main/java/androidx/browser/trusted/NotificationApiHelperForO.java b/browser/browser/src/main/java/androidx/browser/trusted/NotificationApiHelperForO.java
index c773ad79..8867899 100644
--- a/browser/browser/src/main/java/androidx/browser/trusted/NotificationApiHelperForO.java
+++ b/browser/browser/src/main/java/androidx/browser/trusted/NotificationApiHelperForO.java
@@ -34,16 +34,15 @@
  *
  * @hide
  */
+@RequiresApi(Build.VERSION_CODES.O)
 @RestrictTo(RestrictTo.Scope.LIBRARY)
 class NotificationApiHelperForO {
-    @RequiresApi(Build.VERSION_CODES.O)
     static boolean isChannelEnabled(NotificationManager manager, String channelId) {
         NotificationChannel channel = manager.getNotificationChannel(channelId);
 
         return channel == null || channel.getImportance() != NotificationManager.IMPORTANCE_NONE;
     }
 
-    @RequiresApi(Build.VERSION_CODES.O)
     @Nullable static Notification copyNotificationOntoChannel(Context context,
             NotificationManager manager, Notification notification, String channelId,
             String channelName) {
diff --git a/browser/browser/src/test/java/androidx/browser/customtabs/CustomTabsIntentTest.java b/browser/browser/src/test/java/androidx/browser/customtabs/CustomTabsIntentTest.java
index 08553dc..f3fd01e 100644
--- a/browser/browser/src/test/java/androidx/browser/customtabs/CustomTabsIntentTest.java
+++ b/browser/browser/src/test/java/androidx/browser/customtabs/CustomTabsIntentTest.java
@@ -28,6 +28,7 @@
 import android.os.Build;
 
 import androidx.annotation.ColorRes;
+import androidx.annotation.RequiresApi;
 import androidx.test.core.app.ApplicationProvider;
 
 import org.junit.Test;
@@ -43,6 +44,7 @@
 @RunWith(RobolectricTestRunner.class)
 @DoNotInstrument
 // minSdk For Bundle#getBinder
+@RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
 @Config(minSdk = Build.VERSION_CODES.JELLY_BEAN_MR2)
 public class CustomTabsIntentTest {
 
diff --git a/browser/browser/src/test/java/androidx/browser/customtabs/TestUtil.java b/browser/browser/src/test/java/androidx/browser/customtabs/TestUtil.java
index d5316fd..318a99a 100644
--- a/browser/browser/src/test/java/androidx/browser/customtabs/TestUtil.java
+++ b/browser/browser/src/test/java/androidx/browser/customtabs/TestUtil.java
@@ -23,14 +23,18 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.os.Build;
 import android.support.customtabs.ICustomTabsCallback;
 import android.support.customtabs.ICustomTabsService;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 
 /**
  * Utilities for unit testing Custom Tabs.
  */
+// minSdk For Bundle#getBinder
+@RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
 public class TestUtil {
 
     @NonNull
diff --git a/browser/browser/src/test/java/androidx/browser/trusted/TrustedWebActivityIntentBuilderTest.java b/browser/browser/src/test/java/androidx/browser/trusted/TrustedWebActivityIntentBuilderTest.java
index 8b1847a..3ef37df 100644
--- a/browser/browser/src/test/java/androidx/browser/trusted/TrustedWebActivityIntentBuilderTest.java
+++ b/browser/browser/src/test/java/androidx/browser/trusted/TrustedWebActivityIntentBuilderTest.java
@@ -29,6 +29,7 @@
 import android.os.Build;
 import android.os.Bundle;
 
+import androidx.annotation.RequiresApi;
 import androidx.browser.customtabs.CustomTabColorSchemeParams;
 import androidx.browser.customtabs.CustomTabsIntent;
 import androidx.browser.customtabs.CustomTabsSession;
@@ -53,6 +54,7 @@
 @RunWith(RobolectricTestRunner.class)
 @DoNotInstrument
 // minSdk For Bundle#getBinder
+@RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
 @Config(minSdk = Build.VERSION_CODES.JELLY_BEAN_MR2)
 public class TrustedWebActivityIntentBuilderTest {
 
diff --git a/buildSrc-tests/build.gradle b/buildSrc-tests/build.gradle
index c4b5046..7c9ca1e 100644
--- a/buildSrc-tests/build.gradle
+++ b/buildSrc-tests/build.gradle
@@ -32,7 +32,7 @@
 
 // Also do style checking of the buildSrc project from within this project too
 // We run that from this project so that it doesn't block other projects while it runs
-def ktlintDir = "../buildSrc/"
+def ktlintDir = "../buildSrc"
 def subdirs = ["plugins", "private", "public"]
 for (d : subdirs) {
   def f = file("$ktlintDir/$d")
@@ -42,12 +42,12 @@
 }
 def ktlintInputs = project.fileTree(ktlintDir) {
     for (d : subdirs) {
-        include("$ktlintDir/$d/src/**/*.kt")
+        include("$d/src/**/*.kt")
     }
 }
 def sourceArgs = []
 for (d : subdirs) {
-    sourceArgs = sourceArgs + "$ktlintDir/$d/src/**/*.kt"
+    sourceArgs = sourceArgs + "$d/src/**/*.kt"
 }
 
 tasks["ktlint"].configure({ t ->
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
index 12d1092..a106f01 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
@@ -49,6 +49,7 @@
 import com.android.build.gradle.TestPlugin
 import com.android.build.gradle.TestedExtension
 import com.android.build.gradle.internal.tasks.AnalyticsRecordingTask
+import com.android.build.gradle.internal.tasks.ListingFileRedirectTask
 import org.gradle.api.GradleException
 import org.gradle.api.JavaVersion.VERSION_1_8
 import org.gradle.api.Plugin
@@ -224,10 +225,6 @@
         project.tasks.withType(KotlinCompile::class.java).configureEach { task ->
             task.kotlinOptions.jvmTarget = "1.8"
             project.configureJavaCompilationWarnings(task)
-
-            // Not directly impacting us, but a bunch of issues like KT-46512, probably prudent
-            // for us to just disable until Kotlin 1.5.10+ to avoid end users hitting users
-            task.kotlinOptions.freeCompilerArgs += listOf("-Xsam-conversions=class")
         }
         project.afterEvaluate {
             val isAndroidProject = project.plugins.hasPlugin(LibraryPlugin::class.java) ||
@@ -542,6 +539,9 @@
             }
             addToTestZips(project, packageTask)
         }
+        project.tasks.withType(ListingFileRedirectTask::class.java).forEach {
+            AffectedModuleDetector.configureTaskGuard(it)
+        }
     }
 
     private fun LibraryExtension.configureAndroidLibraryOptions(
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt
index b20eea1..8cba22f 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt
@@ -170,6 +170,7 @@
                 it.dependsOn(validateProperties)
             }
         }
+        project.configureRootProjectForLint()
 
         if (partiallyDejetifyArchiveTask != null) {
             project(":jetifier:jetifier-standalone").afterEvaluate { standAloneProject ->
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt b/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt
index 47c3bfd..c6e01cd 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt
@@ -17,10 +17,14 @@
 package androidx.build
 
 import androidx.build.dependencyTracker.AffectedModuleDetector
+import com.android.build.api.variant.AndroidComponentsExtension
 import com.android.build.gradle.internal.dsl.LintOptions
+import com.android.build.gradle.internal.lint.AndroidLintAnalysisTask
 import org.gradle.api.DefaultTask
 import org.gradle.api.Project
 import org.gradle.api.file.RegularFileProperty
+import org.gradle.api.services.BuildService
+import org.gradle.api.services.BuildServiceParameters
 import org.gradle.api.tasks.InputFile
 import org.gradle.api.tasks.InputFiles
 import org.gradle.api.tasks.TaskAction
@@ -34,11 +38,34 @@
 private const val UPDATE_LINT_BASELINE = "updateLintBaseline"
 
 /**
+ * Name of the service we use to limit the number of concurrent executions of lint
+ */
+public const val LINT_SERVICE_NAME = "androidxLintService"
+
+/**
  * Property used by Lint to continue creating baselines without failing lint, normally set by:
  * -Dlint.baselines.continue=true from command line.
  */
 private const val LINT_BASELINE_CONTINUE = "lint.baselines.continue"
 
+// service for limiting the number of concurrent lint tasks
+interface AndroidXLintService : BuildService<BuildServiceParameters.None>
+
+fun Project.configureRootProjectForLint() {
+    // determine many lint tasks to run in parallel
+    val memoryPerTask = 512 * 1024 * 1024
+    val maxLintMemory = Runtime.getRuntime().maxMemory() * 0.75 // save memory for other things too
+    val maxNumParallelUsages = Math.max(1, (maxLintMemory / memoryPerTask).toInt())
+
+    project.gradle.sharedServices.registerIfAbsent(
+        LINT_SERVICE_NAME,
+        AndroidXLintService::class.java,
+        { spec ->
+            spec.maxParallelUsages.set(maxNumParallelUsages)
+        }
+    )
+}
+
 fun Project.configureNonAndroidProjectForLint(extension: AndroidXExtension) {
     apply(mapOf("plugin" to "com.android.lint"))
 
@@ -144,13 +171,20 @@
     val isTestingLintItself = (project.path == ":lint-checks:integration-tests")
 
     // If -PupdateLintBaseline was set we should update the baseline if it exists
-    val updateLintBaseline = hasProperty(UPDATE_LINT_BASELINE) && !isTestingLintItself
+    val updateLintBaseline = project.providers.gradleProperty(UPDATE_LINT_BASELINE)
+        .forUseAtConfigurationTime().isPresent() && !isTestingLintItself
 
     lintOptions.apply {
         // Skip lintVital tasks on assemble. We explicitly run lintRelease for libraries.
         isCheckReleaseBuilds = false
     }
 
+    tasks.withType(AndroidLintAnalysisTask::class.java).configureEach { task ->
+        task.usesService(
+            task.project.gradle.sharedServices.registrations.getByName(LINT_SERVICE_NAME).service
+        )
+    }
+
     // Lint is configured entirely in finalizeDsl so that individual projects cannot easily
     // disable individual checks in the DSL for any reason.
     val finalizeDsl: () -> Unit = {
@@ -302,10 +336,8 @@
         }
     }
 
-    // TODO(aurimas): migrate away from this when upgrading to AGP 7.1.0-alpha03 or newer
-    @Suppress("UnstableApiUsage", "DEPRECATION")
     val androidComponents = extensions.findByType(
-        com.android.build.api.extension.AndroidComponentsExtension::class.java
+        AndroidComponentsExtension::class.java
     )
     if (null != androidComponents) {
         @Suppress("UnstableApiUsage")
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/SourceJarTaskHelper.kt b/buildSrc/private/src/main/kotlin/androidx/build/SourceJarTaskHelper.kt
index 2fa31fb..f5b6fb4 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/SourceJarTaskHelper.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/SourceJarTaskHelper.kt
@@ -31,6 +31,7 @@
 import org.gradle.kotlin.dsl.extra
 import org.gradle.kotlin.dsl.getByType
 import org.gradle.kotlin.dsl.named
+import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
 import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension
 import java.util.Locale
 
@@ -40,9 +41,11 @@
 fun Project.configureSourceJarForAndroid(extension: LibraryExtension) {
     extension.defaultPublishVariant { variant ->
         val sourceJar = tasks.register(
-            "sourceJar${variant.name.replaceFirstChar {
-                if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString()
-            }}",
+            "sourceJar${
+                variant.name.replaceFirstChar {
+                    if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString()
+                }
+            }",
             Jar::class.java
         ) {
             it.archiveClassifier.set("sources")
@@ -50,7 +53,7 @@
             // Do not allow source files with duplicate names, information would be lost otherwise.
             it.duplicatesStrategy = DuplicatesStrategy.FAIL
         }
-        registerSourcesVariant(sourceJar)
+        registerSourcesVariant("sourcesElements", sourceJar)
     }
     project.afterEvaluate {
         // we can only tell if a project is multiplatform after it is configured
@@ -59,11 +62,13 @@
                 val kotlinExt = project.extensions.getByName("kotlin") as KotlinProjectExtension
                 val sourceJar =
                     project.tasks.named(
-                        "sourceJar${variant.name.replaceFirstChar {
-                            if (it.isLowerCase()) {
-                                it.titlecase(Locale.getDefault())
-                            } else it.toString()
-                        }}",
+                        "sourceJar${
+                            variant.name.replaceFirstChar {
+                                if (it.isLowerCase()) {
+                                    it.titlecase(Locale.getDefault())
+                                } else it.toString()
+                            }
+                        }",
                         Jar::class.java
                     )
                 // multiplatform projects use different source sets, so we need to modify the task
@@ -81,18 +86,36 @@
  * Sets up a source jar task for a Java library project.
  */
 fun Project.configureSourceJarForJava() {
-    val sourceJar = tasks.register("sourceJar", Jar::class.java) {
+    registerSourcesVariant("sourcesElements", tasks.register("sourceJar", Jar::class.java) {
         it.archiveClassifier.set("sources")
         val extension = extensions.getByType<JavaPluginExtension>()
         it.from(extension.sourceSets.getByName("main").allSource.srcDirs)
         // Do not allow source files with duplicate names, information would be lost otherwise.
         it.duplicatesStrategy = DuplicatesStrategy.FAIL
+    })
+
+    extensions.findByType(KotlinMultiplatformExtension::class.java)?.let { kmpExtension ->
+        for (sourceSetName in listOf("commonMain", "jvmMain")) {
+            kmpExtension.sourceSets.findByName(sourceSetName)?.let { sourceSet ->
+                registerSourcesVariant(
+                    "${sourceSetName}SourcesElements",
+                    tasks.register("${sourceSetName}SourceJar", Jar::class.java) {
+                        it.archiveClassifier.set("${sourceSetName}Sources")
+                        it.from(sourceSet.kotlin.srcDirs)
+                        // KMP has duplicate files, but there should be only one of each name in
+                        // each jar.
+                        it.duplicatesStrategy = DuplicatesStrategy.FAIL
+                    })
+            }
+        }
     }
-    registerSourcesVariant(sourceJar)
 }
 
-private fun Project.registerSourcesVariant(sourceJar: TaskProvider<Jar>) {
-    configurations.create("sourcesElements") { gradleVariant ->
+private fun Project.registerSourcesVariant(
+    configurationName: String,
+    sourceJar: TaskProvider<Jar>
+) {
+    configurations.create(configurationName) { gradleVariant ->
         gradleVariant.isVisible = false
         gradleVariant.isCanBeResolved = false
         gradleVariant.attributes.attribute(
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/VerifyDependencyVersionsTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/VerifyDependencyVersionsTask.kt
index a465db6..efe4848 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/VerifyDependencyVersionsTask.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/VerifyDependencyVersionsTask.kt
@@ -123,6 +123,7 @@
     // api, debugImplementation for implementation, etc. -- or test configurations.
     if (name.startsWith("androidTest")) return false
     if (name.startsWith("androidAndroidTest")) return false
+    if (name.startsWith("androidCommonTest")) return false
     if (name.startsWith("debug")) return false
     if (name.startsWith("androidDebug")) return false
     if (name.startsWith("release")) return false
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/checkapi/ApiTasks.kt b/buildSrc/private/src/main/kotlin/androidx/build/checkapi/ApiTasks.kt
index 807e8f4..2cdd25a 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/checkapi/ApiTasks.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/checkapi/ApiTasks.kt
@@ -20,7 +20,7 @@
 import androidx.build.Release
 import androidx.build.RunApiTasks
 import androidx.build.Version
-import androidx.build.doclava.androidJarFile
+import androidx.build.getAndroidJar
 import androidx.build.isWriteVersionedApiFilesEnabled
 import androidx.build.java.JavaCompileInputs
 import androidx.build.metalava.MetalavaTasks
@@ -226,6 +226,6 @@
     return JavaCompileInputs(
         sourcePaths = mainSourcePaths + kotlinSourcePaths,
         dependencyClasspath = dependencyClasspath,
-        androidJarFile(project)
+        project.getAndroidJar()
     )
 }
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/doclava/Doclava.kt b/buildSrc/private/src/main/kotlin/androidx/build/doclava/Doclava.kt
index 8097412..1e88b2ec 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/doclava/Doclava.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/doclava/Doclava.kt
@@ -17,10 +17,10 @@
 package androidx.build.doclava
 
 import androidx.build.SupportConfig
+import androidx.build.getAndroidJar
 import androidx.build.getSdkPath
 import org.gradle.api.Project
 import org.gradle.api.artifacts.Configuration
-import org.gradle.api.file.FileCollection
 import org.gradle.api.tasks.TaskProvider
 import org.gradle.api.tasks.util.PatternSet
 import java.io.File
@@ -46,7 +46,7 @@
             setDocletpath(doclavaConfig)
             destinationDir = destination
             // Strip the androidx.annotation classes injected by Metalava. They are not accessible.
-            classpath = androidJarFile(project)
+            classpath = project.getAndroidJar()
                 .filter { it.path.contains("androidx/annotation") }
                 .plus(annotationConfig)
             source(
@@ -77,25 +77,6 @@
 )
 
 /**
- * @return the project's Android SDK stub JAR as a File.
- */
-fun androidJarFile(project: Project): FileCollection =
-    project.files(
-        arrayOf(
-            File(
-                project.getSdkPath(),
-                "platforms/${SupportConfig.COMPILE_SDK_VERSION}/android.jar"
-            ),
-            // Allow using optional android.car APIs
-            File(
-                project.getSdkPath(),
-                "platforms/${SupportConfig.COMPILE_SDK_VERSION}/optional/android.car.jar"
-            )
-
-        )
-    )
-
-/**
  * @return the project's Android SDK stub source JAR as a File.
  */
 private fun androidSrcJarFile(project: Project): File = File(
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/docs/AndroidXDocsImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/docs/AndroidXDocsImplPlugin.kt
index e8b7c8b..99ce039 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/docs/AndroidXDocsImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/docs/AndroidXDocsImplPlugin.kt
@@ -22,9 +22,9 @@
 import androidx.build.doclava.DacOptions
 import androidx.build.doclava.DoclavaTask
 import androidx.build.doclava.GENERATE_DOCS_CONFIG
-import androidx.build.doclava.androidJarFile
 import androidx.build.doclava.createGenerateSdkApiTask
 import androidx.build.dokka.Dokka
+import androidx.build.getAndroidJar
 import androidx.build.getBuildId
 import androidx.build.getCheckoutRoot
 import androidx.build.getDistributionDirectory
@@ -337,7 +337,7 @@
                 samplesDir = unzippedSamplesSources
                 sourcesDir = unzippedDocsSources
                 docsProjectDir = File(project.rootDir, "docs-public")
-                dependenciesClasspath = androidJarFile(project) + dependencyClasspath
+                dependenciesClasspath = project.getAndroidJar() + dependencyClasspath
                 excludedPackages = hiddenPackages.toSet()
                 excludedPackagesForJava = hiddenPackagesJava
                 excludedPackagesForKotlin = emptySet()
@@ -388,7 +388,7 @@
             task.dependsOn(unzipDocsTask)
             task.dependsOn(unzipSamplesTask)
 
-            val androidJar = androidJarFile(project)
+            val androidJar = project.getAndroidJar()
             val dokkaClasspath = project.provider({
                 project.files(androidJar).plus(dependencyClasspath)
             })
@@ -481,7 +481,7 @@
                 dependsOn(doclavaConfiguration)
                 setDocletpath(doclavaConfiguration)
                 destinationDir = destDir
-                classpath = androidJarFile(project) + dependencyClasspath
+                classpath = project.getAndroidJar() + dependencyClasspath
                 checksConfig = GENERATE_DOCS_CONFIG
                 extraArgumentsBuilder.apply {
                     addStringOption(
@@ -622,7 +622,7 @@
     }
 }
 
-private const val DACKKA_DEPENDENCY = "com.google.devsite:dackka:0.0.11"
+private const val DACKKA_DEPENDENCY = "com.google.devsite:dackka:0.0.12"
 private const val DOCLAVA_DEPENDENCY = "com.android:doclava:1.0.6"
 
 // List of packages to exclude from both Java and Kotlin refdoc generation
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/java/JavaCompileInputs.kt b/buildSrc/private/src/main/kotlin/androidx/build/java/JavaCompileInputs.kt
index 9fdedb5..1f1ece8 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/java/JavaCompileInputs.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/java/JavaCompileInputs.kt
@@ -16,7 +16,7 @@
 
 package androidx.build.java
 
-import androidx.build.doclava.androidJarFile
+import androidx.build.getAndroidJar
 import androidx.build.multiplatformExtension
 import org.gradle.api.Project
 import org.gradle.api.file.FileCollection
@@ -63,7 +63,7 @@
                 }
             )
             val dependencyClasspath = sourceSet.compileClasspath
-            return JavaCompileInputs(sourcePaths, dependencyClasspath, androidJarFile(project))
+            return JavaCompileInputs(sourcePaths, dependencyClasspath, project.getAndroidJar())
         }
 
         @Suppress("DEPRECATION") // BaseVariant, SourceKind
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/metalava/RegenerateOldApisTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/metalava/RegenerateOldApisTask.kt
index 63bd573..0434728 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/metalava/RegenerateOldApisTask.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/metalava/RegenerateOldApisTask.kt
@@ -20,7 +20,7 @@
 import androidx.build.checkapi.getApiFileVersion
 import androidx.build.checkapi.getVersionedApiLocation
 import androidx.build.checkapi.isValidArtifactVersion
-import androidx.build.doclava.androidJarFile
+import androidx.build.getAndroidJar
 import androidx.build.getCheckoutRoot
 import androidx.build.java.JavaCompileInputs
 import org.gradle.api.DefaultTask
@@ -103,7 +103,7 @@
         val jars = getJars(runnerProject, mavenId)
         val sources = getSources(runnerProject, mavenId + ":sources")
 
-        return JavaCompileInputs(sources, jars, androidJarFile(project))
+        return JavaCompileInputs(sources, jars, project.getAndroidJar())
     }
 
     fun getJars(runnerProject: Project, mavenId: String): FileCollection {
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/resources/ResourceTasks.kt b/buildSrc/private/src/main/kotlin/androidx/build/resources/ResourceTasks.kt
index ea6ba3e..1ad9097 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/resources/ResourceTasks.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/resources/ResourceTasks.kt
@@ -118,7 +118,9 @@
             // Since apiLocation isn't a File, we have to manually set up the dependency.
             task.dependsOn(generateResourceApi)
             task.outputApiLocations.set(outputApiLocations)
-            task.forceUpdate.set(project.hasProperty("force"))
+            task.forceUpdate.set(
+                project.providers.gradleProperty("force").forUseAtConfigurationTime().isPresent()
+            )
             checkResourceApiRelease?.let {
                 // If a developer (accidentally) makes a non-backwards compatible change to an
                 // API, the developer will want to be informed of it as soon as possible.
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/studio/StudioArchiveCreator.kt b/buildSrc/private/src/main/kotlin/androidx/build/studio/StudioArchiveCreator.kt
index fa885c3..06b5994 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/studio/StudioArchiveCreator.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/studio/StudioArchiveCreator.kt
@@ -16,7 +16,7 @@
 
 package androidx.build.studio
 
-import org.gradle.api.Project
+import org.gradle.process.ExecOperations
 import java.io.File
 import java.nio.file.Files
 import java.nio.file.Paths
@@ -26,7 +26,7 @@
  * extracting later.
  */
 typealias StudioArchiveCreator = (
-    project: Project,
+    execOperations: ExecOperations,
     studioVersion: String,
     filename: String,
     destinationPath: String
@@ -36,7 +36,7 @@
  * Downloads a Studio archive from the official download URL, and places it at destinationPath.
  */
 val UrlArchiveCreator: StudioArchiveCreator = fun (
-    project: Project,
+    execOperations: ExecOperations,
     studioVersion: String,
     filename: String,
     destinationPath: String
@@ -46,7 +46,7 @@
     val tmpDownloadPath = File("$destinationPath.tmp").absolutePath
 
     println("Downloading $url to $tmpDownloadPath")
-    project.exec { execSpec ->
+    execOperations.exec { execSpec ->
         with(execSpec) {
             executable("curl")
             args(url, "--output", tmpDownloadPath)
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/studio/StudioPatcher.kt b/buildSrc/private/src/main/kotlin/androidx/build/studio/StudioPatcher.kt
deleted file mode 100644
index 5e51934..0000000
--- a/buildSrc/private/src/main/kotlin/androidx/build/studio/StudioPatcher.kt
+++ /dev/null
@@ -1,63 +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.build.studio
-
-import org.gradle.api.Project
-import java.io.File
-
-typealias StudioPatcher = (
-    studioTask: StudioTask,
-    project: Project,
-    studioInstallationDir: File
-) -> Unit
-
-/**
- * noop - leave studio unpatched by default
- */
-val NoopStudioPatcher: StudioPatcher = fun (_: StudioTask, _: Project, _: File) {}
-
-/**
- * Patch studio with the Performance Testing 202.6948.5 plugin, downloaded from Jetbrains
- */
-val PerformancePluginStudioPatcher: StudioPatcher = fun (
-    studioTask: StudioTask,
-    project: Project,
-    studioInstallationDir: File
-) {
-    val url = "https://plugins.jetbrains.com/plugin/download?rel=true&updateId=94393"
-    val tmpZip = File("${studioInstallationDir.absolutePath}/performanceTestingPlugin.zip")
-        .absolutePath
-
-    println("Downloading $url to $tmpZip")
-    project.exec { execSpec ->
-        with(execSpec) {
-            executable("curl")
-            args("--location", url, "--output", tmpZip)
-        }
-    }
-
-    val platformUtilities = StudioPlatformUtilities.get(project.rootDir, studioInstallationDir)
-    val pluginsDir = with(platformUtilities) { studioTask.pluginsDirectory }
-    File(pluginsDir, "performanceTesting").deleteRecursively()
-
-    project.exec { execSpec ->
-        with(execSpec) {
-            executable("unzip")
-            args(tmpZip, "-d", pluginsDir)
-        }
-    }
-}
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/studio/StudioTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/studio/StudioTask.kt
index 9419c13..e51c320 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/studio/StudioTask.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/studio/StudioTask.kt
@@ -16,7 +16,10 @@
 
 package androidx.build.studio
 
+import androidx.build.OperatingSystem
 import androidx.build.StudioType
+import androidx.build.getOperatingSystem
+import androidx.build.getSdkPath
 import androidx.build.getSupportRootFolder
 import androidx.build.studioType
 import com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION
@@ -29,7 +32,10 @@
 import org.gradle.api.tasks.Internal
 import org.gradle.api.tasks.TaskAction
 import org.gradle.internal.service.ServiceRegistry
+import org.gradle.process.ExecOperations
 import java.io.File
+import java.nio.file.Files
+import javax.inject.Inject
 
 /**
  * Base task with common logic for updating and launching studio in both the frameworks/support
@@ -49,6 +55,9 @@
         StudioPlatformUtilities.get(projectRoot, studioInstallationDir)
     }
 
+    @get:Inject
+    abstract val execOperations: ExecOperations
+
     /**
      * If `true`, checks for `ANDROIDX_PROJECTS` environment variable to decide which
      * projects need to be loaded.
@@ -138,9 +147,6 @@
         File("$studioInstallationDir/STUDIOW_LICENSE_ACCEPTED")
     }
 
-    @get:Internal
-    protected open val studioPatcher = NoopStudioPatcher
-
     /**
      * Install Studio and removes any old installation files if they exist.
      */
@@ -151,18 +157,44 @@
             studioInstallationDir.parentFile.deleteRecursively()
             // Create installation directory and any needed parent directories
             studioInstallationDir.mkdirs()
-            studioArchiveCreator(project, studioVersion, studioArchiveName, studioArchivePath)
+            studioArchiveCreator(
+                execOperations,
+                studioVersion,
+                studioArchiveName,
+                studioArchivePath
+            )
             println("Extracting archive...")
             extractStudioArchive()
             with(platformUtilities) { updateJvmHeapSize() }
             // Finish install process
             successfulInstallFile.createNewFile()
         }
-        val successfulStudioPatch = File("$studioInstallationDir/PLUGIN_PATCH_SUCCESSFUL")
-        if (!successfulStudioPatch.exists()) {
-            studioPatcher(this, project, studioInstallationDir)
-            // Finish patch process
-            successfulStudioPatch.createNewFile()
+    }
+
+    /**
+     * Attempts to symlink the system-images and emulator SDK directories to a canonical SDK.
+     */
+    private fun setupSymlinksIfNeeded() {
+        val paths = listOf("system-images", "emulator")
+
+        val localSdkPath = project.getSdkPath()
+        val canonicalSdkPath = when (getOperatingSystem()) {
+            OperatingSystem.MAC -> File(System.getProperty("user.home"), "Library/Android/sdk")
+            OperatingSystem.LINUX -> File(System.getProperty("user.home"), "Android/Sdk")
+            else -> null
+        } ?: return
+
+        if (!canonicalSdkPath.exists()) {
+            // In the future, we might want to try a little harder to locate a canonical SDK path.
+            return
+        }
+
+        paths.forEach { path ->
+            val link = File(localSdkPath, path)
+            val target = File(canonicalSdkPath, path)
+            if (target.exists() && !link.exists()) {
+                Files.createSymbolicLink(link.toPath(), target.toPath())
+            }
         }
     }
 
@@ -181,6 +213,10 @@
                     """.trimIndent()
                 )
             }
+
+            // This seems like as good a time as any to set up SDK symlinks...
+            setupSymlinksIfNeeded()
+
             println("Launching studio...")
             launchStudio()
         } else {
@@ -234,7 +270,9 @@
         val fromPath = studioArchivePath
         val toPath = studioInstallationDir.absolutePath
         println("Extracting to $toPath...")
-        project.exec { execSpec -> platformUtilities.extractArchive(fromPath, toPath, execSpec) }
+        execOperations.exec {
+                execSpec -> platformUtilities.extractArchive(fromPath, toPath, execSpec)
+        }
         // Remove studio archive once done
         File(studioArchivePath).delete()
     }
@@ -255,16 +293,15 @@
 /**
  * Task for launching studio in the frameworks/support project
  */
-open class RootStudioTask : StudioTask() {
+abstract class RootStudioTask : StudioTask() {
     override val studioArchiveCreator = UrlArchiveCreator
-    override val studioPatcher: StudioPatcher = PerformancePluginStudioPatcher
     override val ideaProperties get() = projectRoot.resolve("development/studio/idea.properties")
 }
 
 /**
  * Task for launching studio in a playground project
  */
-open class PlaygroundStudioTask : RootStudioTask() {
+abstract class PlaygroundStudioTask : RootStudioTask() {
     @get:Internal
     val supportRootFolder = (project.rootProject.property("ext") as ExtraPropertiesExtension)
         .let { it.get("supportRootFolder") as File }
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/TestSuiteConfiguration.kt b/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/TestSuiteConfiguration.kt
index db5e430..659a74c 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/TestSuiteConfiguration.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/testConfiguration/TestSuiteConfiguration.kt
@@ -198,7 +198,6 @@
             project.rootProject.tasks.findByName(ZIP_TEST_CONFIGS_WITH_APKS_TASK)!!
                 .dependsOn(task)
             project.rootProject.tasks.findByName(ZIP_CONSTRAINED_TEST_CONFIGS_WITH_APKS_TASK)!!
-
                 .dependsOn(task)
             return task
         } else {
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt b/buildSrc/private/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt
index 4503a9f..1613cc3 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt
@@ -190,6 +190,7 @@
     "lintWithKspDebug"
 )
 
+@Suppress("UnstableApiUsage") // usage of BuildService that's incubating
 abstract class TaskUpToDateValidator :
     BuildService<TaskUpToDateValidator.Parameters>, OperationCompletionListener {
     interface Parameters : BuildServiceParameters {
@@ -200,7 +201,7 @@
     }
 
     override fun onFinish(event: FinishEvent) {
-        if (!getParameters().validate.get()) {
+        if (!parameters.validate.get()) {
             return
         }
         val result = event.result
@@ -228,7 +229,7 @@
         // Tells whether to create a TaskUpToDateValidator listener
         private fun shouldEnable(project: Project): Boolean {
             return project.providers.gradleProperty(ENABLE_FLAG_NAME)
-                .forUseAtConfigurationTime().isPresent()
+                .forUseAtConfigurationTime().isPresent
         }
 
         private fun isAllowedToRerunTask(taskPath: String): Boolean {
@@ -257,14 +258,13 @@
                 return
             }
             val validate = rootProject.providers.gradleProperty(DISALLOW_TASK_EXECUTION_FLAG_NAME)
-                .map({ _ -> true }).orElse(false)
+                .map { true }.orElse(false)
             // create listener for validating that any task that reran was expected to rerun
-            val validatorProvider = rootProject.getGradle().getSharedServices()
+            val validatorProvider = rootProject.gradle.sharedServices
                 .registerIfAbsent(
                     "TaskUpToDateValidator",
-                    TaskUpToDateValidator::class.java,
-                    { spec -> spec.getParameters().validate = validate }
-                )
+                    TaskUpToDateValidator::class.java
+                ) { spec -> spec.parameters.validate = validate }
             registry.onTaskCompletion(validatorProvider)
 
             // skip rerunning tasks that are known to be unnecessary to rerun
diff --git a/buildSrc/public/src/main/kotlin/androidx/build/BuildServerConfiguration.kt b/buildSrc/public/src/main/kotlin/androidx/build/BuildServerConfiguration.kt
index 46ecf9c..3797c89 100644
--- a/buildSrc/public/src/main/kotlin/androidx/build/BuildServerConfiguration.kt
+++ b/buildSrc/public/src/main/kotlin/androidx/build/BuildServerConfiguration.kt
@@ -53,7 +53,8 @@
  * the contents of DIST_DIR to somewhere and make it available.
  */
 fun Project.getDistributionDirectory(): File {
-    val envVar = project.providers.environmentVariable("DIST_DIR").forUseAtConfigurationTime().getOrElse("")
+    val envVar = project.providers.environmentVariable("DIST_DIR")
+        .forUseAtConfigurationTime().getOrElse("")
     return if (envVar != "") {
         File(envVar)
     } else {
diff --git a/buildSrc/public/src/main/kotlin/androidx/build/LibraryVersions.kt b/buildSrc/public/src/main/kotlin/androidx/build/LibraryVersions.kt
index b2152e2..d18d50a 100644
--- a/buildSrc/public/src/main/kotlin/androidx/build/LibraryVersions.kt
+++ b/buildSrc/public/src/main/kotlin/androidx/build/LibraryVersions.kt
@@ -22,14 +22,14 @@
 object LibraryVersions {
     val ACTIVITY = Version("1.5.0-alpha01")
     val ADS_IDENTIFIER = Version("1.0.0-alpha05")
-    val ANNOTATION = Version("1.3.0-rc01")
+    val ANNOTATION = Version("1.4.0-alpha01")
     val ANNOTATION_EXPERIMENTAL = Version("1.2.0-alpha01")
-    val APPCOMPAT = Version("1.4.0-rc01")
-    val APPSEARCH = Version("1.0.0-alpha03")
+    val APPCOMPAT = Version("1.5.0-alpha01")
+    val APPSEARCH = Version("1.0.0-alpha04")
     val ARCH_CORE = Version("2.2.0-alpha01")
     val ASYNCLAYOUTINFLATER = Version("1.1.0-alpha01")
     val AUTOFILL = Version("1.2.0-beta02")
-    val BENCHMARK = Version("1.1.0-beta01")
+    val BENCHMARK = Version("1.1.0-alpha11")
     val BIOMETRIC = Version("1.2.0-alpha04")
     val BROWSER = Version("1.5.0-alpha01")
     val BUILDSRC_TESTS = Version("1.0.0-alpha01")
@@ -38,14 +38,14 @@
     val CAMERA_PIPE = Version("1.0.0-alpha01")
     val CAMERA_VIEW = Version("1.0.0-alpha31")
     val CARDVIEW = Version("1.1.0-alpha01")
-    val CAR_APP = Version("1.1.0-beta02")
+    val CAR_APP = Version("1.2.0-alpha01")
     val COLLECTION = Version("1.2.0-beta02")
     val COLLECTION2 = Version("1.2.0-beta01")
     val CONTENTPAGER = Version("1.1.0-alpha01")
     val COMPOSE_MATERIAL3 = Version(System.getenv("COMPOSE_CUSTOM_VERSION") ?: "1.0.0-alpha01")
-    val COMPOSE = Version(System.getenv("COMPOSE_CUSTOM_VERSION") ?: "1.1.0-alpha07")
+    val COMPOSE = Version(System.getenv("COMPOSE_CUSTOM_VERSION") ?: "1.1.0-beta02")
     val COORDINATORLAYOUT = Version("1.2.0-alpha01")
-    val CORE = Version("1.7.0-rc01")
+    val CORE = Version("1.8.0-alpha01")
     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")
@@ -62,10 +62,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-rc01")
+    val EMOJI2 = Version("1.1.0-alpha01")
     val ENTERPRISE = Version("1.1.0-rc01")
     val EXIFINTERFACE = Version("1.4.0-alpha01")
-    val FRAGMENT = Version("1.4.0-beta01")
+    val FRAGMENT = Version("1.4.0-rc01")
     val FUTURES = Version("1.2.0-alpha01")
     val GLANCE = Version("1.0.0-alpha01")
     val GRIDLAYOUT = Version("1.1.0-alpha01")
@@ -80,6 +80,7 @@
     val LEANBACK_PAGING = Version("1.1.0-alpha09")
     val LEANBACK_PREFERENCE = Version("1.2.0-alpha02")
     val LEANBACK_TAB = Version("1.1.0-beta01")
+    val LEANBACK_GRID = Version("1.0.0-alpha01")
     val LEGACY = Version("1.1.0-alpha01")
     val LOCALBROADCASTMANAGER = Version("1.1.0-alpha02")
     val LIFECYCLE = Version("2.5.0-alpha01")
@@ -90,19 +91,19 @@
     val MEDIA2 = Version("1.3.0-alpha01")
     val MEDIAROUTER = Version("1.3.0-alpha01")
     val METRICS = Version("1.0.0-alpha01")
-    val NAVIGATION = Version("2.4.0-beta01")
+    val NAVIGATION = Version("2.4.0-beta02")
     val PAGING = Version("3.1.0-beta02")
     val PAGING_COMPOSE = Version("1.0.0-alpha15")
     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-alpha08")
+    val PREFERENCE = Version("1.2.0-alpha02")
+    val PROFILEINSTALLER = Version("1.1.0-beta02")
     val RECOMMENDATION = Version("1.1.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-rc01")
+    val RESOURCEINSPECTION = Version("1.1.0-alpha01")
     val ROOM = Version("2.4.0-beta02")
     val SAVEDSTATE = Version("1.2.0-alpha01")
     val SECURITY = Version("1.1.0-alpha04")
@@ -133,16 +134,16 @@
     val VIEWPAGER = Version("1.1.0-alpha02")
     val VIEWPAGER2 = Version("1.1.0-beta02")
     val WEAR = Version("1.3.0-alpha02")
-    val WEAR_COMPOSE = Version("1.0.0-alpha09")
+    val WEAR_COMPOSE = Version("1.0.0-alpha10")
     val WEAR_INPUT = Version("1.2.0-alpha03")
     val WEAR_INPUT_TESTING = WEAR_INPUT
     val WEAR_ONGOING = 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-rc01")
-    val WEAR_WATCHFACE = Version("1.0.0-beta01")
+    val WEAR_TILES = Version("1.1.0-alpha01")
+    val WEAR_WATCHFACE = Version("1.1.0-alpha01")
     val WEBKIT = Version("1.5.0-alpha01")
-    val WINDOW = Version("1.0.0-beta03")
+    val WINDOW = Version("1.0.0-beta04")
     val WINDOW_EXTENSIONS = Version("1.0.0-alpha01")
     val WINDOW_SIDECAR = Version("1.0.0-beta01")
     val WORK = Version("2.8.0-alpha01")
diff --git a/buildSrc/public/src/main/kotlin/androidx/build/SupportConfig.kt b/buildSrc/public/src/main/kotlin/androidx/build/SupportConfig.kt
index 301071b..b250acb 100644
--- a/buildSrc/public/src/main/kotlin/androidx/build/SupportConfig.kt
+++ b/buildSrc/public/src/main/kotlin/androidx/build/SupportConfig.kt
@@ -16,8 +16,10 @@
 
 package androidx.build
 
+import androidx.build.SupportConfig.COMPILE_SDK_VERSION
 import org.gradle.api.GradleException
 import org.gradle.api.Project
+import org.gradle.api.file.FileCollection
 import org.gradle.api.plugins.ExtraPropertiesExtension
 import java.io.File
 
@@ -76,3 +78,21 @@
     val reposProperties = ext.get("repos") as Map<*, *>
     return File(reposProperties["prebuiltsRoot"].toString())
 }
+
+/**
+ * @return the project's Android SDK stub JAR as a File.
+ */
+fun Project.getAndroidJar(): FileCollection =
+    files(
+        arrayOf(
+            File(
+                getSdkPath(),
+                "platforms/$COMPILE_SDK_VERSION/android.jar"
+            ),
+            // Allow using optional android.car APIs
+            File(
+                getSdkPath(),
+                "platforms/$COMPILE_SDK_VERSION/optional/android.car.jar"
+            )
+        )
+    )
diff --git a/busytown/androidx-studio-integration-lint.sh b/busytown/androidx-studio-integration-lint.sh
index 29b4c5f..a1d24aa 100755
--- a/busytown/androidx-studio-integration-lint.sh
+++ b/busytown/androidx-studio-integration-lint.sh
@@ -1,4 +1,13 @@
 set -e
 SCRIPT_PATH="$(cd $(dirname $0) && pwd)"
 
-$SCRIPT_PATH/impl/build-studio-and-androidx.sh -Pandroidx.summarizeStderr --no-daemon -Pandroidx.allWarningsAsErrors lintDebug -Pandroidx.verifyUpToDate -x verifyDependencyVersions --stacktrace
+$SCRIPT_PATH/impl/build-studio-and-androidx.sh \
+  -Pandroidx.allWarningsAsErrors \
+  -Pandroidx.summarizeStderr \
+  -Pandroidx.verifyUpToDate \
+  -x verifyDependencyVersions \
+  lint \
+  lintDebug \
+  lintReport \
+  --no-daemon \
+  --stacktrace
diff --git a/busytown/androidx-studio-integration.sh b/busytown/androidx-studio-integration.sh
index 3633139..27a2179 100755
--- a/busytown/androidx-studio-integration.sh
+++ b/busytown/androidx-studio-integration.sh
@@ -1,4 +1,15 @@
 set -e
 SCRIPT_PATH="$(cd $(dirname $0) && pwd)"
 
-$SCRIPT_PATH/impl/build-studio-and-androidx.sh -Pandroidx.allWarningsAsErrors listTaskOutputs bOS -Pandroidx.verifyUpToDate -x verifyDependencyVersions --stacktrace
+# Exclude lint tasks, as those are covered by the
+# androidx-studio-integration-lint.sh script
+$SCRIPT_PATH/impl/build-studio-and-androidx.sh \
+  -Pandroidx.allWarningsAsErrors \
+  -Pandroidx.verifyUpToDate \
+  -x lint \
+  -x lintDebug \
+  -x lintReport \
+  -x verifyDependencyVersions \
+  listTaskOutputs \
+  bOS \
+  --stacktrace
diff --git a/busytown/androidx_incremental.sh b/busytown/androidx_incremental.sh
index 9c29a31..8bfc26a 100755
--- a/busytown/androidx_incremental.sh
+++ b/busytown/androidx_incremental.sh
@@ -60,11 +60,7 @@
 else
   zipKotlinMetadata
   echo build failed
-  if [ "$PRESUBMIT" == "true" ]; then
-    echo androidx_incremental ignoring presubmit failure
-  else
-    EXIT_VALUE=1
-  fi
+  EXIT_VALUE=1
 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-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/Camera2CameraControlDeviceTest.kt b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/Camera2CameraControlDeviceTest.kt
index 953720a..e36b12d 100644
--- a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/Camera2CameraControlDeviceTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/Camera2CameraControlDeviceTest.kt
@@ -35,11 +35,11 @@
 import androidx.camera.camera2.pipe.integration.interop.ExperimentalCamera2Interop
 import androidx.camera.core.CameraControl
 import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraX
 import androidx.camera.core.ImageAnalysis
 import androidx.camera.core.impl.CameraInfoInternal
 import androidx.camera.core.internal.CameraUseCaseAdapter
 import androidx.camera.testing.CameraUtil
+import androidx.camera.testing.CameraXUtil
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
@@ -82,7 +82,10 @@
         Assume.assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK))
 
         context = ApplicationProvider.getApplicationContext()
-        CameraX.initialize(context, CameraPipeConfig.defaultConfig())
+        CameraXUtil.initialize(
+            context,
+            CameraPipeConfig.defaultConfig()
+        )
         cameraSelector = CameraSelector.Builder().requireLensFacing(
             CameraSelector.LENS_FACING_BACK
         ).build()
@@ -98,7 +101,7 @@
             camera.detachUseCases()
         }
 
-        CameraX.shutdown()[10000, TimeUnit.MILLISECONDS]
+        CameraXUtil.shutdown()[10000, TimeUnit.MILLISECONDS]
     }
 
     @Test
diff --git a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/CameraControlAdapterDeviceTest.kt b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/CameraControlAdapterDeviceTest.kt
index 463118c..dc7911f 100644
--- a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/CameraControlAdapterDeviceTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/CameraControlAdapterDeviceTest.kt
@@ -26,12 +26,12 @@
 import androidx.camera.camera2.pipe.integration.interop.ExperimentalCamera2Interop
 import androidx.camera.camera2.pipe.testing.VerifyResultListener
 import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraX
 import androidx.camera.core.ImageAnalysis
 import androidx.camera.core.ImageCapture
 import androidx.camera.core.UseCase
 import androidx.camera.core.internal.CameraUseCaseAdapter
 import androidx.camera.testing.CameraUtil
+import androidx.camera.testing.CameraXUtil
 import androidx.concurrent.futures.await
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -81,7 +81,10 @@
         Assume.assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK))
 
         context = ApplicationProvider.getApplicationContext()
-        CameraX.initialize(context, CameraPipeConfig.defaultConfig())
+        CameraXUtil.initialize(
+            context,
+            CameraPipeConfig.defaultConfig()
+        )
         cameraSelector = CameraSelector.Builder().requireLensFacing(
             CameraSelector.LENS_FACING_BACK
         ).build()
@@ -96,7 +99,7 @@
             camera.detachUseCases()
         }
 
-        CameraX.shutdown()[10000, TimeUnit.MILLISECONDS]
+        CameraXUtil.shutdown()[10000, TimeUnit.MILLISECONDS]
     }
 
     // TODO: test all public API of the CameraControl to ensure the RequestOptions still exist
diff --git a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/CaptureConfigAdapterDeviceTest.kt b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/CaptureConfigAdapterDeviceTest.kt
index 47f1b6f..5cd5948 100644
--- a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/CaptureConfigAdapterDeviceTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/CaptureConfigAdapterDeviceTest.kt
@@ -23,7 +23,6 @@
 import androidx.annotation.RequiresApi
 import androidx.camera.camera2.pipe.integration.adapter.CameraControlAdapter
 import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraX
 import androidx.camera.core.impl.CameraCaptureCallback
 import androidx.camera.core.impl.CameraCaptureFailure
 import androidx.camera.core.impl.CameraCaptureResult
@@ -33,6 +32,7 @@
 import androidx.camera.core.impl.utils.futures.Futures
 import androidx.camera.core.internal.CameraUseCaseAdapter
 import androidx.camera.testing.CameraUtil
+import androidx.camera.testing.CameraXUtil
 import androidx.camera.testing.fakes.FakeUseCase
 import androidx.camera.testing.fakes.FakeUseCaseConfig
 import androidx.test.core.app.ApplicationProvider
@@ -86,7 +86,10 @@
         Assume.assumeTrue(CameraUtil.hasCameraWithLensFacing(DEFAULT_LENS_FACING_SELECTOR))
 
         val context: Context = ApplicationProvider.getApplicationContext()
-        CameraX.initialize(context, CameraPipeConfig.defaultConfig())
+        CameraXUtil.initialize(
+            context,
+            CameraPipeConfig.defaultConfig()
+        )
         camera = CameraUtil.createCameraUseCaseAdapter(
             context,
             CameraSelector.Builder().requireLensFacing(
@@ -105,7 +108,7 @@
     fun tearDown() {
         camera?.detachUseCases()
         testDeferrableSurface.close()
-        CameraX.shutdown()[10000, TimeUnit.MILLISECONDS]
+        CameraXUtil.shutdown()[10000, TimeUnit.MILLISECONDS]
     }
 
     @Test
diff --git a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/EvCompDeviceTest.kt b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/EvCompDeviceTest.kt
index a0f2387..4c0462c 100644
--- a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/EvCompDeviceTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/EvCompDeviceTest.kt
@@ -27,12 +27,12 @@
 import androidx.camera.camera2.pipe.integration.interop.ExperimentalCamera2Interop
 import androidx.camera.camera2.pipe.testing.VerifyResultListener
 import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraX
 import androidx.camera.core.ImageAnalysis
 import androidx.camera.core.ImageCapture
 import androidx.camera.core.ImageCapture.FLASH_TYPE_ONE_SHOT_FLASH
 import androidx.camera.core.internal.CameraUseCaseAdapter
 import androidx.camera.testing.CameraUtil
+import androidx.camera.testing.CameraXUtil
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
@@ -84,7 +84,10 @@
         Assume.assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK))
 
         context = ApplicationProvider.getApplicationContext()
-        CameraX.initialize(context, CameraPipeConfig.defaultConfig())
+        CameraXUtil.initialize(
+            context,
+            CameraPipeConfig.defaultConfig()
+        )
         cameraSelector = CameraSelector.Builder().requireLensFacing(
             CameraSelector.LENS_FACING_BACK
         ).build()
@@ -101,7 +104,7 @@
             camera.detachUseCases()
         }
 
-        CameraX.shutdown()[10000, TimeUnit.MILLISECONDS]
+        CameraXUtil.shutdown()[10000, TimeUnit.MILLISECONDS]
     }
 
     @Test
diff --git a/camera/camera-camera2-pipe-testing/src/test/java/androidx/camera/camera2/pipe/testing/CameraGraphSimulatorTest.kt b/camera/camera-camera2-pipe-testing/src/test/java/androidx/camera/camera2/pipe/testing/CameraGraphSimulatorTest.kt
index 5bdcdf0..8b452f0 100644
--- a/camera/camera-camera2-pipe-testing/src/test/java/androidx/camera/camera2/pipe/testing/CameraGraphSimulatorTest.kt
+++ b/camera/camera-camera2-pipe-testing/src/test/java/androidx/camera/camera2/pipe/testing/CameraGraphSimulatorTest.kt
@@ -36,6 +36,7 @@
 import kotlinx.coroutines.withContext
 import kotlinx.coroutines.withTimeout
 import kotlinx.coroutines.withTimeoutOrNull
+import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.robolectric.annotation.Config
@@ -60,6 +61,7 @@
     private val simulator = CameraGraphSimulator(graphConfig, metadata)
     private val stream = simulator.cameraGraph.streams[streamConfig]!!
 
+    @Ignore("b/188446185")
     @Test
     fun simulatorCanSimulateRepeatingFrames() = runBlocking {
         val listener = FakeRequestListener()
@@ -193,6 +195,7 @@
         assertThat(lossEvent.streamId).isEqualTo(stream.id)
     }
 
+    @Ignore("b/188446185")
     @Test
     fun simulatorCanIssueMultipleFrames() = runBlocking {
         val listener = FakeRequestListener()
@@ -279,4 +282,4 @@
 
         simulateCallbacks.join()
     }
-}
\ No newline at end of file
+}
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraPipe.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraPipe.kt
index 94e522c..bb4b107 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraPipe.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraPipe.kt
@@ -19,6 +19,7 @@
 package androidx.camera.camera2.pipe
 
 import android.content.Context
+import android.hardware.camera2.CameraCharacteristics
 import android.os.HandlerThread
 import androidx.annotation.RequiresApi
 import androidx.camera.camera2.pipe.config.CameraGraphConfigModule
@@ -75,7 +76,8 @@
      */
     public data class Config(
         val appContext: Context,
-        val threadConfig: ThreadConfig = ThreadConfig()
+        val threadConfig: ThreadConfig = ThreadConfig(),
+        val cameraMetadataConfig: CameraMetadataConfig = CameraMetadataConfig()
     )
 
     /**
@@ -96,6 +98,20 @@
         val defaultCameraHandler: HandlerThread? = null
     )
 
+    /**
+     * Application level configuration options for [CameraMetadata] provider(s).
+     *
+     * @param cacheBlocklist is used to prevent the metadata backend from caching the results of
+     *   specific keys.
+     * @param cameraCacheBlocklist is used to prevent the metadata backend from caching the results
+     *   of specific keys for specific cameraIds.
+     */
+    public class CameraMetadataConfig(
+        public val cacheBlocklist: Set<CameraCharacteristics.Key<*>> = emptySet(),
+        public val cameraCacheBlocklist: Map<CameraId, Set<CameraCharacteristics.Key<*>>> =
+            emptyMap()
+    )
+
     override fun toString(): String = "CameraPipe-$debugId"
 
     /**
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraMetadata.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraMetadata.kt
index a8514f3..178064a 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraMetadata.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraMetadata.kt
@@ -40,6 +40,7 @@
     private val characteristics: CameraCharacteristics,
     private val metadataProvider: CameraMetadataProvider,
     private val metadata: Map<Metadata.Key<*>, Any?>,
+    private val cacheBlocklist: Set<CameraCharacteristics.Key<*>>,
 ) : CameraMetadata {
     @GuardedBy("values")
     private val values = ArrayMap<CameraCharacteristics.Key<*>, Any?>()
@@ -52,6 +53,10 @@
         metadata[key] as T? ?: default
 
     override fun <T> get(key: CameraCharacteristics.Key<T>): T? {
+        if (cacheBlocklist.contains(key)) {
+            return characteristics.get(key)
+        }
+
         // Cache the return value of calls to characteristics as the implementation performs a
         // blocking jni binder call which can be expensive when invoked frequently (see b/144028609
         // for more details).
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2MetadataCache.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2MetadataCache.kt
index 0b9efe9..12b453b 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2MetadataCache.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2MetadataCache.kt
@@ -23,6 +23,7 @@
 import androidx.annotation.RequiresApi
 import androidx.camera.camera2.pipe.CameraId
 import androidx.camera.camera2.pipe.CameraMetadata
+import androidx.camera.camera2.pipe.CameraPipe
 import androidx.camera.camera2.pipe.core.Debug
 import androidx.camera.camera2.pipe.core.Log
 import androidx.camera.camera2.pipe.core.Timestamps
@@ -35,17 +36,18 @@
 import javax.inject.Singleton
 
 /**
- * Provides caching and querying of [CameraMetadata].
+ * Provides caching and querying of [CameraMetadata] via Camera2.
  *
- * This class is designed to be thread safe and provides suspend functions for querying and
- * accessing CameraMetadata.
+ * This class is thread safe and provides suspending functions for querying and accessing
+ * [CameraMetadata].
  */
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 @Singleton
 internal class Camera2MetadataCache @Inject constructor(
     private val context: Context,
     private val threads: Threads,
-    private val permissions: Permissions
+    private val permissions: Permissions,
+    private val cameraMetadataConfig: CameraPipe.CameraMetadataConfig
 ) : CameraMetadataProvider {
     @GuardedBy("cache")
     private val cache = ArrayMap<String, CameraMetadata>()
@@ -89,8 +91,25 @@
                     context.getSystemService(Context.CAMERA_SERVICE) as CameraManager
                 val characteristics =
                     cameraManager.getCameraCharacteristics(cameraId.value)
+
+                // Merge the camera specific and global cache blocklists together.
+                // this will prevent these values from being cached after first access.
+                val cameraBlocklist = cameraMetadataConfig.cameraCacheBlocklist[cameraId]
+                val cacheBlocklist = if (cameraBlocklist == null) {
+                    cameraMetadataConfig.cacheBlocklist
+                } else {
+                    cameraMetadataConfig.cacheBlocklist + cameraBlocklist
+                }
+
                 val cameraMetadata =
-                    Camera2CameraMetadata(cameraId, redacted, characteristics, this, emptyMap())
+                    Camera2CameraMetadata(
+                        cameraId,
+                        redacted,
+                        characteristics,
+                        this,
+                        emptyMap(),
+                        cacheBlocklist
+                    )
 
                 Log.info {
                     val duration = Timestamps.now() - start
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/CameraPipeComponent.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/CameraPipeComponent.kt
index 6ad0f30..de31e8c 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/CameraPipeComponent.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/CameraPipeComponent.kt
@@ -23,6 +23,7 @@
 import androidx.annotation.RequiresApi
 import androidx.camera.camera2.pipe.CameraDevices
 import androidx.camera.camera2.pipe.CameraPipe
+import androidx.camera.camera2.pipe.CameraPipe.CameraMetadataConfig
 import androidx.camera.camera2.pipe.compat.Camera2CameraDevices
 import dagger.Binds
 import dagger.Component
@@ -61,6 +62,10 @@
         @Provides
         fun provideContext(config: CameraPipe.Config): Context = config.appContext
 
+        @Provides
+        fun provideCameraMetadataConfig(config: CameraPipe.Config): CameraMetadataConfig =
+            config.cameraMetadataConfig
+
         @Reusable
         @Provides
         fun provideCameraManager(context: Context): CameraManager =
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/Camera2MetadataCacheTest.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/Camera2MetadataCacheTest.kt
index 27b8b3a..82aea1f 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/Camera2MetadataCacheTest.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/Camera2MetadataCacheTest.kt
@@ -18,6 +18,7 @@
 
 import android.hardware.camera2.CameraCharacteristics
 import android.os.Build
+import androidx.camera.camera2.pipe.CameraPipe
 import androidx.camera.camera2.pipe.core.Permissions
 import androidx.camera.camera2.pipe.testing.RobolectricCameraPipeTestRunner
 import androidx.camera.camera2.pipe.testing.RobolectricCameras
@@ -57,7 +58,8 @@
         val cache = Camera2MetadataCache(
             RobolectricCameras.application,
             FakeThreads.forTests,
-            Permissions(RobolectricCameras.application)
+            Permissions(RobolectricCameras.application),
+            CameraPipe.CameraMetadataConfig()
         )
 
         val metadata0 = cache.awaitMetadata(camera0)
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/RobolectricCameras.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/RobolectricCameras.kt
index dd499a0..d121323 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/RobolectricCameras.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/testing/RobolectricCameras.kt
@@ -110,7 +110,8 @@
             false,
             characteristics,
             FakeCameraMetadataProvider(),
-            emptyMap()
+            emptyMap(),
+            emptySet()
         )
 
         @Suppress("SyntheticAccessor")
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/CameraControlDeviceTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/CameraControlDeviceTest.java
index 7e5e579..f2f0ef3 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/CameraControlDeviceTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/CameraControlDeviceTest.java
@@ -37,6 +37,7 @@
 import androidx.camera.core.internal.CameraUseCaseAdapter;
 import androidx.camera.testing.CameraAvailabilityUtil;
 import androidx.camera.testing.CameraUtil;
+import androidx.camera.testing.CameraXUtil;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.filters.LargeTest;
 import androidx.test.filters.SdkSuppress;
@@ -93,9 +94,9 @@
             throws ExecutionException, InterruptedException {
         Context context = ApplicationProvider.getApplicationContext();
         CameraXConfig cameraXConfig = Camera2Config.defaultConfig();
-        CameraX.initialize(context, cameraXConfig).get();
+        CameraXUtil.initialize(context, cameraXConfig).get();
 
-        CameraX cameraX = CameraX.getOrCreateInstance(context).get();
+        CameraX cameraX = CameraXUtil.getOrCreateInstance(context, null).get();
 
         assumeTrue(CameraAvailabilityUtil.hasCamera(cameraX.getCameraRepository(),
                 mCameraSelector));
@@ -142,7 +143,7 @@
                 mCamera.removeUseCases(mCamera.getUseCases())
         );
 
-        CameraX.shutdown().get(10000, TimeUnit.MILLISECONDS);
+        CameraXUtil.shutdown().get(10000, TimeUnit.MILLISECONDS);
     }
 
 
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/PreviewTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/PreviewTest.java
index 22d7540..0fdaa5f 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/PreviewTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/PreviewTest.java
@@ -42,7 +42,6 @@
 import androidx.camera.core.AspectRatio;
 import androidx.camera.core.CameraInfoUnavailableException;
 import androidx.camera.core.CameraSelector;
-import androidx.camera.core.CameraX;
 import androidx.camera.core.CameraXConfig;
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.Preview;
@@ -53,6 +52,7 @@
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.camera.core.internal.CameraUseCaseAdapter;
 import androidx.camera.testing.CameraUtil;
+import androidx.camera.testing.CameraXUtil;
 import androidx.camera.testing.GLUtil;
 import androidx.camera.testing.SurfaceTextureProvider;
 import androidx.core.util.Consumer;
@@ -103,7 +103,7 @@
     public void setUp() throws ExecutionException, InterruptedException {
         mContext = ApplicationProvider.getApplicationContext();
         CameraXConfig cameraXConfig = Camera2Config.defaultConfig();
-        CameraX.initialize(mContext, cameraXConfig).get();
+        CameraXUtil.initialize(mContext, cameraXConfig).get();
 
         // init CameraX before creating Preview to get preview size with CameraX's context
         mDefaultBuilder = Preview.Builder.fromConfig(Preview.DEFAULT_CONFIG.getConfig());
@@ -122,7 +122,7 @@
         }
 
         // Ensure all cameras are released for the next test
-        CameraX.shutdown().get(10000, TimeUnit.MILLISECONDS);
+        CameraXUtil.shutdown().get(10000, TimeUnit.MILLISECONDS);
     }
 
     @Test
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/SurfaceOrientedMeteringPointFactoryTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/SurfaceOrientedMeteringPointFactoryTest.java
index 03d3ca3..474ac38 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/SurfaceOrientedMeteringPointFactoryTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/SurfaceOrientedMeteringPointFactoryTest.java
@@ -25,7 +25,6 @@
 
 import androidx.camera.core.AspectRatio;
 import androidx.camera.core.CameraSelector;
-import androidx.camera.core.CameraX;
 import androidx.camera.core.CameraXConfig;
 import androidx.camera.core.ImageAnalysis;
 import androidx.camera.core.MeteringPoint;
@@ -33,6 +32,7 @@
 import androidx.camera.core.SurfaceOrientedMeteringPointFactory;
 import androidx.camera.core.internal.CameraUseCaseAdapter;
 import androidx.camera.testing.CameraUtil;
+import androidx.camera.testing.CameraXUtil;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.filters.SdkSuppress;
 import androidx.test.platform.app.InstrumentationRegistry;
@@ -57,13 +57,13 @@
         mContext = ApplicationProvider.getApplicationContext();
         CameraXConfig config = Camera2Config.defaultConfig();
 
-        CameraX.initialize(mContext, config);
+        CameraXUtil.initialize(mContext, config);
         mPointFactory = new SurfaceOrientedMeteringPointFactory(WIDTH, HEIGHT);
     }
 
     @After
     public void tearDown() throws ExecutionException, InterruptedException, TimeoutException {
-        CameraX.shutdown().get(10000, TimeUnit.MILLISECONDS);
+        CameraXUtil.shutdown().get(10000, TimeUnit.MILLISECONDS);
     }
 
     @Test
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/VideoCaptureTest.kt b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/VideoCaptureTest.kt
index d57509d..bc1cfa6 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/VideoCaptureTest.kt
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/VideoCaptureTest.kt
@@ -28,7 +28,6 @@
 import android.util.Size
 import androidx.annotation.NonNull
 import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraX
 import androidx.camera.core.Logger
 import androidx.camera.core.Preview
 import androidx.camera.core.UseCase
@@ -37,6 +36,7 @@
 import androidx.camera.core.internal.CameraUseCaseAdapter
 import androidx.camera.testing.AudioUtil
 import androidx.camera.testing.CameraUtil
+import androidx.camera.testing.CameraXUtil
 import androidx.camera.testing.SurfaceTextureProvider.SurfaceTextureCallback
 import androidx.camera.testing.SurfaceTextureProvider.createSurfaceTextureProvider
 import androidx.test.core.app.ApplicationProvider
@@ -114,7 +114,10 @@
             CameraSelector.DEFAULT_FRONT_CAMERA
         }
 
-        CameraX.initialize(context, Camera2Config.defaultConfig()).get()
+        CameraXUtil.initialize(
+            context,
+            Camera2Config.defaultConfig()
+        ).get()
         cameraUseCaseAdapter = CameraUtil.createCameraUseCaseAdapter(context, cameraSelector)
 
         contentResolver = context.contentResolver
@@ -128,7 +131,7 @@
             }
         }
 
-        CameraX.shutdown().get(10000, TimeUnit.MILLISECONDS)
+        CameraXUtil.shutdown().get(10000, TimeUnit.MILLISECONDS)
     }
 
     @Test
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/VideoCaptureTestWithoutAudioPermissionTest.kt b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/VideoCaptureTestWithoutAudioPermissionTest.kt
index d606f2f..c2d119c 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/VideoCaptureTestWithoutAudioPermissionTest.kt
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/VideoCaptureTestWithoutAudioPermissionTest.kt
@@ -27,7 +27,6 @@
 import android.util.Size
 import androidx.annotation.NonNull
 import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraX
 import androidx.camera.core.Logger
 import androidx.camera.core.Preview
 import androidx.camera.core.UseCase
@@ -35,6 +34,7 @@
 import androidx.camera.core.impl.utils.executor.CameraXExecutors
 import androidx.camera.core.internal.CameraUseCaseAdapter
 import androidx.camera.testing.CameraUtil
+import androidx.camera.testing.CameraXUtil
 import androidx.camera.testing.SurfaceTextureProvider
 import androidx.core.content.ContextCompat
 import androidx.test.core.app.ApplicationProvider
@@ -100,7 +100,10 @@
             CameraSelector.DEFAULT_FRONT_CAMERA
         }
 
-        CameraX.initialize(context, Camera2Config.defaultConfig()).get()
+        CameraXUtil.initialize(
+            context,
+            Camera2Config.defaultConfig()
+        ).get()
         cameraUseCaseAdapter = CameraUtil.createCameraUseCaseAdapter(context, cameraSelector)
 
         contentResolver = context.contentResolver
@@ -114,7 +117,7 @@
             }
         }
 
-        CameraX.shutdown().get(10000, TimeUnit.MILLISECONDS)
+        CameraXUtil.shutdown().get(10000, TimeUnit.MILLISECONDS)
     }
 
     /**
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraControlImplDeviceTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraControlImplDeviceTest.java
index 5c132c0..9751cc0 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraControlImplDeviceTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraControlImplDeviceTest.java
@@ -58,7 +58,6 @@
 import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat;
 import androidx.camera.core.CameraControl;
 import androidx.camera.core.CameraSelector;
-import androidx.camera.core.CameraX;
 import androidx.camera.core.CameraXConfig;
 import androidx.camera.core.FocusMeteringAction;
 import androidx.camera.core.ImageAnalysis;
@@ -72,6 +71,7 @@
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.camera.core.internal.CameraUseCaseAdapter;
 import androidx.camera.testing.CameraUtil;
+import androidx.camera.testing.CameraXUtil;
 import androidx.camera.testing.HandlerUtil;
 import androidx.core.os.HandlerCompat;
 import androidx.test.core.app.ApplicationProvider;
@@ -126,7 +126,7 @@
 
         Context context = ApplicationProvider.getApplicationContext();
         CameraXConfig config = Camera2Config.defaultConfig();
-        CameraX.initialize(context, config);
+        CameraXUtil.initialize(context, config);
 
         mCameraCharacteristics = CameraUtil.getCameraCharacteristics(
                 CameraSelector.LENS_FACING_BACK);
@@ -160,7 +160,7 @@
             );
         }
 
-        CameraX.shutdown().get(10000, TimeUnit.MILLISECONDS);
+        CameraXUtil.shutdown().get(10000, TimeUnit.MILLISECONDS);
         if (mHandlerThread != null) {
             mHandlerThread.quitSafely();
         }
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2ImplCameraXTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2ImplCameraXTest.java
index f8f88e6..7c1d472 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2ImplCameraXTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2ImplCameraXTest.java
@@ -44,13 +44,13 @@
 import androidx.camera.camera2.interop.ExperimentalCamera2Interop;
 import androidx.camera.core.CameraInfoUnavailableException;
 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.impl.utils.executor.CameraXExecutors;
 import androidx.camera.core.internal.CameraUseCaseAdapter;
 import androidx.camera.testing.CameraUtil;
+import androidx.camera.testing.CameraXUtil;
 import androidx.camera.testing.fakes.FakeLifecycleOwner;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -102,7 +102,7 @@
     @Before
     public void setUp() {
         mContext = ApplicationProvider.getApplicationContext();
-        CameraX.initialize(mContext, Camera2Config.defaultConfig());
+        CameraXUtil.initialize(mContext, Camera2Config.defaultConfig());
         mLifecycle = new FakeLifecycleOwner();
 
         mDeviceStateCallback = mock(CameraDevice.StateCallback.class);
@@ -118,7 +118,7 @@
             );
         }
 
-        CameraX.shutdown().get(10000, TimeUnit.MILLISECONDS);
+        CameraXUtil.shutdown().get(10000, TimeUnit.MILLISECONDS);
     }
 
     @Test
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/TorchControlDeviceTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/TorchControlDeviceTest.java
index 4bc572f..a8c97fa 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/TorchControlDeviceTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/TorchControlDeviceTest.java
@@ -22,13 +22,13 @@
 
 import androidx.camera.camera2.Camera2Config;
 import androidx.camera.core.CameraSelector;
-import androidx.camera.core.CameraX;
 import androidx.camera.core.CameraXConfig;
 import androidx.camera.core.ImageAnalysis;
 import androidx.camera.core.ImageProxy;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.camera.core.internal.CameraUseCaseAdapter;
 import androidx.camera.testing.CameraUtil;
+import androidx.camera.testing.CameraXUtil;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.MediumTest;
@@ -69,7 +69,7 @@
         // Init CameraX
         Context context = ApplicationProvider.getApplicationContext();
         CameraXConfig config = Camera2Config.defaultConfig();
-        CameraX.initialize(context, config);
+        CameraXUtil.initialize(context, config);
 
         // Prepare TorchControl
         CameraSelector cameraSelector =
@@ -96,7 +96,7 @@
             );
         }
 
-        CameraX.shutdown().get(10000, TimeUnit.MILLISECONDS);
+        CameraXUtil.shutdown().get(10000, TimeUnit.MILLISECONDS);
     }
 
     @Test(timeout = 5000L)
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/ZoomControlDeviceTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/ZoomControlDeviceTest.java
index f077ce4..5c9727e 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/ZoomControlDeviceTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/ZoomControlDeviceTest.java
@@ -43,13 +43,13 @@
 import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat;
 import androidx.camera.core.CameraInfoUnavailableException;
 import androidx.camera.core.CameraSelector;
-import androidx.camera.core.CameraX;
 import androidx.camera.core.CameraXConfig;
 import androidx.camera.core.ZoomState;
 import androidx.camera.core.impl.CameraControlInternal.ControlUpdateCallback;
 import androidx.camera.core.impl.SessionConfig;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.camera.testing.CameraUtil;
+import androidx.camera.testing.CameraXUtil;
 import androidx.camera.testing.HandlerUtil;
 import androidx.camera.testing.fakes.FakeLifecycleOwner;
 import androidx.core.os.HandlerCompat;
@@ -94,7 +94,7 @@
         // Init CameraX
         Context context = ApplicationProvider.getApplicationContext();
         CameraXConfig config = Camera2Config.defaultConfig();
-        CameraX.initialize(context, config);
+        CameraXUtil.initialize(context, config);
 
         mCameraCharacteristics =
                 CameraUtil.getCameraCharacteristics(CameraSelector.LENS_FACING_BACK);
@@ -122,7 +122,7 @@
 
     @After
     public void tearDown() throws ExecutionException, InterruptedException, TimeoutException {
-        CameraX.shutdown().get(10000, TimeUnit.MILLISECONDS);
+        CameraXUtil.shutdown().get(10000, TimeUnit.MILLISECONDS);
         if (mHandlerThread != null) {
             mHandlerThread.quit();
         }
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/compat/workaround/ExtraSupportedSurfaceCombinationsContainerDeviceTest.kt b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/compat/workaround/ExtraSupportedSurfaceCombinationsContainerDeviceTest.kt
index aa668d8..a48140c 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/compat/workaround/ExtraSupportedSurfaceCombinationsContainerDeviceTest.kt
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/compat/workaround/ExtraSupportedSurfaceCombinationsContainerDeviceTest.kt
@@ -29,7 +29,6 @@
 import androidx.camera.camera2.interop.Camera2CameraInfo
 import androidx.camera.core.CameraInfo
 import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraX
 import androidx.camera.core.ImageAnalysis
 import androidx.camera.core.ImageCapture
 import androidx.camera.core.ImageCaptureException
@@ -43,6 +42,7 @@
 import androidx.camera.core.impl.utils.executor.CameraXExecutors
 import androidx.camera.core.internal.CameraUseCaseAdapter
 import androidx.camera.testing.CameraUtil
+import androidx.camera.testing.CameraXUtil
 import androidx.camera.testing.SurfaceTextureProvider
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.filters.LargeTest
@@ -96,7 +96,10 @@
     @Before
     fun setUp() {
         assumeTrue(CameraUtil.deviceHasCamera())
-        CameraX.initialize(context, Camera2Config.defaultConfig()).get()
+        CameraXUtil.initialize(
+            context,
+            Camera2Config.defaultConfig()
+        ).get()
 
         // Only runs the test when the ExtraSupportedSurfaceCombinationsQuirk is applied for the
         // device.
@@ -105,7 +108,7 @@
 
     @After
     fun tearDown() {
-        CameraX.shutdown().get(10000, TimeUnit.MILLISECONDS)
+        CameraXUtil.shutdown().get(10000, TimeUnit.MILLISECONDS)
     }
 
     @Test
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/interop/Camera2CameraControlDeviceTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/interop/Camera2CameraControlDeviceTest.java
index c0714c8..058be03 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/interop/Camera2CameraControlDeviceTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/interop/Camera2CameraControlDeviceTest.java
@@ -40,12 +40,12 @@
 import androidx.camera.camera2.Camera2Config;
 import androidx.camera.camera2.internal.Camera2CameraControlImpl;
 import androidx.camera.core.CameraSelector;
-import androidx.camera.core.CameraX;
 import androidx.camera.core.ImageAnalysis;
 import androidx.camera.core.impl.CameraInfoInternal;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.camera.core.internal.CameraUseCaseAdapter;
 import androidx.camera.testing.CameraUtil;
+import androidx.camera.testing.CameraXUtil;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.LargeTest;
@@ -88,7 +88,7 @@
     public void setUp() {
         assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK));
         mContext = ApplicationProvider.getApplicationContext();
-        CameraX.initialize(mContext, Camera2Config.defaultConfig());
+        CameraXUtil.initialize(mContext, Camera2Config.defaultConfig());
         mCameraSelector = new CameraSelector.Builder().requireLensFacing(
                 CameraSelector.LENS_FACING_BACK).build();
         mCamera = CameraUtil.createCameraUseCaseAdapter(mContext, mCameraSelector);
@@ -99,7 +99,7 @@
 
     @After
     public void tearDown() throws ExecutionException, InterruptedException, TimeoutException {
-        CameraX.shutdown().get(10000, TimeUnit.MILLISECONDS);
+        CameraXUtil.shutdown().get(10000, TimeUnit.MILLISECONDS);
     }
 
     @Test
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/interop/Camera2InteropDeviceTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/interop/Camera2InteropDeviceTest.java
index 923196d..82e85ee 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/interop/Camera2InteropDeviceTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/interop/Camera2InteropDeviceTest.java
@@ -39,11 +39,11 @@
 import androidx.annotation.OptIn;
 import androidx.camera.camera2.Camera2Config;
 import androidx.camera.core.CameraSelector;
-import androidx.camera.core.CameraX;
 import androidx.camera.core.ImageAnalysis;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.camera.core.internal.CameraUseCaseAdapter;
 import androidx.camera.testing.CameraUtil;
+import androidx.camera.testing.CameraXUtil;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.LargeTest;
@@ -83,7 +83,7 @@
     public void setUp() {
         assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK));
         mContext = ApplicationProvider.getApplicationContext();
-        CameraX.initialize(mContext, Camera2Config.defaultConfig());
+        CameraXUtil.initialize(mContext, Camera2Config.defaultConfig());
         mCameraSelector = new CameraSelector.Builder().requireLensFacing(
                 CameraSelector.LENS_FACING_BACK).build();
         mMockCaptureCallback = mock(CameraCaptureSession.CaptureCallback.class);
@@ -99,7 +99,7 @@
             );
         }
 
-        CameraX.shutdown().get(10000, TimeUnit.MILLISECONDS);
+        CameraXUtil.shutdown().get(10000, TimeUnit.MILLISECONDS);
     }
 
     @Test
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraSelectionOptimizer.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraSelectionOptimizer.java
index 24a3be3..e19ea46 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraSelectionOptimizer.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraSelectionOptimizer.java
@@ -84,7 +84,7 @@
                     availableCameraIds.add(cameraId);
                 }
             } catch (IllegalArgumentException e) {
-                // Return empty available id list if no camera is found.
+                // Return empty available id list if there's an issue with filtering
                 return availableCameraIds;
             }
 
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SupportedSurfaceCombination.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SupportedSurfaceCombination.java
index 0a7bb5c..be5dfad 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SupportedSurfaceCombination.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SupportedSurfaceCombination.java
@@ -495,8 +495,7 @@
     }
 
     private boolean isRotationNeeded(int targetRotation) {
-        Integer sensorOrientation =
-                mCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
+        Integer sensorOrientation = mCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
         Preconditions.checkNotNull(sensorOrientation, "Camera HAL in bad state, unable to "
                 + "retrieve the SENSOR_ORIENTATION");
         int relativeRotationDegrees =
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraCharacteristicsCompat.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraCharacteristicsCompat.java
index 267cf93..856adddf 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraCharacteristicsCompat.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraCharacteristicsCompat.java
@@ -61,6 +61,18 @@
     }
 
     /**
+     * Return true if the key should be retrieved from {@link CameraCharacteristics} without
+     * caching it.
+     */
+    private boolean isKeyNonCacheable(@NonNull CameraCharacteristics.Key<?> key) {
+        // SENSOR_ORIENTATION value scould change in some circumstances.
+        if (key.equals(CameraCharacteristics.SENSOR_ORIENTATION)) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
      * Gets a camera characteristics field value and caches the value for later use.
      *
      * <p>It will cache the value once get() is called. If get() is called more than once using
@@ -71,6 +83,12 @@
      */
     @Nullable
     public <T> T get(@NonNull CameraCharacteristics.Key<T> key) {
+        // For some keys that will have varying value and cannot be cached, we need to always
+        // retrieve the key from the CameraCharacteristics.
+        if (isKeyNonCacheable(key)) {
+            return mCameraCharacteristicsImpl.get(key);
+        }
+
         synchronized (this) {
             @SuppressWarnings("unchecked") // The value type always matches the key type.
             T value = (T) mValuesCache.get(key);
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/ImageCapturePixelHDRPlusQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/ImageCapturePixelHDRPlusQuirk.java
index 2b12b74..5800ecc 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/ImageCapturePixelHDRPlusQuirk.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/ImageCapturePixelHDRPlusQuirk.java
@@ -22,6 +22,9 @@
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.impl.Quirk;
 
+import java.util.Arrays;
+import java.util.List;
+
 /**
  * Quirk required to turn on/off HDR+ on Pixel devices by enabling/disabling zero-shutter-lag
  * (ZSL) mode on the capture request, depending on the image capture use case's capture mode, i.e.
@@ -33,15 +36,16 @@
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class ImageCapturePixelHDRPlusQuirk implements Quirk {
 
+    public static final List<String> BUILD_MODELS = Arrays.asList(
+            "Pixel 2",
+            "Pixel 2 XL",
+            "Pixel 3",
+            "Pixel 3 XL"
+    );
+
     static boolean load() {
-        return (isPixel2() || isPixel3()) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
-    }
-
-    private static boolean isPixel2() {
-        return "Google".equals(Build.MANUFACTURER) && "Pixel 2".equals(Build.MODEL);
-    }
-
-    private static boolean isPixel3() {
-        return "Google".equals(Build.MANUFACTURER) && "Pixel 3".equals(Build.MODEL);
+        return BUILD_MODELS.contains(Build.MODEL)
+                && "Google".equals(Build.MANUFACTURER)
+                && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
     }
 }
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/PreviewPixelHDRnetQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/PreviewPixelHDRnetQuirk.java
index 0017911..dec1d57 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/PreviewPixelHDRnetQuirk.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/PreviewPixelHDRnetQuirk.java
@@ -41,7 +41,7 @@
 
     /** The devices that support wysiwyg preview in 3rd party apps (go/p20-wysiwyg-hdr) */
     private static final List<String> SUPPORTED_DEVICES =
-            Arrays.asList("sunfish", "bramble", "redfin");
+            Arrays.asList("sunfish", "bramble", "redfin", "barbet");
 
     static boolean load() {
         return "Google".equals(Build.MANUFACTURER) && SUPPORTED_DEVICES.contains(
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/interop/Camera2CameraControl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/interop/Camera2CameraControl.java
index ef4de37..5b6c39c 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/interop/Camera2CameraControl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/interop/Camera2CameraControl.java
@@ -323,7 +323,6 @@
                 updateSession();
             }
         } else {
-            clearCaptureRequestOptionsInternal();
             if (mCompleter != null) {
                 mCompleter.setException(new CameraControl.OperationCanceledException(
                         "The camera control has became inactive."));
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/CameraXConfigTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/CameraXConfigTest.java
index f6ceb69..e1478e4 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/CameraXConfigTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/CameraXConfigTest.java
@@ -21,8 +21,8 @@
 import android.os.Build;
 
 import androidx.camera.core.CameraSelector;
-import androidx.camera.core.CameraX;
 import androidx.camera.core.CameraXConfig;
+import androidx.camera.testing.CameraXUtil;
 import androidx.test.core.app.ApplicationProvider;
 
 import org.junit.Test;
@@ -47,10 +47,10 @@
                         .setAvailableCamerasLimiter(CameraSelector.DEFAULT_BACK_CAMERA)
                         .build();
 
-        CameraX.initialize(ApplicationProvider.getApplicationContext(), cameraXConfig).get(3,
+        CameraXUtil.initialize(ApplicationProvider.getApplicationContext(), cameraXConfig).get(3,
                 TimeUnit.SECONDS);
 
-        CameraX.shutdown().get(3, TimeUnit.SECONDS);
+        CameraXUtil.shutdown().get(3, TimeUnit.SECONDS);
     }
 
     private void initCharacterisics(String cameraId, int lensFacing) {
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/Camera2DeviceSurfaceManagerTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/Camera2DeviceSurfaceManagerTest.java
index b039939f7..0720e88 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/Camera2DeviceSurfaceManagerTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/Camera2DeviceSurfaceManagerTest.java
@@ -58,6 +58,7 @@
 import androidx.camera.core.impl.UseCaseConfig;
 import androidx.camera.core.impl.UseCaseConfigFactory;
 import androidx.camera.testing.CameraUtil;
+import androidx.camera.testing.CameraXUtil;
 import androidx.camera.testing.Configs;
 import androidx.camera.testing.fakes.FakeCamera;
 import androidx.camera.testing.fakes.FakeCameraFactory;
@@ -152,7 +153,7 @@
 
     @After
     public void tearDown() throws ExecutionException, InterruptedException, TimeoutException {
-        CameraX.shutdown().get(10000, TimeUnit.MILLISECONDS);
+        CameraXUtil.shutdown().get(10000, TimeUnit.MILLISECONDS);
     }
 
     private CameraManagerCompat getCameraManagerCompat() {
@@ -586,10 +587,9 @@
 
     private void initCameraX() {
         CameraXConfig cameraXConfig = createFakeAppConfig();
-        CameraX.initialize(mContext, cameraXConfig);
         CameraX cameraX;
         try {
-            cameraX = CameraX.getOrCreateInstance(mContext).get();
+            cameraX = CameraXUtil.getOrCreateInstance(mContext, () -> cameraXConfig).get();
         } catch (ExecutionException | InterruptedException e) {
             throw new IllegalStateException("Unable to initialize CameraX for test.");
         }
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SupportedSizeConstraintsTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SupportedSizeConstraintsTest.java
index 5c8beda..a9a073f 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SupportedSizeConstraintsTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SupportedSizeConstraintsTest.java
@@ -38,11 +38,11 @@
 import androidx.camera.camera2.internal.compat.CameraManagerCompat;
 import androidx.camera.camera2.internal.compat.workaround.ExcludedSupportedSizesContainer;
 import androidx.camera.core.CameraUnavailableException;
-import androidx.camera.core.CameraX;
 import androidx.camera.core.CameraXConfig;
 import androidx.camera.core.InitializationException;
 import androidx.camera.core.impl.CameraDeviceSurfaceManager;
 import androidx.camera.testing.CameraUtil;
+import androidx.camera.testing.CameraXUtil;
 import androidx.camera.testing.fakes.FakeCamera;
 import androidx.camera.testing.fakes.FakeCameraFactory;
 import androidx.camera.testing.fakes.FakeUseCase;
@@ -116,7 +116,7 @@
 
     @After
     public void tearDown() throws ExecutionException, InterruptedException, TimeoutException {
-        CameraX.shutdown().get(10000, TimeUnit.MILLISECONDS);
+        CameraXUtil.shutdown().get(10000, TimeUnit.MILLISECONDS);
     }
 
     @Test
@@ -222,6 +222,6 @@
                 .setDeviceSurfaceManagerProvider(surfaceManagerProvider)
                 .setCameraFactoryProvider((ignored0, ignored1, ignored2) -> cameraFactory)
                 .build();
-        CameraX.initialize(mContext, cameraXConfig);
+        CameraXUtil.initialize(mContext, cameraXConfig);
     }
 }
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SupportedSurfaceCombinationTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SupportedSurfaceCombinationTest.java
index 0760c89..3561b59 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SupportedSurfaceCombinationTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SupportedSurfaceCombinationTest.java
@@ -64,6 +64,7 @@
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.camera.core.internal.CameraUseCaseAdapter;
 import androidx.camera.testing.CameraUtil;
+import androidx.camera.testing.CameraXUtil;
 import androidx.camera.testing.Configs;
 import androidx.camera.testing.SurfaceTextureProvider;
 import androidx.camera.testing.fakes.FakeCamera;
@@ -181,7 +182,7 @@
 
     @After
     public void tearDown() throws ExecutionException, InterruptedException, TimeoutException {
-        CameraX.shutdown().get(10000, TimeUnit.MILLISECONDS);
+        CameraXUtil.shutdown().get(10000, TimeUnit.MILLISECONDS);
     }
 
     @Test
@@ -2372,10 +2373,9 @@
                 .setDeviceSurfaceManagerProvider(surfaceManagerProvider)
                 .setCameraFactoryProvider((ignored0, ignored1, ignored2) -> mCameraFactory)
                 .build();
-        CameraX.initialize(mContext, cameraXConfig);
         CameraX cameraX;
         try {
-            cameraX = CameraX.getOrCreateInstance(mContext).get();
+            cameraX = CameraXUtil.getOrCreateInstance(mContext, () -> cameraXConfig).get();
         } catch (ExecutionException | InterruptedException e) {
             throw new IllegalStateException("Unable to initialize CameraX for test.");
         }
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/CameraCharacteristicsCompatTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/CameraCharacteristicsCompatTest.java
index 1fbe51f..ad99ddf 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/CameraCharacteristicsCompatTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/CameraCharacteristicsCompatTest.java
@@ -19,6 +19,8 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
 import android.hardware.camera2.CameraCharacteristics;
@@ -39,18 +41,20 @@
 @DoNotInstrument
 @Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
 public class CameraCharacteristicsCompatTest {
-    CameraCharacteristics mCharacteristics;
+    private CameraCharacteristics mCharacteristics;
+    private static final int SENSOR_ORIENTATION_VAL = 270;
 
     @Before
     public void setUp() {
         mCharacteristics = ShadowCameraCharacteristics.newCameraCharacteristics();
-
         ShadowCameraCharacteristics shadowCharacteristics0 = Shadow.extract(mCharacteristics);
         shadowCharacteristics0.set(CameraCharacteristics.CONTROL_MAX_REGIONS_AE, 1);
         shadowCharacteristics0.set(CameraCharacteristics.CONTROL_MAX_REGIONS_AF, 2);
         shadowCharacteristics0.set(CameraCharacteristics.CONTROL_MAX_REGIONS_AWB, 3);
 
         shadowCharacteristics0.set(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES, null);
+        shadowCharacteristics0.set(
+                CameraCharacteristics.SENSOR_ORIENTATION, SENSOR_ORIENTATION_VAL);
     }
 
     @Test
@@ -86,8 +90,8 @@
         // CONTROL_AE_AVAILABLE_MODES is set to null in setUp
         assertThat(characteristicsCompat.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES))
                 .isNull();
-        // SENSOR_ORIENTATION is not set.
-        assertThat(characteristicsCompat.get(CameraCharacteristics.SENSOR_ORIENTATION))
+        // INFO_SUPPORTED_HARDWARE_LEVEL is not set.
+        assertThat(characteristicsCompat.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL))
                 .isNull();
     }
 
@@ -110,4 +114,18 @@
                 CameraCharacteristicsCompat.toCameraCharacteristicsCompat(mCharacteristics);
         assertThat(characteristicsCompat.getPhysicalCameraIds()).isEmpty();
     }
+
+    @Test
+    public void getSensorOrientation_shouldNotCache() {
+        CameraCharacteristics cameraCharacteristics = spy(mCharacteristics);
+        CameraCharacteristicsCompat characteristicsCompat =
+                CameraCharacteristicsCompat.toCameraCharacteristicsCompat(cameraCharacteristics);
+        assertThat(characteristicsCompat.get(CameraCharacteristics.SENSOR_ORIENTATION))
+                .isEqualTo(SENSOR_ORIENTATION_VAL);
+
+        // Call get() twice, cameraCharacteristics.get() should be called twice as well.
+        assertThat(characteristicsCompat.get(CameraCharacteristics.SENSOR_ORIENTATION))
+                .isEqualTo(SENSOR_ORIENTATION_VAL);
+        verify(cameraCharacteristics, times(2)).get(CameraCharacteristics.SENSOR_ORIENTATION);
+    }
 }
diff --git a/camera/camera-core/api/current.ignore b/camera/camera-core/api/current.ignore
index 17d923e..f6bfd36 100644
--- a/camera/camera-core/api/current.ignore
+++ b/camera/camera-core/api/current.ignore
@@ -7,3 +7,5 @@
     Added method androidx.camera.core.CameraInfo.getCameraState()
 AddedAbstractMethod: androidx.camera.core.CameraInfo#getExposureState():
     Added method androidx.camera.core.CameraInfo.getExposureState()
+AddedAbstractMethod: androidx.camera.core.ImageInfo#getSensorToBufferTransformMatrix():
+    Added method androidx.camera.core.ImageInfo.getSensorToBufferTransformMatrix()
diff --git a/camera/camera-core/api/current.txt b/camera/camera-core/api/current.txt
index bd13c62..f5f6815 100644
--- a/camera/camera-core/api/current.txt
+++ b/camera/camera-core/api/current.txt
@@ -48,6 +48,7 @@
   }
 
   @RequiresApi(21) public final class CameraSelector {
+    method public java.util.List<androidx.camera.core.CameraInfo!> filter(java.util.List<androidx.camera.core.CameraInfo!>);
     field public static final androidx.camera.core.CameraSelector DEFAULT_BACK_CAMERA;
     field public static final androidx.camera.core.CameraSelector DEFAULT_FRONT_CAMERA;
     field public static final int LENS_FACING_BACK = 1; // 0x1
@@ -180,6 +181,7 @@
     method public int getOutputImageFormat();
     method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
     method public int getTargetRotation();
+    method public boolean isOutputImageRotationEnabled();
     method public void setAnalyzer(java.util.concurrent.Executor, androidx.camera.core.ImageAnalysis.Analyzer);
     method public void setTargetRotation(int);
     field public static final int OUTPUT_IMAGE_FORMAT_RGBA_8888 = 2; // 0x2
@@ -199,6 +201,7 @@
     method public androidx.camera.core.ImageAnalysis.Builder setBackpressureStrategy(int);
     method public androidx.camera.core.ImageAnalysis.Builder setImageQueueDepth(int);
     method public androidx.camera.core.ImageAnalysis.Builder setOutputImageFormat(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setOutputImageRotationEnabled(boolean);
     method public androidx.camera.core.ImageAnalysis.Builder setTargetAspectRatio(int);
     method public androidx.camera.core.ImageAnalysis.Builder setTargetName(String);
     method public androidx.camera.core.ImageAnalysis.Builder setTargetResolution(android.util.Size);
@@ -213,6 +216,7 @@
     method public int getTargetRotation();
     method public void setCropAspectRatio(android.util.Rational);
     method public void setFlashMode(int);
+    method public void setSensorToBufferTransformMatrix(android.graphics.Matrix);
     method public void setTargetRotation(int);
     method public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
     method public void takePicture(androidx.camera.core.ImageCapture.OutputFileOptions, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
@@ -284,6 +288,7 @@
 
   @RequiresApi(21) public interface ImageInfo {
     method public int getRotationDegrees();
+    method public android.graphics.Matrix getSensorToBufferTransformMatrix();
     method public long getTimestamp();
   }
 
diff --git a/camera/camera-core/api/public_plus_experimental_current.txt b/camera/camera-core/api/public_plus_experimental_current.txt
index ffaebcf..168763a 100644
--- a/camera/camera-core/api/public_plus_experimental_current.txt
+++ b/camera/camera-core/api/public_plus_experimental_current.txt
@@ -48,6 +48,7 @@
   }
 
   @RequiresApi(21) public final class CameraSelector {
+    method public java.util.List<androidx.camera.core.CameraInfo!> filter(java.util.List<androidx.camera.core.CameraInfo!>);
     field public static final androidx.camera.core.CameraSelector DEFAULT_BACK_CAMERA;
     field public static final androidx.camera.core.CameraSelector DEFAULT_FRONT_CAMERA;
     field public static final int LENS_FACING_BACK = 1; // 0x1
@@ -183,6 +184,7 @@
     method public int getOutputImageFormat();
     method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
     method public int getTargetRotation();
+    method public boolean isOutputImageRotationEnabled();
     method public void setAnalyzer(java.util.concurrent.Executor, androidx.camera.core.ImageAnalysis.Analyzer);
     method public void setTargetRotation(int);
     field public static final int OUTPUT_IMAGE_FORMAT_RGBA_8888 = 2; // 0x2
@@ -202,6 +204,7 @@
     method public androidx.camera.core.ImageAnalysis.Builder setBackpressureStrategy(int);
     method public androidx.camera.core.ImageAnalysis.Builder setImageQueueDepth(int);
     method public androidx.camera.core.ImageAnalysis.Builder setOutputImageFormat(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setOutputImageRotationEnabled(boolean);
     method public androidx.camera.core.ImageAnalysis.Builder setTargetAspectRatio(int);
     method public androidx.camera.core.ImageAnalysis.Builder setTargetName(String);
     method public androidx.camera.core.ImageAnalysis.Builder setTargetResolution(android.util.Size);
@@ -216,6 +219,7 @@
     method public int getTargetRotation();
     method public void setCropAspectRatio(android.util.Rational);
     method public void setFlashMode(int);
+    method public void setSensorToBufferTransformMatrix(android.graphics.Matrix);
     method public void setTargetRotation(int);
     method public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
     method public void takePicture(androidx.camera.core.ImageCapture.OutputFileOptions, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
@@ -287,6 +291,7 @@
 
   @RequiresApi(21) public interface ImageInfo {
     method public int getRotationDegrees();
+    method public android.graphics.Matrix getSensorToBufferTransformMatrix();
     method public long getTimestamp();
   }
 
diff --git a/camera/camera-core/api/restricted_current.ignore b/camera/camera-core/api/restricted_current.ignore
index 17d923e..f6bfd36 100644
--- a/camera/camera-core/api/restricted_current.ignore
+++ b/camera/camera-core/api/restricted_current.ignore
@@ -7,3 +7,5 @@
     Added method androidx.camera.core.CameraInfo.getCameraState()
 AddedAbstractMethod: androidx.camera.core.CameraInfo#getExposureState():
     Added method androidx.camera.core.CameraInfo.getExposureState()
+AddedAbstractMethod: androidx.camera.core.ImageInfo#getSensorToBufferTransformMatrix():
+    Added method androidx.camera.core.ImageInfo.getSensorToBufferTransformMatrix()
diff --git a/camera/camera-core/api/restricted_current.txt b/camera/camera-core/api/restricted_current.txt
index bd13c62..f5f6815 100644
--- a/camera/camera-core/api/restricted_current.txt
+++ b/camera/camera-core/api/restricted_current.txt
@@ -48,6 +48,7 @@
   }
 
   @RequiresApi(21) public final class CameraSelector {
+    method public java.util.List<androidx.camera.core.CameraInfo!> filter(java.util.List<androidx.camera.core.CameraInfo!>);
     field public static final androidx.camera.core.CameraSelector DEFAULT_BACK_CAMERA;
     field public static final androidx.camera.core.CameraSelector DEFAULT_FRONT_CAMERA;
     field public static final int LENS_FACING_BACK = 1; // 0x1
@@ -180,6 +181,7 @@
     method public int getOutputImageFormat();
     method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
     method public int getTargetRotation();
+    method public boolean isOutputImageRotationEnabled();
     method public void setAnalyzer(java.util.concurrent.Executor, androidx.camera.core.ImageAnalysis.Analyzer);
     method public void setTargetRotation(int);
     field public static final int OUTPUT_IMAGE_FORMAT_RGBA_8888 = 2; // 0x2
@@ -199,6 +201,7 @@
     method public androidx.camera.core.ImageAnalysis.Builder setBackpressureStrategy(int);
     method public androidx.camera.core.ImageAnalysis.Builder setImageQueueDepth(int);
     method public androidx.camera.core.ImageAnalysis.Builder setOutputImageFormat(int);
+    method public androidx.camera.core.ImageAnalysis.Builder setOutputImageRotationEnabled(boolean);
     method public androidx.camera.core.ImageAnalysis.Builder setTargetAspectRatio(int);
     method public androidx.camera.core.ImageAnalysis.Builder setTargetName(String);
     method public androidx.camera.core.ImageAnalysis.Builder setTargetResolution(android.util.Size);
@@ -213,6 +216,7 @@
     method public int getTargetRotation();
     method public void setCropAspectRatio(android.util.Rational);
     method public void setFlashMode(int);
+    method public void setSensorToBufferTransformMatrix(android.graphics.Matrix);
     method public void setTargetRotation(int);
     method public void takePicture(java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageCapturedCallback);
     method public void takePicture(androidx.camera.core.ImageCapture.OutputFileOptions, java.util.concurrent.Executor, androidx.camera.core.ImageCapture.OnImageSavedCallback);
@@ -284,6 +288,7 @@
 
   @RequiresApi(21) public interface ImageInfo {
     method public int getRotationDegrees();
+    method public android.graphics.Matrix getSensorToBufferTransformMatrix();
     method public long getTimestamp();
   }
 
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/CameraXTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/CameraXTest.java
index a34bbd7..20bb770 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/CameraXTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/CameraXTest.java
@@ -19,6 +19,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import android.content.Context;
+import android.util.Log;
 
 import androidx.camera.core.impl.CameraFactory;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
@@ -29,7 +30,6 @@
 import androidx.test.filters.LargeTest;
 import androidx.test.filters.SdkSuppress;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -54,87 +54,45 @@
         mConfigBuilder = CameraXConfig.Builder.fromConfig(FakeAppConfig.create());
     }
 
-    @After
-    public void tearDown() throws ExecutionException, InterruptedException, TimeoutException {
-        CameraX.shutdown().get(10000, TimeUnit.MILLISECONDS);
-    }
-
-
     @Test
     public void initDeinit_success() throws ExecutionException, InterruptedException {
-        CameraX.initialize(mContext, mConfigBuilder.build()).get();
-        assertThat(CameraX.isInitialized()).isTrue();
+        CameraX cameraX = new CameraX(mContext, () -> mConfigBuilder.build());
+        cameraX.getInitializeFuture().get();
+        assertThat(cameraX.isInitialized()).isTrue();
 
-        CameraX.shutdown().get();
-        assertThat(CameraX.isInitialized()).isFalse();
+        cameraX.shutdown().get();
+        assertThat(cameraX.isInitialized()).isFalse();
     }
 
     @Test
     public void failInit_shouldInDeinitState() throws InterruptedException {
         // Create an empty config to cause a failed init.
         CameraXConfig cameraXConfig = new CameraXConfig.Builder().build();
+        CameraX cameraX = new CameraX(mContext, () -> cameraXConfig);
         Exception exception = null;
         try {
-            CameraX.initialize(mContext, cameraXConfig).get();
+            cameraX.getInitializeFuture().get();
         } catch (ExecutionException e) {
             exception = e;
         }
         assertThat(exception).isInstanceOf(ExecutionException.class);
-        assertThat(CameraX.isInitialized()).isFalse();
+        assertThat(cameraX.isInitialized()).isFalse();
     }
 
     @Test
     public void reinit_success() throws ExecutionException, InterruptedException {
-        CameraX.initialize(mContext, mConfigBuilder.build()).get();
-        assertThat(CameraX.isInitialized()).isTrue();
+        CameraX cameraX = new CameraX(mContext, () -> mConfigBuilder.build());
+        cameraX.getInitializeFuture().get();
+        assertThat(cameraX.isInitialized()).isTrue();
 
-        CameraX.shutdown().get();
-        assertThat(CameraX.isInitialized()).isFalse();
+        cameraX.shutdown().get();
+        assertThat(cameraX.isInitialized()).isFalse();
 
-        CameraX.initialize(mContext, mConfigBuilder.build()).get();
-        assertThat(CameraX.isInitialized()).isTrue();
-    }
+        CameraX cameraX2 = new CameraX(mContext, () -> mConfigBuilder.build());
+        cameraX2.getInitializeFuture().get();
+        assertThat(cameraX2.isInitialized()).isTrue();
 
-    @Test
-    public void failedInit_doesNotRequireReconfigure() throws InterruptedException {
-        // Create an empty config to cause a failed init.
-        CameraXConfig cameraXConfig = new CameraXConfig.Builder().build();
-        Exception exception = null;
-        CameraX.configureInstance(cameraXConfig);
-        boolean firstInitFailed = false;
-        try {
-            CameraX.getOrCreateInstance(mContext).get();
-        } catch (ExecutionException e) {
-            firstInitFailed = true;
-        }
-
-        // Does not throw IllegalStateException (though initialization will fail)
-        boolean secondInitFailed = false;
-        try {
-            CameraX.getOrCreateInstance(mContext).get();
-        } catch (ExecutionException e) {
-            secondInitFailed = true;
-        }
-        assertThat(firstInitFailed).isTrue();
-        assertThat(secondInitFailed).isTrue();
-    }
-
-    @Test(expected = IllegalStateException.class)
-    public void cannotConfigureTwice() {
-        CameraX.configureInstance(mConfigBuilder.build());
-        CameraX.configureInstance(mConfigBuilder.build());
-    }
-
-    @Test
-    public void shutdown_clearsPreviousConfiguration()
-            throws ExecutionException, InterruptedException {
-        CameraX.configureInstance(mConfigBuilder.build());
-
-        // Clear the configuration so we can reinit
-        CameraX.shutdown().get();
-
-        // Should not throw
-        CameraX.configureInstance(mConfigBuilder.build());
+        cameraX2.shutdown().get();
     }
 
     @Test
@@ -142,11 +100,11 @@
         mConfigBuilder.setCameraExecutor(CameraXExecutors.directExecutor());
 
         // Don't call Future.get() because its behavior should be the same as synchronous call.
-        CameraX.initialize(mContext, mConfigBuilder.build());
-        assertThat(CameraX.isInitialized()).isTrue();
+        CameraX cameraX = new CameraX(mContext, () -> mConfigBuilder.build());
+        assertThat(cameraX.isInitialized()).isTrue();
 
-        CameraX.shutdown();
-        assertThat(CameraX.isInitialized()).isFalse();
+        cameraX.shutdown();
+        assertThat(cameraX.isInitialized()).isFalse();
     }
 
     @Test
@@ -155,11 +113,11 @@
         ExecutorService executorService = Executors.newFixedThreadPool(3);
         mConfigBuilder.setCameraExecutor(executorService);
 
-        CameraX.initialize(mContext, mConfigBuilder.build()).get();
-        assertThat(CameraX.isInitialized()).isTrue();
+        CameraX cameraX = new CameraX(mContext, () -> mConfigBuilder.build());
+        cameraX.getInitializeFuture().get();
 
-        CameraX.shutdown().get();
-        assertThat(CameraX.isInitialized()).isFalse();
+        cameraX.shutdown().get();
+        assertThat(cameraX.isInitialized()).isFalse();
 
         executorService.shutdown();
     }
@@ -174,21 +132,64 @@
                 (ignored0, ignored1, ignored2) -> cameraFactory1;
 
         mConfigBuilder.setCameraFactoryProvider(cameraFactoryProvider0);
-        CameraX.initialize(mContext, mConfigBuilder.build());
-        CameraX cameraX0 = CameraX.getOrCreateInstance(mContext).get();
+        CameraX cameraX0 = new CameraX(mContext, () -> mConfigBuilder.build());
+        cameraX0.getInitializeFuture().get();
 
         assertThat(cameraX0.getCameraFactory()).isEqualTo(cameraFactory0);
 
-        CameraX.shutdown();
+        cameraX0.shutdown().get();
 
         mConfigBuilder.setCameraFactoryProvider(cameraFactoryProvider1);
-        CameraX.initialize(mContext, mConfigBuilder.build());
-        CameraX cameraX1 = CameraX.getOrCreateInstance(mContext).get();
+        CameraX cameraX1 = new CameraX(mContext, () -> mConfigBuilder.build());
+        cameraX1.getInitializeFuture().get();
 
         assertThat(cameraX1.getCameraFactory()).isEqualTo(cameraFactory1);
+
+        cameraX1.shutdown().get();
     }
 
-    private void initCameraX() {
-        CameraX.initialize(mContext, mConfigBuilder.build());
+    @Test
+    public void minLogLevelIsCorrectlySetAndReset()
+            throws ExecutionException, InterruptedException, TimeoutException {
+        mConfigBuilder.setMinimumLoggingLevel(Log.ERROR);
+        CameraX cameraX = new CameraX(mContext, () -> mConfigBuilder.build());
+        cameraX.getInitializeFuture().get(10000, TimeUnit.MILLISECONDS);
+
+        assertThat(Logger.getMinLogLevel()).isEqualTo(Log.ERROR);
+
+        cameraX.shutdown().get(10000, TimeUnit.MILLISECONDS);
+
+        assertThat(Logger.getMinLogLevel()).isEqualTo(Log.DEBUG);
+    }
+
+    @Test
+    public void minLogLevelIsCorrectlySetAndReset_whenSettingMultipleTimes()
+            throws ExecutionException, InterruptedException, TimeoutException {
+        mConfigBuilder.setMinimumLoggingLevel(Log.INFO);
+        CameraX cameraX1 = new CameraX(mContext, () -> mConfigBuilder.build());
+        cameraX1.getInitializeFuture().get(10000, TimeUnit.MILLISECONDS);
+
+        // Checks whether minimum log level is correctly set by the first CameraX instance
+        assertThat(Logger.getMinLogLevel()).isEqualTo(Log.INFO);
+
+        mConfigBuilder.setMinimumLoggingLevel(Log.ERROR);
+        CameraX cameraX2 = new CameraX(mContext, () -> mConfigBuilder.build());
+        cameraX2.getInitializeFuture().get(10000, TimeUnit.MILLISECONDS);
+
+        // Checks whether minimum log level is correctly kept as INFO level since it is lower
+        // than the target minimum log level setting of the second CameraX instance
+        assertThat(Logger.getMinLogLevel()).isEqualTo(Log.INFO);
+
+        cameraX1.shutdown().get(10000, TimeUnit.MILLISECONDS);
+
+        // Checks whether minimum log level is correctly updated as ERROR level after the first
+        // CameraX instance is shutdown
+        assertThat(Logger.getMinLogLevel()).isEqualTo(Log.ERROR);
+
+        cameraX2.shutdown().get(10000, TimeUnit.MILLISECONDS);
+
+        // Checks whether minimum log level is correctly reset as DEBUG level after the second
+        // CameraX instance is shutdown
+        assertThat(Logger.getMinLogLevel()).isEqualTo(Log.DEBUG);
     }
 }
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageAnalysisAbstractAnalyzerTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageAnalysisAbstractAnalyzerTest.java
index ec851c5..96cd6ad 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageAnalysisAbstractAnalyzerTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageAnalysisAbstractAnalyzerTest.java
@@ -21,16 +21,16 @@
 
 import static androidx.camera.core.ImageAnalysis.OUTPUT_IMAGE_FORMAT_RGBA_8888;
 import static androidx.camera.core.ImageAnalysis.OUTPUT_IMAGE_FORMAT_YUV_420_888;
+import static androidx.camera.core.ImageAnalysisAbstractAnalyzer.getAdditionalTransformMatrixAppliedByProcessor;
 import static androidx.camera.testing.ImageProxyUtil.createYUV420ImagePlanes;
 
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
 
-import android.graphics.PixelFormat;
-import android.view.Surface;
+import android.graphics.Matrix;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -60,15 +60,20 @@
 @SdkSuppress(minSdkVersion = 21)
 public class ImageAnalysisAbstractAnalyzerTest {
     private static final int WIDTH = 8;
-    private static final int HEIGHT = 8;
+    private static final int HEIGHT = 4;
+    private static final int MAX_IMAGES = 4;
     private static final int PIXEL_STRIDE_Y = 1;
     private static final int PIXEL_STRIDE_UV = 1;
 
     private FakeImageAnalysisAnalyzer mImageAnalysisAbstractAnalyzer;
     private FakeImageProxy mImageProxy;
+    private FakeImageProxy mSecondImageProxy;
     private ImageAnalysis.Analyzer mAnalyzer;
-    private ImageReaderProxy mYUVImageReaderProxy;
-    private ImageReaderProxy mRGBImageReaderProxy;
+    private SafeCloseImageReaderProxy mYUVImageReaderProxy;
+    private SafeCloseImageReaderProxy mRGBImageReaderProxy;
+    private SafeCloseImageReaderProxy mRotatedYUVImageReaderProxy;
+    private SafeCloseImageReaderProxy mRotatedRGBImageReaderProxy;
+    private Matrix mSensorToBufferMatrix;
 
     @Before
     public void setup() {
@@ -84,25 +89,57 @@
                 /*flipUV=*/true,
                 /*incrementValue=*/true));
 
-        mYUVImageReaderProxy = mock(ImageReaderProxy.class);
-        when(mYUVImageReaderProxy.getWidth()).thenReturn(WIDTH);
-        when(mYUVImageReaderProxy.getHeight()).thenReturn(HEIGHT);
-        when(mYUVImageReaderProxy.getImageFormat()).thenReturn(YUV_420_888);
-        when(mYUVImageReaderProxy.getMaxImages()).thenReturn(4);
-        when(mYUVImageReaderProxy.getSurface()).thenReturn(mock(Surface.class));
+        mSecondImageProxy = new FakeImageProxy(new FakeImageInfo());
+        mSecondImageProxy.setWidth(WIDTH);
+        mSecondImageProxy.setHeight(HEIGHT);
+        mSecondImageProxy.setFormat(YUV_420_888);
+        mSecondImageProxy.setPlanes(createYUV420ImagePlanes(
+                WIDTH,
+                HEIGHT,
+                PIXEL_STRIDE_Y,
+                PIXEL_STRIDE_UV,
+                /*flipUV=*/true,
+                /*incrementValue=*/true));
+
+        mYUVImageReaderProxy = new SafeCloseImageReaderProxy(
+                ImageReaderProxys.createIsolatedReader(
+                        WIDTH,
+                        HEIGHT,
+                        YUV_420_888,
+                        MAX_IMAGES));
+
+        // rotated yuv image reader proxy with 90 degree
+        mRotatedYUVImageReaderProxy = new SafeCloseImageReaderProxy(
+                ImageReaderProxys.createIsolatedReader(
+                        mYUVImageReaderProxy.getHeight(),
+                        mYUVImageReaderProxy.getWidth(),
+                        YUV_420_888,
+                        mYUVImageReaderProxy.getMaxImages()));
 
         // rgb image reader proxy should not be mocked for JNI native code
         mRGBImageReaderProxy = new SafeCloseImageReaderProxy(
                 ImageReaderProxys.createIsolatedReader(
                         mYUVImageReaderProxy.getWidth(),
                         mYUVImageReaderProxy.getHeight(),
-                        PixelFormat.RGBA_8888,
+                        RGBA_8888,
+                        mYUVImageReaderProxy.getMaxImages()));
+
+        // rotated rgb image reader proxy with 90 degree
+        mRotatedRGBImageReaderProxy = new SafeCloseImageReaderProxy(
+                ImageReaderProxys.createIsolatedReader(
+                        mYUVImageReaderProxy.getHeight(),
+                        mYUVImageReaderProxy.getWidth(),
+                        RGBA_8888,
                         mYUVImageReaderProxy.getMaxImages()));
 
         mImageAnalysisAbstractAnalyzer = new FakeImageAnalysisAnalyzer(
                 new ImageAnalysisNonBlockingAnalyzer(
                 CameraXExecutors.directExecutor()));
 
+        mSensorToBufferMatrix = new Matrix();
+        mSensorToBufferMatrix.setTranslate(20.0f, 10.0f);
+        mSensorToBufferMatrix.setScale(0.4f, 0.6f, 0.0f, 0.0f);
+
         mAnalyzer = mock(ImageAnalysis.Analyzer.class);
         mImageAnalysisAbstractAnalyzer.setAnalyzer(CameraXExecutors.mainThreadExecutor(),
                 mAnalyzer);
@@ -113,7 +150,7 @@
     public void analysisRunWhenOutputImageYUV() throws ExecutionException, InterruptedException {
         // Arrange.
         mImageAnalysisAbstractAnalyzer.setOutputImageFormat(OUTPUT_IMAGE_FORMAT_YUV_420_888);
-        mImageAnalysisAbstractAnalyzer.setRGBImageReaderProxy(mRGBImageReaderProxy);
+        mImageAnalysisAbstractAnalyzer.setProcessedImageReaderProxy(mYUVImageReaderProxy);
 
         // Act.
         ListenableFuture<Void> result =
@@ -132,7 +169,7 @@
     public void analysisRunWhenOutputImageRGB() throws ExecutionException, InterruptedException {
         // Arrange.
         mImageAnalysisAbstractAnalyzer.setOutputImageFormat(OUTPUT_IMAGE_FORMAT_RGBA_8888);
-        mImageAnalysisAbstractAnalyzer.setRGBImageReaderProxy(mRGBImageReaderProxy);
+        mImageAnalysisAbstractAnalyzer.setProcessedImageReaderProxy(mRGBImageReaderProxy);
 
         // Act.
         ListenableFuture<Void> result =
@@ -147,12 +184,173 @@
         assertThat(imageProxyArgumentCaptor.getValue().getPlanes().length).isEqualTo(1);
     }
 
+    @SdkSuppress(minSdkVersion = 23)
+    @Test
+    public void analysisRunWhenRotateYUVMinSdk23() throws ExecutionException, InterruptedException {
+        // Arrange.
+        mImageAnalysisAbstractAnalyzer.setOutputImageFormat(OUTPUT_IMAGE_FORMAT_YUV_420_888);
+        mImageAnalysisAbstractAnalyzer.setProcessedImageReaderProxy(mRotatedYUVImageReaderProxy);
+        mImageAnalysisAbstractAnalyzer.setOutputImageRotationEnabled(true);
+        mImageAnalysisAbstractAnalyzer.setSensorToBufferTransformMatrix(mSensorToBufferMatrix);
+        mImageAnalysisAbstractAnalyzer.setRelativeRotation(/*rotation=*/90);
+
+        Matrix original = new Matrix(mSensorToBufferMatrix);
+
+        // Act.
+        ListenableFuture<Void> result =
+                mImageAnalysisAbstractAnalyzer.analyzeImage(mImageProxy);
+        result.get();
+
+        // Assert.
+        ArgumentCaptor<ImageProxy> imageProxyArgumentCaptor =
+                ArgumentCaptor.forClass(ImageProxy.class);
+        verify(mAnalyzer).analyze(imageProxyArgumentCaptor.capture());
+
+        Matrix target = new Matrix();
+        target.setConcat(original, getAdditionalTransformMatrixAppliedByProcessor(
+                WIDTH, HEIGHT, HEIGHT, WIDTH, 90));
+        assertThat(imageProxyArgumentCaptor.getValue().getImageInfo()
+                .getSensorToBufferTransformMatrix()).isEqualTo(target);
+    }
+
+    @SdkSuppress(maxSdkVersion = 22, minSdkVersion = 21)
+    @Test
+    public void analysisRunWhenRotateYUVMaxSdk22() throws ExecutionException, InterruptedException {
+        // Arrange.
+        mImageAnalysisAbstractAnalyzer.setOutputImageFormat(OUTPUT_IMAGE_FORMAT_YUV_420_888);
+        mImageAnalysisAbstractAnalyzer.setProcessedImageReaderProxy(mRotatedYUVImageReaderProxy);
+        mImageAnalysisAbstractAnalyzer.setOutputImageRotationEnabled(true);
+        mImageAnalysisAbstractAnalyzer.setSensorToBufferTransformMatrix(mSensorToBufferMatrix);
+        mImageAnalysisAbstractAnalyzer.setRelativeRotation(/*rotation=*/90);
+
+        Matrix original = new Matrix(mSensorToBufferMatrix);
+
+        // Act.
+        ListenableFuture<Void> result =
+                mImageAnalysisAbstractAnalyzer.analyzeImage(mImageProxy);
+        result.get();
+
+        // Assert.
+        ArgumentCaptor<ImageProxy> imageProxyArgumentCaptor =
+                ArgumentCaptor.forClass(ImageProxy.class);
+        verify(mAnalyzer).analyze(imageProxyArgumentCaptor.capture());
+
+        assertThat(imageProxyArgumentCaptor.getValue().getImageInfo()
+                .getSensorToBufferTransformMatrix()).isEqualTo(original);
+    }
+
+    @Test
+    public void analysisRunWhenRotateRGB() throws ExecutionException,
+            InterruptedException {
+        // Arrange.
+        mImageAnalysisAbstractAnalyzer.setOutputImageFormat(OUTPUT_IMAGE_FORMAT_RGBA_8888);
+        mImageAnalysisAbstractAnalyzer.setProcessedImageReaderProxy(mRotatedRGBImageReaderProxy);
+        mImageAnalysisAbstractAnalyzer.setOutputImageRotationEnabled(true);
+        mImageAnalysisAbstractAnalyzer.setSensorToBufferTransformMatrix(mSensorToBufferMatrix);
+        mImageAnalysisAbstractAnalyzer.setRelativeRotation(/*rotation=*/90);
+
+        Matrix original = new Matrix(mSensorToBufferMatrix);
+
+        // Act.
+        ListenableFuture<Void> result =
+                mImageAnalysisAbstractAnalyzer.analyzeImage(mImageProxy);
+        result.get();
+
+        // Assert.
+        ArgumentCaptor<ImageProxy> imageProxyArgumentCaptor =
+                ArgumentCaptor.forClass(ImageProxy.class);
+        verify(mAnalyzer).analyze(imageProxyArgumentCaptor.capture());
+
+        Matrix target = new Matrix();
+        target.setConcat(original, getAdditionalTransformMatrixAppliedByProcessor(
+                WIDTH, HEIGHT, HEIGHT, WIDTH, 90));
+        assertThat(imageProxyArgumentCaptor.getValue().getImageInfo()
+                .getSensorToBufferTransformMatrix()).isEqualTo(target);
+    }
+
+    @SdkSuppress(minSdkVersion = 23)
+    @Test
+    public void analysisRunWhenYUVSetTargetRotationMultipleTimes() throws ExecutionException,
+            InterruptedException {
+        // Arrange.
+        mImageAnalysisAbstractAnalyzer.setOutputImageFormat(OUTPUT_IMAGE_FORMAT_YUV_420_888);
+        mImageAnalysisAbstractAnalyzer.setProcessedImageReaderProxy(mRotatedYUVImageReaderProxy);
+        mImageAnalysisAbstractAnalyzer.setOutputImageRotationEnabled(true);
+        mImageAnalysisAbstractAnalyzer.setSensorToBufferTransformMatrix(mSensorToBufferMatrix);
+        mImageAnalysisAbstractAnalyzer.setRelativeRotation(/*rotation=*/90);
+
+        Matrix original = new Matrix(mSensorToBufferMatrix);
+
+        // Act.
+        ListenableFuture<Void> result1 =
+                mImageAnalysisAbstractAnalyzer.analyzeImage(mImageProxy);
+        result1.get();
+
+        reset(mAnalyzer);
+
+        // Act.
+        mImageAnalysisAbstractAnalyzer.setRelativeRotation(/*rotation=*/180);
+        ListenableFuture<Void> result2 =
+                mImageAnalysisAbstractAnalyzer.analyzeImage(mSecondImageProxy);
+        result2.get();
+
+        // Assert.
+        ArgumentCaptor<ImageProxy> imageProxyArgumentCaptor =
+                ArgumentCaptor.forClass(ImageProxy.class);
+        verify(mAnalyzer).analyze(imageProxyArgumentCaptor.capture());
+
+        // Verify that additional transform matrix will only be applied to original matrix once.
+        Matrix target = new Matrix();
+        target.setConcat(original, getAdditionalTransformMatrixAppliedByProcessor(
+                WIDTH, HEIGHT, WIDTH, HEIGHT, 180));
+        assertThat(imageProxyArgumentCaptor.getValue().getImageInfo()
+                .getSensorToBufferTransformMatrix()).isEqualTo(target);
+    }
+
+    @Test
+    public void analysisRunWhenRGBSetTargetRotationMultipleTimes() throws ExecutionException,
+            InterruptedException {
+        // Arrange.
+        mImageAnalysisAbstractAnalyzer.setOutputImageFormat(OUTPUT_IMAGE_FORMAT_RGBA_8888);
+        mImageAnalysisAbstractAnalyzer.setProcessedImageReaderProxy(mRotatedRGBImageReaderProxy);
+        mImageAnalysisAbstractAnalyzer.setOutputImageRotationEnabled(true);
+        mImageAnalysisAbstractAnalyzer.setSensorToBufferTransformMatrix(mSensorToBufferMatrix);
+        mImageAnalysisAbstractAnalyzer.setRelativeRotation(/*rotation=*/90);
+
+        Matrix original = new Matrix(mSensorToBufferMatrix);
+
+        // Act.
+        ListenableFuture<Void> result1 =
+                mImageAnalysisAbstractAnalyzer.analyzeImage(mImageProxy);
+        result1.get();
+
+        reset(mAnalyzer);
+
+        // Act.
+        mImageAnalysisAbstractAnalyzer.setRelativeRotation(/*rotation=*/180);
+        ListenableFuture<Void> result2 =
+                mImageAnalysisAbstractAnalyzer.analyzeImage(mSecondImageProxy);
+        result2.get();
+
+        // Assert.
+        ArgumentCaptor<ImageProxy> imageProxyArgumentCaptor =
+                ArgumentCaptor.forClass(ImageProxy.class);
+        verify(mAnalyzer).analyze(imageProxyArgumentCaptor.capture());
+
+        // Verify that additional transform matrix will only be applied to original matrix once.
+        Matrix target = new Matrix();
+        target.setConcat(original, getAdditionalTransformMatrixAppliedByProcessor(
+                WIDTH, HEIGHT, WIDTH, HEIGHT, 180));
+        assertThat(imageProxyArgumentCaptor.getValue().getImageInfo()
+                .getSensorToBufferTransformMatrix()).isEqualTo(target);
+    }
+
     @Test
     public void applyPixelShiftForYUVWhenOnePixelShiftEnabled() throws ExecutionException,
             InterruptedException {
         // Arrange.
         mImageAnalysisAbstractAnalyzer.setOutputImageFormat(OUTPUT_IMAGE_FORMAT_YUV_420_888);
-        mImageAnalysisAbstractAnalyzer.setRGBImageReaderProxy(mRGBImageReaderProxy);
+        mImageAnalysisAbstractAnalyzer.setProcessedImageReaderProxy(mRGBImageReaderProxy);
         mImageAnalysisAbstractAnalyzer.setOnePixelShiftEnabled(true);
 
         // Act.
@@ -180,7 +378,7 @@
             InterruptedException {
         // Arrange.
         mImageAnalysisAbstractAnalyzer.setOutputImageFormat(OUTPUT_IMAGE_FORMAT_YUV_420_888);
-        mImageAnalysisAbstractAnalyzer.setRGBImageReaderProxy(mRGBImageReaderProxy);
+        mImageAnalysisAbstractAnalyzer.setProcessedImageReaderProxy(mRGBImageReaderProxy);
         mImageAnalysisAbstractAnalyzer.setOnePixelShiftEnabled(false);
 
         // Act.
@@ -251,8 +449,10 @@
         }
 
         @Override
-        void setRGBImageReaderProxy(@NonNull ImageReaderProxy rgbImageReaderProxy) {
-            mImageAnalysisNonBlockingAnalyzer.setRGBImageReaderProxy(rgbImageReaderProxy);
+        void setProcessedImageReaderProxy(
+                @NonNull SafeCloseImageReaderProxy processedImageReaderProxy) {
+            mImageAnalysisNonBlockingAnalyzer.setProcessedImageReaderProxy(
+                    processedImageReaderProxy);
         }
 
         @Override
@@ -264,5 +464,22 @@
         void setOnePixelShiftEnabled(boolean onePixelShiftEnabled) {
             mImageAnalysisNonBlockingAnalyzer.setOnePixelShiftEnabled(onePixelShiftEnabled);
         }
+
+        @Override
+        void setOutputImageRotationEnabled(boolean outputImageRotationEnabled) {
+            mImageAnalysisNonBlockingAnalyzer.setOutputImageRotationEnabled(
+                    outputImageRotationEnabled);
+        }
+
+        @Override
+        void setSensorToBufferTransformMatrix(@NonNull Matrix sensorToBufferTransformMatrix) {
+            mImageAnalysisNonBlockingAnalyzer.setSensorToBufferTransformMatrix(
+                    sensorToBufferTransformMatrix);
+        }
+
+        @Override
+        void setRelativeRotation(int relativeRotation) {
+            mImageAnalysisNonBlockingAnalyzer.setRelativeRotation(relativeRotation);
+        }
     }
 }
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 0a56bfc..2aa8bb6 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
@@ -28,6 +28,7 @@
 import android.content.ContentValues;
 import android.graphics.Bitmap;
 import android.graphics.ImageFormat;
+import android.graphics.Matrix;
 import android.graphics.Rect;
 import android.provider.MediaStore;
 import android.util.Rational;
@@ -86,6 +87,7 @@
 public class ImageCaptureTest {
     private CameraUseCaseAdapter mCameraUseCaseAdapter;
     private final Instrumentation mInstrumentation = InstrumentationRegistry.getInstrumentation();
+    private Matrix mSensorToBufferTransformMatrix;
 
     @Before
     public void setup() {
@@ -103,6 +105,9 @@
                 new LinkedHashSet<>(Collections.singleton(fakeCamera)),
                 fakeCameraDeviceSurfaceManager,
                 useCaseConfigFactory);
+
+        mSensorToBufferTransformMatrix = new Matrix();
+        mSensorToBufferTransformMatrix.setScale(10, 10);
     }
 
     @Test
@@ -355,6 +360,7 @@
                 /*jpegQuality*/100,
                 /*targetRatio*/ null,
                 /*viewPortCropRect*/ new Rect(0, 0, 2, 1),
+                mSensorToBufferTransformMatrix,
                 CameraXExecutors.mainThreadExecutor(),
                 new ImageCapture.OnImageCapturedCallback() {
                     @Override
@@ -373,6 +379,8 @@
         // Assert: that the rotation is 0 and the crop rect has been updated.
         assertThat(imageProxyReference.get().getImageInfo().getRotationDegrees()).isEqualTo(0);
         assertThat(imageProxyReference.get().getCropRect()).isEqualTo(new Rect(3, 0, 4, 2));
+        assertThat(imageProxyReference.get().getImageInfo()
+                .getSensorToBufferTransformMatrix()).isEqualTo(mSensorToBufferTransformMatrix);
     }
 
     /**
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageProcessingUtilTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageProcessingUtilTest.java
index 2b979d9..b30ee814 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageProcessingUtilTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageProcessingUtilTest.java
@@ -16,12 +16,14 @@
 
 package androidx.camera.core;
 
+import static androidx.camera.core.ImageProcessingUtil.rotateYUV;
 import static androidx.camera.testing.ImageProxyUtil.createYUV420ImagePlanes;
 
 import static com.google.common.truth.Truth.assertThat;
 
 import android.graphics.ImageFormat;
 import android.graphics.PixelFormat;
+import android.media.ImageWriter;
 
 import androidx.camera.testing.fakes.FakeImageInfo;
 import androidx.camera.testing.fakes.FakeImageProxy;
@@ -34,21 +36,30 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.nio.ByteBuffer;
+
 @SmallTest
 @RunWith(AndroidJUnit4.class)
 @SdkSuppress(minSdkVersion = 21)
 public class ImageProcessingUtilTest {
 
     private static final int WIDTH = 8;
-    private static final int HEIGHT = 8;
+    private static final int HEIGHT = 4;
     private static final int PIXEL_STRIDE_Y = 1;
     private static final int PIXEL_STRIDE_UV = 1;
     private static final int PIXEL_STRIDE_Y_UNSUPPORTED = 1;
     private static final int PIXEL_STRIDE_UV_UNSUPPORTED = 3;
     private static final int MAX_IMAGES = 4;
 
+    private ByteBuffer mRgbConvertedBuffer;
+    private ByteBuffer mYRotatedBuffer;
+    private ByteBuffer mURotatedBuffer;
+    private ByteBuffer mVRotatedBuffer;
+
     private FakeImageProxy mYUVImageProxy;
     private SafeCloseImageReaderProxy mRGBImageReaderProxy;
+    private SafeCloseImageReaderProxy mRotatedRGBImageReaderProxy;
+    private SafeCloseImageReaderProxy mRotatedYUVImageReaderProxy;
 
     @Before
     public void setUp() {
@@ -64,11 +75,32 @@
                         HEIGHT,
                         PixelFormat.RGBA_8888,
                         MAX_IMAGES));
+
+        // rotated image reader proxy with width and height flipped
+        mRotatedRGBImageReaderProxy = new SafeCloseImageReaderProxy(
+                ImageReaderProxys.createIsolatedReader(
+                        HEIGHT,
+                        WIDTH,
+                        PixelFormat.RGBA_8888,
+                        MAX_IMAGES));
+
+        mRotatedYUVImageReaderProxy = new SafeCloseImageReaderProxy(
+                ImageReaderProxys.createIsolatedReader(
+                        HEIGHT,
+                        WIDTH,
+                        ImageFormat.YUV_420_888,
+                        MAX_IMAGES));
+
+        mRgbConvertedBuffer = ByteBuffer.allocateDirect(WIDTH * HEIGHT * 4);
+        mYRotatedBuffer = ByteBuffer.allocateDirect(WIDTH * HEIGHT);
+        mURotatedBuffer = ByteBuffer.allocateDirect(WIDTH * HEIGHT / 2);
+        mVRotatedBuffer = ByteBuffer.allocateDirect(WIDTH * HEIGHT / 2);
     }
 
     @After
     public void tearDown() {
         mRGBImageReaderProxy.safeClose();
+        mRotatedRGBImageReaderProxy.safeClose();
     }
 
     @Test
@@ -83,8 +115,12 @@
                 /*incrementValue=*/false));
 
         // Act.
-        ImageProxy rgbImageProxy = ImageProcessingUtil.convertYUVToRGB(mYUVImageProxy,
-                mRGBImageReaderProxy, /*onePixelShiftRequested=*/false);
+        ImageProxy rgbImageProxy = ImageProcessingUtil.convertYUVToRGB(
+                mYUVImageProxy,
+                mRGBImageReaderProxy,
+                mRgbConvertedBuffer,
+                /*rotation=*/0,
+                /*onePixelShiftRequested=*/false);
 
         // Assert.
         assertThat(rgbImageProxy.getFormat()).isEqualTo(PixelFormat.RGBA_8888);
@@ -103,8 +139,12 @@
                 /*incrementValue=*/false));
 
         // Act.
-        ImageProxy rgbImageProxy = ImageProcessingUtil.convertYUVToRGB(mYUVImageProxy,
-                mRGBImageReaderProxy, /*onePixelShiftRequested=*/false);
+        ImageProxy rgbImageProxy = ImageProcessingUtil.convertYUVToRGB(
+                mYUVImageProxy,
+                mRGBImageReaderProxy,
+                mRgbConvertedBuffer,
+                /*rotation=*/0,
+                /*onePixelShiftRequested=*/false);
 
         // Assert.
         assertThat(rgbImageProxy.getFormat()).isEqualTo(PixelFormat.RGBA_8888);
@@ -123,8 +163,12 @@
                 /*incrementValue=*/false));
 
         // Act.
-        ImageProxy rgbImageProxy = ImageProcessingUtil.convertYUVToRGB(mYUVImageProxy,
-                mRGBImageReaderProxy, /*onePixelShiftRequested=*/false);
+        ImageProxy rgbImageProxy = ImageProcessingUtil.convertYUVToRGB(
+                mYUVImageProxy,
+                mRGBImageReaderProxy,
+                mRgbConvertedBuffer,
+                /*rotation=*/0,
+                /*onePixelShiftRequested=*/false);
 
         // Assert.
         assertThat(rgbImageProxy.getFormat()).isEqualTo(PixelFormat.RGBA_8888);
@@ -169,8 +213,12 @@
                 /*incrementValue=*/false));
 
         // Act.
-        ImageProxy rgbImageProxy = ImageProcessingUtil.convertYUVToRGB(mYUVImageProxy,
-                mRGBImageReaderProxy, /*onePixelShiftRequested=*/false);
+        ImageProxy rgbImageProxy = ImageProcessingUtil.convertYUVToRGB(
+                mYUVImageProxy,
+                mRGBImageReaderProxy,
+                mRgbConvertedBuffer,
+                /*rotation=*/0,
+                /*onePixelShiftRequested=*/false);
 
         // Assert.
         assertThat(rgbImageProxy.getFormat()).isEqualTo(PixelFormat.RGBA_8888);
@@ -181,4 +229,62 @@
 
         assertThat(mYUVImageProxy.isClosed()).isTrue();
     }
+
+    @Test
+    public void rotateRGB_imageRotated() {
+        // Arrange.
+        mYUVImageProxy.setPlanes(createYUV420ImagePlanes(
+                WIDTH,
+                HEIGHT,
+                PIXEL_STRIDE_Y,
+                PIXEL_STRIDE_UV,
+                /*flipUV=*/true,
+                /*incrementValue=*/false));
+
+        // Act.
+        ImageProxy rgbImageProxy = ImageProcessingUtil.convertYUVToRGB(
+                mYUVImageProxy,
+                mRotatedRGBImageReaderProxy,
+                mRgbConvertedBuffer,
+                /*rotation=*/90,
+                /*onePixelShiftRequested=*/false);
+
+        // Assert.
+        assertThat(rgbImageProxy.getFormat()).isEqualTo(PixelFormat.RGBA_8888);
+        assertThat(rgbImageProxy.getPlanes().length).isEqualTo(1);
+        assertThat(rgbImageProxy.getWidth()).isEqualTo(HEIGHT);
+        assertThat(rgbImageProxy.getHeight()).isEqualTo(WIDTH);
+    }
+
+    @SdkSuppress(minSdkVersion = 23)
+    @Test
+    public void rotateYUV_imageRotated() {
+        // Arrange.
+        mYUVImageProxy.setPlanes(createYUV420ImagePlanes(
+                WIDTH,
+                HEIGHT,
+                PIXEL_STRIDE_Y,
+                PIXEL_STRIDE_UV,
+                /*flipUV=*/true,
+                /*incrementValue=*/false));
+
+        // Act.
+        ImageProxy yuvImageProxy = rotateYUV(
+                mYUVImageProxy,
+                mRotatedYUVImageReaderProxy,
+                ImageWriter.newInstance(
+                        mRotatedYUVImageReaderProxy.getSurface(),
+                        mRotatedYUVImageReaderProxy.getMaxImages()),
+                mYRotatedBuffer,
+                mURotatedBuffer,
+                mVRotatedBuffer,
+                /*rotation=*/90);
+
+        // Assert.
+        assertThat(yuvImageProxy).isNotNull();
+        assertThat(yuvImageProxy.getFormat()).isEqualTo(ImageFormat.YUV_420_888);
+        assertThat(yuvImageProxy.getPlanes().length).isEqualTo(3);
+        assertThat(yuvImageProxy.getWidth()).isEqualTo(HEIGHT);
+        assertThat(yuvImageProxy.getHeight()).isEqualTo(WIDTH);
+    }
 }
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/internal/CameraUseCaseAdapterTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/internal/CameraUseCaseAdapterTest.java
index 3c4aa14..23f7ee6 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/internal/CameraUseCaseAdapterTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/internal/CameraUseCaseAdapterTest.java
@@ -25,6 +25,8 @@
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 
+import android.graphics.Matrix;
+import android.graphics.Rect;
 import android.util.Rational;
 import android.view.Surface;
 
@@ -279,6 +281,25 @@
     }
 
     @Test
+    @MediumTest
+    public void addExistingUseCase_setSensorToBufferMatrix()
+            throws CameraUseCaseAdapter.CameraException {
+        Rational aspectRatio = new Rational(1, 1);
+
+        // Arrange: set up adapter with aspect ratio 1.
+        CameraUseCaseAdapter cameraUseCaseAdapter = new CameraUseCaseAdapter(mFakeCameraSet,
+                mFakeCameraDeviceSurfaceManager,
+                mUseCaseConfigFactory);
+        cameraUseCaseAdapter.setViewPort(
+                new ViewPort.Builder(aspectRatio, Surface.ROTATION_0).build());
+        FakeUseCase fakeUseCase = spy(new FakeUseCase());
+        cameraUseCaseAdapter.addUseCases(Collections.singleton(fakeUseCase));
+
+        verify(fakeUseCase).setViewPortCropRect(new Rect(504, 0, 3528, 3024));
+        verify(fakeUseCase).setSensorToBufferTransformMatrix(new Matrix());
+    }
+
+    @Test
     public void canSetExtendedCameraConfig_whenNoUseCase() {
         CameraUseCaseAdapter cameraUseCaseAdapter = new CameraUseCaseAdapter(mFakeCameraSet,
                 mFakeCameraDeviceSurfaceManager,
diff --git a/camera/camera-core/src/main/cpp/image_processing_util_jni.cc b/camera/camera-core/src/main/cpp/image_processing_util_jni.cc
index 51f20e8..d70ac14 100644
--- a/camera/camera-core/src/main/cpp/image_processing_util_jni.cc
+++ b/camera/camera-core/src/main/cpp/image_processing_util_jni.cc
@@ -8,11 +8,57 @@
 #include <cstdlib>
 
 #include "libyuv/convert_argb.h"
+#include "libyuv/rotate_argb.h"
+#include "libyuv/convert.h"
 
 #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, "YuvToRgbJni", __VA_ARGS__)
 
+#define align_buffer_64(var, size)                                           \
+  uint8_t* var##_mem = (uint8_t*)(malloc((size) + 63));         /* NOLINT */ \
+  uint8_t* var = (uint8_t*)(((intptr_t)(var##_mem) + 63) & ~63) /* NOLINT */
+
+#define free_aligned_buffer_64(var) \
+  free(var##_mem);                  \
+  var = 0
+
+static void weave_pixels(const uint8_t* src_u,
+                        const uint8_t* src_v,
+                        int src_pixel_stride_uv,
+                        uint8_t* dst_uv,
+                        int width) {
+    int i;
+    for (i = 0; i < width; ++i) {
+        dst_uv[0] = *src_u;
+        dst_uv[1] = *src_v;
+        dst_uv += 2;
+        src_u += src_pixel_stride_uv;
+        src_v += src_pixel_stride_uv;
+    }
+}
+
+static libyuv::RotationMode get_rotation_mode(int rotation) {
+    libyuv::RotationMode mode = libyuv::kRotate0;
+    switch (rotation) {
+        case 0:
+            mode = libyuv::kRotate0;
+            break;
+        case 90:
+            mode = libyuv::kRotate90;
+            break;
+        case 180:
+            mode = libyuv::kRotate180;
+            break;
+        case 270:
+            mode = libyuv::kRotate270;
+            break;
+        default:
+            break;
+    }
+    return mode;
+}
+
 extern "C" {
-JNIEXPORT jint Java_androidx_camera_core_ImageProcessingUtil_shiftPixel(
+JNIEXPORT jint Java_androidx_camera_core_ImageProcessingUtil_nativeShiftPixel(
         JNIEnv* env,
         jclass,
         jobject src_y,
@@ -40,8 +86,8 @@
     // Y
     for (int i = 0; i < height; i++) {
         memmove(&src_y_ptr[0 + i * src_stride_y],
-               &src_y_ptr[start_offset_y + i * src_stride_y],
-               width - 1);
+                &src_y_ptr[start_offset_y + i * src_stride_y],
+                width - 1);
 
         src_y_ptr[width - start_offset_y + i * src_stride_y] =
                 src_y_ptr[src_stride_y - start_offset_y + i * src_stride_y];
@@ -50,8 +96,8 @@
     // U
     for (int i = 0; i < height / 2; i++) {
         memmove(&src_u_ptr[0 + i * src_stride_u],
-               &src_u_ptr[start_offset_u + i * src_stride_u],
-               width / 2 - 1);
+                &src_u_ptr[start_offset_u + i * src_stride_u],
+                width / 2 - 1);
 
         src_u_ptr[width / 2 - start_offset_u + i * src_stride_u] =
                 src_u_ptr[src_stride_u - start_offset_u + i * src_stride_u];
@@ -60,8 +106,8 @@
     // V
     for (int i = 0; i < height / 2; i++) {
         memmove(&src_v_ptr[0 + i * src_stride_v],
-               &src_v_ptr[start_offset_v + i * src_stride_v],
-               width / 2 - 1);
+                &src_v_ptr[start_offset_v + i * src_stride_v],
+                width / 2 - 1);
 
         src_v_ptr[width / 2 - start_offset_v + i * src_stride_v] =
                 src_v_ptr[src_stride_v - start_offset_v + i * src_stride_v];
@@ -70,7 +116,7 @@
     return 0;
 }
 
-JNIEXPORT jint Java_androidx_camera_core_ImageProcessingUtil_convertAndroid420ToABGR(
+JNIEXPORT jint Java_androidx_camera_core_ImageProcessingUtil_nativeConvertAndroid420ToABGR(
         JNIEnv* env,
         jclass,
         jobject src_y,
@@ -82,11 +128,13 @@
         jint src_pixel_stride_y,
         jint src_pixel_stride_uv,
         jobject surface,
+        jobject converted_buffer,
         jint width,
         jint height,
         jint start_offset_y,
         jint start_offset_u,
-        jint start_offset_v) {
+        jint start_offset_v,
+        int rotation) {
 
     uint8_t* src_y_ptr =
             static_cast<uint8_t*>(env->GetDirectBufferAddress(src_y));
@@ -106,7 +154,16 @@
         return -1;
     }
 
-    uint8_t* dst_abgr_ptr = reinterpret_cast<uint8_t*>(buffer.bits);
+    libyuv::RotationMode mode = get_rotation_mode(rotation);
+    bool has_rotation = rotation != 0;
+
+    uint8_t* buffer_ptr = reinterpret_cast<uint8_t*>(buffer.bits);
+    uint8_t* converted_buffer_ptr = static_cast<uint8_t*>(env->GetDirectBufferAddress(
+            converted_buffer));
+
+    uint8_t* dst_ptr = has_rotation ? converted_buffer_ptr : buffer_ptr;
+    int dst_stride_y = has_rotation ? (width * 4) : (buffer.stride * 4);
+
     int result = 0;
     // Apply workaround for one pixel shift issue by checking offset.
     if (start_offset_y > 0 || start_offset_u > 0 || start_offset_v > 0) {
@@ -129,8 +186,8 @@
                                           src_v_ptr + start_offset_v,
                                           src_stride_v,
                                           src_pixel_stride_uv,
-                                          dst_abgr_ptr,
-                                          buffer.stride * 4,
+                                          dst_ptr,
+                                          dst_stride_y,
                                           width,
                                           height - 1);
         if (result == 0) {
@@ -144,8 +201,8 @@
                     src_v_ptr + start_offset_v + src_stride_v * (height - 2) / 2,
                     src_stride_v - 1,
                     src_pixel_stride_uv,
-                    dst_abgr_ptr + buffer.stride * 4 * (height - 1),
-                    buffer.stride * 4,
+                    dst_ptr + dst_stride_y * (height - 1),
+                    dst_stride_y,
                     width - 1,
                     1);
         }
@@ -155,14 +212,14 @@
             // from the right to left in each row.
             for (int i = 0; i < 2; i++) {
                 for (int j = 0; j < 2; j++) {
-                    int r_ind = buffer.stride * 4 * (height - 1 - i) + width * 4 - (j * 4 + 1);
-                    int g_ind = buffer.stride * 4 * (height - 1 - i) + width * 4 - (j * 4 + 2);
-                    int b_ind = buffer.stride * 4 * (height - 1 - i) + width * 4 - (j * 4 + 3);
-                    int a_ind = buffer.stride * 4 * (height - 1 - i) + width * 4 - (j * 4 + 4);
-                    dst_abgr_ptr[r_ind] = dst_abgr_ptr[r_ind - 8];
-                    dst_abgr_ptr[g_ind] = dst_abgr_ptr[g_ind - 8];
-                    dst_abgr_ptr[b_ind] = dst_abgr_ptr[b_ind - 8];
-                    dst_abgr_ptr[a_ind] = dst_abgr_ptr[a_ind - 8];
+                    int r_ind = dst_stride_y * (height - 1 - i) + width * 4 - (j * 4 + 1);
+                    int g_ind = dst_stride_y * (height - 1 - i) + width * 4 - (j * 4 + 2);
+                    int b_ind = dst_stride_y * (height - 1 - i) + width * 4 - (j * 4 + 3);
+                    int a_ind = dst_stride_y * (height - 1 - i) + width * 4 - (j * 4 + 4);
+                    dst_ptr[r_ind] = dst_ptr[r_ind - 8];
+                    dst_ptr[g_ind] = dst_ptr[g_ind - 8];
+                    dst_ptr[b_ind] = dst_ptr[b_ind - 8];
+                    dst_ptr[a_ind] = dst_ptr[a_ind - 8];
                 }
             }
         }
@@ -174,15 +231,202 @@
                                           src_v_ptr + start_offset_v,
                                           src_stride_v,
                                           src_pixel_stride_uv,
-                                          dst_abgr_ptr,
-                                          buffer.stride * 4,
+                                          dst_ptr,
+                                          dst_stride_y,
                                           width,
                                           height);
     }
 
+    // TODO(b/203141655): avoid unnecessary memory copy by merging libyuv API for rotation.
+    if (result == 0 && has_rotation) {
+        result = libyuv::ARGBRotate(dst_ptr,
+                                    dst_stride_y,
+                                    buffer_ptr,
+                                    buffer.stride * 4,
+                                    width,
+                                    height,
+                                    mode);
+    }
+
     ANativeWindow_unlockAndPost(window);
     ANativeWindow_release(window);
     return result;
 }
 
+JNIEXPORT jint Java_androidx_camera_core_ImageProcessingUtil_nativeRotateYUV(
+        JNIEnv* env,
+        jclass,
+        jobject src_y,
+        jint src_stride_y,
+        jobject src_u,
+        jint src_stride_u,
+        jobject src_v,
+        jint src_stride_v,
+        jint src_pixel_stride_uv,
+        jobject dst_y,
+        jint dst_stride_y,
+        jint dst_pixel_stride_y,
+        jobject dst_u,
+        jint dst_stride_u,
+        jint dst_pixel_stride_u,
+        jobject dst_v,
+        jint dst_stride_v,
+        jint dst_pixel_stride_v,
+        jobject rotated_buffer_y,
+        jobject rotated_buffer_u,
+        jobject rotated_buffer_v,
+        jint width,
+        jint height,
+        jint rotation) {
+
+    uint8_t *src_y_ptr =
+            static_cast<uint8_t *>(env->GetDirectBufferAddress(src_y));
+    uint8_t *src_u_ptr =
+            static_cast<uint8_t *>(env->GetDirectBufferAddress(src_u));
+    uint8_t *src_v_ptr =
+            static_cast<uint8_t *>(env->GetDirectBufferAddress(src_v));
+
+    uint8_t *dst_y_ptr =
+            static_cast<uint8_t *>(env->GetDirectBufferAddress(dst_y));
+    uint8_t *dst_u_ptr =
+            static_cast<uint8_t *>(env->GetDirectBufferAddress(dst_u));
+    uint8_t *dst_v_ptr =
+            static_cast<uint8_t *>(env->GetDirectBufferAddress(dst_v));
+
+    int halfwidth = (width + 1) >> 1;
+    int halfheight = (height + 1) >> 1;
+
+    // TODO(b/203141655): avoid unnecessary memory copy by merging libyuv API for rotation.
+    uint8_t *rotated_y_ptr =
+            static_cast<uint8_t *>(env->GetDirectBufferAddress(rotated_buffer_y));
+    uint8_t *rotated_u_ptr =
+            static_cast<uint8_t *>(env->GetDirectBufferAddress(rotated_buffer_u));
+    uint8_t *rotated_v_ptr =
+            static_cast<uint8_t *>(env->GetDirectBufferAddress(rotated_buffer_v));
+
+    libyuv::RotationMode mode = get_rotation_mode(rotation);
+    bool flip_wh = (mode == libyuv::kRotate90 || mode == libyuv::kRotate270);
+
+    int rotated_stride_y = flip_wh ? height : width;
+    int rotated_stride_u = flip_wh ? halfheight : halfwidth;
+    int rotated_stride_v = flip_wh ? halfheight : halfwidth;
+
+    int rotated_width = flip_wh ? height : width;
+    int rotated_height = flip_wh ? width : height;
+    int rotated_halfwidth = flip_wh ? halfheight : halfwidth;
+    int rotated_halfheight = flip_wh ? halfwidth : halfheight;
+
+    int result = 0;
+    const ptrdiff_t vu_off = src_v_ptr - src_u_ptr;
+
+    if (src_pixel_stride_uv == 1) {
+        // I420
+        result = libyuv::I420Rotate(src_y_ptr,
+                                    src_stride_y,
+                                    src_u_ptr,
+                                    src_stride_u,
+                                    src_v_ptr,
+                                    src_stride_v,
+                                    rotated_y_ptr,
+                                    rotated_stride_y,
+                                    rotated_u_ptr,
+                                    rotated_stride_u,
+                                    rotated_v_ptr,
+                                    rotated_stride_v,
+                                    width,
+                                    height,
+                                    mode);
+    } else if (src_pixel_stride_uv == 2 && vu_off == -1 &&
+               src_stride_u == src_stride_v) {
+        // NV21
+        result = libyuv::NV12ToI420Rotate(src_y_ptr,
+                                          src_stride_y,
+                                          src_u_ptr,
+                                          src_stride_u,
+                                          rotated_y_ptr,
+                                          rotated_stride_y,
+                                          rotated_u_ptr,
+                                          rotated_stride_u,
+                                          rotated_v_ptr,
+                                          rotated_stride_v,
+                                          width,
+                                          height,
+                                          mode);
+    } else if (src_pixel_stride_uv == 2 && vu_off == 1 && src_stride_u == src_stride_v) {
+        // NV12
+        result = libyuv::NV12ToI420Rotate(src_y_ptr,
+                                          src_stride_y,
+                                          src_v_ptr,
+                                          src_stride_v,
+                                          rotated_y_ptr,
+                                          rotated_stride_y,
+                                          rotated_u_ptr,
+                                          rotated_stride_u,
+                                          rotated_v_ptr,
+                                          rotated_stride_v,
+                                          width,
+                                          height,
+                                          mode);
+    } else {
+        // General case fallback creates NV12
+        align_buffer_64(plane_uv, halfwidth * 2 * halfheight);
+        uint8_t* dst_uv = plane_uv;
+        for (int y = 0; y < halfheight; y++) {
+            weave_pixels(src_v_ptr, src_u_ptr, src_pixel_stride_uv, dst_uv, halfwidth);
+            src_u += src_stride_u;
+            src_v += src_stride_v;
+            dst_uv += halfwidth * 2;
+        }
+
+        result = libyuv::NV12ToI420Rotate(src_y_ptr,
+                                          src_stride_y,
+                                          plane_uv,
+                                          halfwidth * 2,
+                                          rotated_y_ptr,
+                                          rotated_stride_y,
+                                          rotated_u_ptr,
+                                          rotated_stride_u,
+                                          rotated_v_ptr,
+                                          rotated_stride_v,
+                                          width,
+                                          height,
+                                          mode);
+        free_aligned_buffer_64(plane_uv);
+    }
+
+    if (result == 0) {
+        // Y
+        uint8_t *dst_y = rotated_y_ptr;
+        int rotated_pixel_stride_y = 1;
+        for (int i = 0; i < rotated_height; i++) {
+            for (int j = 0; j < rotated_width; j++) {
+                dst_y_ptr[i * dst_stride_y + j * dst_pixel_stride_y] =
+                        dst_y[i * rotated_stride_y + j * rotated_pixel_stride_y];
+            }
+        }
+
+        // U
+        uint8_t *dst_u = rotated_u_ptr;
+        int rotated_pixel_stride_u = 1;
+        for (int i = 0; i < rotated_halfheight; i++) {
+            for (int j = 0; j < rotated_halfwidth; j++) {
+                dst_u_ptr[i * dst_stride_u + j * dst_pixel_stride_u] =
+                        dst_u[i * rotated_stride_u + j * rotated_pixel_stride_u];
+            }
+        }
+
+        // V
+        uint8_t *dst_v = rotated_v_ptr;
+        int rotated_pixel_stride_v = 1;
+        for (int i = 0; i < rotated_halfheight; i++) {
+            for (int j = 0; j < rotated_halfwidth; j++) {
+                dst_v_ptr[i * dst_stride_v + j * dst_pixel_stride_v] =
+                        dst_v[i * rotated_stride_v + j * rotated_pixel_stride_v];
+            }
+        }
+    }
+
+    return result;
+}
+
 }  // extern "C"
\ No newline at end of file
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageProxy.java
index 4ed71524..1b474b4 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageProxy.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageProxy.java
@@ -16,6 +16,7 @@
 
 package androidx.camera.core;
 
+import android.graphics.Matrix;
 import android.graphics.Rect;
 import android.media.Image;
 
@@ -57,7 +58,11 @@
             mPlanes = new PlaneProxy[0];
         }
 
-        mImageInfo = ImmutableImageInfo.create(TagBundle.emptyBundle(), image.getTimestamp(), 0);
+        mImageInfo = ImmutableImageInfo.create(
+                TagBundle.emptyBundle(),
+                image.getTimestamp(),
+                0,
+                new Matrix());
     }
 
     @Override
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraSelector.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraSelector.java
index c3d43b0..af2224c 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraSelector.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraSelector.java
@@ -28,6 +28,7 @@
 import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
 
@@ -74,38 +75,46 @@
     @RestrictTo(Scope.LIBRARY_GROUP)
     @NonNull
     public CameraInternal select(@NonNull LinkedHashSet<CameraInternal> cameras) {
-        return filter(cameras).iterator().next();
+        Iterator<CameraInternal> cameraInternalIterator = filter(cameras).iterator();
+        if (cameraInternalIterator.hasNext()) {
+            return cameraInternalIterator.next();
+        } else {
+            throw new IllegalArgumentException("No available camera can be found");
+        }
     }
 
     /**
      * Filters the input {@link CameraInfo}s using the {@link CameraFilter}s assigned to the
      * selector.
      *
-     * <p>The camera infos filtered must be contained in the input set. Otherwise it will throw an
-     * exception.
+     * <p>If the {@link CameraFilter}s assigned to this selector produce a camera info that
+     * is not part of the input list, an exception will be thrown.
+     *
+     * <p>A use case for using this function would is when you want to get all {@link CameraInfo}s
+     * from a given {@link CameraSelector}.
+     * <pre>
+     * eg.
+     * {@code
+     * CameraSelector.DEFAULT_BACK_CAMERA.filter(cameraProvider.getAvailableCameraInfos());
+     * }
+     * </pre>
      *
      * @param cameraInfos The camera infos list being filtered.
-     * @return The remain list of camera infos.
-     * @throws IllegalArgumentException      If there's no available camera infos after being
-     * filtered or
-     *                                       the filtered camera infos aren't contained in the input
-     *                                       list.
+     * @return The remaining list of camera infos.
+     * @throws IllegalArgumentException      If the remaining camera infos aren't contained in the
+     *                                       input list.
      * @throws UnsupportedOperationException If the {@link CameraFilter}s assigned to the selector
-     *                                       try to modify the input camera infos.
-     * @hide
+     *                                       try to modify the input camera infos list.
      */
-    @RestrictTo(Scope.LIBRARY_GROUP)
     @NonNull
     public List<CameraInfo> filter(@NonNull List<CameraInfo> cameraInfos) {
         List<CameraInfo> input = new ArrayList<>(cameraInfos);
         List<CameraInfo> output = new ArrayList<>(cameraInfos);
         for (CameraFilter filter : mCameraFilterSet) {
             output = filter.filter(Collections.unmodifiableList(output));
-            // If the result is empty or has extra camera that isn't contained in the input,
+            // If the result has extra camera that isn't contained in the input,
             // throws an exception.
-            if (output.isEmpty()) {
-                throw new IllegalArgumentException("No available camera can be found.");
-            } else if (!input.containsAll(output)) {
+            if (!input.containsAll(output)) {
                 throw new IllegalArgumentException("The output isn't contained in the input.");
             }
             input.retainAll(output);
@@ -121,9 +130,9 @@
      * exception.
      *
      * @param cameras The camera set being filtered.
-     * @return The remain set of cameras.
-     * @throws IllegalArgumentException If there's no available camera after being filtered or
-     *                                  the filtered cameras aren't contained in the input set.
+     * @return The remaining set of cameras.
+     * @throws IllegalArgumentException If the filtered cameras aren't contained in the input set.
+     *
      * @hide
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraX.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraX.java
index 7c480ad..00a7812 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraX.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraX.java
@@ -19,13 +19,14 @@
 import android.app.Application;
 import android.content.ComponentName;
 import android.content.Context;
-import android.content.ContextWrapper;
 import android.content.pm.PackageManager;
 import android.content.pm.ServiceInfo;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Process;
 import android.os.SystemClock;
+import android.util.Log;
+import android.util.SparseArray;
 
 import androidx.annotation.GuardedBy;
 import androidx.annotation.MainThread;
@@ -42,9 +43,6 @@
 import androidx.camera.core.impl.MetadataHolderService;
 import androidx.camera.core.impl.UseCaseConfigFactory;
 import androidx.camera.core.impl.utils.ContextUtil;
-import androidx.camera.core.impl.utils.executor.CameraXExecutors;
-import androidx.camera.core.impl.utils.futures.FutureCallback;
-import androidx.camera.core.impl.utils.futures.FutureChain;
 import androidx.camera.core.impl.utils.futures.Futures;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
 import androidx.core.os.HandlerCompat;
@@ -53,7 +51,6 @@
 import com.google.common.util.concurrent.ListenableFuture;
 
 import java.lang.reflect.InvocationTargetException;
-import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
 
 /**
@@ -72,22 +69,6 @@
     private static final long WAIT_INITIALIZED_TIMEOUT_MILLIS = 3000L;
     private static final long RETRY_SLEEP_MILLIS = 500L;
 
-    static final Object INSTANCE_LOCK = new Object();
-
-    @SuppressWarnings("WeakerAccess") /* synthetic accessor */
-    @GuardedBy("INSTANCE_LOCK")
-    static CameraX sInstance = null;
-
-    @GuardedBy("INSTANCE_LOCK")
-    private static CameraXConfig.Provider sConfigProvider = null;
-
-    @GuardedBy("INSTANCE_LOCK")
-    private static ListenableFuture<Void> sInitializeFuture =
-            Futures.immediateFailedFuture(new IllegalStateException("CameraX is not initialized."));
-
-    @GuardedBy("INSTANCE_LOCK")
-    private static ListenableFuture<Void> sShutdownFuture = Futures.immediateFuture(null);
-
     final CameraRepository mCameraRepository = new CameraRepository();
     private final Object mInitializeLock = new Object();
 
@@ -103,17 +84,38 @@
     // TODO(b/161302102): Remove the stored context. Only make use of the context within the
     //  called method.
     private Context mAppContext;
+    private final ListenableFuture<Void> mInitInternalFuture;
 
     @GuardedBy("mInitializeLock")
     private InternalInitState mInitState = InternalInitState.UNINITIALIZED;
     @GuardedBy("mInitializeLock")
     private ListenableFuture<Void> mShutdownInternalFuture = Futures.immediateFuture(null);
+    private final Integer mMinLogLevel;
 
-    CameraX(@NonNull CameraXConfig cameraXConfig) {
-        mCameraXConfig = Preconditions.checkNotNull(cameraXConfig);
+    private static final Object MIN_LOG_LEVEL_LOCK = new Object();
+    @GuardedBy("MIN_LOG_LEVEL_LOCK")
+    private static final SparseArray<Integer> sMinLogLevelReferenceCountMap = new SparseArray<>();
 
-        Executor executor = cameraXConfig.getCameraExecutor(null);
-        Handler schedulerHandler = cameraXConfig.getSchedulerHandler(null);
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    public CameraX(@NonNull Context context, @Nullable CameraXConfig.Provider configProvider) {
+        if (configProvider != null) {
+            mCameraXConfig = configProvider.getCameraXConfig();
+        } else {
+            CameraXConfig.Provider provider =
+                    getConfigProvider(context);
+
+            if (provider == null) {
+                throw new IllegalStateException("CameraX is not configured properly. The most "
+                        + "likely cause is you did not include a default implementation in your "
+                        + "build such as 'camera-camera2'.");
+            }
+
+            mCameraXConfig = provider.getCameraXConfig();
+        }
+
+        Executor executor = mCameraXConfig.getCameraExecutor(null);
+        Handler schedulerHandler = mCameraXConfig.getSchedulerHandler(null);
         mCameraExecutor = executor == null ? new CameraExecutor() : executor;
         if (schedulerHandler == null) {
             mSchedulerThread = new HandlerThread(CameraXThreads.TAG + "scheduler",
@@ -124,155 +126,12 @@
             mSchedulerThread = null;
             mSchedulerHandler = schedulerHandler;
         }
-    }
 
-    /**
-     * Initializes CameraX with the given context and application configuration.
-     *
-     * <p>The context enables CameraX to obtain access to necessary services, including the camera
-     * service. For example, the context can be provided by the application.
-     *
-     * @param context       to attach
-     * @param cameraXConfig configuration options for this application session.
-     * @return A {@link ListenableFuture} representing the initialization task. This future may
-     * fail with an {@link InitializationException} and associated cause that can be retrieved by
-     * {@link Throwable#getCause()). The cause will be a {@link CameraUnavailableException} if it
-     * fails to access any camera during initialization.
-     * @hide
-     */
-    @RestrictTo(Scope.TESTS)
-    @NonNull
-    public static ListenableFuture<Void> initialize(@NonNull Context context,
-            @NonNull CameraXConfig cameraXConfig) {
-        synchronized (INSTANCE_LOCK) {
-            Preconditions.checkNotNull(context);
-            configureInstanceLocked(() -> cameraXConfig);
-            initializeInstanceLocked(context);
-            return sInitializeFuture;
-        }
-    }
+        // Retrieves the mini log level setting from config provider
+        mMinLogLevel = mCameraXConfig.retrieveOption(CameraXConfig.OPTION_MIN_LOGGING_LEVEL, null);
+        increaseMinLogLevelReference(mMinLogLevel);
 
-    /**
-     * Configures the CameraX singleton with the given {@link androidx.camera.core.CameraXConfig}.
-     *
-     * @param cameraXConfig configuration options for the singleton instance.
-     */
-    public static void configureInstance(@NonNull CameraXConfig cameraXConfig) {
-        synchronized (INSTANCE_LOCK) {
-            configureInstanceLocked(() -> cameraXConfig);
-        }
-    }
-
-    @GuardedBy("INSTANCE_LOCK")
-    private static void configureInstanceLocked(@NonNull CameraXConfig.Provider configProvider) {
-        Preconditions.checkNotNull(configProvider);
-        Preconditions.checkState(sConfigProvider == null, "CameraX has already been configured. "
-                + "To use a different configuration, shutdown() must be called.");
-
-        sConfigProvider = configProvider;
-
-        // Set the minimum logging level inside CameraX before it's initialization begins
-        final Integer minLogLevel = configProvider.getCameraXConfig().retrieveOption(
-                CameraXConfig.OPTION_MIN_LOGGING_LEVEL, null);
-        if (minLogLevel != null) {
-            Logger.setMinLogLevel(minLogLevel);
-        }
-    }
-
-    @GuardedBy("INSTANCE_LOCK")
-    private static void initializeInstanceLocked(@NonNull Context context) {
-        Preconditions.checkNotNull(context);
-        Preconditions.checkState(sInstance == null, "CameraX already initialized.");
-        Preconditions.checkNotNull(sConfigProvider);
-        CameraX cameraX = new CameraX(sConfigProvider.getCameraXConfig());
-        sInstance = cameraX;
-        sInitializeFuture = CallbackToFutureAdapter.getFuture(completer -> {
-            synchronized (INSTANCE_LOCK) {
-                // The sShutdownFuture should always be successful, otherwise it will not
-                // propagate to transformAsync() due to the behavior of FutureChain.
-                ListenableFuture<Void> future = FutureChain.from(sShutdownFuture)
-                        .transformAsync(input -> cameraX.initInternal(context),
-                                CameraXExecutors.directExecutor());
-
-                Futures.addCallback(future, new FutureCallback<Void>() {
-                    @Override
-                    public void onSuccess(@Nullable Void result) {
-                        completer.set(null);
-                    }
-
-                    @SuppressWarnings("FutureReturnValueIgnored")
-                    @Override
-                    public void onFailure(Throwable t) {
-                        Logger.w(TAG, "CameraX initialize() failed", t);
-                        // Call shutdown() automatically, if initialization fails.
-                        synchronized (INSTANCE_LOCK) {
-                            // Make sure it is the same instance to prevent reinitialization
-                            // during initialization.
-                            if (sInstance == cameraX) {
-                                shutdownLocked();
-                            }
-                        }
-                        completer.setException(t);
-                    }
-                }, CameraXExecutors.directExecutor());
-                return "CameraX-initialize";
-            }
-        });
-    }
-
-    /**
-     * Shutdown CameraX so that it can be initialized again.
-     *
-     * @return A {@link ListenableFuture} representing the shutdown task.
-     */
-    @NonNull
-    public static ListenableFuture<Void> shutdown() {
-        synchronized (INSTANCE_LOCK) {
-            sConfigProvider = null;
-            Logger.resetMinLogLevel();
-            return shutdownLocked();
-        }
-    }
-
-    @SuppressWarnings("WeakerAccess") /* synthetic accessor */
-    @GuardedBy("INSTANCE_LOCK")
-    @NonNull
-    static ListenableFuture<Void> shutdownLocked() {
-        if (sInstance == null) {
-            // If it is already or will be shutdown, return the future directly.
-            return sShutdownFuture;
-        }
-
-        CameraX cameraX = sInstance;
-        sInstance = null;
-
-        // Do not use FutureChain to chain the initFuture, because FutureChain.transformAsync()
-        // will not propagate if the input initFuture is failed. We want to always
-        // shutdown the CameraX instance to ensure that resources are freed.
-        sShutdownFuture = Futures.nonCancellationPropagating(CallbackToFutureAdapter.getFuture(
-                completer -> {
-                    synchronized (INSTANCE_LOCK) {
-                        // Wait initialize complete
-                        sInitializeFuture.addListener(() -> {
-                            // Wait shutdownInternal complete
-                            Futures.propagate(cameraX.shutdownInternal(), completer);
-                        }, CameraXExecutors.directExecutor());
-                        return "CameraX shutdown";
-                    }
-                }));
-        return sShutdownFuture;
-    }
-
-    /**
-     * Returns true if CameraX is initialized.
-     *
-     * @hide
-     */
-    @RestrictTo(Scope.TESTS)
-    public static boolean isInitialized() {
-        synchronized (INSTANCE_LOCK) {
-            return sInstance != null && sInstance.isInitializedInternal();
-        }
+        mInitInternalFuture = initInternal(context);
     }
 
     /**
@@ -292,59 +151,10 @@
         return mCameraFactory;
     }
 
-    /**
-     * Returns a future which contains a CameraX instance after initialization is complete.
-     *
-     * @hide
-     */
-    @SuppressWarnings("FutureReturnValueIgnored") // shutdownLocked() should always succeed.
-    @RestrictTo(Scope.LIBRARY_GROUP)
-    @NonNull
-    public static ListenableFuture<CameraX> getOrCreateInstance(@NonNull Context context) {
-        Preconditions.checkNotNull(context, "Context must not be null.");
-        synchronized (INSTANCE_LOCK) {
-            boolean isConfigured = sConfigProvider != null;
-            ListenableFuture<CameraX> instanceFuture = getInstanceLocked();
-            if (instanceFuture.isDone()) {
-                try {
-                    instanceFuture.get();
-                } catch (InterruptedException e) {
-                    // Should not be possible since future is complete.
-                    throw new RuntimeException("Unexpected thread interrupt. Should not be "
-                            + "possible since future is already complete.", e);
-                } catch (ExecutionException e) {
-                    // Either initialization failed or initialize() has not been called, ensure we
-                    // can try to reinitialize.
-                    shutdownLocked();
-                    instanceFuture = null;
-                }
-            }
-
-            if (instanceFuture == null) {
-                if (!isConfigured) {
-                    // Attempt initialization through Application or meta-data
-                    CameraXConfig.Provider configProvider = getConfigProvider(context);
-                    if (configProvider == null) {
-                        throw new IllegalStateException("CameraX is not configured properly. "
-                                + "The most likely cause is you did not include a default "
-                                + "implementation in your build such as 'camera-camera2'.");
-                    }
-
-                    configureInstanceLocked(configProvider);
-                }
-
-                initializeInstanceLocked(context);
-                instanceFuture = getInstanceLocked();
-            }
-
-            return instanceFuture;
-        }
-    }
-
     @Nullable
     private static CameraXConfig.Provider getConfigProvider(@NonNull Context context) {
         CameraXConfig.Provider configProvider = null;
-        Application application = getApplicationFromContext(context);
+        Application application = ContextUtil.getApplicationFromContext(context);
         if (application instanceof CameraXConfig.Provider) {
             // Application is a CameraXConfig.Provider, use this directly
             configProvider = (CameraXConfig.Provider) application;
@@ -391,42 +201,6 @@
     }
 
     /**
-     * Attempts to retrieve an {@link Application} object from the provided {@link Context}.
-     *
-     * <p>Because the contract does not specify that {@code Context.getApplicationContext()} must
-     * return an {@code Application} object, this method will attempt to retrieve the
-     * {@code Application} by unwrapping the context via {@link ContextWrapper#getBaseContext()} if
-     * {@code Context.getApplicationContext()}} does not succeed.
-     */
-    @Nullable
-    private static Application getApplicationFromContext(@NonNull Context context) {
-        Application application = null;
-        Context appContext = ContextUtil.getApplicationContext(context);
-        while (appContext instanceof ContextWrapper) {
-            if (appContext instanceof Application) {
-                application = (Application) appContext;
-                break;
-            } else {
-                appContext = ContextUtil.getBaseContext((ContextWrapper) appContext);
-            }
-        }
-        return application;
-    }
-
-    @GuardedBy("INSTANCE_LOCK")
-    @NonNull
-    private static ListenableFuture<CameraX> getInstanceLocked() {
-        CameraX cameraX = sInstance;
-        if (cameraX == null) {
-            return Futures.immediateFailedFuture(new IllegalStateException("Must "
-                    + "call CameraX.initialize() first"));
-        }
-
-        return Futures.transform(sInitializeFuture, nullVoid -> cameraX,
-                CameraXExecutors.directExecutor());
-    }
-
-    /**
      * Returns the {@link CameraDeviceSurfaceManager} instance.
      *
      * @throws IllegalStateException if the {@link CameraDeviceSurfaceManager} has not been set, due
@@ -469,6 +243,28 @@
         return mDefaultConfigFactory;
     }
 
+    /**
+     * Returns the initialize future.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @NonNull
+    public ListenableFuture<Void> getInitializeFuture() {
+        return mInitInternalFuture;
+    }
+
+    /**
+     * Returns the shutdown future.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @NonNull
+    public ListenableFuture<Void> shutdown() {
+        return shutdownInternal();
+    }
+
     private ListenableFuture<Void> initInternal(@NonNull Context context) {
         synchronized (mInitializeLock) {
             Preconditions.checkState(mInitState == InternalInitState.UNINITIALIZED,
@@ -495,7 +291,7 @@
             try {
                 // TODO(b/161302102): Remove the stored context. Only make use of
                 //  the context within the called method.
-                mAppContext = getApplicationFromContext(context);
+                mAppContext = ContextUtil.getApplicationFromContext(context);
                 if (mAppContext == null) {
                     mAppContext = ContextUtil.getApplicationContext(context);
                 }
@@ -559,8 +355,9 @@
                             RETRY_SLEEP_MILLIS);
 
                 } else {
-                    // Set the state to initialized so it can be shut down properly.
-                    setStateToInitialized();
+                    synchronized (mInitializeLock) {
+                        mInitState = InternalInitState.INITIALIZING_ERROR;
+                    }
                     if (e instanceof CameraValidator.CameraIdListIncorrectException) {
                         // Ignore the camera validation failure if it reaches the maximum retry
                         // time. Set complete.
@@ -598,8 +395,10 @@
                     throw new IllegalStateException(
                             "CameraX could not be shutdown when it is initializing.");
 
+                case INITIALIZING_ERROR:
                 case INITIALIZED:
                     mInitState = InternalInitState.SHUTDOWN;
+                    decreaseMinLogLevelReference(mMinLogLevel);
                     mShutdownInternalFuture = CallbackToFutureAdapter.getFuture(
                             completer -> {
                                 ListenableFuture<Void> future = mCameraRepository.deinit();
@@ -630,12 +429,75 @@
         }
     }
 
-    private boolean isInitializedInternal() {
+    /**
+     * Returns whether the instance is in InternalInitState.INITIALIZED state.
+     */
+    boolean isInitialized() {
         synchronized (mInitializeLock) {
             return mInitState == InternalInitState.INITIALIZED;
         }
     }
 
+    private static void increaseMinLogLevelReference(@Nullable Integer minLogLevel) {
+        synchronized (MIN_LOG_LEVEL_LOCK) {
+            if (minLogLevel == null) {
+                return;
+            }
+
+            Preconditions.checkArgumentInRange(minLogLevel, Log.DEBUG, Log.ERROR, "minLogLevel");
+
+            int refCount = 1;
+            // Retrieves the value from the map and plus one if there has been some other
+            // instance refers to the same minimum log level.
+            if (sMinLogLevelReferenceCountMap.get(minLogLevel) != null) {
+                refCount = sMinLogLevelReferenceCountMap.get(minLogLevel) + 1;
+            }
+            sMinLogLevelReferenceCountMap.put(minLogLevel, refCount);
+            updateOrResetMinLogLevel();
+        }
+    }
+
+    private static void decreaseMinLogLevelReference(@Nullable Integer minLogLevel) {
+        synchronized (MIN_LOG_LEVEL_LOCK) {
+            if (minLogLevel == null) {
+                return;
+            }
+
+            int refCount = sMinLogLevelReferenceCountMap.get(minLogLevel) - 1;
+
+            if (refCount == 0) {
+                // Removes the entry if reference count becomes zero.
+                sMinLogLevelReferenceCountMap.remove(minLogLevel);
+            } else {
+                // Update the value if it is still referred by other instance.
+                sMinLogLevelReferenceCountMap.put(minLogLevel, refCount);
+            }
+            updateOrResetMinLogLevel();
+        }
+    }
+
+    @GuardedBy("MIN_LOG_LEVEL_LOCK")
+    private static void updateOrResetMinLogLevel() {
+        // Resets the minimum log level if there has been no instances refer to any minimum
+        // log level setting.
+        if (sMinLogLevelReferenceCountMap.size() == 0) {
+            Logger.resetMinLogLevel();
+            return;
+        }
+
+        // If the HashMap is not empty, find the minimum log level from the map and update it
+        // to Logger.
+        if (sMinLogLevelReferenceCountMap.get(Log.DEBUG) != null) {
+            Logger.setMinLogLevel(Log.DEBUG);
+        } else if (sMinLogLevelReferenceCountMap.get(Log.INFO) != null) {
+            Logger.setMinLogLevel(Log.INFO);
+        } else if (sMinLogLevelReferenceCountMap.get(Log.WARN) != null) {
+            Logger.setMinLogLevel(Log.WARN);
+        } else if (sMinLogLevelReferenceCountMap.get(Log.ERROR) != null) {
+            Logger.setMinLogLevel(Log.ERROR);
+        }
+    }
+
     /** Internal initialization state. */
     private enum InternalInitState {
         /** The CameraX instance has not yet been initialized. */
@@ -644,6 +506,9 @@
         /** The CameraX instance is initializing. */
         INITIALIZING,
 
+        /** The CameraX instance encounters error when initializing. */
+        INITIALIZING_ERROR,
+
         /** The CameraX instance has been initialized. */
         INITIALIZED,
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysis.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysis.java
index 6431f05..fcb1e3b 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysis.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysis.java
@@ -21,6 +21,7 @@
 import static androidx.camera.core.impl.ImageAnalysisConfig.OPTION_IMAGE_READER_PROXY_PROVIDER;
 import static androidx.camera.core.impl.ImageAnalysisConfig.OPTION_ONE_PIXEL_SHIFT_ENABLED;
 import static androidx.camera.core.impl.ImageAnalysisConfig.OPTION_OUTPUT_IMAGE_FORMAT;
+import static androidx.camera.core.impl.ImageAnalysisConfig.OPTION_OUTPUT_IMAGE_ROTATION_ENABLED;
 import static androidx.camera.core.impl.ImageOutputConfig.OPTION_MAX_RESOLUTION;
 import static androidx.camera.core.impl.ImageOutputConfig.OPTION_SUPPORTED_RESOLUTIONS;
 import static androidx.camera.core.impl.ImageOutputConfig.OPTION_TARGET_ASPECT_RATIO;
@@ -38,7 +39,9 @@
 import static androidx.camera.core.internal.ThreadConfig.OPTION_BACKGROUND_EXECUTOR;
 
 import android.graphics.ImageFormat;
+import android.graphics.Matrix;
 import android.graphics.PixelFormat;
+import android.graphics.Rect;
 import android.media.CamcorderProfile;
 import android.media.ImageReader;
 import android.util.Pair;
@@ -180,6 +183,8 @@
     private static final int DEFAULT_OUTPUT_IMAGE_FORMAT = OUTPUT_IMAGE_FORMAT_YUV_420_888;
     // One pixel shift for YUV.
     private static final Boolean DEFAULT_ONE_PIXEL_SHIFT_ENABLED = null;
+    // Default to disabled for rotation.
+    private static final boolean DEFAULT_OUTPUT_IMAGE_ROTATION_ENABLED = false;
 
     @SuppressWarnings("WeakerAccess") /* synthetic access */
     final ImageAnalysisAbstractAnalyzer mImageAnalysisAbstractAnalyzer;
@@ -220,6 +225,8 @@
                     config.getBackgroundExecutor(CameraXExecutors.highPriorityExecutor()));
         }
         mImageAnalysisAbstractAnalyzer.setOutputImageFormat(getOutputImageFormat());
+        mImageAnalysisAbstractAnalyzer.setOutputImageRotationEnabled(
+                isOutputImageRotationEnabled());
     }
 
     /**
@@ -272,20 +279,31 @@
                             imageQueueDepth));
         }
 
+        boolean flipWH = getCamera() != null ? isFlipWH(getCamera()) : false;
+        int width = flipWH ? resolution.getHeight() : resolution.getWidth();
+        int height = flipWH ? resolution.getWidth() : resolution.getHeight();
+        int format = getOutputImageFormat() == OUTPUT_IMAGE_FORMAT_RGBA_8888
+                ? PixelFormat.RGBA_8888 : ImageFormat.YUV_420_888;
+
+        boolean isYuv2Rgb = getImageFormat() == ImageFormat.YUV_420_888
+                && getOutputImageFormat() == OUTPUT_IMAGE_FORMAT_RGBA_8888;
+        boolean isYuvRotationOrPixelShift = getImageFormat() == ImageFormat.YUV_420_888
+                && ((getCamera() != null && getRelativeRotation(getCamera()) != 0)
+                || Boolean.TRUE.equals(getOnePixelShiftEnabled()));
+
         // TODO(b/195021586): to support RGB format input for image analysis for devices already
         // supporting RGB natively. The logic here will check if the specific configured size is
         // available in RGB and if not, fall back to YUV-RGB conversion.
-        final SafeCloseImageReaderProxy rgbImageReaderProxy =
-                (getImageFormat() == ImageFormat.YUV_420_888
-                        && getOutputImageFormat() == OUTPUT_IMAGE_FORMAT_RGBA_8888)
+        final SafeCloseImageReaderProxy processedImageReaderProxy =
+                (isYuv2Rgb || isYuvRotationOrPixelShift)
                         ? new SafeCloseImageReaderProxy(
                                 ImageReaderProxys.createIsolatedReader(
-                                        resolution.getWidth(),
-                                        resolution.getHeight(),
-                                        PixelFormat.RGBA_8888,
+                                        width,
+                                        height,
+                                        format,
                                         imageReaderProxy.getMaxImages())) : null;
-        if (rgbImageReaderProxy != null) {
-            mImageAnalysisAbstractAnalyzer.setRGBImageReaderProxy(rgbImageReaderProxy);
+        if (processedImageReaderProxy != null) {
+            mImageAnalysisAbstractAnalyzer.setProcessedImageReaderProxy(processedImageReaderProxy);
         }
 
         tryUpdateRelativeRotation();
@@ -303,8 +321,8 @@
         mDeferrableSurface.getTerminationFuture().addListener(
                 () -> {
                     imageReaderProxy.safeClose();
-                    if (rgbImageReaderProxy != null) {
-                        rgbImageReaderProxy.safeClose();
+                    if (processedImageReaderProxy != null) {
+                        processedImageReaderProxy.safeClose();
                     }
                 },
                 CameraXExecutors.mainThreadExecutor());
@@ -442,12 +460,7 @@
      */
     public void setAnalyzer(@NonNull Executor executor, @NonNull Analyzer analyzer) {
         synchronized (mAnalysisLock) {
-            mImageAnalysisAbstractAnalyzer.setAnalyzer(executor, image -> {
-                if (getViewPortCropRect() != null) {
-                    image.setCropRect(getViewPortCropRect());
-                }
-                analyzer.analyze(image);
-            });
+            mImageAnalysisAbstractAnalyzer.setAnalyzer(executor, image -> analyzer.analyze(image));
             if (mSubscribedAnalyzer == null) {
                 notifyActive();
             }
@@ -456,6 +469,34 @@
     }
 
     /**
+     * {@inheritDoc}
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public void setViewPortCropRect(@NonNull Rect viewPortCropRect) {
+        super.setViewPortCropRect(viewPortCropRect);
+        mImageAnalysisAbstractAnalyzer.setViewPortCropRect(viewPortCropRect);
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public void setSensorToBufferTransformMatrix(@NonNull Matrix matrix) {
+        mImageAnalysisAbstractAnalyzer.setSensorToBufferTransformMatrix(matrix);
+    }
+
+    private boolean isFlipWH(@NonNull CameraInternal cameraInternal) {
+        return isOutputImageRotationEnabled()
+                ? ((getRelativeRotation(cameraInternal) % 180) != 0) : false;
+    }
+
+    /**
      * Returns the mode with which images are acquired from the {@linkplain ImageReader image
      * producer}.
      *
@@ -501,6 +542,7 @@
      * {@link ImageAnalysis#OUTPUT_IMAGE_FORMAT_RGBA_8888}.
      *
      * @return output image format.
+     * @see ImageAnalysis.Builder#setOutputImageFormat(int)
      */
     @ImageAnalysis.OutputImageFormat
     public int getOutputImageFormat() {
@@ -509,6 +551,17 @@
     }
 
     /**
+     * Checks if output image rotation is enabled. It returns false by default.
+     *
+     * @return true if enabled, false otherwise.
+     * @see ImageAnalysis.Builder#setOutputImageRotationEnabled(boolean)
+     */
+    public boolean isOutputImageRotationEnabled() {
+        return ((ImageAnalysisConfig) getCurrentConfig()).isOutputImageRotationEnabled(
+                DEFAULT_OUTPUT_IMAGE_ROTATION_ENABLED);
+    }
+
+    /**
      * @hide
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
@@ -875,6 +928,32 @@
             return this;
         }
 
+        /**
+         * Enable or disable output image rotation.
+         *
+         * <p>{@link ImageAnalysis#setTargetRotation(int)} is to adjust the rotation
+         * degree information returned by {@link ImageInfo#getRotationDegrees()} based on
+         * sensor rotation and user still needs to rotate the output image to achieve the target
+         * rotation. Once this is enabled, user doesn't need to handle the rotation, the output
+         * image will be a rotated {@link ImageProxy} and {@link ImageInfo#getRotationDegrees()}
+         * will return 0.
+         *
+         * <p>Turning this on will add more processing overhead to every image analysis
+         * frame. The average processing time is about 10-15ms for 640x480 image on a mid-range
+         * device.
+         *
+         * By default, the rotation is disabled.
+         *
+         * @param outputImageRotationEnabled flag to enable or disable.
+         * @return The current Builder.
+         */
+        @NonNull
+        public Builder setOutputImageRotationEnabled(boolean outputImageRotationEnabled) {
+            getMutableConfig().insertOption(OPTION_OUTPUT_IMAGE_ROTATION_ENABLED,
+                    outputImageRotationEnabled);
+            return this;
+        }
+
         /** @hide */
         @RestrictTo(Scope.LIBRARY_GROUP)
         @NonNull
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisAbstractAnalyzer.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisAbstractAnalyzer.java
index 12d1f07..43b5044 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisAbstractAnalyzer.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisAbstractAnalyzer.java
@@ -19,18 +19,29 @@
 import static androidx.camera.core.ImageAnalysis.OUTPUT_IMAGE_FORMAT_RGBA_8888;
 import static androidx.camera.core.ImageProcessingUtil.applyPixelShiftForYUV;
 import static androidx.camera.core.ImageProcessingUtil.convertYUVToRGB;
+import static androidx.camera.core.ImageProcessingUtil.rotateYUV;
+
+import android.graphics.Matrix;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.media.ImageWriter;
+import android.os.Build;
 
 import androidx.annotation.GuardedBy;
+import androidx.annotation.IntRange;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
+import androidx.annotation.VisibleForTesting;
 import androidx.camera.core.impl.ImageReaderProxy;
 import androidx.camera.core.impl.utils.futures.Futures;
+import androidx.camera.core.internal.compat.ImageWriterCompat;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
 import androidx.core.os.OperationCanceledException;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
+import java.nio.ByteBuffer;
 import java.util.concurrent.Executor;
 
 /**
@@ -44,20 +55,66 @@
 abstract class ImageAnalysisAbstractAnalyzer implements ImageReaderProxy.OnImageAvailableListener {
 
     private static final String TAG = "ImageAnalysisAnalyzer";
+    private static final RectF NORMALIZED_RECT = new RectF(-1, -1, 1, 1);
 
     // Member variables from ImageAnalysis.
     @GuardedBy("mAnalyzerLock")
     private ImageAnalysis.Analyzer mSubscribedAnalyzer;
+
+    // Relative rotation degree provided to user in image info based on sensor to buffer rotation
+    // degrees and target rotation degrees.
+    @IntRange(from = 0, to = 359)
     private volatile int mRelativeRotation;
+
+    // Cache buffer rotation degree for previous frame to decide whether new image reader proxy
+    // needs to be created.
+    @IntRange(from = 0, to = 359)
+    private volatile int mPrevBufferRotationDegrees;
+
     @ImageAnalysis.OutputImageFormat
     private volatile int mOutputImageFormat = ImageAnalysis.OUTPUT_IMAGE_FORMAT_YUV_420_888;
+    private volatile boolean mOutputImageRotationEnabled;
     private volatile boolean mOnePixelShiftEnabled;
+    private volatile boolean mOutputImageDirty;
+
     @GuardedBy("mAnalyzerLock")
     private Executor mUserExecutor;
 
     @GuardedBy("mAnalyzerLock")
     @Nullable
-    private ImageReaderProxy mRGBImageReaderProxy;
+    private SafeCloseImageReaderProxy mProcessedImageReaderProxy;
+
+    @GuardedBy("mAnalyzerLock")
+    @Nullable
+    private ImageWriter mProcessedImageWriter;
+
+    @GuardedBy("mAnalyzerLock")
+    private Rect mOriginalViewPortCropRect = new Rect();
+
+    @GuardedBy("mAnalyzerLock")
+    private Rect mUpdatedViewPortCropRect = new Rect();
+
+    @GuardedBy("mAnalyzerLock")
+    private Matrix mOriginalSensorToBufferTransformMatrix = new Matrix();
+
+    @GuardedBy("mAnalyzerLock")
+    private Matrix mUpdatedSensorToBufferTransformMatrix = new Matrix();
+
+    @GuardedBy("mAnalyzerLock")
+    @Nullable
+    private ByteBuffer mRGBConvertedBuffer;
+
+    @GuardedBy("mAnalyzerLock")
+    @Nullable
+    private ByteBuffer mYRotatedBuffer;
+
+    @GuardedBy("mAnalyzerLock")
+    @Nullable
+    private ByteBuffer mURotatedBuffer;
+
+    @GuardedBy("mAnalyzerLock")
+    @Nullable
+    private ByteBuffer mVRotatedBuffer;
 
     // Lock that synchronizes the access to mSubscribedAnalyzer/mUserExecutor to prevent mismatch.
     private final Object mAnalyzerLock = new Object();
@@ -106,32 +163,101 @@
      * <p> The analysis will run on the executor provided by {@link #setAnalyzer(Executor,
      * ImageAnalysis.Analyzer)}. Once the analysis successfully finishes the returned
      * ListenableFuture will succeed. If the future fails then it means the {@link
-     * androidx.camera.core.ImageAnalysis.Analyzer} was not called so the image needs to be closed.
+     * ImageAnalysis.Analyzer} was not called so the image needs to be closed.
      *
      * @return The future which will complete once analysis has finished or it failed.
      */
     ListenableFuture<Void> analyzeImage(@NonNull ImageProxy imageProxy) {
         Executor executor;
         ImageAnalysis.Analyzer analyzer;
-        ImageReaderProxy rgbImageReaderProxy;
+        SafeCloseImageReaderProxy processedImageReaderProxy;
+        ImageWriter processedImageWriter;
+        ByteBuffer rgbConvertedBuffer;
+        ByteBuffer yRotatedBuffer;
+        ByteBuffer uRotatedBuffer;
+        ByteBuffer vRotatedBuffer;
+        int currentBufferRotationDegrees = mOutputImageRotationEnabled ? mRelativeRotation : 0;
+
         synchronized (mAnalyzerLock) {
             executor = mUserExecutor;
             analyzer = mSubscribedAnalyzer;
-            rgbImageReaderProxy = mRGBImageReaderProxy;
+
+            // Set dirty flag to indicate the output image transform matrix (for both YUV and RGB)
+            // and image reader proxy (for YUV) needs to be recreated.
+            mOutputImageDirty = mOutputImageRotationEnabled
+                    && currentBufferRotationDegrees != mPrevBufferRotationDegrees;
+
+            // Cache the image reader proxy and image write for reuse and only recreate when
+            // relative rotation degree changes.
+            if (mOutputImageDirty) {
+                recreateImageReaderProxy(imageProxy, currentBufferRotationDegrees);
+            }
+
+            // Cache memory buffer for image rotation
+            createHelperBuffer(imageProxy);
+
+            processedImageReaderProxy = mProcessedImageReaderProxy;
+            processedImageWriter = mProcessedImageWriter;
+            rgbConvertedBuffer = mRGBConvertedBuffer;
+            yRotatedBuffer = mYRotatedBuffer;
+            uRotatedBuffer = mURotatedBuffer;
+            vRotatedBuffer = mVRotatedBuffer;
         }
 
         ListenableFuture<Void> future;
 
         if (analyzer != null && executor != null && mIsAttached) {
-            final ImageProxy rgbImageProxy =
-                    (mOutputImageFormat == OUTPUT_IMAGE_FORMAT_RGBA_8888
-                            && rgbImageReaderProxy != null)
-                            ? convertYUVToRGB(
-                                    imageProxy, rgbImageReaderProxy, mOnePixelShiftEnabled)
-                            : null;
-            if (mOutputImageFormat == ImageAnalysis.OUTPUT_IMAGE_FORMAT_YUV_420_888
-                    && mOnePixelShiftEnabled) {
-                applyPixelShiftForYUV(imageProxy);
+            ImageProxy processedImageProxy = null;
+
+            if (processedImageReaderProxy != null) {
+                if (mOutputImageFormat == OUTPUT_IMAGE_FORMAT_RGBA_8888) {
+                    processedImageProxy =
+                            convertYUVToRGB(
+                                    imageProxy,
+                                    processedImageReaderProxy,
+                                    rgbConvertedBuffer,
+                                    currentBufferRotationDegrees,
+                                    mOnePixelShiftEnabled);
+                } else if (mOutputImageFormat == ImageAnalysis.OUTPUT_IMAGE_FORMAT_YUV_420_888) {
+                    // Apply one pixel shift before other processing, e.g. rotation.
+                    if (mOnePixelShiftEnabled) {
+                        applyPixelShiftForYUV(imageProxy);
+                    }
+                    if (processedImageWriter != null) {
+                        processedImageProxy = rotateYUV(
+                                imageProxy,
+                                processedImageReaderProxy,
+                                processedImageWriter,
+                                yRotatedBuffer,
+                                uRotatedBuffer,
+                                vRotatedBuffer,
+                                currentBufferRotationDegrees);
+                    }
+                }
+            }
+
+            // Flag to indicate YUV2RGB conversion or YUV/RGB rotation failed, not including one
+            // pixel shift process for YUV.
+            final boolean outputProcessedImageFailed = processedImageProxy == null;
+            final ImageProxy outputImageProxy = outputProcessedImageFailed ? imageProxy :
+                    processedImageProxy;
+
+            // recalculate transform matrix and update crop rect only if
+            // rotation succeeded and relative rotation degree changed
+            Rect cropRect = new Rect();
+            Matrix transformMatrix = new Matrix();
+            synchronized (mAnalyzerLock) {
+                if (mOutputImageDirty && !outputProcessedImageFailed) {
+                    recalculateTransformMatrixAndCropRect(
+                            imageProxy.getWidth(),
+                            imageProxy.getHeight(),
+                            outputImageProxy.getWidth(),
+                            outputImageProxy.getHeight());
+                }
+                mPrevBufferRotationDegrees = currentBufferRotationDegrees;
+
+                cropRect.set(mUpdatedViewPortCropRect);
+                transformMatrix.set(mUpdatedSensorToBufferTransformMatrix);
             }
 
             // When the analyzer exists and ImageAnalysis is active.
@@ -142,10 +268,14 @@
                                 ImageInfo imageInfo = ImmutableImageInfo.create(
                                         imageProxy.getImageInfo().getTagBundle(),
                                         imageProxy.getImageInfo().getTimestamp(),
-                                        mRelativeRotation);
+                                        mOutputImageRotationEnabled ? 0
+                                                : mRelativeRotation,
+                                        transformMatrix);
 
-                                analyzer.analyze(new SettableImageProxy(rgbImageProxy == null
-                                        ? imageProxy : rgbImageProxy, imageInfo));
+                                ImageProxy outputSettableImageProxy = new SettableImageProxy(
+                                        outputImageProxy, imageInfo);
+                                outputSettableImageProxy.setCropRect(cropRect);
+                                analyzer.analyze(outputSettableImageProxy);
                                 completer.set(null);
                             } else {
                                 completer.setException(new OperationCanceledException(
@@ -162,10 +292,33 @@
         return future;
     }
 
+    @NonNull
+    private static SafeCloseImageReaderProxy createImageReaderProxy(
+            int imageWidth,
+            int imageHeight,
+            int rotation,
+            int format,
+            int maxImages) {
+        boolean flipWH = (rotation == 90 || rotation == 270);
+        int width = flipWH ? imageHeight : imageWidth;
+        int height = flipWH ? imageWidth : imageHeight;
+
+        return new SafeCloseImageReaderProxy(
+                ImageReaderProxys.createIsolatedReader(
+                        width,
+                        height,
+                        format,
+                        maxImages));
+    }
+
     void setRelativeRotation(int relativeRotation) {
         mRelativeRotation = relativeRotation;
     }
 
+    void setOutputImageRotationEnabled(boolean outputImageRotationEnabled) {
+        mOutputImageRotationEnabled = outputImageRotationEnabled;
+    }
+
     void setOutputImageFormat(@ImageAnalysis.OutputImageFormat int outputImageFormat) {
         mOutputImageFormat = outputImageFormat;
     }
@@ -174,12 +327,29 @@
         mOnePixelShiftEnabled = onePixelShiftEnabled;
     }
 
-    void setRGBImageReaderProxy(@NonNull ImageReaderProxy rgbImageReaderProxy) {
+    void setViewPortCropRect(@NonNull Rect viewPortCropRect) {
         synchronized (mAnalyzerLock) {
-            mRGBImageReaderProxy = rgbImageReaderProxy;
+            mOriginalViewPortCropRect = viewPortCropRect;
+            mUpdatedViewPortCropRect = new Rect(mOriginalViewPortCropRect);
         }
     }
 
+    void setSensorToBufferTransformMatrix(@NonNull Matrix sensorToBufferTransformMatrix) {
+        synchronized (mAnalyzerLock) {
+            mOriginalSensorToBufferTransformMatrix = sensorToBufferTransformMatrix;
+            mUpdatedSensorToBufferTransformMatrix =
+                    new Matrix(mOriginalSensorToBufferTransformMatrix);
+        }
+    }
+
+    void setProcessedImageReaderProxy(
+            @NonNull SafeCloseImageReaderProxy processedImageReaderProxy) {
+        synchronized (mAnalyzerLock) {
+            mProcessedImageReaderProxy = processedImageReaderProxy;
+        }
+
+    }
+
     void setAnalyzer(@Nullable Executor userExecutor,
             @Nullable ImageAnalysis.Analyzer subscribedAnalyzer) {
         synchronized (mAnalyzerLock) {
@@ -205,4 +375,118 @@
         mIsAttached = false;
         clearCache();
     }
+
+    @GuardedBy("mAnalyzerLock")
+    private void createHelperBuffer(@NonNull ImageProxy imageProxy) {
+        if (mOutputImageFormat == ImageAnalysis.OUTPUT_IMAGE_FORMAT_YUV_420_888) {
+            if (mYRotatedBuffer == null) {
+                mYRotatedBuffer = ByteBuffer.allocateDirect(
+                        imageProxy.getWidth() * imageProxy.getHeight());
+            }
+            mYRotatedBuffer.position(0);
+
+            if (mURotatedBuffer == null) {
+                mURotatedBuffer = ByteBuffer.allocateDirect(
+                        imageProxy.getWidth() * imageProxy.getHeight() / 4);
+            }
+            mURotatedBuffer.position(0);
+
+            if (mVRotatedBuffer == null) {
+                mVRotatedBuffer = ByteBuffer.allocateDirect(
+                        imageProxy.getWidth() * imageProxy.getHeight() / 4);
+            }
+            mVRotatedBuffer.position(0);
+        } else if (mOutputImageFormat == OUTPUT_IMAGE_FORMAT_RGBA_8888) {
+            if (mRGBConvertedBuffer == null) {
+                mRGBConvertedBuffer = ByteBuffer.allocateDirect(
+                        imageProxy.getWidth() * imageProxy.getHeight() * 4);
+            }
+        }
+    }
+
+    @GuardedBy("mAnalyzerLock")
+    private void recreateImageReaderProxy(
+            @NonNull ImageProxy imageProxy,
+            @IntRange(from = 0, to = 359) int relativeRotation) {
+        if (mProcessedImageReaderProxy == null) {
+            return;
+        }
+
+        mProcessedImageReaderProxy.safeClose();
+        mProcessedImageReaderProxy = createImageReaderProxy(
+                imageProxy.getWidth(),
+                imageProxy.getHeight(),
+                relativeRotation,
+                mProcessedImageReaderProxy.getImageFormat(),
+                mProcessedImageReaderProxy.getMaxImages());
+
+        if (Build.VERSION.SDK_INT >= 23
+                && mOutputImageFormat == ImageAnalysis.OUTPUT_IMAGE_FORMAT_YUV_420_888) {
+
+            if (mProcessedImageWriter != null) {
+                ImageWriterCompat.close(mProcessedImageWriter);
+            }
+
+            mProcessedImageWriter = ImageWriterCompat.newInstance(
+                    mProcessedImageReaderProxy.getSurface(),
+                    mProcessedImageReaderProxy.getMaxImages());
+        }
+    }
+
+    @GuardedBy("mAnalyzerLock")
+    private void recalculateTransformMatrixAndCropRect(
+            int originalWidth,
+            int originalHeight,
+            int rotatedWidth,
+            int rotatedHeight) {
+        Matrix additionalTransformMatrix = getAdditionalTransformMatrixAppliedByProcessor(
+                originalWidth,
+                originalHeight,
+                rotatedWidth,
+                rotatedHeight,
+                mRelativeRotation);
+        mUpdatedViewPortCropRect = getUpdatedCropRect(
+                mOriginalViewPortCropRect, additionalTransformMatrix);
+        mUpdatedSensorToBufferTransformMatrix.setConcat(mOriginalSensorToBufferTransformMatrix,
+                additionalTransformMatrix);
+    }
+
+    @NonNull
+    static Rect getUpdatedCropRect(
+            @NonNull Rect originalCropRect,
+            @NonNull Matrix additionalTransformMatrix) {
+        RectF rectF = new RectF(originalCropRect);
+        additionalTransformMatrix.mapRect(rectF);
+        Rect rect = new Rect();
+        rectF.round(rect);
+        return rect;
+    }
+
+    @VisibleForTesting
+    @NonNull
+    static Matrix getAdditionalTransformMatrixAppliedByProcessor(
+            int originalWidth,
+            int originalHeight,
+            int rotatedWidth,
+            int rotatedHeight,
+            @IntRange(from = 0, to = 359) int relativeRotation) {
+        Matrix matrix = new Matrix();
+        if (relativeRotation > 0) {
+            matrix.setRectToRect(
+                    new RectF(0, 0, originalWidth, originalHeight),
+                    NORMALIZED_RECT,
+                    Matrix.ScaleToFit.FILL);
+            matrix.postRotate(relativeRotation);
+            matrix.postConcat(getNormalizedToBuffer(new RectF(0, 0, rotatedWidth,
+                    rotatedHeight)));
+        }
+        return matrix;
+    }
+
+    @NonNull
+    private static Matrix getNormalizedToBuffer(@NonNull RectF buffer) {
+        Matrix normalizedToBuffer = new Matrix();
+        normalizedToBuffer.setRectToRect(NORMALIZED_RECT, buffer, Matrix.ScaleToFit.FILL);
+        return normalizedToBuffer;
+    }
 }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java
index 2f09aff..68c2a64 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java
@@ -46,6 +46,7 @@
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.graphics.ImageFormat;
+import android.graphics.Matrix;
 import android.graphics.Rect;
 import android.location.Location;
 import android.media.Image;
@@ -342,6 +343,8 @@
     @SuppressWarnings("WeakerAccess")
     final Executor mSequentialIoExecutor;
 
+    private Matrix mSensorToBufferTransformMatrix = new Matrix();
+
     /**
      * Creates a new image capture use case from the given configuration.
      *
@@ -840,6 +843,11 @@
         return super.getResolutionInfo();
     }
 
+    @Override
+    public void setSensorToBufferTransformMatrix(@NonNull Matrix sensorToBufferTransformMatrix) {
+        mSensorToBufferTransformMatrix = sensorToBufferTransformMatrix;
+    }
+
     /**
      * {@inheritDoc}
      *
@@ -1085,7 +1093,7 @@
 
         mImageCaptureRequestProcessor.sendRequest(new ImageCaptureRequest(
                 getRelativeRotation(attachedCamera), jpegQuality, mCropAspectRatio,
-                getViewPortCropRect(), callbackExecutor, callback));
+                getViewPortCropRect(), mSensorToBufferTransformMatrix, callbackExecutor, callback));
     }
 
     private void lockFlashMode() {
@@ -2436,6 +2444,9 @@
 
         private final Rect mViewPortCropRect;
 
+        @NonNull
+        private final Matrix mSensorToBufferTransformMatrix;
+
         /**
          * @param rotationDegrees The degrees to rotate the image buffer from sensor
          *                        coordinates into the final output coordinate space.
@@ -2448,6 +2459,7 @@
                 @IntRange(from = 1, to = 100) int jpegQuality,
                 Rational targetRatio,
                 @Nullable Rect viewPortCropRect,
+                @NonNull Matrix sensorToBufferTransformMatrix,
                 @NonNull Executor executor,
                 @NonNull OnImageCapturedCallback callback) {
             mRotationDegrees = rotationDegrees;
@@ -2459,6 +2471,7 @@
             }
             mTargetRatio = targetRatio;
             mViewPortCropRect = viewPortCropRect;
+            mSensorToBufferTransformMatrix = sensorToBufferTransformMatrix;
             mListenerExecutor = executor;
             mCallback = callback;
         }
@@ -2505,7 +2518,9 @@
             // Construct the ImageProxy with the updated rotation & crop for the output
             ImageInfo imageInfo = ImmutableImageInfo.create(
                     image.getImageInfo().getTagBundle(),
-                    image.getImageInfo().getTimestamp(), dispatchRotationDegrees);
+                    image.getImageInfo().getTimestamp(),
+                    dispatchRotationDegrees,
+                    mSensorToBufferTransformMatrix);
 
             final ImageProxy dispatchedImageProxy = new SettableImageProxy(image,
                     dispatchResolution, imageInfo);
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageInfo.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageInfo.java
index 8ae16ad..b21403d 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageInfo.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageInfo.java
@@ -16,6 +16,9 @@
 
 package androidx.camera.core;
 
+import android.graphics.Matrix;
+import android.hardware.camera2.CameraCharacteristics;
+
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
@@ -69,6 +72,28 @@
     int getRotationDegrees();
 
     /**
+     * Returns the sensor to image buffer transform matrix.
+     *
+     * <p>The returned matrix is a mapping from sensor coordinates to buffer coordinates,
+     * which is, from the value of {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE} to
+     * {@code (0, 0, image.getWidth, image.getHeight)}. The matrix can be used to map the
+     * coordinates from one {@link UseCase} to another. For example, mapping coordinates of the
+     * face detected with {@link ImageAnalysis} to {@link Preview}.
+     *
+     * <pre>
+     *     <code>
+     *         float[] points = new float[] {x0, y0, x1, y1};
+     *         Matrix matrix = getSensorToBufferTransformMatrix();
+     *         matrix.mapPoints(points);
+     *     </code>
+     * </pre>
+     *
+     * @return the transform matrix.
+     */
+    @NonNull
+    Matrix getSensorToBufferTransformMatrix();
+
+    /**
      * Adds any stored EXIF information in this ImageInfo into the provided ExifData builder.
      *
      * @hide
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageProcessingUtil.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageProcessingUtil.java
index d5dbee2..1ff9ec1 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageProcessingUtil.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageProcessingUtil.java
@@ -16,14 +16,22 @@
 
 package androidx.camera.core;
 
+import static androidx.camera.core.ImageProcessingUtil.Result.ERROR_CONVERSION;
+import static androidx.camera.core.ImageProcessingUtil.Result.SUCCESS;
+
 import android.graphics.ImageFormat;
 import android.media.Image;
+import android.media.ImageWriter;
+import android.os.Build;
 import android.view.Surface;
 
+import androidx.annotation.IntRange;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
+import androidx.camera.core.impl.ImageOutputConfig;
 import androidx.camera.core.impl.ImageReaderProxy;
+import androidx.camera.core.internal.compat.ImageWriterCompat;
 
 import java.nio.ByteBuffer;
 
@@ -40,7 +48,6 @@
     enum Result {
         UNKNOWN,
         SUCCESS,
-        ERROR_FORMAT, // YUV format error.
         ERROR_CONVERSION,  // Native conversion error.
     }
 
@@ -56,6 +63,8 @@
      *
      * @param imageProxy input image proxy in YUV.
      * @param rgbImageReaderProxy output image reader proxy in RGB.
+     * @param rgbConvertedBuffer intermediate image buffer for format conversion.
+     * @param rotationDegrees output image rotation degrees.
      * @param onePixelShiftEnabled true if one pixel shift should be applied, otherwise false.
      * @return output image proxy in RGB.
      */
@@ -63,29 +72,36 @@
     public static ImageProxy convertYUVToRGB(
             @NonNull ImageProxy imageProxy,
             @NonNull ImageReaderProxy rgbImageReaderProxy,
+            @NonNull ByteBuffer rgbConvertedBuffer,
+            @IntRange(from = 0, to = 359) int rotationDegrees,
             boolean onePixelShiftEnabled) {
-        if (!ImageProcessingUtil.isSupportedYUVFormat(imageProxy)) {
+        if (!isSupportedYUVFormat(imageProxy)) {
             Logger.e(TAG, "Unsupported format for YUV to RGB");
             return null;
         }
 
+        if (!isSupportedRotationDegrees(rotationDegrees)) {
+            Logger.e(TAG, "Unsupported rotation degrees for rotate RGB");
+            return null;
+        }
+
         // Convert YUV To RGB and write data to surface
-        ImageProcessingUtil.Result result = convertYUVToRGBInternal(
-                imageProxy, rgbImageReaderProxy.getSurface(), onePixelShiftEnabled);
+        Result result = convertYUVToRGBInternal(
+                imageProxy,
+                rgbImageReaderProxy.getSurface(),
+                rgbConvertedBuffer,
+                rotationDegrees,
+                onePixelShiftEnabled);
 
-        if (result == Result.ERROR_CONVERSION) {
+        if (result == ERROR_CONVERSION) {
             Logger.e(TAG, "YUV to RGB conversion failure");
             return null;
         }
 
-        if (result == Result.ERROR_FORMAT) {
-            Logger.e(TAG, "Unsupported format for YUV to RGB");
-            return null;
-        }
-
         // Retrieve ImageProxy in RGB
         final ImageProxy rgbImageProxy = rgbImageReaderProxy.acquireLatestImage();
         if (rgbImageProxy == null) {
+            Logger.e(TAG, "YUV to RGB acquireLatestImage failure");
             return null;
         }
 
@@ -107,48 +123,108 @@
      * @return true if one pixel shift is applied successfully, otherwise false.
      */
     public static boolean applyPixelShiftForYUV(@NonNull ImageProxy imageProxy) {
-        if (!ImageProcessingUtil.isSupportedYUVFormat(imageProxy)) {
+        if (!isSupportedYUVFormat(imageProxy)) {
             Logger.e(TAG, "Unsupported format for YUV to RGB");
             return false;
         }
 
-        ImageProcessingUtil.Result result = applyPixelShiftInternal(imageProxy);
+        Result result = applyPixelShiftInternal(imageProxy);
 
-        if (result == Result.ERROR_CONVERSION) {
-            Logger.e(TAG, "YUV to RGB conversion failure");
-            return false;
-        }
-
-        if (result == Result.ERROR_FORMAT) {
-            Logger.e(TAG, "Unsupported format for YUV to RGB");
+        if (result == ERROR_CONVERSION) {
+            Logger.e(TAG, "One pixel shift for YUV failure");
             return false;
         }
         return true;
     }
 
     /**
-     * Checks whether input image is in supported YUV format.
+     * Rotates YUV image proxy.
      *
-     * @param imageProxy input image proxy in YUV.
-     * @return true if in supported YUV format, false otherwise.
+     * @param imageProxy input image proxy.
+     * @param rotatedImageReaderProxy input image reader proxy.
+     * @param rotatedImageWriter output image writer.
+     * @param yRotatedBuffer intermediate image buffer for y plane rotation.
+     * @param uRotatedBuffer intermediate image buffer for u plane rotation.
+     * @param vRotatedBuffer intermediate image buffer for v plane rotation.
+     * @param rotationDegrees output image rotation degrees.
+     * @return rotated image proxy or null if rotation fails or format is not supported.
      */
+    @Nullable
+    public static ImageProxy rotateYUV(
+            @NonNull ImageProxy imageProxy,
+            @NonNull ImageReaderProxy rotatedImageReaderProxy,
+            @NonNull ImageWriter rotatedImageWriter,
+            @NonNull ByteBuffer yRotatedBuffer,
+            @NonNull ByteBuffer uRotatedBuffer,
+            @NonNull ByteBuffer vRotatedBuffer,
+            @IntRange(from = 0, to = 359) int rotationDegrees) {
+        if (!isSupportedYUVFormat(imageProxy)) {
+            Logger.e(TAG, "Unsupported format for rotate YUV");
+            return null;
+        }
+
+        if (!isSupportedRotationDegrees(rotationDegrees)) {
+            Logger.e(TAG, "Unsupported rotation degrees for rotate YUV");
+            return null;
+        }
+
+        Result result = ERROR_CONVERSION;
+
+        // YUV rotation is checking non-zero rotation degrees in java layer to avoid unnecessary
+        // overhead, while RGB rotation is checking in c++ layer.
+        if (Build.VERSION.SDK_INT >= 23 && rotationDegrees > 0) {
+            result = rotateYUVInternal(
+                    imageProxy,
+                    rotatedImageWriter,
+                    yRotatedBuffer,
+                    uRotatedBuffer,
+                    vRotatedBuffer,
+                    rotationDegrees);
+        }
+
+        if (result == ERROR_CONVERSION) {
+            Logger.e(TAG, "rotate YUV failure");
+            return null;
+        }
+
+        // Retrieve ImageProxy in rotated YUV
+        ImageProxy rotatedImageProxy = rotatedImageReaderProxy.acquireLatestImage();
+        if (rotatedImageProxy == null) {
+            Logger.e(TAG, "YUV rotation acquireLatestImage failure");
+            return null;
+        }
+
+        SingleCloseImageProxy wrappedRotatedImageProxy = new SingleCloseImageProxy(
+                rotatedImageProxy);
+        wrappedRotatedImageProxy.addOnImageCloseListener(image -> {
+            // Close original YUV image proxy when rotated YUV image is closed by app.
+            if (rotatedImageProxy != null && imageProxy != null) {
+                imageProxy.close();
+            }
+        });
+
+        return wrappedRotatedImageProxy;
+    }
+
     private static boolean isSupportedYUVFormat(@NonNull ImageProxy imageProxy) {
         return imageProxy.getFormat() == ImageFormat.YUV_420_888
                 && imageProxy.getPlanes().length == 3;
     }
 
-    /**
-     * Converts image from YUV to RGB.
-     *
-     * @param imageProxy input image proxy in YUV.
-     * @param surface output surface for RGB data.
-     * @param onePixelShiftEnabled true if one pixel shift should be applied, otherwise false.
-     * @return {@link Result}.
-     */
+    private static boolean isSupportedRotationDegrees(
+            @IntRange(from = 0, to = 359) int rotationDegrees) {
+        return rotationDegrees == 0
+                || rotationDegrees == 90
+                || rotationDegrees == 180
+                || rotationDegrees == 270;
+    }
+
     @NonNull
     private static Result convertYUVToRGBInternal(
             @NonNull ImageProxy imageProxy,
             @NonNull Surface surface,
+            @NonNull ByteBuffer rgbConvertedBuffer,
+            @ImageOutputConfig.RotationDegreesValue int rotation,
             boolean onePixelShiftEnabled) {
         int imageWidth = imageProxy.getWidth();
         int imageHeight = imageProxy.getHeight();
@@ -162,7 +238,7 @@
         int startOffsetU = onePixelShiftEnabled ? srcPixelStrideUV : 0;
         int startOffsetV = onePixelShiftEnabled ? srcPixelStrideUV : 0;
 
-        int result = convertAndroid420ToABGR(
+        int result = nativeConvertAndroid420ToABGR(
                 imageProxy.getPlanes()[0].getBuffer(),
                 srcStrideY,
                 imageProxy.getPlanes()[1].getBuffer(),
@@ -172,15 +248,17 @@
                 srcPixelStrideY,
                 srcPixelStrideUV,
                 surface,
+                rgbConvertedBuffer,
                 imageWidth,
                 imageHeight,
                 startOffsetY,
                 startOffsetU,
-                startOffsetV);
+                startOffsetV,
+                rotation);
         if (result != 0) {
-            return Result.ERROR_CONVERSION;
+            return ERROR_CONVERSION;
         }
-        return Result.SUCCESS;
+        return SUCCESS;
     }
 
     @NonNull
@@ -197,7 +275,7 @@
         int startOffsetU = srcPixelStrideUV;
         int startOffsetV = srcPixelStrideUV;
 
-        int result = shiftPixel(
+        int result = nativeShiftPixel(
                 imageProxy.getPlanes()[0].getBuffer(),
                 srcStrideY,
                 imageProxy.getPlanes()[1].getBuffer(),
@@ -212,31 +290,65 @@
                 startOffsetU,
                 startOffsetV);
         if (result != 0) {
-            return Result.ERROR_CONVERSION;
+            return ERROR_CONVERSION;
         }
-        return Result.SUCCESS;
+        return SUCCESS;
     }
 
-    /**
-     * Converts Android YUV_420_888 to RGBA.
-     *
-     * @param srcByteBufferY Source Y data.
-     * @param srcStrideY Source Y row stride.
-     * @param srcByteBufferU Source U data.
-     * @param srcStrideU Source U row stride.
-     * @param srcByteBufferV Source V data.
-     * @param srcStrideV Source V row stride.
-     * @param srcPixelStrideY Pixel stride for Y.
-     * @param srcPixelStrideUV Pixel stride for UV.
-     * @param surface Destination surface for ABGR data.
-     * @param width Destination image width.
-     * @param height Destination image height.
-     * @param startOffsetY Position in Y source data to begin reading from.
-     * @param startOffsetU Position in U source data to begin reading from.
-     * @param startOffsetV Position in V source data to begin reading from.
-     * @return zero if succeeded, otherwise non-zero.
-     */
-    private static native int convertAndroid420ToABGR(
+    @RequiresApi(23)
+    @Nullable
+    private static Result rotateYUVInternal(
+            @NonNull ImageProxy imageProxy,
+            @NonNull ImageWriter rotatedImageWriter,
+            @NonNull ByteBuffer yRotatedBuffer,
+            @NonNull ByteBuffer uRotatedBuffer,
+            @NonNull ByteBuffer vRotatedBuffer,
+            @ImageOutputConfig.RotationDegreesValue int rotationDegrees) {
+        int imageWidth = imageProxy.getWidth();
+        int imageHeight = imageProxy.getHeight();
+        int srcStrideY = imageProxy.getPlanes()[0].getRowStride();
+        int srcStrideU = imageProxy.getPlanes()[1].getRowStride();
+        int srcStrideV = imageProxy.getPlanes()[2].getRowStride();
+        int srcPixelStrideUV = imageProxy.getPlanes()[1].getPixelStride();
+
+        Image rotatedImage = ImageWriterCompat.dequeueInputImage(rotatedImageWriter);
+        if (rotatedImage == null) {
+            return ERROR_CONVERSION;
+        }
+
+        int result = nativeRotateYUV(
+                imageProxy.getPlanes()[0].getBuffer(),
+                srcStrideY,
+                imageProxy.getPlanes()[1].getBuffer(),
+                srcStrideU,
+                imageProxy.getPlanes()[2].getBuffer(),
+                srcStrideV,
+                srcPixelStrideUV,
+                rotatedImage.getPlanes()[0].getBuffer(),
+                rotatedImage.getPlanes()[0].getRowStride(),
+                rotatedImage.getPlanes()[0].getPixelStride(),
+                rotatedImage.getPlanes()[1].getBuffer(),
+                rotatedImage.getPlanes()[1].getRowStride(),
+                rotatedImage.getPlanes()[1].getPixelStride(),
+                rotatedImage.getPlanes()[2].getBuffer(),
+                rotatedImage.getPlanes()[2].getRowStride(),
+                rotatedImage.getPlanes()[2].getPixelStride(),
+                yRotatedBuffer,
+                uRotatedBuffer,
+                vRotatedBuffer,
+                imageWidth,
+                imageHeight,
+                rotationDegrees);
+
+        if (result != 0) {
+            return ERROR_CONVERSION;
+        }
+
+        ImageWriterCompat.queueInputImage(rotatedImageWriter, rotatedImage);
+        return SUCCESS;
+    }
+
+    private static native int nativeConvertAndroid420ToABGR(
             @NonNull ByteBuffer srcByteBufferY,
             int srcStrideY,
             @NonNull ByteBuffer srcByteBufferU,
@@ -246,13 +358,15 @@
             int srcPixelStrideY,
             int srcPixelStrideUV,
             @NonNull Surface surface,
+            @NonNull ByteBuffer convertedByteBufferRGB,
             int width,
             int height,
             int startOffsetY,
             int startOffsetU,
-            int startOffsetV);
+            int startOffsetV,
+            @ImageOutputConfig.RotationDegreesValue int rotationDegrees);
 
-    private static native int shiftPixel(
+    private static native int nativeShiftPixel(
             @NonNull ByteBuffer srcByteBufferY,
             int srcStrideY,
             @NonNull ByteBuffer srcByteBufferU,
@@ -267,4 +381,27 @@
             int startOffsetU,
             int startOffsetV);
 
+    private static native int nativeRotateYUV(
+            @NonNull ByteBuffer srcByteBufferY,
+            int srcStrideY,
+            @NonNull ByteBuffer srcByteBufferU,
+            int srcStrideU,
+            @NonNull ByteBuffer srcByteBufferV,
+            int srcStrideV,
+            int srcPixelStrideUV,
+            @NonNull ByteBuffer dstByteBufferY,
+            int dstStrideY,
+            int dstPixelStrideY,
+            @NonNull ByteBuffer dstByteBufferU,
+            int dstStrideU,
+            int dstPixelStrideU,
+            @NonNull ByteBuffer dstByteBufferV,
+            int dstStrideV,
+            int dstPixelStrideV,
+            @NonNull ByteBuffer rotatedByteBufferY,
+            @NonNull ByteBuffer rotatedByteBufferU,
+            @NonNull ByteBuffer rotatedByteBufferV,
+            int width,
+            int height,
+            @ImageOutputConfig.RotationDegreesValue int rotationDegrees);
 }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImmutableImageInfo.java b/camera/camera-core/src/main/java/androidx/camera/core/ImmutableImageInfo.java
index e18d65a..8184d1c 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImmutableImageInfo.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImmutableImageInfo.java
@@ -16,6 +16,8 @@
 
 package androidx.camera.core;
 
+import android.graphics.Matrix;
+
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 import androidx.camera.core.impl.TagBundle;
@@ -27,8 +29,12 @@
 @AutoValue
 abstract class ImmutableImageInfo implements ImageInfo {
     public static ImageInfo create(@NonNull TagBundle tag, long timestamp,
-            int rotationDegrees) {
-        return new AutoValue_ImmutableImageInfo(tag, timestamp, rotationDegrees);
+            int rotationDegrees, Matrix sensorToBufferTransformMatrix) {
+        return new AutoValue_ImmutableImageInfo(
+                tag,
+                timestamp,
+                rotationDegrees,
+                sensorToBufferTransformMatrix);
     }
 
     @Override
@@ -41,6 +47,10 @@
     @Override
     public abstract int getRotationDegrees();
 
+    @NonNull
+    @Override
+    public abstract Matrix getSensorToBufferTransformMatrix();
+
     @Override
     public void populateExifData(@NonNull ExifData.Builder exifBuilder) {
         // Only have access to orientation information.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/Logger.java b/camera/camera-core/src/main/java/androidx/camera/core/Logger.java
index 3703bbd..1d4aa96 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/Logger.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/Logger.java
@@ -78,6 +78,13 @@
     }
 
     /**
+     * Returns current minimum logging level.
+     */
+    static int getMinLogLevel() {
+        return sMinLogLevel;
+    }
+
+    /**
      * Resets the minimum logging level to use in {@link Logger} to the default minimum logging
      * level. After calling this method, only logs at the default level and above are output.
      */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/UseCase.java b/camera/camera-core/src/main/java/androidx/camera/core/UseCase.java
index a1b203e..234d2ef 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/UseCase.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/UseCase.java
@@ -17,6 +17,7 @@
 package androidx.camera.core;
 
 import android.annotation.SuppressLint;
+import android.graphics.Matrix;
 import android.graphics.Rect;
 import android.media.ImageReader;
 import android.util.Size;
@@ -679,6 +680,14 @@
     }
 
     /**
+     * Sets the sensor to image buffer transform matrix.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    public void setSensorToBufferTransformMatrix(@NonNull Matrix sensorToBufferTransformMatrix) {}
+
+    /**
      * Get image format for the use case.
      *
      * @return image format for the use case
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageAnalysisConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageAnalysisConfig.java
index 5a298f1..efc784f 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageAnalysisConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageAnalysisConfig.java
@@ -55,6 +55,9 @@
     public static final Option<Boolean> OPTION_ONE_PIXEL_SHIFT_ENABLED =
             Option.create("camerax.core.imageAnalysis.onePixelShiftEnabled",
                     Boolean.class);
+    public static final Option<Boolean> OPTION_OUTPUT_IMAGE_ROTATION_ENABLED =
+            Option.create("camerax.core.imageAnalysis.outputImageRotationEnabled",
+                    Boolean.class);
 
     // *********************************************************************************************
 
@@ -158,6 +161,17 @@
     }
 
     /**
+     * Gets if output image rotation is enabled or not.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Nullable
+    public Boolean isOutputImageRotationEnabled(@Nullable Boolean valueIfMissing) {
+        return retrieveOption(OPTION_OUTPUT_IMAGE_ROTATION_ENABLED, valueIfMissing);
+    }
+
+    /**
      * Gets the caller provided {@link ImageReaderProxy}.
      *
      * @hide
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ContextUtil.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ContextUtil.java
index 13bb51e..d2a6a048 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ContextUtil.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ContextUtil.java
@@ -16,6 +16,7 @@
 
 package androidx.camera.core.impl.utils;
 
+import android.app.Application;
 import android.content.Context;
 import android.content.ContextWrapper;
 import android.os.Build;
@@ -63,6 +64,29 @@
         return baseContext;
     }
 
+    /**
+     * Attempts to retrieve an {@link Application} object from the provided {@link Context}.
+     *
+     * <p>Because the contract does not specify that {@code Context.getApplicationContext()} must
+     * return an {@code Application} object, this method will attempt to retrieve the
+     * {@code Application} by unwrapping the context via {@link ContextWrapper#getBaseContext()} if
+     * {@code Context.getApplicationContext()}} does not succeed.
+     */
+    @Nullable
+    public static Application getApplicationFromContext(@NonNull Context context) {
+        Application application = null;
+        Context appContext = getApplicationContext(context);
+        while (appContext instanceof ContextWrapper) {
+            if (appContext instanceof Application) {
+                application = (Application) appContext;
+                break;
+            } else {
+                appContext = getBaseContext((ContextWrapper) appContext);
+            }
+        }
+        return application;
+    }
+
     private ContextUtil() {
     }
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraCaptureResultImageInfo.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraCaptureResultImageInfo.java
index dd396b5..6ef8a0f 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraCaptureResultImageInfo.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraCaptureResultImageInfo.java
@@ -16,6 +16,8 @@
 
 package androidx.camera.core.internal;
 
+import android.graphics.Matrix;
+
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 import androidx.camera.core.ImageInfo;
@@ -49,6 +51,12 @@
         return 0;
     }
 
+    @NonNull
+    @Override
+    public Matrix getSensorToBufferTransformMatrix() {
+        return new Matrix();
+    }
+
     @Override
     public void populateExifData(@NonNull ExifData.Builder exifBuilder) {
         mCameraCaptureResult.populateExifData(exifBuilder);
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java
index 060844a2..d29368a 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java
@@ -16,7 +16,9 @@
 
 package androidx.camera.core.internal;
 
+import android.graphics.Matrix;
 import android.graphics.Rect;
+import android.graphics.RectF;
 import android.graphics.SurfaceTexture;
 import android.util.Size;
 import android.view.Surface;
@@ -439,11 +441,32 @@
                 for (UseCase useCase : useCases) {
                     useCase.setViewPortCropRect(
                             Preconditions.checkNotNull(cropRectMap.get(useCase)));
+                    useCase.setSensorToBufferTransformMatrix(
+                            calculateSensorToBufferTransformMatrix(
+                                    mCameraInternal.getCameraControlInternal().getSensorRect(),
+                                    suggestedResolutionsMap.get(useCase)));
                 }
             }
         }
     }
 
+    @NonNull
+    private static Matrix calculateSensorToBufferTransformMatrix(
+            @NonNull Rect fullSensorRect,
+            @NonNull Size useCaseSize) {
+        Preconditions.checkArgument(
+                fullSensorRect.width() > 0 && fullSensorRect.height() > 0,
+                "Cannot compute viewport crop rects zero sized sensor rect.");
+        RectF fullSensorRectF = new RectF(fullSensorRect);
+        Matrix sensorToUseCaseTransformation = new Matrix();
+        RectF srcRect = new RectF(0, 0, useCaseSize.getWidth(),
+                useCaseSize.getHeight());
+        sensorToUseCaseTransformation.setRectToRect(srcRect, fullSensorRectF,
+                Matrix.ScaleToFit.CENTER);
+        sensorToUseCaseTransformation.invert(sensorToUseCaseTransformation);
+        return sensorToUseCaseTransformation;
+    }
+
     // Pair of UseCase configs. One for the extended config applied on top of the use case and
     // the camera default which applied underneath the use case's config.
     private static class ConfigPair {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/ImageWriterCompat.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/ImageWriterCompat.java
index 452de69..a012b29 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/ImageWriterCompat.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/ImageWriterCompat.java
@@ -16,6 +16,7 @@
 
 package androidx.camera.core.internal.compat;
 
+import android.media.Image;
 import android.media.ImageWriter;
 import android.os.Build;
 import android.view.Surface;
@@ -27,7 +28,7 @@
 /**
  * Helper for accessing features of {@link ImageWriter} in a backwards compatible fashion.
  */
-@RequiresApi(26)
+@RequiresApi(23)
 public final class ImageWriterCompat {
 
     /**
@@ -85,6 +86,94 @@
                         + ". Version 26 or higher required.");
     }
 
+    /**
+     * <p>
+     * Create a new ImageWriter with given number of max Images and format.
+     * </p>
+     * <p>
+     * The {@code maxImages} parameter determines the maximum number of
+     * {@link android.media.Image} objects that can be be dequeued from the
+     * {@code ImageWriter} simultaneously. Requesting more buffers will use up
+     * more memory, so it is important to use only the minimum number necessary.
+     * </p>
+     *
+     * @param surface The destination Surface this writer produces Image data
+     *            into.
+     * @param maxImages The maximum number of Images the user will want to
+     *            access simultaneously for producing Image data. This should be
+     *            as small as possible to limit memory use. Once maxImages
+     *            Images are dequeued by the user, one of them has to be queued
+     *            back before a new Image can be dequeued for access via
+     *            {@link ImageWriter#dequeueInputImage()}.
+     *
+     * @return a new ImageWriter instance.
+     */
+    @NonNull
+    public static ImageWriter newInstance(@NonNull Surface surface,
+            @IntRange(from = 1) int maxImages) {
+        if (Build.VERSION.SDK_INT >= 23) {
+            return ImageWriterCompatApi23Impl.newInstance(surface, maxImages);
+        }
+
+        throw new RuntimeException(
+                "Unable to call newInstance(Surface, int) on API " + Build.VERSION.SDK_INT
+                        + ". Version 23 or higher required.");
+    }
+
+    /**
+     * <p>
+     * Dequeue an image from image writer.
+     * </p>
+     *
+     * @param imageWriter image writer instance.
+     * @return image from image writer
+     */
+    @NonNull
+    public static Image dequeueInputImage(@NonNull ImageWriter imageWriter) {
+        if (Build.VERSION.SDK_INT >= 23) {
+            return ImageWriterCompatApi23Impl.dequeueInputImage(imageWriter);
+        }
+
+        throw new RuntimeException(
+                "Unable to call dequeueInputImage() on API " + Build.VERSION.SDK_INT
+                        + ". Version 23 or higher required.");
+    }
+
+    /**
+     * <p>
+     * Queue an image to image writer.
+     * </p>
+     *
+     * @param imageWriter image writer instance.
+     * @param image image to image writer.
+     */
+    public static void queueInputImage(@NonNull ImageWriter imageWriter, @NonNull Image image) {
+        if (Build.VERSION.SDK_INT >= 23) {
+            ImageWriterCompatApi23Impl.queueInputImage(imageWriter, image);
+            return;
+        }
+
+        throw new RuntimeException(
+                "Unable to call queueInputImage() on API " + Build.VERSION.SDK_INT
+                        + ". Version 23 or higher required.");
+    }
+
+    /**
+     * Close the existing ImageWriter instance.
+     *
+     * @param imageWriter ImageWriter instance.
+     */
+    public static void close(@NonNull ImageWriter imageWriter) {
+        if (Build.VERSION.SDK_INT >= 23) {
+            ImageWriterCompatApi23Impl.close(imageWriter);
+            return;
+        }
+
+        throw new RuntimeException(
+                "Unable to call close() on API " + Build.VERSION.SDK_INT
+                        + ". Version 23 or higher required.");
+    }
+
     // Class should not be instantiated.
     private ImageWriterCompat() {
     }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/ImageWriterCompatApi23Impl.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/ImageWriterCompatApi23Impl.java
new file mode 100644
index 0000000..88cce3c
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/ImageWriterCompatApi23Impl.java
@@ -0,0 +1,52 @@
+/*
+ * 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.camera.core.internal.compat;
+
+import android.media.Image;
+import android.media.ImageWriter;
+import android.view.Surface;
+
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+
+@RequiresApi(23)
+final class ImageWriterCompatApi23Impl {
+
+    @NonNull
+    static ImageWriter newInstance(@NonNull Surface surface, @IntRange(from = 1) int maxImages) {
+        return ImageWriter.newInstance(surface, maxImages);
+    }
+
+    @NonNull
+    static Image dequeueInputImage(@NonNull ImageWriter imageWriter) {
+        return imageWriter.dequeueInputImage();
+    }
+
+    static void queueInputImage(@NonNull ImageWriter imageWriter, @NonNull Image image) {
+        imageWriter.queueInputImage(image);
+    }
+
+    static void close(ImageWriter imageWriter) {
+        imageWriter.close();
+    }
+
+    // Class should not be instantiated.
+    private ImageWriterCompatApi23Impl() {
+    }
+}
+
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/CameraSelectorTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/CameraSelectorTest.kt
index df97222..f23fbd7 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/CameraSelectorTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/CameraSelectorTest.kt
@@ -170,4 +170,22 @@
         // Should throw an exception if the input is modified.
         cameraSelectorBuilder.build().select(mCameras)
     }
+
+    @Test
+    public fun canFilterCameraInfos() {
+        val cameraInfos = mCameras.map { camera -> camera.cameraInfo }
+        val backCameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
+
+        val filteredCameraInfos = backCameraSelector.filter(cameraInfos)
+        assertThat(filteredCameraInfos).isEqualTo(listOf(mRearCamera.cameraInfo))
+    }
+
+    @Test
+    public fun canFilterCameraInfosWithEmptyResult() {
+        val cameraInfos = listOf(mFrontCamera.cameraInfo)
+        val backCameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
+
+        val filteredCameraInfos = backCameraSelector.filter(cameraInfos)
+        assertThat(filteredCameraInfos).isEmpty()
+    }
 }
\ No newline at end of file
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/ImageAnalysisTest.java b/camera/camera-core/src/test/java/androidx/camera/core/ImageAnalysisTest.java
index 7fa7f6c..7423901 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/ImageAnalysisTest.java
+++ b/camera/camera-core/src/test/java/androidx/camera/core/ImageAnalysisTest.java
@@ -21,12 +21,10 @@
 import static org.robolectric.Shadows.shadowOf;
 
 import android.content.Context;
-import android.graphics.Rect;
 import android.os.Build;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.util.Pair;
-import android.util.Rational;
 import android.view.Surface;
 
 import androidx.camera.core.impl.CameraFactory;
@@ -35,6 +33,7 @@
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.camera.core.internal.CameraUseCaseAdapter;
 import androidx.camera.testing.CameraUtil;
+import androidx.camera.testing.CameraXUtil;
 import androidx.camera.testing.fakes.FakeAppConfig;
 import androidx.camera.testing.fakes.FakeCamera;
 import androidx.camera.testing.fakes.FakeCameraFactory;
@@ -114,13 +113,13 @@
                 FakeAppConfig.create()).setCameraFactoryProvider(cameraFactoryProvider).build();
 
         Context context = ApplicationProvider.getApplicationContext();
-        CameraX.initialize(context, cameraXConfig).get();
+        CameraXUtil.initialize(context, cameraXConfig).get();
     }
 
     @After
     public void tearDown() throws ExecutionException, InterruptedException, TimeoutException {
         mImageProxiesReceived.clear();
-        CameraX.shutdown().get(10000, TimeUnit.MILLISECONDS);
+        CameraXUtil.shutdown().get(10000, TimeUnit.MILLISECONDS);
         if (mBackgroundThread != null) {
             mBackgroundThread.quitSafely();
         }
@@ -130,31 +129,6 @@
     }
 
     @Test
-    public void bindViewPortWithFillStyle_returnsSameViewPortRectAndCropRect()
-            throws InterruptedException, CameraUseCaseAdapter.CameraException {
-        // Arrange.
-        setUpImageAnalysisWithStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST,
-                new ViewPort.Builder(new Rational(1, 1), Surface.ROTATION_0)
-                        .build());
-
-        // Act.
-        mFakeImageReaderProxy.triggerImageAvailable(mTagBundle, TIMESTAMP_1);
-        flushHandler(mBackgroundHandler);
-        flushHandler(mCallbackHandler);
-
-        // Assert: both
-        ImageProxy imageProxyReceived = Iterables.getOnlyElement(mImageProxiesReceived);
-        // The expected value is based on fitting the 1:1 view port into a rect with the size of
-        // the ImageReader.
-        int expectedPadding =
-                (mFakeImageReaderProxy.getWidth() - mFakeImageReaderProxy.getHeight()) / 2;
-        assertThat(imageProxyReceived.getCropRect())
-                .isEqualTo(new Rect(expectedPadding, 0,
-                        mFakeImageReaderProxy.getWidth() - expectedPadding,
-                        mFakeImageReaderProxy.getHeight()));
-    }
-
-    @Test
     public void resultSize_isEqualToSurfaceSize() throws InterruptedException,
             CameraUseCaseAdapter.CameraException {
         // Arrange.
@@ -303,6 +277,7 @@
                             return mFakeImageReaderProxy;
                         })
                 .setSessionOptionUnpacker((config, builder) -> { })
+                .setOnePixelShiftEnabled(false)
                 .build();
 
         mImageAnalysis.setAnalyzer(CameraXExecutors.newHandlerExecutor(mCallbackHandler),
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/ImageCaptureTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/ImageCaptureTest.kt
index 25a96c7..0c9aa31 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/ImageCaptureTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/ImageCaptureTest.kt
@@ -38,6 +38,7 @@
 import androidx.camera.core.impl.utils.futures.Futures
 import androidx.camera.core.internal.CameraUseCaseAdapter
 import androidx.camera.testing.CameraUtil
+import androidx.camera.testing.CameraXUtil
 import androidx.camera.testing.fakes.FakeAppConfig
 import androidx.camera.testing.fakes.FakeCamera
 import androidx.camera.testing.fakes.FakeCameraFactory
@@ -114,7 +115,7 @@
         ).setCameraFactoryProvider(cameraFactoryProvider).build()
         val context =
             ApplicationProvider.getApplicationContext<Context>()
-        CameraX.initialize(context, cameraXConfig).get()
+        CameraXUtil.initialize(context, cameraXConfig).get()
         callbackThread = HandlerThread("Callback")
         callbackThread.start()
         // Explicitly pause callback thread since we will control execution manually in tests
@@ -126,7 +127,7 @@
     @After
     @Throws(ExecutionException::class, InterruptedException::class)
     public fun tearDown() {
-        CameraX.shutdown().get()
+        CameraXUtil.shutdown().get()
         fakeImageReaderProxy = null
         callbackThread.quitSafely()
     }
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/PreviewTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/PreviewTest.kt
index 986d317..f163296 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/PreviewTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/PreviewTest.kt
@@ -31,6 +31,7 @@
 import androidx.camera.core.impl.utils.executor.CameraXExecutors
 import androidx.camera.core.internal.CameraUseCaseAdapter
 import androidx.camera.testing.CameraUtil
+import androidx.camera.testing.CameraXUtil
 import androidx.camera.testing.fakes.FakeAppConfig
 import androidx.camera.testing.fakes.FakeCamera
 import androidx.camera.testing.fakes.FakeCameraDeviceSurfaceManager
@@ -80,7 +81,7 @@
             FakeAppConfig.create()
         ).setCameraFactoryProvider(cameraFactoryProvider).build()
         val context = ApplicationProvider.getApplicationContext<Context>()
-        CameraX.initialize(context, cameraXConfig).get()
+        CameraXUtil.initialize(context, cameraXConfig).get()
     }
 
     @After
@@ -90,7 +91,7 @@
             this?.removeUseCases(useCases)
         }
         cameraUseCaseAdapter = null
-        CameraX.shutdown().get()
+        CameraXUtil.shutdown().get()
     }
 
     @Test
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/VideoCaptureTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/VideoCaptureTest.kt
index 2cc5e17..27af2cf 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/VideoCaptureTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/VideoCaptureTest.kt
@@ -21,6 +21,7 @@
 import android.os.Looper
 import androidx.camera.core.impl.CameraFactory
 import androidx.camera.core.impl.utils.executor.CameraXExecutors
+import androidx.camera.testing.CameraXUtil
 import androidx.camera.testing.fakes.FakeAppConfig
 import androidx.camera.testing.fakes.FakeCamera
 import androidx.camera.testing.fakes.FakeCameraFactory
@@ -62,12 +63,12 @@
             .setCameraFactoryProvider(cameraFactoryProvider)
             .build()
         val context = ApplicationProvider.getApplicationContext<Context>()
-        CameraX.initialize(context, cameraXConfig).get()
+        CameraXUtil.initialize(context, cameraXConfig).get()
     }
 
     @After
     fun tearDown() {
-        CameraX.shutdown().get()
+        CameraXUtil.shutdown().get()
     }
 
     @Test
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsInfo.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsInfo.java
index 71948b2..940024f 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsInfo.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsInfo.java
@@ -133,12 +133,12 @@
                     baseCameraSelector);
             builder.addCameraFilter(getFilter(mode));
 
-            builder.build().filter(cameraProvider.getAvailableCameraInfos());
+            List<CameraInfo> cameraInfos = builder.build().filter(
+                    cameraProvider.getAvailableCameraInfos());
+            return !cameraInfos.isEmpty();
         } catch (IllegalArgumentException e) {
             return false;
         }
-
-        return true;
     }
 
     /**
@@ -177,7 +177,7 @@
                     newCameraSelector.filter(cameraProvider.getAvailableCameraInfos());
 
             if (cameraInfos.isEmpty()) {
-                return null;
+                throw new IllegalArgumentException("No cameras found for given CameraSelector");
             }
 
             extensionsCameraInfo = cameraInfos.get(0);
diff --git a/camera/camera-lifecycle/build.gradle b/camera/camera-lifecycle/build.gradle
index 2b934a8..cf970d9 100644
--- a/camera/camera-lifecycle/build.gradle
+++ b/camera/camera-lifecycle/build.gradle
@@ -30,6 +30,7 @@
     api(project(":camera:camera-core"))
     implementation("androidx.core:core:1.1.0")
     implementation(libs.autoValueAnnotations)
+    implementation("androidx.concurrent:concurrent-futures:1.0.0")
 
     annotationProcessor(libs.autoValue)
 
diff --git a/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt b/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt
index 9e81392..b2f6d00 100644
--- a/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt
+++ b/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt
@@ -49,7 +49,7 @@
 
 @SmallTest
 @SdkSuppress(minSdkVersion = 21)
-public class ProcessCameraProviderTest {
+class ProcessCameraProviderTest {
 
     private val context = ApplicationProvider.getApplicationContext() as Context
     private val lifecycleOwner0 = FakeLifecycleOwner()
@@ -58,7 +58,7 @@
     private lateinit var provider: ProcessCameraProvider
 
     @After
-    public fun tearDown() {
+    fun tearDown() {
         runBlocking {
             try {
                 val provider = ProcessCameraProvider.getInstance(context).await()
@@ -70,7 +70,7 @@
     }
 
     @Test
-    public fun canGetInstance_fromMetaData(): Unit = runBlocking {
+    fun canGetInstance_fromMetaData(): Unit = runBlocking {
         // Check the static invocation count for the test CameraXConfig.Provider which is defined
         // in the instrumentation test's AndroidManfiest.xml. It should be incremented after
         // retrieving the ProcessCameraProvider.
@@ -83,7 +83,7 @@
 
     @OptIn(ExperimentalCameraProviderConfiguration::class)
     @Test
-    public fun configuredGetInstance_doesNotUseMetaData() {
+    fun configuredGetInstance_doesNotUseMetaData() {
         ProcessCameraProvider.configureInstance(FakeAppConfig.create())
         runBlocking {
             // Check the static invocation count for the test CameraXConfig.Provider which is defined
@@ -100,7 +100,7 @@
 
     @OptIn(ExperimentalCameraProviderConfiguration::class)
     @Test
-    public fun configuredGetInstance_doesNotUseApplication() {
+    fun configuredGetInstance_doesNotUseApplication() {
         ProcessCameraProvider.configureInstance(FakeAppConfig.create())
         runBlocking {
             // Wrap the context with a TestAppContextWrapper and provide a context with an
@@ -115,7 +115,7 @@
     }
 
     @Test
-    public fun unconfiguredGetInstance_usesApplicationProvider(): Unit = runBlocking {
+    fun unconfiguredGetInstance_usesApplicationProvider(): Unit = runBlocking {
         val testApp = TestApplication(context.packageManager)
         val contextWrapper = TestAppContextWrapper(context, testApp)
         provider = ProcessCameraProvider.getInstance(contextWrapper).await()
@@ -125,7 +125,7 @@
 
     @OptIn(ExperimentalCameraProviderConfiguration::class)
     @Test
-    public fun multipleConfigureInstance_throwsISE() {
+    fun multipleConfigureInstance_throwsISE() {
         val config = FakeAppConfig.create()
         ProcessCameraProvider.configureInstance(config)
         assertThrows<IllegalStateException> {
@@ -135,7 +135,7 @@
 
     @OptIn(ExperimentalCameraProviderConfiguration::class)
     @Test
-    public fun configuredGetInstance_returnsProvider() {
+    fun configuredGetInstance_returnsProvider() {
         ProcessCameraProvider.configureInstance(FakeAppConfig.create())
         runBlocking {
             provider = ProcessCameraProvider.getInstance(context).await()
@@ -145,7 +145,7 @@
 
     @OptIn(ExperimentalCameraProviderConfiguration::class)
     @Test
-    public fun configuredGetInstance_usesConfiguredExecutor() {
+    fun configuredGetInstance_usesConfiguredExecutor() {
         var executeCalled = false
         val config =
             CameraXConfig.Builder.fromConfig(FakeAppConfig.create()).setCameraExecutor { runnable ->
@@ -163,7 +163,7 @@
 
     @OptIn(ExperimentalCameraProviderConfiguration::class)
     @Test
-    public fun canRetrieveCamera_withZeroUseCases() {
+    fun canRetrieveCamera_withZeroUseCases() {
         ProcessCameraProvider.configureInstance(FakeAppConfig.create())
         runBlocking(MainScope().coroutineContext) {
             provider = ProcessCameraProvider.getInstance(context).await()
@@ -174,7 +174,7 @@
     }
 
     @Test
-    public fun bindUseCase_isBound() {
+    fun bindUseCase_isBound() {
         ProcessCameraProvider.configureInstance(FakeAppConfig.create())
 
         runBlocking(MainScope().coroutineContext) {
@@ -191,7 +191,7 @@
     }
 
     @Test
-    public fun bindSecondUseCaseToDifferentLifecycle_firstUseCaseStillBound() {
+    fun bindSecondUseCaseToDifferentLifecycle_firstUseCaseStillBound() {
         ProcessCameraProvider.configureInstance(FakeAppConfig.create())
 
         runBlocking(MainScope().coroutineContext) {
@@ -219,7 +219,7 @@
     }
 
     @Test
-    public fun isNotBound_afterUnbind() {
+    fun isNotBound_afterUnbind() {
         ProcessCameraProvider.configureInstance(FakeAppConfig.create())
 
         runBlocking(MainScope().coroutineContext) {
@@ -240,7 +240,7 @@
     }
 
     @Test
-    public fun unbindFirstUseCase_secondUseCaseStillBound() {
+    fun unbindFirstUseCase_secondUseCaseStillBound() {
         ProcessCameraProvider.configureInstance(FakeAppConfig.create())
 
         runBlocking(MainScope().coroutineContext) {
@@ -264,7 +264,7 @@
     }
 
     @Test
-    public fun unbindAll_unbindsAllUseCasesFromCameras() {
+    fun unbindAll_unbindsAllUseCasesFromCameras() {
         ProcessCameraProvider.configureInstance(FakeAppConfig.create())
 
         runBlocking(MainScope().coroutineContext) {
@@ -284,7 +284,7 @@
     }
 
     @Test
-    public fun bindMultipleUseCases() {
+    fun bindMultipleUseCases() {
         ProcessCameraProvider.configureInstance(FakeAppConfig.create())
 
         runBlocking(MainScope().coroutineContext) {
@@ -303,7 +303,7 @@
     }
 
     @Test
-    public fun bind_createsDifferentLifecycleCameras_forDifferentLifecycles() {
+    fun bind_createsDifferentLifecycleCameras_forDifferentLifecycles() {
         ProcessCameraProvider.configureInstance(FakeAppConfig.create())
 
         runBlocking(MainScope().coroutineContext) {
@@ -326,7 +326,7 @@
     }
 
     @Test
-    public fun exception_withDestroyedLifecycle() {
+    fun exception_withDestroyedLifecycle() {
         ProcessCameraProvider.configureInstance(FakeAppConfig.create())
 
         runBlocking(MainScope().coroutineContext) {
@@ -341,7 +341,7 @@
     }
 
     @Test
-    public fun bind_returnTheSameCameraForSameSelectorAndLifecycleOwner() {
+    fun bind_returnTheSameCameraForSameSelectorAndLifecycleOwner() {
         ProcessCameraProvider.configureInstance(FakeAppConfig.create())
 
         runBlocking(MainScope().coroutineContext) {
@@ -367,7 +367,7 @@
     }
 
     @Test
-    public fun bindUseCases_withDifferentLensFacingButSameLifecycleOwner() {
+    fun bindUseCases_withDifferentLensFacingButSameLifecycleOwner() {
         ProcessCameraProvider.configureInstance(FakeAppConfig.create())
 
         runBlocking(MainScope().coroutineContext) {
@@ -389,7 +389,7 @@
     }
 
     @Test
-    public fun bindUseCases_withDifferentLensFacingAndLifecycle() {
+    fun bindUseCases_withDifferentLensFacingAndLifecycle() {
         ProcessCameraProvider.configureInstance(FakeAppConfig.create())
 
         runBlocking(MainScope().coroutineContext) {
@@ -417,7 +417,7 @@
     }
 
     @Test
-    public fun bindUseCases_withNotExistedLensFacingCamera() {
+    fun bindUseCases_withNotExistedLensFacingCamera() {
         val cameraFactoryProvider =
             CameraFactory.Provider { _, _, _ ->
                 val cameraFactory = FakeCameraFactory()
@@ -461,7 +461,7 @@
     }
 
     @Test
-    public fun lifecycleCameraIsNotActive_withZeroUseCases_bindBeforeLifecycleStarted() {
+    fun lifecycleCameraIsNotActive_withZeroUseCases_bindBeforeLifecycleStarted() {
         ProcessCameraProvider.configureInstance(FakeAppConfig.create())
         runBlocking(MainScope().coroutineContext) {
             provider = ProcessCameraProvider.getInstance(context).await()
@@ -474,7 +474,7 @@
     }
 
     @Test
-    public fun lifecycleCameraIsNotActive_withZeroUseCases_bindAfterLifecycleStarted() {
+    fun lifecycleCameraIsNotActive_withZeroUseCases_bindAfterLifecycleStarted() {
         ProcessCameraProvider.configureInstance(FakeAppConfig.create())
         runBlocking(MainScope().coroutineContext) {
             provider = ProcessCameraProvider.getInstance(context).await()
@@ -487,7 +487,7 @@
     }
 
     @Test
-    public fun lifecycleCameraIsActive_withUseCases_bindBeforeLifecycleStarted() {
+    fun lifecycleCameraIsActive_withUseCases_bindBeforeLifecycleStarted() {
         ProcessCameraProvider.configureInstance(FakeAppConfig.create())
         runBlocking(MainScope().coroutineContext) {
             provider = ProcessCameraProvider.getInstance(context).await()
@@ -503,7 +503,7 @@
     }
 
     @Test
-    public fun lifecycleCameraIsActive_withUseCases_bindAfterLifecycleStarted() {
+    fun lifecycleCameraIsActive_withUseCases_bindAfterLifecycleStarted() {
         ProcessCameraProvider.configureInstance(FakeAppConfig.create())
         runBlocking(MainScope().coroutineContext) {
             provider = ProcessCameraProvider.getInstance(context).await()
@@ -519,7 +519,7 @@
     }
 
     @Test
-    public fun lifecycleCameraIsNotActive_unbindUseCase() {
+    fun lifecycleCameraIsNotActive_unbindUseCase() {
         ProcessCameraProvider.configureInstance(FakeAppConfig.create())
         runBlocking(MainScope().coroutineContext) {
             provider = ProcessCameraProvider.getInstance(context).await()
@@ -537,7 +537,7 @@
     }
 
     @Test
-    public fun lifecycleCameraIsNotActive_unbindAll() {
+    fun lifecycleCameraIsNotActive_unbindAll() {
         ProcessCameraProvider.configureInstance(FakeAppConfig.create())
         runBlocking(MainScope().coroutineContext) {
             provider = ProcessCameraProvider.getInstance(context).await()
@@ -555,7 +555,7 @@
     }
 
     @Test
-    public fun getAvailableCameraInfos_usesAllCameras() {
+    fun getAvailableCameraInfos_usesAllCameras() {
         ProcessCameraProvider.configureInstance(FakeAppConfig.create())
         runBlocking {
             provider = ProcessCameraProvider.getInstance(context).await()
@@ -564,7 +564,7 @@
     }
 
     @Test
-    public fun getAvailableCameraInfos_usesFilteredCameras() {
+    fun getAvailableCameraInfos_usesFilteredCameras() {
         ProcessCameraProvider.configureInstance(
             FakeAppConfig.create(CameraSelector.DEFAULT_BACK_CAMERA)
         )
@@ -578,6 +578,28 @@
             assertThat(cameraInfo.lensFacing).isEqualTo(CameraSelector.LENS_FACING_BACK)
         }
     }
+
+    @Test
+    fun cannotConfigureTwice() {
+        ProcessCameraProvider.configureInstance(FakeAppConfig.create())
+        assertThrows<IllegalStateException> {
+            ProcessCameraProvider.configureInstance(FakeAppConfig.create())
+        }
+    }
+
+    @Test
+    fun shutdown_clearsPreviousConfiguration() {
+        ProcessCameraProvider.configureInstance(FakeAppConfig.create())
+
+        runBlocking {
+            provider = ProcessCameraProvider.getInstance(context).await()
+            // Clear the configuration so we can reinit
+            provider.shutdown().await()
+        }
+
+        // Should not throw exception
+        ProcessCameraProvider.configureInstance(FakeAppConfig.create())
+    }
 }
 
 private class TestAppContextWrapper(base: Context, val app: Application? = null) :
diff --git a/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/ProcessCameraProvider.java b/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/ProcessCameraProvider.java
index bc15552..01a7d5f 100644
--- a/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/ProcessCameraProvider.java
+++ b/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/ProcessCameraProvider.java
@@ -20,6 +20,7 @@
 import android.content.Context;
 import android.os.Handler;
 
+import androidx.annotation.GuardedBy;
 import androidx.annotation.MainThread;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -46,8 +47,11 @@
 import androidx.camera.core.impl.utils.ContextUtil;
 import androidx.camera.core.impl.utils.Threads;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
+import androidx.camera.core.impl.utils.futures.FutureCallback;
+import androidx.camera.core.impl.utils.futures.FutureChain;
 import androidx.camera.core.impl.utils.futures.Futures;
 import androidx.camera.core.internal.CameraUseCaseAdapter;
+import androidx.concurrent.futures.CallbackToFutureAdapter;
 import androidx.core.util.Preconditions;
 import androidx.lifecycle.Lifecycle;
 import androidx.lifecycle.LifecycleOwner;
@@ -82,8 +86,16 @@
 
     private static final ProcessCameraProvider sAppInstance = new ProcessCameraProvider();
 
-    private final LifecycleCameraRepository
-            mLifecycleCameraRepository = new LifecycleCameraRepository();
+    private final Object mLock = new Object();
+    @GuardedBy("mLock")
+    private CameraXConfig.Provider mCameraXConfigProvider = null;
+    @GuardedBy("mLock")
+    private ListenableFuture<CameraX> mCameraXInitializeFuture;
+    @GuardedBy("mLock")
+    private ListenableFuture<Void> mCameraXShutdownFuture = Futures.immediateFuture(null);
+
+    private final LifecycleCameraRepository mLifecycleCameraRepository =
+            new LifecycleCameraRepository();
     private CameraX mCameraX;
     private Context mContext;
 
@@ -150,14 +162,49 @@
      * @see #configureInstance(CameraXConfig)
      */
     @NonNull
-    public static ListenableFuture<ProcessCameraProvider> getInstance(
-            @NonNull Context context) {
+    public static ListenableFuture<ProcessCameraProvider> getInstance(@NonNull Context context) {
         Preconditions.checkNotNull(context);
-        return Futures.transform(CameraX.getOrCreateInstance(context), cameraX -> {
-            sAppInstance.setCameraX(cameraX);
-            sAppInstance.setContext(ContextUtil.getApplicationContext(context));
-            return sAppInstance;
-        }, CameraXExecutors.directExecutor());
+        return Futures.transform(sAppInstance.getOrCreateCameraXInstance(context),
+                cameraX -> {
+                    sAppInstance.setCameraX(cameraX);
+                    sAppInstance.setContext(ContextUtil.getApplicationContext(context));
+                    return sAppInstance;
+                }, CameraXExecutors.directExecutor());
+    }
+
+    private ListenableFuture<CameraX> getOrCreateCameraXInstance(@NonNull Context context) {
+        synchronized (mLock) {
+            if (mCameraXInitializeFuture != null) {
+                return mCameraXInitializeFuture;
+            }
+
+            CameraX cameraX = new CameraX(context, mCameraXConfigProvider);
+
+            mCameraXInitializeFuture = CallbackToFutureAdapter.getFuture(completer -> {
+                synchronized (mLock) {
+                    ListenableFuture<Void> future =
+                            FutureChain.from(mCameraXShutdownFuture).transformAsync(
+                                    input -> cameraX.getInitializeFuture(),
+                                    CameraXExecutors.directExecutor());
+
+                    Futures.addCallback(future, new FutureCallback<Void>() {
+                        @Override
+                        public void onSuccess(@Nullable Void result) {
+                            completer.set(cameraX);
+                        }
+
+                        @Override
+                        public void onFailure(Throwable t) {
+                            completer.setException(t);
+                        }
+                    }, CameraXExecutors.directExecutor());
+                }
+
+                return "ProcessCameraProvider-initializeCameraX";
+            });
+
+            return mCameraXInitializeFuture;
+        }
     }
 
     /**
@@ -192,7 +239,18 @@
      */
     @ExperimentalCameraProviderConfiguration
     public static void configureInstance(@NonNull CameraXConfig cameraXConfig) {
-        CameraX.configureInstance(cameraXConfig);
+        sAppInstance.configureInstanceInternal(cameraXConfig);
+    }
+
+    private void configureInstanceInternal(@NonNull CameraXConfig cameraXConfig) {
+        synchronized (mLock) {
+            Preconditions.checkNotNull(cameraXConfig);
+            Preconditions.checkState(mCameraXConfigProvider == null, "CameraX has "
+                    + "already been configured. To use a different configuration, shutdown() must"
+                    + " be called.");
+
+            mCameraXConfigProvider = () -> cameraXConfig;
+        }
     }
 
     /**
@@ -214,7 +272,18 @@
     @NonNull
     public ListenableFuture<Void> shutdown() {
         mLifecycleCameraRepository.clear();
-        return CameraX.shutdown();
+
+        ListenableFuture<Void> shutdownFuture = mCameraX != null ? mCameraX.shutdown() :
+                Futures.immediateFuture(null);
+
+        synchronized (mLock) {
+            mCameraXConfigProvider = null;
+            mCameraXInitializeFuture = null;
+            mCameraXShutdownFuture = shutdownFuture;
+        }
+        mCameraX = null;
+        mContext = null;
+        return shutdownFuture;
     }
 
     private void setCameraX(CameraX cameraX) {
@@ -397,6 +466,10 @@
 
         LinkedHashSet<CameraInternal> cameraInternals =
                 modifiedSelector.filter(mCameraX.getCameraRepository().getCameras());
+        if (cameraInternals.isEmpty()) {
+            throw new IllegalArgumentException("Provided camera selector unable to resolve a "
+                    + "camera for the given use case");
+        }
         CameraUseCaseAdapter.CameraId cameraId =
                 CameraUseCaseAdapter.generateCameraId(cameraInternals);
 
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/CameraUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/CameraUtil.java
index 69745ab..fc6a6cd 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/CameraUtil.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/CameraUtil.java
@@ -314,7 +314,7 @@
     /**
      * Creates the CameraUseCaseAdapter that would be created with the given CameraSelector.
      *
-     * <p> This requires that {@link CameraX#initialize(Context, CameraXConfig)} has been called
+     * <p> This requires that {@link CameraXUtil#initialize(Context, CameraXConfig)} has been called
      * to properly initialize the cameras.
      *
      * <p>A new CameraUseCaseAdapter instance will be created every time this method is called.
@@ -331,7 +331,8 @@
     public static CameraUseCaseAdapter createCameraUseCaseAdapter(@NonNull Context context,
             @NonNull CameraSelector cameraSelector) {
         try {
-            CameraX cameraX = CameraX.getOrCreateInstance(context).get(5000, TimeUnit.MILLISECONDS);
+            CameraX cameraX = CameraXUtil.getOrCreateInstance(context, null).get(5000,
+                    TimeUnit.MILLISECONDS);
             LinkedHashSet<CameraInternal> cameras =
                     cameraSelector.filter(cameraX.getCameraRepository().getCameras());
             return new CameraUseCaseAdapter(cameras,
@@ -345,7 +346,7 @@
      * Creates the CameraUseCaseAdapter that would be created with the given CameraSelector and
      * attaches the UseCases.
      *
-     * <p> This requires that {@link CameraX#initialize(Context, CameraXConfig)} has been called
+     * <p> This requires that {@link CameraXUtil#initialize(Context, CameraXConfig)} has been called
      * to properly initialize the cameras.
      *
      * <p>A new CameraUseCaseAdapter instance will be created every time this method is called.
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/CameraXUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/CameraXUtil.java
new file mode 100644
index 0000000..133ddeb
--- /dev/null
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/CameraXUtil.java
@@ -0,0 +1,231 @@
+/*
+ * 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 android.annotation.SuppressLint;
+import android.content.Context;
+
+import androidx.annotation.GuardedBy;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.CameraX;
+import androidx.camera.core.CameraXConfig;
+import androidx.camera.core.InitializationException;
+import androidx.camera.core.Logger;
+import androidx.camera.core.impl.utils.executor.CameraXExecutors;
+import androidx.camera.core.impl.utils.futures.FutureCallback;
+import androidx.camera.core.impl.utils.futures.FutureChain;
+import androidx.camera.core.impl.utils.futures.Futures;
+import androidx.concurrent.futures.CallbackToFutureAdapter;
+import androidx.core.util.Preconditions;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+import java.util.concurrent.ExecutionException;
+
+/**
+ * Utility functions for creating and shutting down an CameraX instance.
+ *
+ * {@link #initialize} or {@link #getOrCreateInstance} can be used to get or create a CameraX
+ * instance. {@link #shutdown()} can be used to shutdown the existing instance. The utility class
+ * helps to manage that only one CameraX instance exists at a time. If a new CameraX instance
+ * with different config is needed, {@link #shutdown()} needs to be called first and then calling
+ * {@link #initialize} or {@link #getOrCreateInstance} to create a new one with the desired
+ * settings.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public class CameraXUtil {
+    private static final String TAG = "CameraXUtil";
+    private static final CameraXUtil sInstance = new CameraXUtil();
+
+    final Object mLock = new Object();
+    @GuardedBy("mLock")
+    private CameraX mCameraX = null;
+    @GuardedBy("mLock")
+    private ListenableFuture<Void> mInitializeFuture =
+            Futures.immediateFailedFuture(new IllegalStateException("CameraX is not initialized."));
+    @GuardedBy("mLock")
+    private ListenableFuture<Void> mShutdownFuture = Futures.immediateFuture(null);
+
+    /**
+     * Initializes a CameraX instance with the given context and application configuration.
+     *
+     * <p>The context enables CameraX to obtain access to necessary services, including the camera
+     * service. For example, the context can be provided by the application.
+     *
+     * @param context       to attach
+     * @param cameraXConfig configuration options for this application session.
+     * @return A {@link ListenableFuture} representing the initialization task. This future may
+     * fail with an {@link InitializationException} and associated cause that can be retrieved by
+     * {@link Throwable#getCause()). The cause will be a {@link CameraUnavailableException} if it
+     * fails to access any camera during initialization.
+     */
+    @NonNull
+    public static ListenableFuture<Void> initialize(@NonNull Context context,
+            @NonNull CameraXConfig cameraXConfig) {
+        return sInstance.initializeInternal(context, () -> cameraXConfig);
+    }
+
+    @NonNull
+    private ListenableFuture<Void> initializeInternal(@NonNull Context context,
+            @Nullable CameraXConfig.Provider configProvider) {
+        synchronized (mLock) {
+            Preconditions.checkNotNull(context);
+            Preconditions.checkState(mCameraX == null, "A CameraX instance has already been "
+                    + "initialized.");
+            CameraX cameraX = new CameraX(context, configProvider);
+            mCameraX = cameraX;
+            mInitializeFuture = CallbackToFutureAdapter.getFuture(completer -> {
+                synchronized (mLock) {
+                    // The sShutdownFuture should always be successful, otherwise it will not
+                    // propagate to transformAsync() due to the behavior of FutureChain.
+                    ListenableFuture<Void> future = FutureChain.from(mShutdownFuture)
+                            .transformAsync(input -> cameraX.getInitializeFuture(),
+                                    CameraXExecutors.directExecutor());
+
+                    Futures.addCallback(future, new FutureCallback<Void>() {
+                        @Override
+                        public void onSuccess(@Nullable Void result) {
+                            completer.set(null);
+                        }
+
+                        @SuppressLint("SyntheticAccessor")
+                        @SuppressWarnings("FutureReturnValueIgnored")
+                        @Override
+                        public void onFailure(Throwable t) {
+                            Logger.w(TAG, "CameraX initialize failed", t);
+                            // Call shutdown() automatically, if initialization fails.
+                            synchronized (mLock) {
+                                // Make sure it is the same instance to prevent reinitialization
+                                // during initialization.
+                                if (mCameraX == cameraX) {
+                                    shutdownInternal();
+                                }
+                            }
+                            completer.setException(t);
+                        }
+                    }, CameraXExecutors.directExecutor());
+                    return "CameraXUtil-initialize";
+                }
+            });
+
+            return mInitializeFuture;
+        }
+    }
+
+    /**
+     * Shutdown the created CameraX instance so that a new CameraX instance can be initialized
+     * again.
+     *
+     * @return A {@link ListenableFuture} representing the shutdown task.
+     */
+    @NonNull
+    public static ListenableFuture<Void> shutdown() {
+        return sInstance.shutdownInternal();
+    }
+
+    @NonNull
+    private ListenableFuture<Void> shutdownInternal() {
+        synchronized (mLock) {
+            if (mCameraX == null) {
+                // If it is already or will be shutdown, return the future directly.
+                return mShutdownFuture;
+            }
+
+            CameraX cameraX = mCameraX;
+            mCameraX = null;
+
+            // Do not use FutureChain to chain the initFuture, because FutureChain.transformAsync()
+            // will not propagate if the input initFuture is failed. We want to always
+            // shutdown the CameraX instance to ensure that resources are freed.
+            mShutdownFuture = Futures.nonCancellationPropagating(CallbackToFutureAdapter.getFuture(
+                    completer -> {
+                        synchronized (mLock) {
+                            // Wait initialize complete
+                            mInitializeFuture.addListener(() -> {
+                                // Wait shutdownInternal complete
+                                Futures.propagate(cameraX.shutdown(), completer);
+                            }, CameraXExecutors.directExecutor());
+                            return "CameraXUtil shutdown";
+                        }
+                    }));
+            return mShutdownFuture;
+        }
+    }
+
+    /**
+     * Returns a future which contains a CameraX instance after initialization is complete.
+     *
+     * @param configProvider If this is non-null, it will be used to run the initialization
+     *                      process. Otherwise, the initialization process will attempt to
+     *                      retrieve the config provider from Application or meta-data.
+     */
+    @SuppressWarnings("FutureReturnValueIgnored") // shutdownLocked() should always succeed.
+    @NonNull
+    public static ListenableFuture<CameraX> getOrCreateInstance(@NonNull Context context,
+            @Nullable CameraXConfig.Provider configProvider) {
+        return sInstance.getOrCreateInstanceInternal(context, configProvider);
+    }
+
+    @NonNull
+    private ListenableFuture<CameraX> getOrCreateInstanceInternal(@NonNull Context context,
+            @Nullable CameraXConfig.Provider configProvider) {
+        Preconditions.checkNotNull(context, "Context must not be null.");
+        synchronized (mLock) {
+            ListenableFuture<CameraX> instanceFuture = getInstanceLocked();
+            if (instanceFuture.isDone()) {
+                try {
+                    instanceFuture.get();
+                } catch (InterruptedException e) {
+                    // Should not be possible since future is complete.
+                    throw new RuntimeException("Unexpected thread interrupt. Should not be "
+                            + "possible since future is already complete.", e);
+                } catch (ExecutionException e) {
+                    // Either initialization failed or initialize() has not been called, ensure we
+                    // can try to reinitialize.
+                    ListenableFuture<Void> shutdownFuture = shutdownInternal();
+                    shutdownFuture.addListener(() -> {
+                        Logger.w(TAG, "Shutdown due to get or create CameraX instance failed.");
+                    }, CameraXExecutors.directExecutor());
+                    instanceFuture = null;
+                }
+            }
+
+            if (instanceFuture == null && initializeInternal(context, configProvider) != null) {
+                instanceFuture = getInstanceLocked();
+            }
+
+            return instanceFuture;
+        }
+    }
+
+    @GuardedBy("mLock")
+    @NonNull
+    private ListenableFuture<CameraX> getInstanceLocked() {
+        CameraX cameraX = mCameraX;
+        if (cameraX == null) {
+            return Futures.immediateFailedFuture(new IllegalStateException("Must "
+                    + "call CameraXUtil.initialize() first"));
+        }
+
+        return Futures.transform(mInitializeFuture, nullVoid -> cameraX,
+                CameraXExecutors.directExecutor());
+    }
+
+    private CameraXUtil() {}
+}
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/activity/CameraXTestActivity.java b/camera/camera-testing/src/main/java/androidx/camera/testing/activity/CameraXTestActivity.java
index 0d65e3a..8d4a361 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/activity/CameraXTestActivity.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/activity/CameraXTestActivity.java
@@ -37,6 +37,7 @@
 import androidx.camera.core.impl.CameraInternal;
 import androidx.camera.core.internal.CameraUseCaseAdapter;
 import androidx.camera.testing.CameraUtil;
+import androidx.camera.testing.CameraXUtil;
 import androidx.camera.testing.R;
 import androidx.camera.testing.SurfaceTextureProvider;
 import androidx.test.espresso.idling.CountingIdlingResource;
@@ -145,7 +146,7 @@
                 createSurfaceTextureProvider(new SurfaceTextureCallbackImpl(textureView)));
 
         try {
-            final CameraX cameraX = CameraX.getOrCreateInstance(this).get();
+            final CameraX cameraX = CameraXUtil.getOrCreateInstance(this, null).get();
             final LinkedHashSet<CameraInternal> cameras =
                     cameraSelector.filter(cameraX.getCameraRepository().getCameras());
             mCameraUseCaseAdapter = new CameraUseCaseAdapter(cameras,
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraFactory.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraFactory.java
index 547ef69..a0f82d6c 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraFactory.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraFactory.java
@@ -155,12 +155,12 @@
             try {
                 final CameraInternal camera = callable.call();
                 try {
-                    // CameraSelector.filter() throws an exception if all the cameras it takes
-                    // are filtered out. In the scenario below, only one camera is processed, so
-                    // if an exception isn't thrown, it's safe to add the camera id.
-                    mAvailableCamerasSelector.filter(
-                            new LinkedHashSet<>(Collections.singleton(camera)));
-                    filteredCameraIds.add(entry.getKey());
+                    LinkedHashSet<CameraInternal> filteredCameraInternals =
+                            mAvailableCamerasSelector.filter(
+                                    new LinkedHashSet<>(Collections.singleton(camera)));
+                    if (!filteredCameraInternals.isEmpty()) {
+                        filteredCameraIds.add(entry.getKey());
+                    }
                 } catch (IllegalArgumentException exception) {
                     // No op. The camera was not selected by the selector
                 }
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeImageInfo.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeImageInfo.java
index 6ba8e75..ba97ce5 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeImageInfo.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeImageInfo.java
@@ -16,6 +16,8 @@
 
 package androidx.camera.testing.fakes;
 
+import android.graphics.Matrix;
+
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 import androidx.camera.core.ImageInfo;
@@ -28,7 +30,9 @@
  */
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public final class FakeImageInfo implements ImageInfo {
-    private MutableTagBundle mTagBundle = MutableTagBundle.create();
+    @NonNull private MutableTagBundle mTagBundle = MutableTagBundle.create();
+    @NonNull private Matrix mSensorToBufferTransformMatrix = new Matrix();
+
     private long mTimestamp;
     private int mRotationDegrees;
 
@@ -42,14 +46,18 @@
         mTagBundle.addTagBundle(tagBundle);
     }
 
-
     public void setTimestamp(long timestamp) {
         mTimestamp = timestamp;
     }
+
     public void setRotationDegrees(int rotationDegrees) {
         mRotationDegrees = rotationDegrees;
     }
 
+    public void setSensorToBufferTransformMatrix(@NonNull Matrix sensorToBufferTransformMatrix) {
+        mSensorToBufferTransformMatrix = sensorToBufferTransformMatrix;
+    }
+
     @NonNull
     @Override
     public TagBundle getTagBundle() {
@@ -66,6 +74,12 @@
         return mRotationDegrees;
     }
 
+    @NonNull
+    @Override
+    public Matrix getSensorToBufferTransformMatrix() {
+        return mSensorToBufferTransformMatrix;
+    }
+
     @Override
     public void populateExifData(@NonNull ExifData.Builder exifBuilder) {
         exifBuilder.setOrientationDegrees(mRotationDegrees);
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 0499a61..de08cc3 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
@@ -31,7 +31,6 @@
 import android.util.Size
 import androidx.camera.camera2.Camera2Config
 import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraX
 import androidx.camera.core.Preview
 import androidx.camera.core.SurfaceRequest
 import androidx.camera.core.impl.ImageFormatConstants
@@ -40,9 +39,11 @@
 import androidx.camera.core.internal.CameraUseCaseAdapter
 import androidx.camera.testing.AudioUtil
 import androidx.camera.testing.CameraUtil
+import androidx.camera.testing.CameraXUtil
 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_INVALID_OUTPUT_OPTIONS
 import androidx.camera.video.VideoRecordEvent.Finalize.ERROR_SOURCE_INACTIVE
 import androidx.camera.video.internal.compat.quirk.DeactivateEncoderSurfaceBeforeStopEncoderQuirk
 import androidx.camera.video.internal.compat.quirk.DeviceQuirks
@@ -63,6 +64,7 @@
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
+import org.junit.rules.TestName
 import org.junit.rules.TestRule
 import org.junit.runner.RunWith
 import org.mockito.ArgumentCaptor
@@ -90,6 +92,9 @@
     var cameraRule: TestRule = CameraUtil.grantCameraPermissionAndPreTest()
 
     @get:Rule
+    var testName: TestName = TestName()
+
+    @get:Rule
     val permissionRule: GrantPermissionRule =
         GrantPermissionRule.grant(
             Manifest.permission.WRITE_EXTERNAL_STORAGE,
@@ -118,23 +123,36 @@
         )
         assumeTrue(AudioUtil.canStartAudioRecord(MediaRecorder.AudioSource.CAMCORDER))
 
-        CameraX.initialize(context, Camera2Config.defaultConfig()).get()
+        CameraXUtil.initialize(
+            context,
+            Camera2Config.defaultConfig()
+        ).get()
         cameraUseCaseAdapter = CameraUtil.createCameraUseCaseAdapter(context, cameraSelector)
 
         recorder = Recorder.Builder().build()
 
         // Using Preview so that the surface provider could be set to control when to issue the
         // surface request.
-        val resolution = QualitySelector.getResolution(
-            cameraUseCaseAdapter.cameraInfo,
-            QualitySelector.QUALITY_LOWEST
-        )
-        assumeTrue(resolution != null)
+        val cameraInfo = cameraUseCaseAdapter.cameraInfo
+        val candidates = mutableSetOf<Size>().apply {
+            if (testName.methodName == "setFileSizeLimit") {
+                QualitySelector.getResolution(cameraInfo, QualitySelector.QUALITY_FHD)
+                    ?.let { add(it) }
+                QualitySelector.getResolution(cameraInfo, QualitySelector.QUALITY_HD)
+                    ?.let { add(it) }
+                QualitySelector.getResolution(cameraInfo, QualitySelector.QUALITY_SD)
+                    ?.let { add(it) }
+            }
+            QualitySelector.getResolution(cameraInfo, QualitySelector.QUALITY_LOWEST)
+                ?.let { add(it) }
+        }
+        assumeTrue(candidates.isNotEmpty())
+
         val resolutions: List<android.util.Pair<Int, Array<Size>>> =
             listOf<android.util.Pair<Int, Array<Size>>>(
                 android.util.Pair.create(
                     ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE,
-                    arrayOf(resolution!!)
+                    candidates.toTypedArray()
                 )
             )
         preview = Preview.Builder().setSupportedResolutions(resolutions).build()
@@ -184,7 +202,7 @@
             }
         }
 
-        CameraX.shutdown().get(10, TimeUnit.SECONDS)
+        CameraXUtil.shutdown().get(10, TimeUnit.SECONDS)
     }
 
     @Test
@@ -272,29 +290,55 @@
         clearInvocations(videoRecordEventListener)
         invokeSurfaceRequest()
         val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
-        ParcelFileDescriptor.open(
+        val pfd = ParcelFileDescriptor.open(
             file,
             ParcelFileDescriptor.MODE_READ_WRITE
-        ).use { pfd ->
-            val activeRecording = recorder
-                .prepareRecording(context, FileDescriptorOutputOptions.Builder(pfd).build())
-                .withEventListener(CameraXExecutors.directExecutor(), videoRecordEventListener)
-                .withAudioEnabled()
-                .start()
+        )
+        val activeRecording = recorder
+            .prepareRecording(context, FileDescriptorOutputOptions.Builder(pfd).build())
+            .withEventListener(CameraXExecutors.directExecutor(), videoRecordEventListener)
+            .withAudioEnabled()
+            .start()
 
-            val inOrder = inOrder(videoRecordEventListener)
-            inOrder.verify(videoRecordEventListener, timeout(1000L))
-                .accept(any(VideoRecordEvent.Start::class.java))
-            inOrder.verify(videoRecordEventListener, timeout(15000L).atLeast(5))
-                .accept(any(VideoRecordEvent.Status::class.java))
+        // ParcelFileDescriptor should be safe to close after PendingRecording#start.
+        pfd.close()
 
-            activeRecording.stopSafely()
+        val inOrder = inOrder(videoRecordEventListener)
+        inOrder.verify(videoRecordEventListener, timeout(1000L))
+            .accept(any(VideoRecordEvent.Start::class.java))
+        inOrder.verify(videoRecordEventListener, timeout(15000L).atLeast(5))
+            .accept(any(VideoRecordEvent.Status::class.java))
 
-            inOrder.verify(videoRecordEventListener, timeout(FINALIZE_TIMEOUT))
-                .accept(any(VideoRecordEvent.Finalize::class.java))
+        activeRecording.stopSafely()
 
-            checkFileHasAudioAndVideo(Uri.fromFile(file))
-        }
+        inOrder.verify(videoRecordEventListener, timeout(FINALIZE_TIMEOUT))
+            .accept(any(VideoRecordEvent.Finalize::class.java))
+
+        checkFileHasAudioAndVideo(Uri.fromFile(file))
+
+        file.delete()
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = 26)
+    fun recordToFileDescriptor_withClosedFileDescriptor_receiveError() {
+        clearInvocations(videoRecordEventListener)
+        invokeSurfaceRequest()
+        val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
+        val pfd = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_WRITE)
+
+        pfd.close()
+
+        recorder.prepareRecording(context, FileDescriptorOutputOptions
+            .Builder(pfd).build())
+            .withEventListener(CameraXExecutors.directExecutor(), videoRecordEventListener)
+            .withAudioEnabled()
+            .start()
+
+        val captor = ArgumentCaptor.forClass(VideoRecordEvent::class.java)
+        verify(videoRecordEventListener).accept(captor.capture())
+        val finalize = captor.value as VideoRecordEvent.Finalize
+        assertThat(finalize.error).isEqualTo(ERROR_INVALID_OUTPUT_OPTIONS)
 
         file.delete()
     }
@@ -1107,6 +1151,10 @@
     }
 
     private fun runFileSizeLimitTest(fileSizeLimit: Long) {
+        // For the file size is small, the final file length possibly exceeds the file size limit
+        // after adding the file header. We still add the buffer for the tolerance of comparing the
+        // file length and file size limit.
+        val sizeLimitBuffer = 50 * 1024 // 50k threshold buffer
         invokeSurfaceRequest()
         val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
         val outputOptions = FileOutputOptions.Builder(file)
@@ -1115,6 +1163,7 @@
 
         val activeRecording = recorder
             .prepareRecording(context, outputOptions)
+            .withAudioEnabled()
             .withEventListener(CameraXExecutors.directExecutor(), videoRecordEventListener)
             .start()
 
@@ -1129,9 +1178,9 @@
         assertThat(captor.value).isInstanceOf(VideoRecordEvent.Finalize::class.java)
         val finalize = captor.value as VideoRecordEvent.Finalize
         assertThat(finalize.error).isEqualTo(ERROR_FILE_SIZE_LIMIT_REACHED)
-        assertThat(file.length()).isLessThan(fileSizeLimit)
+        assertThat(file.length()).isLessThan(fileSizeLimit + sizeLimitBuffer)
 
         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 44095f6..53c1553 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
@@ -23,13 +23,13 @@
 import androidx.camera.camera2.Camera2Config
 import androidx.camera.core.CameraInfo
 import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraX
 import androidx.camera.core.SurfaceRequest
 import androidx.camera.core.UseCase
 import androidx.camera.core.impl.MutableStateObservable
 import androidx.camera.core.impl.Observable
 import androidx.camera.core.internal.CameraUseCaseAdapter
 import androidx.camera.testing.CameraUtil
+import androidx.camera.testing.CameraXUtil
 import androidx.camera.testing.GLUtil
 import androidx.camera.video.QualitySelector.QUALITY_LOWEST
 import androidx.camera.video.VideoOutput.StreamState
@@ -72,7 +72,10 @@
 
     @Before
     fun setUp() {
-        CameraX.initialize(context, Camera2Config.defaultConfig()).get()
+        CameraXUtil.initialize(
+            context,
+            Camera2Config.defaultConfig()
+        ).get()
 
         cameraUseCaseAdapter = CameraUtil.createCameraUseCaseAdapter(context, cameraSelector)
         cameraInfo = cameraUseCaseAdapter.cameraInfo
@@ -87,7 +90,7 @@
                 }
             }
         }
-        CameraX.shutdown().get(10, TimeUnit.SECONDS)
+        CameraXUtil.shutdown().get(10, TimeUnit.SECONDS)
     }
 
     @Test
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 f15b4e1..696f9ea 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
@@ -27,7 +27,6 @@
 import android.view.Surface
 import androidx.camera.camera2.Camera2Config
 import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraX
 import androidx.camera.core.CameraXConfig
 import androidx.camera.core.Preview
 import androidx.camera.core.Preview.SurfaceProvider
@@ -36,6 +35,7 @@
 import androidx.camera.core.impl.utils.executor.CameraXExecutors
 import androidx.camera.core.internal.CameraUseCaseAdapter
 import androidx.camera.testing.CameraUtil
+import androidx.camera.testing.CameraXUtil
 import androidx.camera.testing.SurfaceTextureProvider
 import androidx.camera.testing.SurfaceTextureProvider.SurfaceTextureCallback
 import androidx.camera.video.QualitySelector
@@ -112,7 +112,7 @@
         )
 
         val cameraXConfig: CameraXConfig = Camera2Config.defaultConfig()
-        CameraX.initialize(context, cameraXConfig).get()
+        CameraXUtil.initialize(context, cameraXConfig).get()
 
         camera = CameraUtil.createCameraUseCaseAdapter(context, cameraSelector)
 
@@ -156,7 +156,7 @@
         }
 
         // Ensure all cameras are released for the next test
-        CameraX.shutdown()[10, TimeUnit.SECONDS]
+        CameraXUtil.shutdown()[10, TimeUnit.SECONDS]
     }
 
     @Test
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 f2f95ff..82987fe 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
@@ -133,8 +133,8 @@
      * @return this pending recording
      * @throws IllegalStateException if the {@link Recorder} this recording is associated to
      * doesn't support audio.
-     * @throws SecurityException if the current application does not have the
-     * {@link Manifest.permission#RECORD_AUDIO} granted.
+     * @throws SecurityException if the {@link Manifest.permission#RECORD_AUDIO} permission
+     * is denied for the current application.
      */
     @RequiresPermission(Manifest.permission.RECORD_AUDIO)
     @NonNull
@@ -176,8 +176,7 @@
      * 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.
+     * active recording.
      */
     @NonNull
     @CheckResult
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 a7390f2..60b89d1 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
@@ -57,6 +57,7 @@
 import androidx.camera.core.impl.Observable;
 import androidx.camera.core.impl.StateObservable;
 import androidx.camera.core.impl.annotation.ExecutedBy;
+import androidx.camera.core.impl.utils.CloseGuardHelper;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.camera.core.impl.utils.futures.FutureCallback;
 import androidx.camera.core.impl.utils.futures.Futures;
@@ -96,6 +97,7 @@
 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;
 
 /**
@@ -681,20 +683,33 @@
                     case STOPPING:
                         // Fall-through
                     case INITIALIZING:
-                        mPendingRecordingRecord = RecordingRecord.from(pendingRecording,
-                                recordingId);
-                        // The recording will automatically start once the initialization completes.
-                        setState(State.PENDING_RECORDING);
-                        break;
+                        // Fall-through
                     case IDLING:
-                        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);
+                        if (mState == State.IDLING) {
+                            Preconditions.checkState(
+                                    mActiveRecordingRecord == null
+                                            && mPendingRecordingRecord == null,
+                                    "Expected recorder to be idle but a recording is either "
+                                            + "pending or in progress.");
+                        }
+                        try {
+                            RecordingRecord recordingRecord = RecordingRecord.from(pendingRecording,
+                                    recordingId);
+                            recordingRecord.initializeRecording(
+                                    pendingRecording.getApplicationContext());
+                            mPendingRecordingRecord = recordingRecord;
+                            if (mState == State.IDLING) {
+                                setState(State.PENDING_RECORDING);
+                                mSequentialExecutor.execute(this::tryServicePendingRecording);
+                            } else {
+                                setState(State.PENDING_RECORDING);
+                                // The recording will automatically start once the initialization
+                                // completes.
+                            }
+                        } catch (IOException e) {
+                            error = ERROR_INVALID_OUTPUT_OPTIONS;
+                            errorCause = e;
+                        }
                         break;
                     case ERROR:
                         error = ERROR_RECORDER_ERROR;
@@ -872,6 +887,7 @@
 
     private void finalizePendingRecording(@NonNull RecordingRecord recordingToFinalize,
             @VideoRecordError int error, @Nullable Throwable cause) {
+        recordingToFinalize.finalizeRecording(Uri.EMPTY);
         recordingToFinalize.updateVideoRecordEvent(
                 VideoRecordEvent.finalizeWithError(
                         recordingToFinalize.getOutputOptions(),
@@ -1306,13 +1322,21 @@
             }
 
             try {
-                setupMediaMuxer(recordingToStart.getOutputOptions());
+                int muxerOutputFormat = MediaSpec.outputFormatToMuxerFormat(
+                        getObservableData(mMediaSpec).getOutputFormat());
+                mMediaMuxer = recordingToStart.performOneTimeMediaMuxerCreation(muxerOutputFormat,
+                        uri -> mOutputUri = uri);
             } catch (IOException e) {
                 onInProgressRecordingInternalError(recordingToStart, ERROR_INVALID_OUTPUT_OPTIONS,
                         e);
                 return;
             }
 
+            // TODO: Add more metadata to MediaMuxer, e.g. location information.
+            if (mSurfaceTransformationInfo != null) {
+                mMediaMuxer.setOrientationHint(mSurfaceTransformationInfo.getRotationDegrees());
+            }
+
             mVideoTrackIndex = mMediaMuxer.addTrack(mVideoOutputConfig.getMediaFormat());
             if (isAudioEnabled()) {
                 mAudioTrackIndex = mMediaMuxer.addTrack(mAudioOutputConfig.getMediaFormat());
@@ -1327,76 +1351,6 @@
         }
     }
 
-    @SuppressLint("WrongConstant")
-    @ExecutedBy("mSequentialExecutor")
-    private void setupMediaMuxer(@NonNull OutputOptions options) throws IOException {
-        int muxerOutputFormat = MediaSpec.outputFormatToMuxerFormat(
-                getObservableData(mMediaSpec).getOutputFormat());
-        if (options instanceof FileOutputOptions) {
-            FileOutputOptions fileOutputOptions = (FileOutputOptions) options;
-            File file = fileOutputOptions.getFile();
-            if (!OutputUtil.createParentFolder(file)) {
-                Logger.w(TAG, "Failed to create folder for " + file.getAbsolutePath());
-            }
-            mMediaMuxer = new MediaMuxer(file.getAbsolutePath(), muxerOutputFormat);
-            mOutputUri = Uri.fromFile(file);
-        } else if (options instanceof FileDescriptorOutputOptions) {
-            FileDescriptorOutputOptions fileDescriptorOutputOptions =
-                    (FileDescriptorOutputOptions) options;
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-                mMediaMuxer = Api26Impl.createMediaMuxer(
-                        fileDescriptorOutputOptions.getParcelFileDescriptor()
-                                .getFileDescriptor(), muxerOutputFormat);
-            } else {
-                throw new IOException(
-                        "MediaMuxer doesn't accept FileDescriptor as output destination.");
-            }
-        } else if (options instanceof MediaStoreOutputOptions) {
-            MediaStoreOutputOptions mediaStoreOutputOptions = (MediaStoreOutputOptions) options;
-
-            ContentValues contentValues =
-                    new ContentValues(mediaStoreOutputOptions.getContentValues());
-            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.getCollectionUri(), 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 =
-                        OutputUtil.getAbsolutePathFromUri(
-                                mediaStoreOutputOptions.getContentResolver(),
-                                mOutputUri, MEDIA_COLUMN);
-                if (path == null) {
-                    throw new IOException("Unable to get path from uri " + mOutputUri);
-                }
-                if (!OutputUtil.createParentFolder(new File(path))) {
-                    Logger.w(TAG, "Failed to create folder for " + path);
-                }
-                mMediaMuxer = new MediaMuxer(path, muxerOutputFormat);
-            } else {
-                ParcelFileDescriptor fileDescriptor =
-                        mediaStoreOutputOptions.getContentResolver().openFileDescriptor(
-                                mOutputUri, "rw");
-                mMediaMuxer = Api26Impl.createMediaMuxer(fileDescriptor.getFileDescriptor(),
-                        muxerOutputFormat);
-                fileDescriptor.close();
-            }
-        } else {
-            throw new AssertionError(
-                    "Invalid output options type: " + options.getClass().getSimpleName());
-        }
-        // TODO: Add more metadata to MediaMuxer, e.g. location information.
-        if (mSurfaceTransformationInfo != null) {
-            mMediaMuxer.setOrientationHint(mSurfaceTransformationInfo.getRotationDegrees());
-        }
-    }
-
     @SuppressLint("MissingPermission")
     @ExecutedBy("mSequentialExecutor")
     private void startInternal(@NonNull RecordingRecord recordingToStart) {
@@ -1819,11 +1773,10 @@
             errorToSend = ERROR_NO_VALID_DATA;
         }
 
+        mInProgressRecording.finalizeRecording(mOutputUri);
+
         OutputOptions outputOptions = mInProgressRecording.getOutputOptions();
         RecordingStats stats = getInProgressRecordingStats();
-
-        mInProgressRecording.finalizeOutputFile(mOutputUri);
-
         OutputResults outputResults = OutputResults.of(mOutputUri);
         mInProgressRecording.updateVideoRecordEvent(errorToSend == ERROR_NONE
                 ? VideoRecordEvent.finalize(
@@ -2169,31 +2122,150 @@
 
     @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     @AutoValue
-    abstract static class RecordingRecord {
+    abstract static class RecordingRecord implements AutoCloseable {
 
-        private final AtomicReference<Consumer<Uri>> mOutputFileFinalizer =
+        private final CloseGuardHelper mCloseGuard = CloseGuardHelper.create();
+
+        private final AtomicBoolean mInitialized = new AtomicBoolean(false);
+
+        private final AtomicReference<MediaMuxerSupplier> mMediaMuxerSupplier =
+                new AtomicReference<>(null);
+
+        private final AtomicReference<Consumer<Uri>> mRecordingFinalizer =
                 new AtomicReference<>(ignored -> {
                     /* no-op by default */
                 });
 
+        @NonNull
         static RecordingRecord from(@NonNull PendingRecording pendingRecording, long recordingId) {
-            OutputOptions outputOptions = pendingRecording.getOutputOptions();
-            RecordingRecord recordingRecord = new AutoValue_Recorder_RecordingRecord(
-                    outputOptions,
+            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();
+
+        /**
+         * Performs initialization for this recording.
+         *
+         * @throws AssertionError if this recording has already been initialized.
+         * @throws IOException if it fails to duplicate the file descriptor when the
+         * {@link #getOutputOptions() OutputOptions} is {@link FileDescriptorOutputOptions}.
+         */
+        void initializeRecording(@NonNull Context context) throws IOException {
+            if (mInitialized.getAndSet(true)) {
+                throw new AssertionError("Recording " + this + " has already been initialized");
+            }
+            OutputOptions outputOptions = getOutputOptions();
+
+            final ParcelFileDescriptor dupedParcelFileDescriptor;
+            if (outputOptions instanceof FileDescriptorOutputOptions) {
+                // Duplicate ParcelFileDescriptor to make input descriptor can be safely closed,
+                // or throw an IOException if it fails.
+                dupedParcelFileDescriptor =
+                        ((FileDescriptorOutputOptions) outputOptions)
+                                .getParcelFileDescriptor().dup();
+            } else {
+                dupedParcelFileDescriptor = null;
+            }
+
+            mCloseGuard.open("finalizeRecording");
+
+            MediaMuxerSupplier mediaMuxerSupplier =
+                    (muxerOutputFormat, outputUriCreatedCallback) -> {
+                        MediaMuxer mediaMuxer;
+                        Uri outputUri = Uri.EMPTY;
+                        if (outputOptions instanceof FileOutputOptions) {
+                            FileOutputOptions fileOutputOptions = (FileOutputOptions) outputOptions;
+                            File file = fileOutputOptions.getFile();
+                            if (!OutputUtil.createParentFolder(file)) {
+                                Logger.w(TAG,
+                                        "Failed to create folder for " + file.getAbsolutePath());
+                            }
+                            mediaMuxer = new MediaMuxer(file.getAbsolutePath(), muxerOutputFormat);
+                            outputUri = Uri.fromFile(file);
+                        } else if (outputOptions instanceof FileDescriptorOutputOptions) {
+                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+                                // Use dup'd ParcelFileDescriptor to prevent the descriptor in
+                                // OutputOptions from being closed.
+                                mediaMuxer = Api26Impl.createMediaMuxer(
+                                        dupedParcelFileDescriptor.getFileDescriptor(),
+                                        muxerOutputFormat);
+                            } else {
+                                throw new IOException(
+                                        "MediaMuxer doesn't accept FileDescriptor as output "
+                                                + "destination.");
+                            }
+                        } else if (outputOptions instanceof MediaStoreOutputOptions) {
+                            MediaStoreOutputOptions mediaStoreOutputOptions =
+                                    (MediaStoreOutputOptions) outputOptions;
+
+                            ContentValues contentValues =
+                                    new ContentValues(mediaStoreOutputOptions.getContentValues());
+                            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);
+                            }
+                            outputUri = mediaStoreOutputOptions.getContentResolver().insert(
+                                    mediaStoreOutputOptions.getCollectionUri(), contentValues);
+                            if (outputUri == null) {
+                                throw new IOException("Unable to create MediaStore entry.");
+                            }
+
+                            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
+                                String path = OutputUtil.getAbsolutePathFromUri(
+                                        mediaStoreOutputOptions.getContentResolver(),
+                                        outputUri, MEDIA_COLUMN);
+                                if (path == null) {
+                                    throw new IOException(
+                                            "Unable to get path from uri " + outputUri);
+                                }
+                                if (!OutputUtil.createParentFolder(new File(path))) {
+                                    Logger.w(TAG, "Failed to create folder for " + path);
+                                }
+                                mediaMuxer = new MediaMuxer(path, muxerOutputFormat);
+                            } else {
+                                ParcelFileDescriptor fileDescriptor =
+                                        mediaStoreOutputOptions.getContentResolver()
+                                                .openFileDescriptor(outputUri, "rw");
+                                mediaMuxer = Api26Impl.createMediaMuxer(
+                                        fileDescriptor.getFileDescriptor(),
+                                        muxerOutputFormat);
+                                fileDescriptor.close();
+                            }
+                        } else {
+                            throw new AssertionError(
+                                    "Invalid output options type: "
+                                            + outputOptions.getClass().getSimpleName());
+                        }
+                        outputUriCreatedCallback.accept(outputUri);
+                        return mediaMuxer;
+                    };
+            mMediaMuxerSupplier.set(mediaMuxerSupplier);
+
+            Consumer<Uri> recordingFinalizer = null;
             if (outputOptions instanceof MediaStoreOutputOptions) {
                 MediaStoreOutputOptions mediaStoreOutputOptions =
                         (MediaStoreOutputOptions) outputOptions;
                 // TODO(b/201946954): Investigate whether we should add a setting to disable
                 //  scan/update to allow users to perform it themselves.
-                Consumer<Uri> outputFileFinalizer;
                 if (Build.VERSION.SDK_INT >= 29) {
-                    outputFileFinalizer = outputUri -> {
+                    recordingFinalizer = outputUri -> {
                         if (outputUri.equals(Uri.EMPTY)) {
                             return;
                         }
@@ -2205,8 +2277,7 @@
                 } else {
                     // Context will only be held in local scope of the consumer so it will not be
                     // retained after finalizeOutputFile() is called.
-                    Context finalContext = pendingRecording.getApplicationContext();
-                    outputFileFinalizer = outputUri -> {
+                    recordingFinalizer = outputUri -> {
                         if (outputUri.equals(Uri.EMPTY)) {
                             return;
                         }
@@ -2216,7 +2287,7 @@
                         if (filePath != null) {
                             // Use null mime type list to have MediaScanner derive mime type from
                             // extension
-                            MediaScannerConnection.scanFile(finalContext,
+                            MediaScannerConnection.scanFile(context,
                                     new String[]{filePath}, /*mimeTypes=*/null, (path, uri) -> {
                                         if (uri == null) {
                                             Logger.e(TAG, String.format("File scanning operation "
@@ -2234,25 +2305,24 @@
                         }
                     };
                 }
-                recordingRecord.mOutputFileFinalizer.set(outputFileFinalizer);
+            } else if (outputOptions instanceof FileDescriptorOutputOptions) {
+                recordingFinalizer = ignored -> {
+                    try {
+                        // dupedParcelFileDescriptor should be non-null.
+                        dupedParcelFileDescriptor.close();
+                    } catch (IOException e) {
+                        // IOException is not expected to be thrown while closing
+                        // ParcelFileDescriptor.
+                        Logger.e(TAG, "Failed to close dup'd ParcelFileDescriptor", e);
+                    }
+                };
             }
 
-            return recordingRecord;
+            if (recordingFinalizer != null) {
+                mRecordingFinalizer.set(recordingFinalizer);
+            }
         }
 
-        @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.
          */
@@ -2271,21 +2341,98 @@
         }
 
         /**
-         * Performs final operations required to prepare completed output file.
+         * Creates a {@link MediaMuxer} for this recording.
          *
-         * <p>Output file finalization can only occur once. Any subsequent calls to this method
-         * will throw an {@link AssertionError}.
+         * <p>A media muxer can only be created once per recording, so subsequent calls to this
+         * method will throw an {@link AssertionError}.
+         *
+         * @param muxerOutputFormat the output file format.
+         * @param outputUriCreatedCallback A callback that will send the returned media muxer's
+         *                                 output {@link Uri}. It will be {@link Uri#EMPTY} if the
+         *                                 {@link #getOutputOptions() OutputOptions} is
+         *                                 {@link FileDescriptorOutputOptions}.
+         *                                 Note: This callback will be called inline.
+         * @return the media muxer.
+         * @throws IOException if the creation of the media mixer fails.
+         * @throws AssertionError if the recording is not initialized or subsequent calls to this
+         * method.
+         */
+        @NonNull
+        MediaMuxer performOneTimeMediaMuxerCreation(int muxerOutputFormat,
+                @NonNull Consumer<Uri> outputUriCreatedCallback) throws IOException {
+            if (!mInitialized.get()) {
+                throw new AssertionError("Recording " + this + " has not been initialized");
+            }
+            MediaMuxerSupplier mediaMuxerSupplier = mMediaMuxerSupplier.getAndSet(null);
+            if (mediaMuxerSupplier == null) {
+                throw new AssertionError("One-time media muxer creation has already occurred for"
+                        + " recording " + this);
+            }
+            return mediaMuxerSupplier.get(muxerOutputFormat, outputUriCreatedCallback);
+        }
+
+        /**
+         * Performs final operations required to finalize this recording.
+         *
+         * <p>Recording finalization can only occur once. Any subsequent calls to this method or
+         * {@link #close()} will throw an {@link AssertionError}.
+         *
+         * <p>Finalizing an uninitialized recording is no-op.
          *
          * @param uri The uri of the output file.
          */
-        void finalizeOutputFile(@NonNull Uri uri) {
-            Consumer<Uri> outputFileFinalizer = mOutputFileFinalizer.getAndSet(null);
-            if (outputFileFinalizer == null) {
-                throw new AssertionError(
-                        "Output file has already been finalized for recording " + this);
+        void finalizeRecording(@NonNull Uri uri) {
+            if (!mInitialized.get()) {
+                return;
             }
+            finalizeRecordingInternal(mRecordingFinalizer.getAndSet(null), uri);
+        }
 
-            outputFileFinalizer.accept(uri);
+        /**
+         * Close this recording, as if calling {@link #finalizeRecording(Uri)} with parameter
+         * {@link Uri#EMPTY}.
+         *
+         * <p>This method is equivalent to calling {@link #finalizeRecording(Uri)} with parameter
+         * {@link Uri#EMPTY}.
+         *
+         * <p>Recording finalization can only occur once. Any subsequent calls to this method or
+         * {@link #finalizeRecording(Uri)} will throw an {@link AssertionError}.
+         *
+         * <p>Closing an uninitialized recording is no-op.
+         */
+        @Override
+        public void close() {
+            finalizeRecording(Uri.EMPTY);
+        }
+
+        @Override
+        @SuppressWarnings("GenericException") // super.finalize() throws Throwable
+        protected void finalize() throws Throwable {
+            try {
+                mCloseGuard.warnIfOpen();
+                Consumer<Uri> finalizer = mRecordingFinalizer.getAndSet(null);
+                if (finalizer != null) {
+                    finalizeRecordingInternal(finalizer, Uri.EMPTY);
+                }
+            } finally {
+                super.finalize();
+            }
+        }
+
+        private void finalizeRecordingInternal(@Nullable Consumer<Uri> finalizer,
+                @NonNull Uri uri) {
+            if (finalizer == null) {
+                throw new AssertionError(
+                        "Recording " + this + " has already been finalized");
+            }
+            mCloseGuard.close();
+            finalizer.accept(uri);
+        }
+
+        private interface MediaMuxerSupplier {
+            @NonNull
+            MediaMuxer get(int muxerOutputFormat, @NonNull Consumer<Uri> outputUriCreatedCallback)
+                    throws IOException;
         }
     }
 
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/MediaCodecInfoReportIncorrectInfoQuirk.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/MediaCodecInfoReportIncorrectInfoQuirk.java
index 699b3e5..1b1046e 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/MediaCodecInfoReportIncorrectInfoQuirk.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/MediaCodecInfoReportIncorrectInfoQuirk.java
@@ -41,23 +41,44 @@
  * "video/mp4v-es" with 1280x720 or 640x480 can be used to record video. So the maximum supported
  * resolution 174x174 is probably incorrect for "video/mp4v-es" and doesn't make sense.
  * See b/192431846#comment3.
+ *
+ * <p>On Huawei Mate9, {@link CamcorderProfile} indicates it can support resolutions 3840x2160 for
+ *  video codec type {@link android.media.MediaRecorder.VideoEncoder#HEVC}, but the current video
+ *  codec type is default {@link android.media.MediaRecorder.VideoEncoder#H264}.
+ *  Even, change video codec type to {@link android.media.MediaRecorder.VideoEncoder#HEVC}, it
+ *  still meet unsupported resolution for 3840x2160, it only support 3840x2112. By experimental
+ *  result, H.264 + 3840x2160 can be used to record video on this device. Hence use quirk to
+ *  workaround this case. See b/203481899#comment2.
+ *
  */
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 public class MediaCodecInfoReportIncorrectInfoQuirk implements Quirk {
 
-    private static final String BUILD_BRAND = "Nokia";
-
-    private static final String BUILD_MODEL = "Nokia 1";
-
-    private static final String MIME_TYPE = MediaFormat.MIMETYPE_VIDEO_MPEG4;
-
     static boolean load() {
-        return BUILD_BRAND.equalsIgnoreCase(Build.BRAND)
-                && BUILD_MODEL.equalsIgnoreCase(Build.MODEL);
+        return isNokia1() || isHuaweiMate9();
     }
 
-    /** Checks if the given mime type is a problematic mime type. */
-    public static boolean isProblematicMimeType(@NonNull String mimeType) {
-        return MIME_TYPE.equals(mimeType);
+    private static boolean isNokia1() {
+        return "Nokia".equalsIgnoreCase(Build.BRAND) && "Nokia 1".equalsIgnoreCase(Build.MODEL);
     }
+
+    private static boolean isHuaweiMate9() {
+        return "Huawei".equalsIgnoreCase(Build.BRAND) && "mha-l29".equalsIgnoreCase(Build.MODEL);
+    }
+
+    /** Check if problematic MediaFormat info for these candidate devices. */
+    public boolean isUnSupportMediaCodecInfo(@NonNull MediaFormat mediaFormat) {
+        if (isNokia1()) {
+            /** Checks if the given mime type is a problematic mime type. */
+            String mimeType = mediaFormat.getString(MediaFormat.KEY_MIME);
+            return MediaFormat.MIMETYPE_VIDEO_MPEG4.equals(mimeType);
+        } else if (isHuaweiMate9()) {
+            /** Checks if this is an unsupported resolution for avc. */
+            int width = mediaFormat.getInteger(MediaFormat.KEY_WIDTH);
+            int height = mediaFormat.getInteger(MediaFormat.KEY_HEIGHT);
+            return (width == 3840 && height == 2160);
+        }
+        return false;
+    }
+
 }
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/workaround/EncoderFinder.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/workaround/EncoderFinder.java
index a4cd073..32525c0 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/workaround/EncoderFinder.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/workaround/EncoderFinder.java
@@ -125,9 +125,11 @@
     }
 
     private boolean shouldCreateCodecByType(@NonNull MediaFormat mediaFormat) {
-        String mimeType = mediaFormat.getString(MediaFormat.KEY_MIME);
-
-        return DeviceQuirks.get(MediaCodecInfoReportIncorrectInfoQuirk.class) != null
-                && MediaCodecInfoReportIncorrectInfoQuirk.isProblematicMimeType(mimeType);
+        MediaCodecInfoReportIncorrectInfoQuirk quirk =
+                DeviceQuirks.get(MediaCodecInfoReportIncorrectInfoQuirk.class);
+        if (quirk == null) {
+            return false;
+        }
+        return quirk.isUnSupportMediaCodecInfo(mediaFormat);
     }
 }
diff --git a/camera/camera-video/src/test/java/androidx/camera/video/VideoCaptureLegacyTest.kt b/camera/camera-video/src/test/java/androidx/camera/video/VideoCaptureLegacyTest.kt
index 085efd3..ba4a69e 100644
--- a/camera/camera-video/src/test/java/androidx/camera/video/VideoCaptureLegacyTest.kt
+++ b/camera/camera-video/src/test/java/androidx/camera/video/VideoCaptureLegacyTest.kt
@@ -20,11 +20,11 @@
 import android.os.Build
 import android.os.Looper
 import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraX
 import androidx.camera.core.CameraXConfig
 import androidx.camera.core.impl.CameraFactory
 import androidx.camera.core.impl.CameraThreadConfig
 import androidx.camera.core.impl.utils.executor.CameraXExecutors
+import androidx.camera.testing.CameraXUtil
 import androidx.camera.testing.fakes.FakeAppConfig
 import androidx.camera.testing.fakes.FakeCamera
 import androidx.camera.testing.fakes.FakeCameraFactory
@@ -66,12 +66,12 @@
             .setCameraFactoryProvider(cameraFactoryProvider)
             .build()
         val context = ApplicationProvider.getApplicationContext<Context>()
-        CameraX.initialize(context, cameraXConfig).get()
+        CameraXUtil.initialize(context, cameraXConfig).get()
     }
 
     @After
     fun tearDown() {
-        CameraX.shutdown().get()
+        CameraXUtil.shutdown().get()
     }
 
     @Test
diff --git a/camera/camera-video/src/test/java/androidx/camera/video/VideoCaptureTest.kt b/camera/camera-video/src/test/java/androidx/camera/video/VideoCaptureTest.kt
index ed358ac..40cfac4 100644
--- a/camera/camera-video/src/test/java/androidx/camera/video/VideoCaptureTest.kt
+++ b/camera/camera-video/src/test/java/androidx/camera/video/VideoCaptureTest.kt
@@ -21,7 +21,6 @@
 import android.util.Size
 import android.view.Surface
 import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraX
 import androidx.camera.core.CameraXConfig
 import androidx.camera.core.SurfaceRequest
 import androidx.camera.core.impl.CamcorderProfileProxy
@@ -41,6 +40,7 @@
 import androidx.camera.testing.CamcorderProfileUtil.RESOLUTION_480P
 import androidx.camera.testing.CamcorderProfileUtil.RESOLUTION_720P
 import androidx.camera.testing.CameraUtil
+import androidx.camera.testing.CameraXUtil
 import androidx.camera.testing.fakes.FakeAppConfig
 import androidx.camera.testing.fakes.FakeCamcorderProfileProvider
 import androidx.camera.testing.fakes.FakeCamera
@@ -96,7 +96,7 @@
                 removeUseCases(useCases)
             }
         }
-        CameraX.shutdown().get(10, TimeUnit.SECONDS)
+        CameraXUtil.shutdown().get(10, TimeUnit.SECONDS)
     }
 
     @Test
@@ -469,6 +469,6 @@
             .setCameraFactoryProvider { _, _, _ -> cameraFactory }
             .setDeviceSurfaceManagerProvider { _, _, _ -> surfaceManager }
             .build()
-        CameraX.initialize(context, cameraXConfig).get()
+        CameraXUtil.initialize(context, cameraXConfig).get()
     }
 }
diff --git a/camera/camera-view/build.gradle b/camera/camera-view/build.gradle
index c229b66..f9cac5f 100644
--- a/camera/camera-view/build.gradle
+++ b/camera/camera-view/build.gradle
@@ -55,6 +55,7 @@
         // override pinned dependency.
         exclude(group:"androidx.camera", module:"camera-core")
     }
+    testImplementation("androidx.camera:camera-camera2:${VIEW_ATOMIC_GROUP_PINNED_VER}")
 
     androidTestImplementation(project(":camera:camera-testing"))  {
         // Ensure camera-testing does not pull in camera-core project dependency which will
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewBitmapTest.java b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewBitmapTest.java
index 2d2c8b8..285c7f3 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewBitmapTest.java
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewBitmapTest.java
@@ -22,10 +22,7 @@
 import android.graphics.Bitmap;
 
 import androidx.annotation.NonNull;
-import androidx.camera.camera2.Camera2Config;
 import androidx.camera.core.CameraSelector;
-import androidx.camera.core.CameraX;
-import androidx.camera.core.CameraXConfig;
 import androidx.camera.core.Preview;
 import androidx.camera.lifecycle.ProcessCameraProvider;
 import androidx.camera.testing.CameraUtil;
@@ -80,8 +77,6 @@
         Assume.assumeTrue(CameraUtil.hasCameraWithLensFacing(CAMERA_LENS));
 
         final Context context = ApplicationProvider.getApplicationContext();
-        final CameraXConfig config = Camera2Config.defaultConfig();
-        CameraX.initialize(context, config);
         mCameraProvider = ProcessCameraProvider.getInstance(context).get();
     }
 
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewDeviceTest.java b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewDeviceTest.java
index d11f8ac..9c76f23 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewDeviceTest.java
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewDeviceTest.java
@@ -49,7 +49,6 @@
 import androidx.camera.core.Camera;
 import androidx.camera.core.CameraInfo;
 import androidx.camera.core.CameraSelector;
-import androidx.camera.core.CameraX;
 import androidx.camera.core.MeteringPoint;
 import androidx.camera.core.MeteringPointFactory;
 import androidx.camera.core.Preview;
@@ -59,6 +58,7 @@
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.camera.core.impl.utils.futures.FutureCallback;
 import androidx.camera.core.impl.utils.futures.Futures;
+import androidx.camera.lifecycle.ProcessCameraProvider;
 import androidx.camera.testing.CameraUtil;
 import androidx.camera.testing.CoreAppTestUtil;
 import androidx.camera.testing.SurfaceFormatUtil;
@@ -115,15 +115,19 @@
     private final Instrumentation mInstrumentation = InstrumentationRegistry.getInstrumentation();
     private ActivityScenario<FakeActivity> mActivityScenario;
     private final Context mContext = ApplicationProvider.getApplicationContext();
+    private ProcessCameraProvider mCameraProvider = null;
     private final List<SurfaceRequest> mSurfaceRequestList = new ArrayList<>();
     private PreviewView mPreviewView;
     private MeteringPointFactory mMeteringPointFactory;
     private final UiDevice mUiDevice = UiDevice.getInstance(mInstrumentation);
 
     @Before
-    public void setUp() throws CoreAppTestUtil.ForegroundOccupiedError {
+    public void setUp() throws CoreAppTestUtil.ForegroundOccupiedError, ExecutionException,
+            InterruptedException, TimeoutException {
         CoreAppTestUtil.prepareDeviceUI(mInstrumentation);
         mActivityScenario = ActivityScenario.launch(FakeActivity.class);
+        mCameraProvider = ProcessCameraProvider.getInstance(mContext).get(10000,
+                TimeUnit.MILLISECONDS);
     }
 
     @After
@@ -133,7 +137,9 @@
             // Ensure all successful requests have their returned future finish.
             surfaceRequest.getDeferrableSurface().close();
         }
-        CameraX.shutdown().get(10, TimeUnit.SECONDS);
+        if (mCameraProvider != null) {
+            mCameraProvider.shutdown();
+        }
     }
 
     @Test
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewStreamStateTest.kt b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewStreamStateTest.kt
index 32aa646..56ed99d 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewStreamStateTest.kt
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewStreamStateTest.kt
@@ -17,9 +17,7 @@
 package androidx.camera.view
 
 import android.content.Context
-import androidx.camera.camera2.Camera2Config
 import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraX
 import androidx.camera.core.ImageAnalysis
 import androidx.camera.core.Preview
 import androidx.camera.lifecycle.ProcessCameraProvider
@@ -86,8 +84,6 @@
         CoreAppTestUtil.assumeCompatibleDevice()
 
         val context = ApplicationProvider.getApplicationContext<Context>()
-        val config = Camera2Config.defaultConfig()
-        CameraX.initialize(context, config)
 
         mLifecycle = FakeLifecycleOwner()
         mActivityRule.scenario.onActivity { activity ->
diff --git a/camera/camera-view/src/test/java/androidx/camera/view/CameraControllerTest.kt b/camera/camera-view/src/test/java/androidx/camera/view/CameraControllerTest.kt
index aade9f9..87af149 100644
--- a/camera/camera-view/src/test/java/androidx/camera/view/CameraControllerTest.kt
+++ b/camera/camera-view/src/test/java/androidx/camera/view/CameraControllerTest.kt
@@ -22,13 +22,13 @@
 import android.view.Surface
 import androidx.camera.core.AspectRatio
 import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraX
 import androidx.camera.core.CameraXConfig
 import androidx.camera.core.ImageAnalysis
 import androidx.camera.core.ImageCapture
 import androidx.camera.core.impl.ImageAnalysisConfig
 import androidx.camera.core.impl.ImageCaptureConfig
 import androidx.camera.core.impl.ImageOutputConfig
+import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.fakes.FakeAppConfig
 import androidx.test.annotation.UiThreadTest
 import androidx.test.core.app.ApplicationProvider
@@ -41,6 +41,7 @@
 import org.robolectric.annotation.Config
 import org.robolectric.annotation.internal.DoNotInstrument
 import java.util.concurrent.Executors
+import java.util.concurrent.TimeUnit
 
 /**
  * Unit tests for [CameraController].
@@ -51,6 +52,7 @@
 public class CameraControllerTest {
 
     private val context = ApplicationProvider.getApplicationContext<Context>()
+    private lateinit var cameraProvider: ProcessCameraProvider
     private lateinit var controller: CameraController
     private val targetSizeWithAspectRatio =
         CameraController.OutputSize(AspectRatio.RATIO_16_9)
@@ -62,13 +64,16 @@
         val cameraXConfig = CameraXConfig.Builder.fromConfig(
             FakeAppConfig.create()
         ).build()
-        CameraX.initialize(context, cameraXConfig).get()
+        ProcessCameraProvider.configureInstance(cameraXConfig)
+        cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
         controller = LifecycleCameraController(context)
     }
 
     @After
     public fun shutDown() {
-        CameraX.shutdown().get()
+        if (::cameraProvider.isInitialized) {
+            cameraProvider.shutdown()[10000, TimeUnit.MILLISECONDS]
+        }
     }
 
     @UiThreadTest
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/Camera2InteropIntegrationTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/Camera2InteropIntegrationTest.kt
index 8858036..b3286f1 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/Camera2InteropIntegrationTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/Camera2InteropIntegrationTest.kt
@@ -19,14 +19,26 @@
 package androidx.camera.integration.core
 
 import android.content.Context
+import android.content.Context.CAMERA_SERVICE
+import android.hardware.camera2.CameraCaptureSession
 import android.hardware.camera2.CameraDevice
+import android.hardware.camera2.CameraManager
+import android.hardware.camera2.CaptureRequest
+import android.hardware.camera2.TotalCaptureResult
+import androidx.camera.camera2.interop.Camera2CameraControl
+import androidx.camera.camera2.interop.Camera2CameraInfo
 import androidx.camera.camera2.interop.Camera2Interop
+import androidx.camera.camera2.interop.CaptureRequestOptions
+import androidx.camera.core.Camera
 import androidx.camera.core.CameraSelector
+import androidx.camera.core.ImageAnalysis
 import androidx.camera.core.Preview
+import androidx.camera.core.impl.utils.executor.CameraXExecutors
 import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
 import androidx.concurrent.futures.await
 import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.LifecycleOwner
 import androidx.lifecycle.testing.TestLifecycleOwner
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -40,19 +52,23 @@
 import kotlinx.coroutines.flow.first
 import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.withContext
+import kotlinx.coroutines.withTimeout
 import org.junit.After
+import org.junit.Assume
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.junit.rules.TestRule
 import org.junit.runner.RunWith
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
 
 @LargeTest
 @RunWith(AndroidJUnit4::class)
 class Camera2InteropIntegrationTest {
 
     @get:Rule
-    val mUseCameraRule: TestRule = CameraUtil.grantCameraPermissionAndPreTest()
+    val useCameraRule: TestRule = CameraUtil.grantCameraPermissionAndPreTest()
 
     private var processCameraProvider: ProcessCameraProvider? = null
 
@@ -60,6 +76,8 @@
     fun setUp() = runBlocking {
         val context = ApplicationProvider.getApplicationContext<Context>()
         processCameraProvider = ProcessCameraProvider.getInstance(context).await()
+
+        Assume.assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK))
     }
 
     @After
@@ -105,6 +123,137 @@
         assertThat(lastState).isEqualTo(DeviceState.Closed)
     }
 
+    @Test
+    fun canUseCameraSelector_fromCamera2CameraIdAndCameraFilter(): Unit = runBlocking {
+        val camera2CameraManager = ApplicationProvider.getApplicationContext<Context>()
+            .getSystemService(CAMERA_SERVICE) as CameraManager
+        camera2CameraManager.cameraIdList.forEach { id ->
+            val cameraSelector = CameraSelector.Builder()
+                .addCameraFilter {
+                    it.filter { Camera2CameraInfo.from(it).cameraId == id }
+                }.build()
+
+            withContext(Dispatchers.Main) {
+                val camera = processCameraProvider!!.bindToLifecycle(
+                    TestLifecycleOwner(Lifecycle.State.CREATED),
+                    cameraSelector
+                )
+                assertThat(Camera2CameraInfo.from(camera.cameraInfo).cameraId).isEqualTo(id)
+            }
+        }
+    }
+
+    @Test
+    fun canUseCameraSelector_fromCamera2CameraIdAndAvailableCameraInfos(): Unit = runBlocking {
+        val camera2CameraManager = ApplicationProvider.getApplicationContext<Context>()
+            .getSystemService(CAMERA_SERVICE) as CameraManager
+        camera2CameraManager.cameraIdList.forEach { id ->
+            withContext(Dispatchers.Main) {
+                val cameraSelector =
+                    processCameraProvider!!.availableCameraInfos.find {
+                        Camera2CameraInfo.from(it).cameraId == id
+                    }?.cameraSelector
+
+                val camera = processCameraProvider!!.bindToLifecycle(
+                    TestLifecycleOwner(Lifecycle.State.CREATED),
+                    cameraSelector!!
+                )
+                assertThat(Camera2CameraInfo.from(camera.cameraInfo).cameraId).isEqualTo(id)
+            }
+        }
+    }
+
+    @Test
+    fun requestOptionsShouldExist_afterLifeCycleStopStart(): Unit = runBlocking {
+        // Arrange.
+        val testKey = CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION
+        val testValue = 1
+        val testLifecycle = TestLifecycleOwner(Lifecycle.State.RESUMED)
+        withContext(Dispatchers.Main) {
+            processCameraProvider!!.bindAnalysis(testLifecycle).setInteropOptions(
+                mapOf(testKey to testValue)
+            )
+        }
+        captureCallback.waitFor(numOfCaptures = 10) {}
+
+        // Act.
+        withContext(Dispatchers.Main) {
+            testLifecycle.handleLifecycleEvent(Lifecycle.Event.ON_STOP)
+            testLifecycle.handleLifecycleEvent(Lifecycle.Event.ON_START)
+        }
+
+        // Assert.
+        captureCallback.waitFor(numOfCaptures = 20) {
+            assertThat(it.last().get(testKey)).isEqualTo(testValue)
+        }
+    }
+
+    private fun ProcessCameraProvider.bindAnalysis(lifecycleOwner: LifecycleOwner): Camera {
+        val imageAnalysis = ImageAnalysis.Builder().apply {
+            Camera2Interop.Extender(this).setSessionCaptureCallback(
+                captureCallback
+            )
+        }.build().apply {
+            // set analyzer to make it active.
+            setAnalyzer(
+                CameraXExecutors.highPriorityExecutor()
+            ) {
+                // Analyzer nothing to to
+            }
+        }
+
+        unbindAll()
+        return bindToLifecycle(
+            lifecycleOwner,
+            CameraSelector.DEFAULT_BACK_CAMERA,
+            imageAnalysis
+        )
+    }
+
+    private fun Camera.setInteropOptions(parameter: Map<CaptureRequest.Key<Int>, Int>) {
+        Camera2CameraControl.from(cameraControl).captureRequestOptions =
+            CaptureRequestOptions.Builder().apply {
+                parameter.forEach { (key, value) ->
+                    setCaptureRequestOption(key, value)
+                }
+            }.build()
+    }
+
+    private val captureCallback = object : CameraCaptureSession.CaptureCallback() {
+
+        val waitingList = mutableListOf<CaptureContainer>()
+
+        suspend fun waitFor(
+            timeout: Long = TimeUnit.SECONDS.toMillis(5),
+            numOfCaptures: Int = 1,
+            verifyResults: (captureRequests: List<CaptureRequest>) -> Unit
+        ) {
+            val resultContainer = CaptureContainer(CountDownLatch(numOfCaptures))
+            waitingList.add(resultContainer)
+            withTimeout(timeout) {
+                resultContainer.countDownLatch.await()
+                verifyResults(resultContainer.captureRequests)
+            }
+            waitingList.remove(resultContainer)
+        }
+
+        override fun onCaptureCompleted(
+            session: CameraCaptureSession,
+            request: CaptureRequest,
+            result: TotalCaptureResult
+        ) {
+            waitingList.toList().forEach {
+                it.captureRequests.add(request)
+                it.countDownLatch.countDown()
+            }
+        }
+    }
+
+    data class CaptureContainer(
+        val countDownLatch: CountDownLatch,
+        val captureRequests: MutableList<CaptureRequest> = mutableListOf()
+    )
+
     // Sealed class for converting CameraDevice.StateCallback into a StateFlow
     sealed class DeviceState {
         object Unknown : DeviceState()
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/CameraDisconnectTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/CameraDisconnectTest.kt
index f600a24..c7b1753 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/CameraDisconnectTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/CameraDisconnectTest.kt
@@ -23,6 +23,7 @@
 import androidx.camera.camera2.pipe.integration.CameraPipeConfig
 import androidx.camera.core.CameraX
 import androidx.camera.core.CameraXConfig
+import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CoreAppTestUtil
 import androidx.camera.testing.activity.Camera2TestActivity
@@ -36,7 +37,6 @@
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
 import androidx.test.platform.app.InstrumentationRegistry
-import kotlinx.coroutines.runBlocking
 import org.junit.After
 import org.junit.Before
 import org.junit.Rule
@@ -67,15 +67,15 @@
 
     private val context: Context = ApplicationProvider.getApplicationContext()
     private lateinit var cameraXActivityScenario: ActivityScenario<CameraXTestActivity>
+    private lateinit var cameraProvider: ProcessCameraProvider
 
     @Before
     fun setUp() {
         IdlingPolicies.setIdlingResourceTimeout(10, TimeUnit.SECONDS)
         CoreAppTestUtil.assumeCompatibleDevice()
         CoreAppTestUtil.assumeCanTestCameraDisconnect()
-        runBlocking {
-            CameraX.initialize(context, cameraConfig).get(10, TimeUnit.SECONDS)
-        }
+        ProcessCameraProvider.configureInstance(cameraConfig)
+        cameraProvider = ProcessCameraProvider.getInstance(context)[10, TimeUnit.SECONDS]
 
         // Clear the device UI and check if there is no dialog or lock screen on the top of the
         // window before start the test.
@@ -88,8 +88,8 @@
             cameraXActivityScenario.close()
         }
 
-        runBlocking {
-            CameraX.shutdown().get(10, TimeUnit.SECONDS)
+        if (::cameraProvider.isInitialized) {
+            cameraProvider.shutdown()[10, TimeUnit.SECONDS]
         }
     }
 
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/CameraXInitTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/CameraXInitTest.kt
index d18c243..0d4c7e8 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/CameraXInitTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/CameraXInitTest.kt
@@ -18,16 +18,18 @@
 
 import android.content.Context
 import android.content.pm.PackageManager
-import android.os.Build
 import androidx.camera.camera2.Camera2Config
 import androidx.camera.camera2.pipe.integration.CameraPipeConfig
 import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraX
 import androidx.camera.core.CameraXConfig
+import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.concurrent.futures.await
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.filters.LargeTest
 import androidx.test.rule.GrantPermissionRule
 import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.withTimeout
 import org.junit.After
 import org.junit.Assume.assumeTrue
 import org.junit.Before
@@ -58,6 +60,7 @@
 
     private val context = ApplicationProvider.getApplicationContext<Context>()
     private val packageManager = context.packageManager
+    private lateinit var cameraProvider: ProcessCameraProvider
 
     @Before
     fun setup() {
@@ -68,33 +71,33 @@
             packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA) ||
                 packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT)
         )
-        CameraX.configureInstance(cameraXConfig)
     }
 
     @After
     fun tearDown() {
-        CameraX.shutdown().get(10, TimeUnit.SECONDS)
+        if (::cameraProvider.isInitialized) {
+            cameraProvider.shutdown()[10, TimeUnit.SECONDS]
+        }
     }
 
     @Test
-    fun initOnDevice() {
-        CameraX.getOrCreateInstance(context).get(10, TimeUnit.SECONDS)
-        assertThat(CameraX.isInitialized()).isTrue()
+    fun initOnDevice(): Unit = runBlocking {
+        withTimeout(10000) {
+            ProcessCameraProvider.configureInstance(cameraXConfig)
+            cameraProvider = ProcessCameraProvider.getInstance(context).await()
+        }
     }
 
     @Test
     fun initOnDevice_hasCamera() {
-        val cameraX = CameraX.getOrCreateInstance(context).get(10, TimeUnit.SECONDS)
-        try {
-            if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
-                CameraSelector.DEFAULT_BACK_CAMERA.select(cameraX.cameraRepository.cameras)
-            }
-            if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT)) {
-                CameraSelector.DEFAULT_FRONT_CAMERA.select(cameraX.cameraRepository.cameras)
-            }
-        } catch (e: IllegalArgumentException) {
-            // Wrap the exception with specific error message for dashboard bug collection.
-            throw IllegalArgumentException("CameraIdList_incorrect:" + Build.MODEL, e)
+        ProcessCameraProvider.configureInstance(cameraXConfig)
+        cameraProvider = ProcessCameraProvider.getInstance(context)[10, TimeUnit.SECONDS]
+
+        if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
+            assertThat(cameraProvider.hasCamera(CameraSelector.DEFAULT_BACK_CAMERA)).isTrue()
+        }
+        if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT)) {
+            assertThat(cameraProvider.hasCamera(CameraSelector.DEFAULT_FRONT_CAMERA)).isTrue()
         }
     }
 }
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ExistingActivityLifecycleTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ExistingActivityLifecycleTest.kt
index 73c6571..8bb0ab0 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ExistingActivityLifecycleTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ExistingActivityLifecycleTest.kt
@@ -17,13 +17,15 @@
 
 import android.Manifest
 import android.app.Instrumentation
+import android.content.Context
 import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraX
+import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CoreAppTestUtil
 import androidx.lifecycle.Lifecycle.State.CREATED
 import androidx.lifecycle.Lifecycle.State.RESUMED
 import androidx.test.core.app.ActivityScenario
+import androidx.test.core.app.ApplicationProvider
 import androidx.test.espresso.Espresso
 import androidx.test.espresso.action.ViewActions
 import androidx.test.espresso.matcher.ViewMatchers
@@ -69,7 +71,9 @@
         @AfterClass
         @JvmStatic
         fun shutdownCameraX() {
-            CameraX.shutdown().get(10, TimeUnit.SECONDS)
+            val context = ApplicationProvider.getApplicationContext<Context>()
+            val cameraProvider = ProcessCameraProvider.getInstance(context)[10, TimeUnit.SECONDS]
+            cameraProvider.shutdown()[10, TimeUnit.SECONDS]
         }
     }
 
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/FlashTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/FlashTest.kt
index 143580c..446bfa9 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/FlashTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/FlashTest.kt
@@ -22,16 +22,16 @@
 import androidx.camera.camera2.Camera2Config
 import androidx.camera.camera2.pipe.integration.CameraPipeConfig
 import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraX
 import androidx.camera.core.CameraXConfig
 import androidx.camera.core.ImageCapture
 import androidx.camera.core.ImageCaptureException
 import androidx.camera.core.ImageProxy
 import androidx.camera.core.Preview
-import androidx.camera.core.internal.CameraUseCaseAdapter
+import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.LabTestRule
 import androidx.camera.testing.SurfaceTextureProvider
+import androidx.camera.testing.fakes.FakeLifecycleOwner
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.filters.LargeTest
 import com.google.common.truth.Truth
@@ -74,24 +74,23 @@
     }
 
     private val context = ApplicationProvider.getApplicationContext<Context>()
-    private lateinit var camera: CameraUseCaseAdapter
+    private lateinit var cameraProvider: ProcessCameraProvider
 
     @Before
     fun setUp() {
         Assume.assumeTrue(CameraUtil.hasCameraWithLensFacing(BACK_LENS_FACING))
-        CameraX.initialize(context, cameraXConfig).get(10, TimeUnit.SECONDS)
+        ProcessCameraProvider.configureInstance(cameraXConfig)
+        cameraProvider = ProcessCameraProvider.getInstance(context)[10, TimeUnit.SECONDS]
     }
 
     @After
     fun tearDown(): Unit = runBlocking {
-        if (::camera.isInitialized) {
-            // TODO: The removeUseCases() call might be removed after clarifying the
-            // abortCaptures() issue in b/162314023
+        if (::cameraProvider.isInitialized) {
             withContext(Dispatchers.Main) {
-                camera.removeUseCases(camera.useCases)
+                cameraProvider.unbindAll()
+                cameraProvider.shutdown()[10, TimeUnit.SECONDS]
             }
         }
-        CameraX.shutdown().get(10, TimeUnit.SECONDS)
     }
 
     @LabTestRule.LabTestRearCamera
@@ -173,8 +172,10 @@
         withContext(Dispatchers.Main) {
             preview.setSurfaceProvider(getSurfaceProvider())
         }
-        camera =
-            CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, imageCapture, preview)
+
+        var fakeLifecycleOwner = FakeLifecycleOwner()
+        fakeLifecycleOwner.startAndResume()
+        cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, imageCapture, preview)
 
         // Take picture after preview is ready for a while. It can cause issue on some devices when
         // flash is on.
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ImageAnalysisTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ImageAnalysisTest.kt
index 87aefea..05646dc 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ImageAnalysisTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ImageAnalysisTest.kt
@@ -25,7 +25,6 @@
 import androidx.camera.camera2.pipe.integration.CameraPipeConfig
 import androidx.camera.core.AspectRatio
 import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraX
 import androidx.camera.core.CameraXConfig
 import androidx.camera.core.ImageAnalysis
 import androidx.camera.core.ImageAnalysis.BackpressureStrategy
@@ -33,8 +32,9 @@
 import androidx.camera.core.ImageProxy
 import androidx.camera.core.impl.ImageOutputConfig
 import androidx.camera.core.impl.utils.executor.CameraXExecutors
-import androidx.camera.core.internal.CameraUseCaseAdapter
+import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
+import androidx.camera.testing.fakes.FakeLifecycleOwner
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.filters.LargeTest
 import com.google.common.truth.Truth.assertThat
@@ -90,32 +90,38 @@
     private lateinit var analysisResultsSemaphore: Semaphore
     private lateinit var handlerThread: HandlerThread
     private lateinit var handler: Handler
-    private var camera: CameraUseCaseAdapter? = null
+    private lateinit var cameraProvider: ProcessCameraProvider
+    private lateinit var fakeLifecycleOwner: FakeLifecycleOwner
 
     @Before
     fun setUp(): Unit = runBlocking {
-        CameraX.initialize(context, cameraConfig).get(10, TimeUnit.SECONDS)
+        ProcessCameraProvider.configureInstance(cameraConfig)
+        cameraProvider = ProcessCameraProvider.getInstance(context)[10, TimeUnit.SECONDS]
         handlerThread = HandlerThread("AnalysisThread")
         handlerThread.start()
         handler = Handler(handlerThread.looper)
         analysisResultsSemaphore = Semaphore(0)
+
+        withContext(Dispatchers.Main) {
+            fakeLifecycleOwner = FakeLifecycleOwner()
+            fakeLifecycleOwner.startAndResume()
+        }
     }
 
     @After
     fun tearDown(): Unit = runBlocking {
-        camera?.let { camera ->
-            // TODO: The removeUseCases() call might be removed after clarifying the
-            //  abortCaptures() issue in b/162314023.
+        if (::cameraProvider.isInitialized) {
             withContext(Dispatchers.Main) {
-                camera.removeUseCases(camera.useCases)
+                cameraProvider.unbindAll()
+                cameraProvider.shutdown()[10, TimeUnit.SECONDS]
             }
         }
-        CameraX.shutdown().get(10, TimeUnit.SECONDS)
+
         handlerThread.quitSafely()
     }
 
     @Test
-    fun exceedMaxImagesWithoutClosing_doNotCrash() {
+    fun exceedMaxImagesWithoutClosing_doNotCrash() = runBlocking {
         // Arrange.
         val queueDepth = 3
         val semaphore = Semaphore(0)
@@ -133,11 +139,13 @@
         )
 
         // Act.
-        camera = CameraUtil.createCameraAndAttachUseCase(
-            context,
-            CameraSelector.DEFAULT_FRONT_CAMERA,
-            useCase
-        )
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(
+                fakeLifecycleOwner,
+                CameraSelector.DEFAULT_FRONT_CAMERA,
+                useCase
+            )
+        }
 
         // Assert: waiting for images does not crash.
         assertThat(semaphore.tryAcquire(queueDepth + 1, 1, TimeUnit.SECONDS)).isFalse()
@@ -151,7 +159,7 @@
 
     @Ignore("TODO(b/183224022): Remove when resolution selection logic is ported to CameraPipe")
     @Test
-    fun canSupportGuaranteedSizeFront() {
+    fun canSupportGuaranteedSizeFront() = runBlocking {
         // CameraSelector.LENS_FACING_FRONT/LENS_FACING_BACK are defined as constant int 0 and 1.
         // Using for-loop to check both front and back device cameras can support the guaranteed
         // 640x480 size.
@@ -166,11 +174,13 @@
             .setTargetResolution(GUARANTEED_RESOLUTION)
             .setTargetRotation(if (isRotateNeeded) Surface.ROTATION_90 else Surface.ROTATION_0)
             .build()
-        camera = CameraUtil.createCameraAndAttachUseCase(
-            context,
-            CameraSelector.DEFAULT_FRONT_CAMERA,
-            useCase
-        )
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(
+                fakeLifecycleOwner,
+                CameraSelector.DEFAULT_FRONT_CAMERA,
+                useCase
+            )
+        }
         useCase.setAnalyzer(CameraXExecutors.newHandlerExecutor(handler), analyzer)
 
         assertThat(analysisResultsSemaphore.tryAcquire(5, TimeUnit.SECONDS)).isTrue()
@@ -186,7 +196,7 @@
 
     @Ignore("TODO(b/183224022): Remove when resolution selection logic is ported to CameraPipe")
     @Test
-    fun canSupportGuaranteedSizeBack() {
+    fun canSupportGuaranteedSizeBack() = runBlocking {
         // CameraSelector.LENS_FACING_FRONT/LENS_FACING_BACK are defined as constant int 0 and 1.
         // Using for-loop to check both front and back device cameras can support the guaranteed
         // 640x480 size.
@@ -201,11 +211,13 @@
             .setTargetResolution(GUARANTEED_RESOLUTION)
             .setTargetRotation(if (isRotateNeeded) Surface.ROTATION_90 else Surface.ROTATION_0)
             .build()
-        camera = CameraUtil.createCameraAndAttachUseCase(
-            context,
-            CameraSelector.DEFAULT_BACK_CAMERA,
-            useCase
-        )
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(
+                fakeLifecycleOwner,
+                CameraSelector.DEFAULT_FRONT_CAMERA,
+                useCase
+            )
+        }
         useCase.setAnalyzer(CameraXExecutors.newHandlerExecutor(handler), analyzer)
 
         assertThat(analysisResultsSemaphore.tryAcquire(5, TimeUnit.SECONDS)).isTrue()
@@ -229,22 +241,27 @@
         analyzerAnalyzesImagesWithStrategy(ImageAnalysis.STRATEGY_BLOCK_PRODUCER)
     }
 
-    private fun analyzerAnalyzesImagesWithStrategy(@BackpressureStrategy strategy: Int) {
-        val useCase = ImageAnalysis.Builder()
-            .setBackpressureStrategy(strategy)
-            .build()
-        camera = CameraUtil.createCameraAndAttachUseCase(context, DEFAULT_CAMERA_SELECTOR, useCase)
+    private fun analyzerAnalyzesImagesWithStrategy(@BackpressureStrategy strategy: Int) =
+        runBlocking {
+            val useCase = ImageAnalysis.Builder()
+                .setBackpressureStrategy(strategy)
+                .build()
+            withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, DEFAULT_CAMERA_SELECTOR, useCase)
+        }
         useCase.setAnalyzer(CameraXExecutors.newHandlerExecutor(handler), analyzer)
         analysisResultsSemaphore.tryAcquire(5, TimeUnit.SECONDS)
         synchronized(analysisResultLock) { assertThat(analysisResults).isNotEmpty() }
     }
 
     @Test
-    fun analyzerDoesNotAnalyzeImages_whenCameraIsNotOpen() {
+    fun analyzerDoesNotAnalyzeImages_whenCameraIsNotOpen() = runBlocking {
         val useCase = ImageAnalysis.Builder().build()
         // Bind but do not start lifecycle
-        camera = CameraUtil.createCameraAndAttachUseCase(context, DEFAULT_CAMERA_SELECTOR, useCase)
-        camera!!.detachUseCases()
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, DEFAULT_CAMERA_SELECTOR, useCase)
+            cameraProvider.unbindAll()
+        }
         useCase.setAnalyzer(CameraXExecutors.newHandlerExecutor(handler), analyzer)
         // Keep the lifecycle in an inactive state.
         // Wait a little while for frames to be analyzed.
@@ -270,15 +287,17 @@
     }
 
     @Test
-    fun defaultAspectRatioWillBeSet_whenTargetResolutionIsNotSet() {
+    fun defaultAspectRatioWillBeSet_whenTargetResolutionIsNotSet() = runBlocking {
         val useCase = ImageAnalysis.Builder().build()
-        camera = CameraUtil.createCameraAndAttachUseCase(context, DEFAULT_CAMERA_SELECTOR, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, DEFAULT_CAMERA_SELECTOR, useCase)
+        }
         val config = useCase.currentConfig as ImageOutputConfig
         assertThat(config.targetAspectRatio).isEqualTo(AspectRatio.RATIO_4_3)
     }
 
     @Test
-    fun defaultAspectRatioWontBeSet_whenTargetResolutionIsSet() {
+    fun defaultAspectRatioWontBeSet_whenTargetResolutionIsSet() = runBlocking {
         assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK))
         val useCase = ImageAnalysis.Builder()
             .setTargetResolution(GUARANTEED_RESOLUTION)
@@ -287,11 +306,13 @@
             useCase.currentConfig.containsOption(ImageOutputConfig.OPTION_TARGET_ASPECT_RATIO)
         ).isFalse()
 
-        camera = CameraUtil.createCameraAndAttachUseCase(
-            context,
-            CameraSelector.DEFAULT_BACK_CAMERA,
-            useCase
-        )
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(
+                fakeLifecycleOwner,
+                CameraSelector.DEFAULT_BACK_CAMERA,
+                useCase
+            )
+        }
         assertThat(
             useCase.currentConfig.containsOption(ImageOutputConfig.OPTION_TARGET_ASPECT_RATIO)
         ).isFalse()
@@ -305,13 +326,18 @@
     }
 
     @Test
-    fun targetResolutionIsUpdatedAfterTargetRotationIsUpdated() {
+    fun targetResolutionIsUpdatedAfterTargetRotationIsUpdated() = runBlocking {
         val imageAnalysis = ImageAnalysis.Builder()
             .setTargetResolution(GUARANTEED_RESOLUTION)
             .setTargetRotation(Surface.ROTATION_0)
             .build()
-        camera =
-            CameraUtil.createCameraAndAttachUseCase(context, DEFAULT_CAMERA_SELECTOR, imageAnalysis)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(
+                fakeLifecycleOwner,
+                DEFAULT_CAMERA_SELECTOR,
+                imageAnalysis
+            )
+        }
 
         // Updates target rotation from ROTATION_0 to ROTATION_90.
         imageAnalysis.targetRotation = Surface.ROTATION_90
@@ -327,11 +353,13 @@
 
     // TODO(b/162298517): change the test to be deterministic instead of depend upon timing.
     @Test
-    fun analyzerSetMultipleTimesInKeepOnlyLatestMode() {
+    fun analyzerSetMultipleTimesInKeepOnlyLatestMode() = runBlocking {
         val useCase = ImageAnalysis.Builder()
             .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
             .build()
-        camera = CameraUtil.createCameraAndAttachUseCase(context, DEFAULT_CAMERA_SELECTOR, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, DEFAULT_CAMERA_SELECTOR, useCase)
+        }
         useCase.setAnalyzer(CameraXExecutors.newHandlerExecutor(handler), analyzer)
         analysisResultsSemaphore.tryAcquire(5, TimeUnit.SECONDS)
 
@@ -362,10 +390,10 @@
     fun useCaseConfigCanBeReset_afterUnbind() = runBlocking {
         val useCase = ImageAnalysis.Builder().build()
         val initialConfig = useCase.currentConfig
-        camera = CameraUtil.createCameraAndAttachUseCase(context, DEFAULT_CAMERA_SELECTOR, useCase)
 
         withContext(Dispatchers.Main) {
-            camera!!.removeUseCases(setOf(useCase))
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, DEFAULT_CAMERA_SELECTOR, useCase)
+            cameraProvider.unbind(useCase)
         }
         val configAfterUnbinding = useCase.currentConfig
         assertThat(initialConfig == configAfterUnbinding).isTrue()
@@ -373,36 +401,40 @@
 
     @Test
     fun targetRotationIsRetained_whenUseCaseIsReused() = runBlocking {
-        val useCase = ImageAnalysis.Builder().build()
-        camera = CameraUtil.createCameraAndAttachUseCase(context, DEFAULT_CAMERA_SELECTOR, useCase)
-
         // Generally, the device can't be rotated to Surface.ROTATION_180. Therefore,
         // use it to do the test.
-        useCase.targetRotation = Surface.ROTATION_180
         withContext(Dispatchers.Main) {
+            val useCase = ImageAnalysis.Builder().build()
+
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, DEFAULT_CAMERA_SELECTOR, useCase)
+            useCase.targetRotation = Surface.ROTATION_180
 
             // Check the target rotation is kept when the use case is unbound.
-            camera!!.removeUseCases(setOf(useCase))
+            cameraProvider.unbind(useCase)
+            assertThat(useCase.targetRotation).isEqualTo(Surface.ROTATION_180)
+
+            // Check the target rotation is kept when the use case is rebound to the
+            // lifecycle.
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, DEFAULT_CAMERA_SELECTOR, useCase)
             assertThat(useCase.targetRotation).isEqualTo(Surface.ROTATION_180)
         }
-
-        // Check the target rotation is kept when the use case is rebound to the
-        // lifecycle.
-        camera = CameraUtil.createCameraAndAttachUseCase(context, DEFAULT_CAMERA_SELECTOR, useCase)
-        assertThat(useCase.targetRotation).isEqualTo(Surface.ROTATION_180)
     }
 
     @Test
     @Throws(InterruptedException::class)
     fun useCaseCanBeReusedInSameCamera() = runBlocking {
         val useCase = ImageAnalysis.Builder().build()
-        camera = CameraUtil.createCameraAndAttachUseCase(context, DEFAULT_CAMERA_SELECTOR, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, DEFAULT_CAMERA_SELECTOR, useCase)
+        }
         useCase.setAnalyzer(CameraXExecutors.newHandlerExecutor(handler), analyzer)
         assertThat(analysisResultsSemaphore.tryAcquire(5, TimeUnit.SECONDS)).isTrue()
-        withContext(Dispatchers.Main) { camera!!.removeUseCases(setOf(useCase)) }
+        withContext(Dispatchers.Main) { cameraProvider.unbind(useCase) }
         analysisResultsSemaphore = Semaphore( /*permits=*/0)
         // Rebind the use case to the same camera.
-        camera = CameraUtil.createCameraAndAttachUseCase(context, DEFAULT_CAMERA_SELECTOR, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, DEFAULT_CAMERA_SELECTOR, useCase)
+        }
         assertThat(analysisResultsSemaphore.tryAcquire(5, TimeUnit.SECONDS)).isTrue()
     }
 
@@ -410,19 +442,17 @@
     @Throws(InterruptedException::class)
     fun useCaseCanBeReusedInDifferentCamera() = runBlocking {
         val useCase = ImageAnalysis.Builder().build()
-        camera = CameraUtil.createCameraAndAttachUseCase(
-            context,
-            CameraSelector.DEFAULT_BACK_CAMERA, useCase
-        )
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, DEFAULT_CAMERA_SELECTOR, useCase)
+        }
         useCase.setAnalyzer(CameraXExecutors.newHandlerExecutor(handler), analyzer)
         assertThat(analysisResultsSemaphore.tryAcquire(5, TimeUnit.SECONDS)).isTrue()
-        withContext(Dispatchers.Main) { camera!!.removeUseCases(setOf(useCase)) }
+        withContext(Dispatchers.Main) { cameraProvider.unbind(useCase) }
         analysisResultsSemaphore = Semaphore( /*permits=*/0)
         // Rebind the use case to different camera.
-        camera = CameraUtil.createCameraAndAttachUseCase(
-            context,
-            CameraSelector.DEFAULT_FRONT_CAMERA, useCase
-        )
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, DEFAULT_CAMERA_SELECTOR, useCase)
+        }
         assertThat(analysisResultsSemaphore.tryAcquire(5, TimeUnit.SECONDS)).isTrue()
     }
 
@@ -433,12 +463,17 @@
     }
 
     @Test
-    fun returnCorrectTargetRotation_afterUseCaseIsAttached() {
+    fun returnCorrectTargetRotation_afterUseCaseIsAttached() = runBlocking {
         val imageAnalysis = ImageAnalysis.Builder()
             .setTargetRotation(Surface.ROTATION_180)
             .build()
-        camera =
-            CameraUtil.createCameraAndAttachUseCase(context, DEFAULT_CAMERA_SELECTOR, imageAnalysis)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(
+                fakeLifecycleOwner,
+                DEFAULT_CAMERA_SELECTOR,
+                imageAnalysis
+            )
+        }
         assertThat(imageAnalysis.targetRotation).isEqualTo(Surface.ROTATION_180)
     }
 
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ImageCaptureTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ImageCaptureTest.kt
index 29f1803..22f2707 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ImageCaptureTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ImageCaptureTest.kt
@@ -40,12 +40,13 @@
 import androidx.camera.camera2.interop.ExperimentalCamera2Interop
 import androidx.camera.camera2.pipe.integration.CameraPipeConfig
 import androidx.camera.core.AspectRatio
+import androidx.camera.core.Camera
 import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraX
 import androidx.camera.core.CameraXConfig
 import androidx.camera.core.ImageCapture
 import androidx.camera.core.ImageCaptureException
 import androidx.camera.core.ImageProxy
+import androidx.camera.core.UseCaseGroup
 import androidx.camera.core.ViewPort
 import androidx.camera.core.impl.CaptureBundle
 import androidx.camera.core.impl.CaptureConfig
@@ -56,9 +57,10 @@
 import androidx.camera.core.impl.ImageProxyBundle
 import androidx.camera.core.impl.utils.CameraOrientationUtil
 import androidx.camera.core.impl.utils.Exif
-import androidx.camera.core.internal.CameraUseCaseAdapter
+import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.fakes.FakeCaptureStage
+import androidx.camera.testing.fakes.FakeLifecycleOwner
 import androidx.core.content.ContextCompat
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.filters.LargeTest
@@ -117,25 +119,29 @@
     private val context = ApplicationProvider.getApplicationContext<Context>()
     private val mainExecutor = ContextCompat.getMainExecutor(context)
     private val defaultBuilder = ImageCapture.Builder()
-    private lateinit var camera: CameraUseCaseAdapter
+    private lateinit var cameraProvider: ProcessCameraProvider
+    private lateinit var fakeLifecycleOwner: FakeLifecycleOwner
 
     @Before
-    fun setUp() {
+    fun setUp(): Unit = runBlocking {
         assumeTrue(CameraUtil.hasCameraWithLensFacing(BACK_LENS_FACING))
         createDefaultPictureFolderIfNotExist()
-        CameraX.initialize(context, cameraXConfig).get(10, TimeUnit.SECONDS)
+        ProcessCameraProvider.configureInstance(cameraXConfig)
+        cameraProvider = ProcessCameraProvider.getInstance(context)[10, TimeUnit.SECONDS]
+        withContext(Dispatchers.Main) {
+            fakeLifecycleOwner = FakeLifecycleOwner()
+            fakeLifecycleOwner.startAndResume()
+        }
     }
 
     @After
     fun tearDown(): Unit = runBlocking {
-        if (::camera.isInitialized) {
-            // TODO: The removeUseCases() call might be removed after clarifying the
-            // abortCaptures() issue in b/162314023
+        if (::cameraProvider.isInitialized) {
             withContext(Dispatchers.Main) {
-                camera.removeUseCases(camera.useCases)
+                cameraProvider.unbindAll()
+                cameraProvider.shutdown()[10, TimeUnit.SECONDS]
             }
         }
-        CameraX.shutdown().get(10, TimeUnit.SECONDS)
     }
 
     @Test
@@ -147,7 +153,9 @@
             .setTargetRotation(Surface.ROTATION_0)
             .build()
 
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCase)
+        }
 
         val callback = FakeImageCaptureCallback(capturesCount = 1)
         useCase.takePicture(mainExecutor, callback)
@@ -210,7 +218,9 @@
             .setTargetRotation(if (isRotateNeeded) Surface.ROTATION_90 else Surface.ROTATION_0)
             .build()
 
-        camera = CameraUtil.createCameraAndAttachUseCase(context, selector, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, selector, useCase)
+        }
 
         val callback = FakeImageCaptureCallback(capturesCount = 1)
         useCase.takePicture(mainExecutor, callback)
@@ -243,7 +253,9 @@
 
     private fun canTakeMultipleImages(builder: ImageCapture.Builder): Unit = runBlocking {
         val useCase = builder.build()
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCase)
+        }
 
         val numImages = 5
         val callback = FakeImageCaptureCallback(capturesCount = numImages)
@@ -286,7 +298,9 @@
 
     private fun canSaveToFile(saveLocation: File) = runBlocking {
         val useCase = defaultBuilder.build()
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCase)
+        }
 
         val callback = FakeImageSavedCallback(capturesCount = 1)
         useCase.takePicture(
@@ -305,7 +319,9 @@
 
         // Arrange.
         val useCase = defaultBuilder.build()
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCase)
+        }
 
         val contentValues = ContentValues()
         contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg")
@@ -337,7 +353,9 @@
 
         // Arrange.
         val useCase = defaultBuilder.build()
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCase)
+        }
 
         val saveLocation = File.createTempFile("test", ".jpg")
         saveLocation.deleteOnExit()
@@ -370,7 +388,9 @@
         val useCase = ImageCapture.Builder()
             .setTargetRotation(Surface.ROTATION_0)
             .build()
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCase)
+        }
 
         val saveLocation = File.createTempFile("test", ".jpg")
         saveLocation.deleteOnExit()
@@ -487,7 +507,9 @@
         verifyExif: (Exif) -> Unit
     ) = runBlocking {
         val useCase = configBuilder.build()
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCase)
+        }
 
         val saveLocation = File.createTempFile("test", ".jpg")
         saveLocation.deleteOnExit()
@@ -513,7 +535,9 @@
         skipTestOnCameraPipeConfig()
 
         val useCase = defaultBuilder.build()
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCase)
+        }
 
         val numImages = 5
         val callback = FakeImageSavedCallback(capturesCount = numImages)
@@ -540,7 +564,9 @@
         skipTestOnCameraPipeConfig()
 
         val useCase = defaultBuilder.build()
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCase)
+        }
 
         // Note the invalid path
         val saveLocation = File("/not/a/real/path.jpg")
@@ -581,7 +607,9 @@
         Camera2Interop.Extender(builder).setSessionCaptureCallback(captureCallback)
         val useCase = builder.build()
 
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCase)
+        }
 
         val callback = FakeImageCaptureCallback(capturesCount = 1)
 
@@ -614,7 +642,9 @@
             .setBufferFormat(ImageFormat.RAW10)
             .build()
 
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCase)
+        }
 
         val callback = FakeImageCaptureCallback(capturesCount = 1)
 
@@ -669,7 +699,9 @@
             .setCaptureBundle(captureBundle)
             .build()
 
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, imageCapture)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, imageCapture)
+        }
 
         val callback = FakeImageCaptureCallback(capturesCount = 1)
 
@@ -704,7 +736,9 @@
             .setCaptureProcessor(captureProcessor)
             .build()
 
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, imageCapture)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, imageCapture)
+        }
 
         // Add an additional capture stage to test the case
         // captureStage.size() > mMaxCaptureStages during takePicture.
@@ -729,7 +763,9 @@
         skipTestOnCameraPipeConfig()
 
         val imageCapture = ImageCapture.Builder().build()
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, imageCapture)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, imageCapture)
+        }
 
         // After the use case can be reused, the capture requests can only be cancelled after the
         // onStateAttached() callback has been received. In the normal code flow, the
@@ -765,7 +801,9 @@
         skipTestOnCameraPipeConfig()
 
         val imageCapture = ImageCapture.Builder().build()
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, imageCapture)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, imageCapture)
+        }
 
         val callback = FakeImageCaptureCallback(capturesCount = 3)
         imageCapture.takePicture(mainExecutor, callback)
@@ -777,7 +815,7 @@
         // after ImageCapture is removed so errors out with a different error from
         // ERROR_CAMERA_CLOSED
         withContext(Dispatchers.Main) {
-            camera.removeUseCases(setOf(imageCapture))
+            cameraProvider.unbind(imageCapture)
         }
 
         // Wait for the signal that the image capture has failed.
@@ -806,18 +844,20 @@
     }
 
     @Test
-    fun defaultAspectRatioWillBeSet_whenTargetResolutionIsNotSet() {
+    fun defaultAspectRatioWillBeSet_whenTargetResolutionIsNotSet() = runBlocking {
         skipTestOnCameraPipeConfig()
 
         val useCase = ImageCapture.Builder().build()
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCase)
+        }
 
         val config = useCase.currentConfig as ImageOutputConfig
         assertThat(config.targetAspectRatio).isEqualTo(AspectRatio.RATIO_4_3)
     }
 
     @Test
-    fun defaultAspectRatioWontBeSet_whenTargetResolutionIsSet() {
+    fun defaultAspectRatioWontBeSet_whenTargetResolutionIsSet() = runBlocking {
         skipTestOnCameraPipeConfig()
 
         val useCase = ImageCapture.Builder()
@@ -830,7 +870,9 @@
             )
         ).isFalse()
 
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCase)
+        }
 
         assertThat(
             useCase.currentConfig.containsOption(
@@ -849,14 +891,16 @@
     }
 
     @Test
-    fun targetResolutionIsUpdatedAfterTargetRotationIsUpdated() {
+    fun targetResolutionIsUpdatedAfterTargetRotationIsUpdated() = runBlocking {
         skipTestOnCameraPipeConfig()
 
         val imageCapture = ImageCapture.Builder()
             .setTargetResolution(DEFAULT_RESOLUTION)
             .setTargetRotation(Surface.ROTATION_0)
             .build()
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, imageCapture)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, imageCapture)
+        }
 
         // Updates target rotation from ROTATION_0 to ROTATION_90.
         imageCapture.targetRotation = Surface.ROTATION_90
@@ -933,7 +977,9 @@
         useCase: ImageCapture,
         rotateCropRect: (Int) -> Boolean
     ) = runBlocking {
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCase)
+        }
 
         val callback = FakeImageCaptureCallback(capturesCount = 1)
         useCase.takePicture(mainExecutor, callback)
@@ -967,7 +1013,9 @@
         skipTestOnCameraPipeConfig()
 
         val useCase = ImageCapture.Builder().build()
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCase)
+        }
 
         val callback = FakeImageCaptureCallback(capturesCount = 1)
 
@@ -1030,19 +1078,17 @@
         val useCaseCroppingAspectRatio = Rational(4, 3)
         useCase.setCropAspectRatio(useCaseCroppingAspectRatio)
 
-        camera = CameraUtil.createCameraUseCaseAdapter(context, BACK_SELECTOR)
-
+        // Sets view port with different aspect ratio and then attach the use case
         val viewPortAspectRatio = Rational(2, 1)
         val viewPort = ViewPort.Builder(
             viewPortAspectRatio,
             if (isRotateNeeded) Surface.ROTATION_90 else Surface.ROTATION_0
         ).build()
 
-        // Sets view port with different aspect ratio and then attach the use case
-        camera.setViewPort(viewPort)
+        val useCaseGroup = UseCaseGroup.Builder().setViewPort(viewPort).addUseCase(useCase).build()
 
         withContext(Dispatchers.Main) {
-            camera.addUseCases(listOf(useCase))
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCaseGroup)
         }
 
         val callback = FakeImageCaptureCallback(capturesCount = 1)
@@ -1087,10 +1133,12 @@
 
         val useCase = defaultBuilder.build()
         val initialConfig = useCase.currentConfig
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCase)
+        }
 
         withContext(Dispatchers.Main) {
-            camera.removeUseCases(setOf(useCase))
+            cameraProvider.unbind(useCase)
         }
 
         val configAfterUnbinding = useCase.currentConfig
@@ -1102,14 +1150,16 @@
         skipTestOnCameraPipeConfig()
 
         val useCase = defaultBuilder.build()
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCase)
+        }
 
         // Generally, the device can't be rotated to Surface.ROTATION_180. Therefore,
         // use it to do the test.
         useCase.targetRotation = Surface.ROTATION_180
         withContext(Dispatchers.Main) {
             // Unbind the use case.
-            camera.removeUseCases(setOf(useCase))
+            cameraProvider.unbind(useCase)
         }
 
         // Check the target rotation is kept when the use case is unbound.
@@ -1117,7 +1167,9 @@
 
         // Check the target rotation is kept when the use case is rebound to the
         // lifecycle.
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCase)
+        }
         assertThat(useCase.targetRotation).isEqualTo(Surface.ROTATION_180)
     }
 
@@ -1127,17 +1179,21 @@
 
         val useCase = defaultBuilder.build()
         val cropAspectRatio = Rational(1, 1)
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCase)
+        }
 
         useCase.setCropAspectRatio(cropAspectRatio)
 
         withContext(Dispatchers.Main) {
             // Unbind the use case.
-            camera.removeUseCases(setOf(useCase))
+            cameraProvider.unbind(useCase)
         }
 
         // Rebind the use case.
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCase)
+        }
 
         val callback = FakeImageCaptureCallback(capturesCount = 1)
         useCase.takePicture(mainExecutor, callback)
@@ -1159,7 +1215,9 @@
         skipTestOnCameraPipeConfig()
 
         val useCase = defaultBuilder.build()
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCase)
+        }
 
         val saveLocation1 = File.createTempFile("test1", ".jpg")
         saveLocation1.deleteOnExit()
@@ -1177,11 +1235,13 @@
 
         withContext(Dispatchers.Main) {
             // Unbind the use case.
-            camera.removeUseCases(setOf(useCase))
+            cameraProvider.unbind(useCase)
         }
 
         // Rebind the use case to the same camera.
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCase)
+        }
 
         val saveLocation2 = File.createTempFile("test2", ".jpg")
         saveLocation2.deleteOnExit()
@@ -1203,7 +1263,9 @@
         skipTestOnCameraPipeConfig()
 
         val useCase = defaultBuilder.build()
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCase)
+        }
 
         val saveLocation1 = File.createTempFile("test1", ".jpg")
         saveLocation1.deleteOnExit()
@@ -1221,15 +1283,17 @@
 
         withContext(Dispatchers.Main) {
             // Unbind the use case.
-            camera.removeUseCases(setOf(useCase))
+            cameraProvider.unbind(useCase)
         }
 
         // Rebind the use case to different camera.
-        camera = CameraUtil.createCameraAndAttachUseCase(
-            context,
-            CameraSelector.DEFAULT_FRONT_CAMERA,
-            useCase
-        )
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(
+                fakeLifecycleOwner,
+                CameraSelector.DEFAULT_FRONT_CAMERA,
+                useCase
+            )
+        }
 
         val saveLocation2 = File.createTempFile("test2", ".jpg")
         saveLocation2.deleteOnExit()
@@ -1253,13 +1317,15 @@
     }
 
     @Test
-    fun returnCorrectTargetRotation_afterUseCaseIsAttached() {
+    fun returnCorrectTargetRotation_afterUseCaseIsAttached() = runBlocking {
         skipTestOnCameraPipeConfig()
 
         val imageCapture = ImageCapture.Builder()
             .setTargetRotation(Surface.ROTATION_180)
             .build()
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, imageCapture)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, imageCapture)
+        }
         assertThat(imageCapture.targetRotation).isEqualTo(Surface.ROTATION_180)
     }
 
@@ -1270,13 +1336,15 @@
     }
 
     @Test
-    fun returnCorrectFlashMode_afterUseCaseIsAttached() {
+    fun returnCorrectFlashMode_afterUseCaseIsAttached() = runBlocking {
         skipTestOnCameraPipeConfig()
 
         val imageCapture = ImageCapture.Builder()
             .setFlashMode(ImageCapture.FLASH_MODE_ON)
             .build()
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, imageCapture)
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, imageCapture)
+        }
         assertThat(imageCapture.flashMode).isEqualTo(ImageCapture.FLASH_MODE_ON)
     }
 
@@ -1296,7 +1364,10 @@
         )
 
         val useCase = builder.build()
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+        var camera: Camera
+        withContext(Dispatchers.Main) {
+            camera = cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCase)
+        }
 
         val callback = FakeImageCaptureCallback(capturesCount = 1)
         useCase.takePicture(mainExecutor, callback)
@@ -1329,7 +1400,10 @@
         )
 
         val useCase = builder.build()
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+        var camera: Camera
+        withContext(Dispatchers.Main) {
+            camera = cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCase)
+        }
 
         val callback = FakeImageCaptureCallback(capturesCount = 1)
         useCase.takePicture(mainExecutor, callback)
@@ -1359,7 +1433,10 @@
 
         // Set a CaptureProcessor to directly pass the image to output surface.
         val useCase = builder.setCaptureProcessor(simpleCaptureProcessor).build()
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+        var camera: Camera
+        withContext(Dispatchers.Main) {
+            camera = cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCase)
+        }
 
         val callback = FakeImageCaptureCallback(capturesCount = 1)
         useCase.takePicture(mainExecutor, callback)
@@ -1397,7 +1474,10 @@
             true
         )
 
-        camera = CameraUtil.createCameraAndAttachUseCase(context, BACK_SELECTOR, useCase)
+        var camera: Camera
+        withContext(Dispatchers.Main) {
+            camera = cameraProvider.bindToLifecycle(fakeLifecycleOwner, BACK_SELECTOR, useCase)
+        }
 
         val callback = FakeImageCaptureCallback(capturesCount = 1)
         useCase.takePicture(mainExecutor, callback)
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/InitializationTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/InitializationTest.kt
index 27de82b..3bca7d9 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/InitializationTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/InitializationTest.kt
@@ -18,7 +18,7 @@
 
 import android.content.Context
 import android.content.Intent
-import androidx.camera.core.CameraX
+import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CoreAppTestUtil
 import androidx.concurrent.futures.await
@@ -78,7 +78,9 @@
         @AfterClass
         @JvmStatic
         fun shutdownCameraX() {
-            CameraX.shutdown().get(10, TimeUnit.SECONDS)
+            val context = ApplicationProvider.getApplicationContext<Context>()
+            val cameraProvider = ProcessCameraProvider.getInstance(context)[10, TimeUnit.SECONDS]
+            cameraProvider.shutdown()[10, TimeUnit.SECONDS]
         }
     }
 
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/MLKitBarcodeTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/MLKitBarcodeTest.kt
index 195d892..1ce4f73 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/MLKitBarcodeTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/MLKitBarcodeTest.kt
@@ -20,14 +20,13 @@
 import android.util.Log
 import android.util.Size
 import android.view.Surface
-import androidx.camera.camera2.Camera2Config
 import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraX
 import androidx.camera.core.ImageAnalysis
 import androidx.camera.core.impl.utils.executor.CameraXExecutors
-import androidx.camera.core.internal.CameraUseCaseAdapter
+import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.LabTestRule
+import androidx.camera.testing.fakes.FakeLifecycleOwner
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.filters.LargeTest
 import com.google.common.truth.Truth.assertWithMessage
@@ -76,32 +75,36 @@
     }
 
     private val context: Context = ApplicationProvider.getApplicationContext()
-    private lateinit var camera: CameraUseCaseAdapter
     // For MK Kit Barcode scanner
     private lateinit var barcodeScanner: BarcodeScanner
     private var imageResolution: Size = resolution
     private var imageRotation: Int = Surface.ROTATION_0
     private var targetRotation: Int = Surface.ROTATION_0
+    private lateinit var cameraProvider: ProcessCameraProvider
+    private lateinit var fakeLifecycleOwner: FakeLifecycleOwner
 
     @Before
-    fun setup() {
-        CameraX.initialize(context, Camera2Config.defaultConfig()).get(10, TimeUnit.SECONDS)
+    fun setup(): Unit = runBlocking {
+        cameraProvider = ProcessCameraProvider.getInstance(context)[10, TimeUnit.SECONDS]
 
         barcodeScanner = BarcodeScanning.getClient(
             BarcodeScannerOptions.Builder().setBarcodeFormats(FORMAT_QR_CODE).build()
         )
+
+        withContext(Dispatchers.Main) {
+            fakeLifecycleOwner = FakeLifecycleOwner()
+            fakeLifecycleOwner.startAndResume()
+        }
     }
 
     @After
     fun tearDown(): Unit = runBlocking {
-        if (::camera.isInitialized) {
-            // TODO: The removeUseCases() call might be removed after clarifying the
-            // abortCaptures() issue in b/162314023
+        if (::cameraProvider.isInitialized) {
             withContext(Dispatchers.Main) {
-                camera.removeUseCases(camera.useCases)
+                cameraProvider.unbindAll()
+                cameraProvider.shutdown()[10, TimeUnit.SECONDS]
             }
         }
-        CameraX.shutdown().get(10, TimeUnit.SECONDS)
 
         if (::barcodeScanner.isInitialized) {
             barcodeScanner.close()
@@ -110,27 +113,31 @@
 
     @LabTestRule.LabTestFrontCamera
     @Test
-    fun barcodeDetectViaFontCamera() {
+    fun barcodeDetectViaFontCamera() = runBlocking {
         val imageAnalysis = initImageAnalysis(CameraSelector.LENS_FACING_FRONT)
 
-        camera = CameraUtil.createCameraAndAttachUseCase(
-            context,
-            CameraSelector.DEFAULT_FRONT_CAMERA,
-            imageAnalysis
-        )
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(
+                fakeLifecycleOwner,
+                CameraSelector.DEFAULT_FRONT_CAMERA,
+                imageAnalysis
+            )
+        }
         assertBarcodeDetect(imageAnalysis)
     }
 
     @LabTestRule.LabTestRearCamera
     @Test
-    fun barcodeDetectViaRearCamera() {
+    fun barcodeDetectViaRearCamera() = runBlocking {
         val imageAnalysis = initImageAnalysis(CameraSelector.LENS_FACING_BACK)
 
-        camera = CameraUtil.createCameraAndAttachUseCase(
-            context,
-            CameraSelector.DEFAULT_BACK_CAMERA,
-            imageAnalysis
-        )
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(
+                fakeLifecycleOwner,
+                CameraSelector.DEFAULT_BACK_CAMERA,
+                imageAnalysis
+            )
+        }
         assertBarcodeDetect(imageAnalysis)
     }
 
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/NewActivityLifecycleTest.java b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/NewActivityLifecycleTest.java
index b1b8a1b..ab53a5b 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/NewActivityLifecycleTest.java
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/NewActivityLifecycleTest.java
@@ -26,7 +26,7 @@
 import android.content.Context;
 import android.content.Intent;
 
-import androidx.camera.core.CameraX;
+import androidx.camera.lifecycle.ProcessCameraProvider;
 import androidx.camera.testing.CameraUtil;
 import androidx.camera.testing.CoreAppTestUtil;
 import androidx.test.core.app.ApplicationProvider;
@@ -105,7 +105,9 @@
     @AfterClass
     public static void shutdownCameraX()
             throws InterruptedException, ExecutionException, TimeoutException {
-        CameraX.shutdown().get(10, TimeUnit.SECONDS);
+        ProcessCameraProvider cameraProvider = ProcessCameraProvider.getInstance(
+                ApplicationProvider.getApplicationContext()).get(10, TimeUnit.SECONDS);
+        cameraProvider.shutdown().get(10, TimeUnit.SECONDS);
     }
 
     @Test
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/TakePictureTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/TakePictureTest.kt
index 1c1704e..a9dc4f0 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/TakePictureTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/TakePictureTest.kt
@@ -17,10 +17,12 @@
 package androidx.camera.integration.core
 
 import android.Manifest
-import androidx.camera.core.CameraX
+import android.content.Context
+import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CoreAppTestUtil
 import androidx.test.core.app.ActivityScenario
+import androidx.test.core.app.ApplicationProvider
 import androidx.test.espresso.Espresso.onView
 import androidx.test.espresso.action.ViewActions.click
 import androidx.test.espresso.matcher.ViewMatchers.withId
@@ -54,7 +56,9 @@
         @AfterClass
         @JvmStatic
         fun tearDown() {
-            CameraX.shutdown().get(10, TimeUnit.SECONDS)
+            val context = ApplicationProvider.getApplicationContext<Context>()
+            val cameraProvider = ProcessCameraProvider.getInstance(context)[10, TimeUnit.SECONDS]
+            cameraProvider.shutdown()[10, TimeUnit.SECONDS]
         }
     }
 
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ToggleButtonUITest.java b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ToggleButtonUITest.java
index 70eccd1..a9af102 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ToggleButtonUITest.java
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ToggleButtonUITest.java
@@ -34,11 +34,11 @@
 
 import androidx.camera.core.CameraInfo;
 import androidx.camera.core.CameraSelector;
-import androidx.camera.core.CameraX;
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.TorchState;
 import androidx.camera.integration.core.idlingresource.ElapsedTimeIdlingResource;
 import androidx.camera.integration.core.idlingresource.WaitForViewToShow;
+import androidx.camera.lifecycle.ProcessCameraProvider;
 import androidx.camera.testing.CameraUtil;
 import androidx.camera.testing.CoreAppTestUtil;
 import androidx.test.core.app.ApplicationProvider;
@@ -127,7 +127,9 @@
     @AfterClass
     public static void shutdownCameraX()
             throws InterruptedException, ExecutionException, TimeoutException {
-        CameraX.shutdown().get(10, TimeUnit.SECONDS);
+        ProcessCameraProvider cameraProvider = ProcessCameraProvider.getInstance(
+                ApplicationProvider.getApplicationContext()).get(10, TimeUnit.SECONDS);
+        cameraProvider.shutdown().get(10, TimeUnit.SECONDS);
     }
 
     @Test
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/UseCaseCombinationTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/UseCaseCombinationTest.kt
index 2ff1686..f6cf786 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/UseCaseCombinationTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/UseCaseCombinationTest.kt
@@ -24,7 +24,9 @@
 import androidx.camera.core.ImageAnalysis
 import androidx.camera.core.ImageCapture
 import androidx.camera.core.Preview
+import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
+import androidx.camera.testing.fakes.FakeLifecycleOwner
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.filters.LargeTest
 import kotlinx.coroutines.Dispatchers
@@ -62,65 +64,85 @@
     }
 
     private val context: Context = ApplicationProvider.getApplicationContext()
+    private lateinit var cameraProvider: ProcessCameraProvider
+    private lateinit var fakeLifecycleOwner: FakeLifecycleOwner
 
     @Before
     fun initializeCameraX(): Unit = runBlocking {
-        CameraX.initialize(context, cameraConfig).get(10, TimeUnit.SECONDS)
+        ProcessCameraProvider.configureInstance(cameraConfig)
+        cameraProvider = ProcessCameraProvider.getInstance(context)[10, TimeUnit.SECONDS]
+
+        withContext(Dispatchers.Main) {
+            fakeLifecycleOwner = FakeLifecycleOwner()
+            fakeLifecycleOwner.startAndResume()
+        }
     }
 
     @After
     fun shutdownCameraX(): Unit = runBlocking {
-        CameraX.shutdown().get(10, TimeUnit.SECONDS)
+        if (::cameraProvider.isInitialized) {
+            withContext(Dispatchers.Main) {
+                cameraProvider.unbindAll()
+                cameraProvider.shutdown()[10, TimeUnit.SECONDS]
+            }
+        }
     }
 
     /** Test Combination: Preview + ImageCapture */
     @Test
-    fun previewCombinesImageCapture() = runBlocking {
+    fun previewCombinesImageCapture(): Unit = runBlocking {
         skipTestOnCameraPipeConfig()
 
         val preview = initPreview()
         val imageCapture = initImageCapture()
 
-        val camera = CameraUtil.createCameraUseCaseAdapter(context, DEFAULT_SELECTOR)
-        camera.detachUseCases()
-
         // TODO(b/160249108) move off of main thread once UseCases can be attached on any thread
         withContext(Dispatchers.Main) {
-            camera.addUseCases(listOf(preview, imageCapture))
+            cameraProvider.bindToLifecycle(
+                fakeLifecycleOwner,
+                DEFAULT_SELECTOR,
+                preview,
+                imageCapture
+            )
         }
     }
 
     /** Test Combination: Preview + ImageAnalysis */
     @Test
-    fun previewCombinesImageAnalysis() = runBlocking {
+    fun previewCombinesImageAnalysis(): Unit = runBlocking {
         val preview = initPreview()
         val imageAnalysis = initImageAnalysis()
 
-        val camera = CameraUtil.createCameraUseCaseAdapter(context, DEFAULT_SELECTOR)
-        camera.detachUseCases()
-
         // TODO(b/160249108) move off of main thread once UseCases can be attached on any thread
         withContext(Dispatchers.Main) {
-            camera.addUseCases(listOf(preview, imageAnalysis))
+            cameraProvider.bindToLifecycle(
+                fakeLifecycleOwner,
+                DEFAULT_SELECTOR,
+                preview,
+                imageAnalysis
+            )
         }
     }
 
     /** Test Combination: Preview + ImageAnalysis + ImageCapture  */
     @Test
-    fun previewCombinesImageAnalysisAndImageCapture() = runBlocking {
+    fun previewCombinesImageAnalysisAndImageCapture(): Unit = runBlocking {
         skipTestOnCameraPipeConfig()
 
         val preview = initPreview()
         val imageAnalysis = initImageAnalysis()
         val imageCapture = initImageCapture()
 
-        val camera = CameraUtil.createCameraUseCaseAdapter(context, DEFAULT_SELECTOR)
-        camera.detachUseCases()
-
         // TODO(b/160249108) move off of main thread once UseCases can be attached on any
         //  thread
         withContext(Dispatchers.Main) {
-            camera.addUseCases(listOf(preview, imageAnalysis, imageCapture))
+            cameraProvider.bindToLifecycle(
+                fakeLifecycleOwner,
+                DEFAULT_SELECTOR,
+                preview,
+                imageAnalysis,
+                imageCapture
+            )
         }
     }
 
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/YuvToRgbConverterTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/YuvToRgbConverterTest.kt
index 3d518ba..df4c80d 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/YuvToRgbConverterTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/YuvToRgbConverterTest.kt
@@ -21,13 +21,13 @@
 import androidx.camera.camera2.Camera2Config
 import androidx.camera.camera2.pipe.integration.CameraPipeConfig
 import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraX
 import androidx.camera.core.CameraXConfig
 import androidx.camera.core.ImageAnalysis
-import androidx.camera.core.internal.CameraUseCaseAdapter
 import androidx.camera.integration.core.util.YuvToRgbConverter
+import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.LabTestRule
+import androidx.camera.testing.fakes.FakeLifecycleOwner
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.filters.LargeTest
 import kotlinx.coroutines.Dispatchers
@@ -60,7 +60,8 @@
     val labTest: LabTestRule = LabTestRule()
 
     private val context = ApplicationProvider.getApplicationContext<Context>()
-    private lateinit var camera: CameraUseCaseAdapter
+    private lateinit var cameraProvider: ProcessCameraProvider
+    private lateinit var fakeLifecycleOwner: FakeLifecycleOwner
 
     companion object {
         @JvmStatic
@@ -72,26 +73,30 @@
     }
 
     @Before
-    fun setUp() {
+    fun setUp(): Unit = runBlocking {
         Assume.assumeTrue(CameraUtil.deviceHasCamera())
-        CameraX.initialize(context, cameraXConfig).get(10, TimeUnit.SECONDS)
+        ProcessCameraProvider.configureInstance(cameraXConfig)
+        cameraProvider = ProcessCameraProvider.getInstance(context)[10, TimeUnit.SECONDS]
+
+        withContext(Dispatchers.Main) {
+            fakeLifecycleOwner = FakeLifecycleOwner()
+            fakeLifecycleOwner.startAndResume()
+        }
     }
 
     @After
     fun tearDown(): Unit = runBlocking {
-        if (::camera.isInitialized) {
-            // TODO: The removeUseCases() call might be removed after clarifying the
-            // abortCaptures() issue in b/162314023
+        if (::cameraProvider.isInitialized) {
             withContext(Dispatchers.Main) {
-                camera.removeUseCases(camera.useCases)
+                cameraProvider.unbindAll()
+                cameraProvider.shutdown()[10, TimeUnit.SECONDS]
             }
         }
-        CameraX.shutdown().get(10, TimeUnit.SECONDS)
     }
 
     @LabTestRule.LabTestOnly
     @Test
-    fun yubToRgbConverterTest() {
+    fun yubToRgbConverterTest(): Unit = runBlocking {
         val yuvToRgbConverter = YuvToRgbConverter(context)
         val countDownLatch = CountDownLatch(30)
         val imageAnalyzer = ImageAnalysis.Builder().build().also {
@@ -115,12 +120,13 @@
                 }
             )
         }
-
-        camera = CameraUtil.createCameraAndAttachUseCase(
-            context,
-            CameraSelector.DEFAULT_BACK_CAMERA,
-            imageAnalyzer
-        )
+        withContext(Dispatchers.Main) {
+            cameraProvider.bindToLifecycle(
+                fakeLifecycleOwner,
+                CameraSelector.DEFAULT_BACK_CAMERA,
+                imageAnalyzer
+            )
+        }
 
         assertTrue(countDownLatch.await(60, TimeUnit.SECONDS))
     }
diff --git a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageAnalysisBaseTest.kt b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageAnalysisBaseTest.kt
index cb965b7..3ee32c0 100644
--- a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageAnalysisBaseTest.kt
+++ b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageAnalysisBaseTest.kt
@@ -16,8 +16,9 @@
 
 package androidx.camera.integration.uiwidgets.rotations
 
+import android.content.Context
 import android.content.Intent
-import androidx.camera.core.CameraX
+import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CoreAppTestUtil
 import androidx.test.core.app.ActivityScenario
@@ -69,7 +70,9 @@
     }
 
     protected fun tearDown() {
-        CameraX.shutdown().get(10, TimeUnit.SECONDS)
+        val context = ApplicationProvider.getApplicationContext<Context>()
+        val cameraProvider = ProcessCameraProvider.getInstance(context)[10, TimeUnit.SECONDS]
+        cameraProvider.shutdown()[10, TimeUnit.SECONDS]
         mDevice.unfreezeRotation()
     }
 
diff --git a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureBaseTest.kt b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureBaseTest.kt
index a3da193..b00d028 100644
--- a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureBaseTest.kt
+++ b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureBaseTest.kt
@@ -16,13 +16,14 @@
 
 package androidx.camera.integration.uiwidgets.rotations
 
+import android.content.Context
 import android.content.Intent
 import android.os.Build
 import android.os.Environment
 import android.view.View
 import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraX
 import androidx.camera.integration.uiwidgets.R
+import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CoreAppTestUtil
 import androidx.test.core.app.ActivityScenario
@@ -88,7 +89,9 @@
     }
 
     protected fun tearDown() {
-        CameraX.shutdown().get(10, TimeUnit.SECONDS)
+        val context = ApplicationProvider.getApplicationContext<Context>()
+        val cameraProvider = ProcessCameraProvider.getInstance(context)[10, TimeUnit.SECONDS]
+        cameraProvider.shutdown()[10, TimeUnit.SECONDS]
         mDevice.unfreezeRotation()
     }
 
diff --git a/camera/integration-tests/viewtestapp/src/androidTest/java/androidx/camera/integration/view/CameraControllerFragmentTest.kt b/camera/integration-tests/viewtestapp/src/androidTest/java/androidx/camera/integration/view/CameraControllerFragmentTest.kt
index 391e744..7dd3870 100644
--- a/camera/integration-tests/viewtestapp/src/androidTest/java/androidx/camera/integration/view/CameraControllerFragmentTest.kt
+++ b/camera/integration-tests/viewtestapp/src/androidTest/java/androidx/camera/integration/view/CameraControllerFragmentTest.kt
@@ -25,7 +25,6 @@
 import android.os.Build
 import android.view.Surface
 import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraX
 import androidx.camera.core.ImageAnalysis
 import androidx.camera.core.ImageCapture
 import androidx.camera.core.ImageCaptureException
@@ -33,18 +32,20 @@
 import androidx.camera.core.impl.utils.executor.CameraXExecutors
 import androidx.camera.core.impl.utils.futures.FutureCallback
 import androidx.camera.core.impl.utils.futures.Futures
+import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CoreAppTestUtil
 import androidx.camera.view.CameraController.TAP_TO_FOCUS_FAILED
-import androidx.camera.view.CameraController.TAP_TO_FOCUS_NOT_STARTED
-import androidx.camera.view.CameraController.TAP_TO_FOCUS_STARTED
 import androidx.camera.view.CameraController.TAP_TO_FOCUS_FOCUSED
 import androidx.camera.view.CameraController.TAP_TO_FOCUS_NOT_FOCUSED
+import androidx.camera.view.CameraController.TAP_TO_FOCUS_NOT_STARTED
+import androidx.camera.view.CameraController.TAP_TO_FOCUS_STARTED
 import androidx.camera.view.PreviewView
 import androidx.fragment.app.testing.FragmentScenario
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.Observer
 import androidx.test.annotation.UiThreadTest
+import androidx.test.core.app.ApplicationProvider
 import androidx.test.espresso.Espresso.onView
 import androidx.test.espresso.action.ViewActions.click
 import androidx.test.espresso.matcher.ViewMatchers.withId
@@ -105,6 +106,7 @@
     )
 
     private val instrumentation = InstrumentationRegistry.getInstrumentation()
+    private lateinit var cameraProvider: ProcessCameraProvider
     private lateinit var fragment: CameraControllerFragment
     private lateinit var fragmentScenario: FragmentScenario<CameraControllerFragment>
     private lateinit var uiDevice: UiDevice
@@ -114,6 +116,9 @@
         // Clear the device UI and check if there is no dialog or lock screen on the top of the
         // window before start the test.
         CoreAppTestUtil.prepareDeviceUI(instrumentation)
+        cameraProvider = ProcessCameraProvider.getInstance(
+            ApplicationProvider.getApplicationContext()
+        )[10000, TimeUnit.MILLISECONDS]
         fragmentScenario = createFragmentScenario()
         fragment = fragmentScenario.getFragment()
         uiDevice = UiDevice.getInstance(instrumentation)
@@ -123,7 +128,10 @@
     fun tearDown() {
         if (::fragmentScenario.isInitialized) {
             fragmentScenario.moveToState(Lifecycle.State.DESTROYED)
-            CameraX.shutdown().get(10, TimeUnit.SECONDS)
+        }
+
+        if (::cameraProvider.isInitialized) {
+            cameraProvider.shutdown()[10000, TimeUnit.MILLISECONDS]
         }
     }
 
diff --git a/car/app/app-automotive/build.gradle b/car/app/app-automotive/build.gradle
index e912238..b305048 100644
--- a/car/app/app-automotive/build.gradle
+++ b/car/app/app-automotive/build.gradle
@@ -30,6 +30,8 @@
     implementation("androidx.lifecycle:lifecycle-common-java8:2.2.0")
     implementation("androidx.annotation:annotation:1.1.0")
     implementation(libs.autoValueAnnotations)
+    implementation("androidx.annotation:annotation-experimental:1.1.0")
+    implementation libs.kotlinStdlib // Due to :annotation-experimental
 
     annotationProcessor(libs.nullaway)
     annotationProcessor(libs.autoValue)
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/PropertyUtils.java b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/PropertyUtils.java
index 258f822..a1f41dc 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/PropertyUtils.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/common/PropertyUtils.java
@@ -17,6 +17,10 @@
 package androidx.car.app.hardware.common;
 
 import static androidx.annotation.RestrictTo.Scope.LIBRARY;
+import static androidx.car.app.hardware.common.CarUnit.IMPERIAL_GALLON;
+import static androidx.car.app.hardware.common.CarUnit.LITER;
+import static androidx.car.app.hardware.common.CarUnit.MILLILITER;
+import static androidx.car.app.hardware.common.CarUnit.US_GALLON;
 
 import android.car.Car;
 import android.car.VehiclePropertyIds;
@@ -24,7 +28,9 @@
 import android.util.Pair;
 import android.util.SparseArray;
 
+import androidx.annotation.OptIn;
 import androidx.annotation.RestrictTo;
+import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.hardware.info.AutomotiveCarInfo;
 import androidx.car.app.hardware.info.EnergyProfile;
 
@@ -132,6 +138,18 @@
     // VehicleUnit.MILE in car service
     private static final int VEHICLE_UNIT_MILE = 0x24;
 
+    // VehicleUnit.MILLIMETER in car service
+    private static final int VEHICLE_UNIT_MILLILITER = 0x40;
+
+    // VehicleUnit.LITER in car service
+    private static final int VEHICLE_UNIT_VOLUME_LITER = 0x41;
+
+    // VehicleUnit.US_GALLON in car service
+    private static final int VEHICLE_UNIT_VOLUME_US_GALLON = 0x42;
+
+    // VehicleUnit.IMPERIAL_GALLON in car service
+    private static final int VEHICLE_UNIT_VOLUME_IMPERIAL_GALLON = 0x43;
+
     /**
      * Maps speed units in car service to speed units in {@link CarUnit}.
      */
@@ -167,6 +185,25 @@
     }
 
     /**
+     * Maps volume units in car service to volume units in {@link CarUnit}.
+     */
+    @OptIn(markerClass = ExperimentalCarApi.class)
+    public static @CarUnit.CarVolumeUnit int covertVolumeUnit(int vehicleUnit) {
+        switch (vehicleUnit) {
+            case VEHICLE_UNIT_MILLILITER:
+                return MILLILITER;
+            case VEHICLE_UNIT_VOLUME_LITER:
+                return LITER;
+            case VEHICLE_UNIT_VOLUME_US_GALLON:
+                return US_GALLON;
+            case VEHICLE_UNIT_VOLUME_IMPERIAL_GALLON:
+                return IMPERIAL_GALLON;
+            default:
+                throw new IllegalArgumentException("Invalid volume unit: " + vehicleUnit);
+        }
+    }
+
+    /**
      * Maps EV connector types in car service to types in {@link EnergyProfile}.
      */
     public static @EnergyProfile.EvConnectorType int covertEvConnectorType(
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/info/AutomotiveCarInfo.java b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/info/AutomotiveCarInfo.java
index 7712336c..b418d91 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/info/AutomotiveCarInfo.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/info/AutomotiveCarInfo.java
@@ -19,6 +19,7 @@
 import static android.car.VehiclePropertyIds.EV_BATTERY_LEVEL;
 import static android.car.VehiclePropertyIds.FUEL_LEVEL;
 import static android.car.VehiclePropertyIds.FUEL_LEVEL_LOW;
+import static android.car.VehiclePropertyIds.FUEL_VOLUME_DISPLAY_UNITS;
 import static android.car.VehiclePropertyIds.INFO_EV_BATTERY_CAPACITY;
 import static android.car.VehiclePropertyIds.INFO_EV_CONNECTOR_TYPE;
 import static android.car.VehiclePropertyIds.INFO_FUEL_CAPACITY;
@@ -40,9 +41,11 @@
 import androidx.annotation.DoNotInline;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.OptIn;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.VisibleForTesting;
+import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.hardware.common.CarPropertyResponse;
 import androidx.car.app.hardware.common.CarValue;
 import androidx.car.app.hardware.common.GetPropertyRequest;
@@ -223,7 +226,8 @@
 
         // This future will get EV battery capacity and fuel capacity for calculating the
         // percentage of battery level and fuel level. Without those values, we still can provide
-        // fuel_level_low, distance_units and range_remaining information in EnergyLevelListener.
+        // fuel_level_low, distance_units, fuel_volume_display_units and range_remaining information
+        // in EnergyLevelListener.
         capacityFuture.addListener(() -> {
             try {
                 float evBatteryCapacity = UNKNOWN_CAPACITY;
@@ -532,68 +536,91 @@
         }
 
         @Override
+        // TODO(b/202303614): Remove this annotation once FuelVolumeDisplayUnit is ready.
+        @OptIn(markerClass = ExperimentalCarApi.class)
         public void onCarPropertyResponses(
                 @NonNull List<CarPropertyResponse<?>> carPropertyResponses) {
-            if (carPropertyResponses.size() == 5) {
-                mExecutor.execute(() -> {
-                    CarValue<Float> batteryPercentValue = CarValue.UNIMPLEMENTED_FLOAT;
-                    CarValue<Float> fuelPercentValue = CarValue.UNIMPLEMENTED_FLOAT;
-                    CarValue<Boolean> energyIsLowValue = CarValue.UNIMPLEMENTED_BOOLEAN;
-                    CarValue<Float> rangeRemainingValue = CarValue.UNIMPLEMENTED_FLOAT;
-                    CarValue<Integer> distanceDisplayUnitValue =
-                            CarValue.UNIMPLEMENTED_INTEGER;
-                    for (CarPropertyResponse<?> response : carPropertyResponses) {
-                        if (response.getValue() == null) {
-                            Log.w(LogTags.TAG_CAR_HARDWARE,
-                                    "Failed to retrieve CarPropertyResponse value for property id "
-                                            + response.getPropertyId());
-                            continue;
-                        }
-                        switch (response.getPropertyId()) {
-                            case EV_BATTERY_LEVEL:
-                                if (mEvBatteryCapacity != Float.NEGATIVE_INFINITY) {
-                                    batteryPercentValue = new CarValue<>(
-                                            (Float) response.getValue() / mEvBatteryCapacity * 100,
-                                            response.getTimestampMillis(), response.getStatus());
-                                }
-                                break;
-                            case FUEL_LEVEL:
-                                if (mFuelCapacity != Float.NEGATIVE_INFINITY) {
-                                    fuelPercentValue = new CarValue<>(
-                                            (Float) response.getValue() / mFuelCapacity * 100,
-                                            response.getTimestampMillis(), response.getStatus());
-                                }
-                                break;
-                            case FUEL_LEVEL_LOW:
-                                energyIsLowValue = new CarValue<>(
-                                        (Boolean) response.getValue(),
-                                        response.getTimestampMillis(), response.getStatus());
-                                break;
-                            case RANGE_REMAINING:
-                                rangeRemainingValue = new CarValue<>(
-                                        (Float) response.getValue(),
-                                        response.getTimestampMillis(), response.getStatus());
-                                break;
-                            case DISTANCE_DISPLAY_UNITS:
-                                distanceDisplayUnitValue = new CarValue<>(
-                                        (Integer) response.getValue(),
-                                        response.getTimestampMillis(), response.getStatus());
-                                break;
-                            default:
-                                Log.e(LogTags.TAG_CAR_HARDWARE,
-                                        "Invalid response callback in EnergyLevelListener");
-                        }
-                    }
-                    EnergyLevel energyLevel =
-                            new EnergyLevel.Builder().setBatteryPercent(
-                                    batteryPercentValue).setFuelPercent(
-                                    fuelPercentValue).setEnergyIsLow(
-                                    energyIsLowValue).setRangeRemainingMeters(
-                                    rangeRemainingValue).setDistanceDisplayUnit(
-                                    distanceDisplayUnitValue).build();
-                    mEnergyLevelOnCarDataAvailableListener.onCarDataAvailable(energyLevel);
-                });
+            if (carPropertyResponses.size() != 6) {
+                Log.e(LogTags.TAG_CAR_HARDWARE,
+                        "Invalid response callback in EnergyLevelListener.");
+                return;
             }
+            mExecutor.execute(() -> {
+                CarValue<Float> batteryPercentValue = CarValue.UNIMPLEMENTED_FLOAT;
+                CarValue<Float> fuelPercentValue = CarValue.UNIMPLEMENTED_FLOAT;
+                CarValue<Boolean> energyIsLowValue = CarValue.UNIMPLEMENTED_BOOLEAN;
+                CarValue<Float> rangeRemainingValue = CarValue.UNIMPLEMENTED_FLOAT;
+                CarValue<Integer> distanceDisplayUnitValue =
+                        CarValue.UNIMPLEMENTED_INTEGER;
+                CarValue<Integer> fuelVolumeDisplayUnitValue =
+                        CarValue.UNIMPLEMENTED_INTEGER;
+                for (CarPropertyResponse<?> response : carPropertyResponses) {
+                    if (response.getValue() == null) {
+                        Log.w(LogTags.TAG_CAR_HARDWARE,
+                                "Failed to retrieve CarPropertyResponse value for property id "
+                                        + response.getPropertyId());
+                        continue;
+                    }
+                    switch (response.getPropertyId()) {
+                        case EV_BATTERY_LEVEL:
+                            if (mEvBatteryCapacity != Float.NEGATIVE_INFINITY) {
+                                batteryPercentValue = new CarValue<>(
+                                        (Float) response.getValue() / mEvBatteryCapacity * 100,
+                                        response.getTimestampMillis(), response.getStatus());
+                            }
+                            break;
+                        case FUEL_LEVEL:
+                            if (mFuelCapacity != Float.NEGATIVE_INFINITY) {
+                                fuelPercentValue = new CarValue<>(
+                                        (Float) response.getValue() / mFuelCapacity * 100,
+                                        response.getTimestampMillis(), response.getStatus());
+                            }
+                            break;
+                        case FUEL_LEVEL_LOW:
+                            energyIsLowValue = new CarValue<>(
+                                    (Boolean) response.getValue(),
+                                    response.getTimestampMillis(), response.getStatus());
+                            break;
+                        case RANGE_REMAINING:
+                            rangeRemainingValue = new CarValue<>(
+                                    (Float) response.getValue(),
+                                    response.getTimestampMillis(), response.getStatus());
+                            break;
+                        case DISTANCE_DISPLAY_UNITS:
+                            Integer displayUnit = null;
+                            if (response.getValue() != null) {
+                                displayUnit = PropertyUtils.covertDistanceUnit(
+                                        (Integer) response.getValue());
+                            }
+                            distanceDisplayUnitValue = new CarValue<>(displayUnit,
+                                    response.getTimestampMillis(), response.getStatus());
+                            break;
+                        case FUEL_VOLUME_DISPLAY_UNITS:
+                            Integer volumeUnit = null;
+                            if (response.getValue() != null) {
+                                volumeUnit = PropertyUtils.covertVolumeUnit(
+                                        (Integer) response.getValue());
+                            }
+                            fuelVolumeDisplayUnitValue =
+                                    new CarValue<>(volumeUnit,
+                                            response.getTimestampMillis(),
+                                            response.getStatus());
+                            break;
+                        default:
+                            Log.e(LogTags.TAG_CAR_HARDWARE,
+                                    "Invalid response callback in EnergyLevelListener");
+                    }
+                }
+                EnergyLevel energyLevel =
+                        new EnergyLevel.Builder().setBatteryPercent(
+                                batteryPercentValue).setFuelPercent(
+                                fuelPercentValue).setEnergyIsLow(
+                                energyIsLowValue).setRangeRemainingMeters(
+                                rangeRemainingValue).setDistanceDisplayUnit(
+                                distanceDisplayUnitValue).setFuelVolumeDisplayUnit(
+                                fuelVolumeDisplayUnitValue).build();
+                mEnergyLevelOnCarDataAvailableListener.onCarDataAvailable(energyLevel);
+            });
         }
     }
 }
diff --git a/car/app/app-automotive/src/test/java/androidx/car/app/hardware/info/AutomotiveCarInfoTest.java b/car/app/app-automotive/src/test/java/androidx/car/app/hardware/info/AutomotiveCarInfoTest.java
index 56be908..55deed1 100644
--- a/car/app/app-automotive/src/test/java/androidx/car/app/hardware/info/AutomotiveCarInfoTest.java
+++ b/car/app/app-automotive/src/test/java/androidx/car/app/hardware/info/AutomotiveCarInfoTest.java
@@ -19,6 +19,7 @@
 import static android.car.VehiclePropertyIds.EV_BATTERY_LEVEL;
 import static android.car.VehiclePropertyIds.FUEL_LEVEL;
 import static android.car.VehiclePropertyIds.FUEL_LEVEL_LOW;
+import static android.car.VehiclePropertyIds.FUEL_VOLUME_DISPLAY_UNITS;
 import static android.car.VehiclePropertyIds.INFO_EV_BATTERY_CAPACITY;
 import static android.car.VehiclePropertyIds.INFO_EV_CONNECTOR_TYPE;
 import static android.car.VehiclePropertyIds.INFO_FUEL_CAPACITY;
@@ -278,6 +279,8 @@
     public void getEnergyLevel_verifyResponse() throws InterruptedException {
         ArgumentCaptor<OnCarPropertyResponseListener> captor = ArgumentCaptor.forClass(
                 OnCarPropertyResponseListener.class);
+        int meterDistanceUnit = 0x21;
+        int meterVolumeUnit = 0x40;
         float evBatteryCapacity = 100f;
         float evBatteryLevelValue = 50f;
         float fuelCapacity = 120f;
@@ -312,7 +315,9 @@
         mResponse.add(CarPropertyResponse.create(RANGE_REMAINING,
                 STATUS_SUCCESS, 1, 5f));
         mResponse.add(CarPropertyResponse.create(DISTANCE_DISPLAY_UNITS,
-                STATUS_SUCCESS, 1, 7));
+                STATUS_SUCCESS, 1, meterDistanceUnit));
+        mResponse.add(CarPropertyResponse.create(FUEL_VOLUME_DISPLAY_UNITS,
+                STATUS_SUCCESS, 2, meterVolumeUnit));
         captor.getValue().onCarPropertyResponses(mResponse);
         mCountDownLatch.await();
 
@@ -325,13 +330,16 @@
                 true);
         assertThat(energyLevel.getRangeRemainingMeters().getValue()).isEqualTo(
                 5f);
-        assertThat(energyLevel.getDistanceDisplayUnit().getValue()).isEqualTo(7);
+        assertThat(energyLevel.getDistanceDisplayUnit().getValue()).isEqualTo(2);
+        assertThat(energyLevel.getFuelVolumeDisplayUnit().getValue()).isEqualTo(201);
     }
 
     @Test
     public void getEnergyLevel_withUnavailableCapacityValues() throws InterruptedException {
         ArgumentCaptor<OnCarPropertyResponseListener> captor = ArgumentCaptor.forClass(
                 OnCarPropertyResponseListener.class);
+        int meterDistanceUnit = 0x21;
+        int meterVolumeUnit = 0x40;
         float evBatteryCapacity = 100f;
         float evBatteryLevelValue = 50f;
         float fuelCapacity = 120f;
@@ -366,7 +374,9 @@
         mResponse.add(CarPropertyResponse.create(RANGE_REMAINING,
                 STATUS_SUCCESS, 1, 5f));
         mResponse.add(CarPropertyResponse.create(DISTANCE_DISPLAY_UNITS,
-                STATUS_SUCCESS, 1, 7));
+                STATUS_SUCCESS, 1, meterDistanceUnit));
+        mResponse.add(CarPropertyResponse.create(FUEL_VOLUME_DISPLAY_UNITS,
+                STATUS_SUCCESS, 2, meterVolumeUnit));
         captor.getValue().onCarPropertyResponses(mResponse);
         mCountDownLatch.await();
 
@@ -384,6 +394,7 @@
                 true);
         assertThat(energyLevel.getRangeRemainingMeters().getValue()).isEqualTo(
                 5f);
-        assertThat(energyLevel.getDistanceDisplayUnit().getValue()).isEqualTo(7);
+        assertThat(energyLevel.getDistanceDisplayUnit().getValue()).isEqualTo(2);
+        assertThat(energyLevel.getFuelVolumeDisplayUnit().getValue()).isEqualTo(201);
     }
 }
diff --git a/car/app/app-projected/build.gradle b/car/app/app-projected/build.gradle
index 9698860..611a6e1 100644
--- a/car/app/app-projected/build.gradle
+++ b/car/app/app-projected/build.gradle
@@ -28,6 +28,7 @@
 
     implementation("androidx.annotation:annotation:1.2.0")
     implementation("androidx.annotation:annotation-experimental:1.1.0")
+    implementation libs.kotlinStdlib // Due to :annotation-experimental
 
     testImplementation("junit:junit:4.13")
     testImplementation(libs.testCore)
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/common/SamplePlaces.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/common/SamplePlaces.java
index 8e25e79..2036e2b 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/common/SamplePlaces.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/common/SamplePlaces.java
@@ -16,6 +16,9 @@
 
 package androidx.car.app.sample.showcase.common.common;
 
+import static java.lang.Math.max;
+import static java.lang.Math.min;
+
 import android.graphics.BitmapFactory;
 import android.location.Location;
 import android.text.SpannableString;
@@ -24,6 +27,7 @@
 import androidx.annotation.NonNull;
 import androidx.car.app.CarContext;
 import androidx.car.app.Screen;
+import androidx.car.app.constraints.ConstraintManager;
 import androidx.car.app.model.CarColor;
 import androidx.car.app.model.CarIcon;
 import androidx.car.app.model.CarLocation;
@@ -36,6 +40,7 @@
 import androidx.car.app.model.PlaceMarker;
 import androidx.car.app.model.Row;
 import androidx.car.app.sample.showcase.common.R;
+import androidx.car.app.versioning.CarAppApiLevels;
 import androidx.core.graphics.drawable.IconCompat;
 
 import java.util.ArrayList;
@@ -60,8 +65,19 @@
     public ItemList getPlaceList() {
         ItemList.Builder listBuilder = new ItemList.Builder();
 
+        int listLimit = 6;
+        CarContext carContext = mDemoScreen.getCarContext();
+        if (carContext.getCarAppApiLevel() > CarAppApiLevels.LEVEL_1) {
+            // Some hosts may allow more items in the grid than others, so put more items if
+            // possible
+            listLimit =
+                    max(listLimit,
+                            carContext.getCarService(ConstraintManager.class).getContentLimit(
+                                    ConstraintManager.CONTENT_LIMIT_TYPE_LIST));
+        }
+        listLimit = min(listLimit, mPlaces.size());
 
-        for (int index = 0; index < mPlaces.size(); index++) {
+        for (int index = 0; index < listLimit; index++) {
             PlaceInfo place = mPlaces.get(index);
 
             // Build a description string that includes the required distance span.
@@ -220,6 +236,43 @@
                         location5,
                         new PlaceMarker.Builder().build()));
 
+        // Some hosts may display more items in the list than others, so create 3 more items.
+        Location location6 = new Location(SamplePlaces.class.getSimpleName());
+        location6.setLatitude(47.5496056);
+        location6.setLongitude(-122.2571713);
+        places.add(
+                new PlaceInfo(
+                        "Seward Park",
+                        "5900 Lake Washington Blvd S, Seattle, WA 98118",
+                        "Text label",
+                        "n/a",
+                        location6,
+                        new PlaceMarker.Builder().build()));
+
+        Location location7 = new Location(SamplePlaces.class.getSimpleName());
+        location7.setLatitude(47.5911456);
+        location7.setLongitude(-122.2256602);
+        places.add(
+                new PlaceInfo(
+                        "Luther Burbank Park",
+                        "2040 84th Ave SE, Mercer Island, WA 98040",
+                        "Text label",
+                        "n/a",
+                        location7,
+                        new PlaceMarker.Builder().build()));
+
+        Location location8 = new Location(SamplePlaces.class.getSimpleName());
+        location8.setLatitude(47.6785932);
+        location8.setLongitude(-122.2113821);
+        places.add(
+                new PlaceInfo(
+                        "Heritage Park",
+                        "111 Waverly Way, Kirkland, WA 98033",
+                        "Text label",
+                        "n/a",
+                        location8,
+                        new PlaceMarker.Builder().build()));
+
         return places;
     }
 }
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/templates/GridTemplateDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/templates/GridTemplateDemoScreen.java
index 3a37401..91549cb 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/templates/GridTemplateDemoScreen.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/templates/GridTemplateDemoScreen.java
@@ -30,6 +30,7 @@
 import androidx.car.app.CarContext;
 import androidx.car.app.CarToast;
 import androidx.car.app.Screen;
+import androidx.car.app.constraints.ConstraintManager;
 import androidx.car.app.model.Action;
 import androidx.car.app.model.ActionStrip;
 import androidx.car.app.model.CarIcon;
@@ -38,6 +39,7 @@
 import androidx.car.app.model.ItemList;
 import androidx.car.app.model.Template;
 import androidx.car.app.sample.showcase.common.R;
+import androidx.car.app.versioning.CarAppApiLevels;
 import androidx.core.graphics.drawable.IconCompat;
 import androidx.lifecycle.DefaultLifecycleObserver;
 import androidx.lifecycle.LifecycleOwner;
@@ -166,7 +168,7 @@
         // Grid item with an image marked as an icon, a long title, a long text and onClickListener.
         gridItemListBuilder.addItem(
                 new GridItem.Builder()
-                        .setImage(new CarIcon.Builder(mImage).build(), GridItem.IMAGE_TYPE_ICON)
+                        .setImage(new CarIcon.Builder(mIcon).build(), GridItem.IMAGE_TYPE_ICON)
                         .setTitle("Sixth Item has a long title set")
                         .setText("Sixth Item has a long text set")
                         .setOnClickListener(
@@ -178,6 +180,32 @@
                                                 .show())
                         .build());
 
+        // Some hosts may allow more items in the grid than others, so create more.
+        if (getCarContext().getCarAppApiLevel() > CarAppApiLevels.LEVEL_1) {
+            int itemLimit =
+                    7 + getCarContext().getCarService(ConstraintManager.class).getContentLimit(
+                            ConstraintManager.CONTENT_LIMIT_TYPE_GRID);
+
+            for (int i = 7; i <= itemLimit; i++) {
+                String titleText = "Item: " + i;
+                String toastText = "Clicked item " + i;
+
+                gridItemListBuilder.addItem(
+                        new GridItem.Builder()
+                                .setImage(new CarIcon.Builder(mIcon).build(),
+                                        GridItem.IMAGE_TYPE_ICON)
+                                .setTitle(titleText)
+                                .setOnClickListener(
+                                        () ->
+                                                CarToast.makeText(
+                                                        getCarContext(),
+                                                        toastText,
+                                                        LENGTH_LONG)
+                                                        .show())
+                                .build());
+            }
+        }
+
         return new GridTemplate.Builder()
                 .setHeaderAction(Action.APP_ICON)
                 .setSingleList(gridItemListBuilder.build())
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/templates/ListTemplateDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/templates/ListTemplateDemoScreen.java
index 8001ad9..02c92d5 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/templates/ListTemplateDemoScreen.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/templates/ListTemplateDemoScreen.java
@@ -23,6 +23,7 @@
 import androidx.car.app.CarContext;
 import androidx.car.app.CarToast;
 import androidx.car.app.Screen;
+import androidx.car.app.constraints.ConstraintManager;
 import androidx.car.app.model.Action;
 import androidx.car.app.model.ActionStrip;
 import androidx.car.app.model.CarText;
@@ -31,6 +32,7 @@
 import androidx.car.app.model.ParkedOnlyOnClickListener;
 import androidx.car.app.model.Row;
 import androidx.car.app.model.Template;
+import androidx.car.app.versioning.CarAppApiLevels;
 import androidx.lifecycle.DefaultLifecycleObserver;
 
 /**
@@ -56,24 +58,31 @@
                         .addText("More Parked only text.")
                         .build());
 
-        for (int i = 2; i <= 6; ++i) {
-            // For row text, set text variants that fit best in different screen sizes.
-            String secondTextStr = "Second line of text";
-            CarText secondText =
-                    new CarText.Builder(
-                            "================= " + secondTextStr + " ================")
-                            .addVariant("--------------------- " + secondTextStr
-                                    + " ----------------------")
-                            .addVariant(secondTextStr)
-                            .build();
-            final String onClickText = "Clicked row: " + i;
-            listBuilder.addItem(
-                    new Row.Builder()
-                            .setOnClickListener(() -> onClick(onClickText))
-                            .setTitle("Title " + i)
-                            .addText("First line of text")
-                            .addText(secondText)
-                            .build());
+        // Some hosts may allow more items in the list than others, so create more.
+        if (getCarContext().getCarAppApiLevel() > CarAppApiLevels.LEVEL_1) {
+            int listLimit =
+                    getCarContext().getCarService(ConstraintManager.class).getContentLimit(
+                            ConstraintManager.CONTENT_LIMIT_TYPE_LIST);
+
+            for (int i = 2; i <= listLimit; ++i) {
+                // For row text, set text variants that fit best in different screen sizes.
+                String secondTextStr = "Second line of text";
+                CarText secondText =
+                        new CarText.Builder(
+                                "================= " + secondTextStr + " ================")
+                                .addVariant("--------------------- " + secondTextStr
+                                        + " ----------------------")
+                                .addVariant(secondTextStr)
+                                .build();
+                final String onClickText = "Clicked row: " + i;
+                listBuilder.addItem(
+                        new Row.Builder()
+                                .setOnClickListener(() -> onClick(onClickText))
+                                .setTitle("Title " + i)
+                                .addText("First line of text")
+                                .addText(secondText)
+                                .build());
+            }
         }
 
         return new ListTemplate.Builder()
diff --git a/car/app/app/api/current.ignore b/car/app/app/api/current.ignore
deleted file mode 100644
index 8e88e97..0000000
--- a/car/app/app/api/current.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-ChangedType: androidx.car.app.CarContext#getCarService(Class<T>):
-    Method androidx.car.app.CarContext.getCarService has changed return type from T (extends java.lang.Object) to T (extends androidx.car.app.managers.Manager)
diff --git a/car/app/app/api/public_plus_experimental_1.1.0-beta02.txt b/car/app/app/api/public_plus_experimental_1.1.0-beta02.txt
index cc6825d..c28de08 100644
--- a/car/app/app/api/public_plus_experimental_1.1.0-beta02.txt
+++ b/car/app/app/api/public_plus_experimental_1.1.0-beta02.txt
@@ -224,13 +224,17 @@
 package androidx.car.app.hardware.common {
 
   @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class CarUnit {
+    field @androidx.car.app.annotations.ExperimentalCarApi public static final int IMPERIAL_GALLON = 204; // 0xcc
     field public static final int KILOMETER = 3; // 0x3
     field public static final int KILOMETERS_PER_HOUR = 102; // 0x66
+    field @androidx.car.app.annotations.ExperimentalCarApi public static final int LITER = 202; // 0xca
     field public static final int METER = 2; // 0x2
     field public static final int METERS_PER_SEC = 101; // 0x65
     field public static final int MILE = 4; // 0x4
     field public static final int MILES_PER_HOUR = 103; // 0x67
+    field @androidx.car.app.annotations.ExperimentalCarApi public static final int MILLILITER = 201; // 0xc9
     field public static final int MILLIMETER = 1; // 0x1
+    field @androidx.car.app.annotations.ExperimentalCarApi public static final int US_GALLON = 203; // 0xcb
   }
 
   @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class CarValue<T> {
@@ -299,6 +303,7 @@
     method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getDistanceDisplayUnit();
     method public androidx.car.app.hardware.common.CarValue<java.lang.Boolean!> getEnergyIsLow();
     method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getFuelPercent();
+    method @androidx.car.app.annotations.ExperimentalCarApi public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getFuelVolumeDisplayUnit();
     method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getRangeRemainingMeters();
   }
 
@@ -309,6 +314,7 @@
     method public androidx.car.app.hardware.info.EnergyLevel.Builder setDistanceDisplayUnit(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
     method public androidx.car.app.hardware.info.EnergyLevel.Builder setEnergyIsLow(androidx.car.app.hardware.common.CarValue<java.lang.Boolean!>);
     method public androidx.car.app.hardware.info.EnergyLevel.Builder setFuelPercent(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+    method @androidx.car.app.annotations.ExperimentalCarApi public androidx.car.app.hardware.info.EnergyLevel.Builder setFuelVolumeDisplayUnit(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
     method public androidx.car.app.hardware.info.EnergyLevel.Builder setRangeRemainingMeters(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
   }
 
@@ -1436,6 +1442,7 @@
     field public static final int LEVEL_1 = 1; // 0x1
     field public static final int LEVEL_2 = 2; // 0x2
     field public static final int LEVEL_3 = 3; // 0x3
+    field @androidx.car.app.annotations.ExperimentalCarApi public static final int LEVEL_4 = 4; // 0x4
   }
 
 }
diff --git a/car/app/app/api/public_plus_experimental_current.txt b/car/app/app/api/public_plus_experimental_current.txt
index cc6825d..c28de08 100644
--- a/car/app/app/api/public_plus_experimental_current.txt
+++ b/car/app/app/api/public_plus_experimental_current.txt
@@ -224,13 +224,17 @@
 package androidx.car.app.hardware.common {
 
   @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class CarUnit {
+    field @androidx.car.app.annotations.ExperimentalCarApi public static final int IMPERIAL_GALLON = 204; // 0xcc
     field public static final int KILOMETER = 3; // 0x3
     field public static final int KILOMETERS_PER_HOUR = 102; // 0x66
+    field @androidx.car.app.annotations.ExperimentalCarApi public static final int LITER = 202; // 0xca
     field public static final int METER = 2; // 0x2
     field public static final int METERS_PER_SEC = 101; // 0x65
     field public static final int MILE = 4; // 0x4
     field public static final int MILES_PER_HOUR = 103; // 0x67
+    field @androidx.car.app.annotations.ExperimentalCarApi public static final int MILLILITER = 201; // 0xc9
     field public static final int MILLIMETER = 1; // 0x1
+    field @androidx.car.app.annotations.ExperimentalCarApi public static final int US_GALLON = 203; // 0xcb
   }
 
   @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class CarValue<T> {
@@ -299,6 +303,7 @@
     method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getDistanceDisplayUnit();
     method public androidx.car.app.hardware.common.CarValue<java.lang.Boolean!> getEnergyIsLow();
     method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getFuelPercent();
+    method @androidx.car.app.annotations.ExperimentalCarApi public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getFuelVolumeDisplayUnit();
     method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getRangeRemainingMeters();
   }
 
@@ -309,6 +314,7 @@
     method public androidx.car.app.hardware.info.EnergyLevel.Builder setDistanceDisplayUnit(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
     method public androidx.car.app.hardware.info.EnergyLevel.Builder setEnergyIsLow(androidx.car.app.hardware.common.CarValue<java.lang.Boolean!>);
     method public androidx.car.app.hardware.info.EnergyLevel.Builder setFuelPercent(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
+    method @androidx.car.app.annotations.ExperimentalCarApi public androidx.car.app.hardware.info.EnergyLevel.Builder setFuelVolumeDisplayUnit(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
     method public androidx.car.app.hardware.info.EnergyLevel.Builder setRangeRemainingMeters(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
   }
 
@@ -1436,6 +1442,7 @@
     field public static final int LEVEL_1 = 1; // 0x1
     field public static final int LEVEL_2 = 2; // 0x2
     field public static final int LEVEL_3 = 3; // 0x3
+    field @androidx.car.app.annotations.ExperimentalCarApi public static final int LEVEL_4 = 4; // 0x4
   }
 
 }
diff --git a/car/app/app/api/restricted_current.ignore b/car/app/app/api/restricted_current.ignore
deleted file mode 100644
index 8e88e97..0000000
--- a/car/app/app/api/restricted_current.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-ChangedType: androidx.car.app.CarContext#getCarService(Class<T>):
-    Method androidx.car.app.CarContext.getCarService has changed return type from T (extends java.lang.Object) to T (extends androidx.car.app.managers.Manager)
diff --git a/car/app/app/build.gradle b/car/app/app/build.gradle
index 1adc8b0..ca00d4c 100644
--- a/car/app/app/build.gradle
+++ b/car/app/app/build.gradle
@@ -74,7 +74,7 @@
 }
 
 project.ext {
-    latestCarAppApiLevel = "3"
+    latestCarAppApiLevel = "4"
 }
 
 android {
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/common/CarUnit.java b/car/app/app/src/main/java/androidx/car/app/hardware/common/CarUnit.java
index cc23f92..145c865 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/common/CarUnit.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/common/CarUnit.java
@@ -21,6 +21,7 @@
 import androidx.annotation.IntDef;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.annotations.RequiresCarApi;
 
 import java.lang.annotation.ElementType;
@@ -28,7 +29,7 @@
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
-/** Units such as speed and distance for car hardware measurements and display. */
+/** Units such as speed, distance and volume for car hardware measurements and display. */
 @CarProtocol
 @RequiresCarApi(3)
 public final class CarUnit {
@@ -66,6 +67,49 @@
     public static final int MILE = 4;
 
     /**
+     * Defines the possible volume units from car hardware.
+     *
+     * @hide
+     */
+    // TODO(b/202303614): Remove this annotation once FuelVolumeDisplayUnit is ready.
+    @ExperimentalCarApi
+    @IntDef({
+            MILLILITER,
+            LITER,
+            US_GALLON,
+            IMPERIAL_GALLON
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    @Target({ElementType.TYPE_USE})
+    @RestrictTo(LIBRARY)
+    public @interface CarVolumeUnit {
+    }
+
+    /** Milliliter unit. */
+    // TODO(b/202303614): Remove this annotation once FuelVolumeDisplayUnit is ready.
+    @ExperimentalCarApi
+    @CarVolumeUnit
+    public static final int MILLILITER = 201;
+
+    /** Liter unit. */
+    // TODO(b/202303614): Remove this annotation once FuelVolumeDisplayUnit is ready.
+    @ExperimentalCarApi
+    @CarVolumeUnit
+    public static final int LITER = 202;
+
+    /** US Gallon unit. */
+    // TODO(b/202303614): Remove this annotation once FuelVolumeDisplayUnit is ready.
+    @ExperimentalCarApi
+    @CarVolumeUnit
+    public static final int US_GALLON = 203;
+
+    /** Imperial Gallon unit. */
+    // TODO(b/202303614): Remove this annotation once FuelVolumeDisplayUnit is ready.
+    @ExperimentalCarApi
+    @CarVolumeUnit
+    public static final int IMPERIAL_GALLON = 204;
+
+    /**
      * Defines the possible distance units from car hardware.
      *
      * @hide
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/info/EnergyLevel.java b/car/app/app/src/main/java/androidx/car/app/hardware/info/EnergyLevel.java
index 67633bb..ec46e3d 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/info/EnergyLevel.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/info/EnergyLevel.java
@@ -16,6 +16,7 @@
 package androidx.car.app.hardware.info;
 
 import static androidx.car.app.hardware.common.CarUnit.CarDistanceUnit;
+import static androidx.car.app.hardware.common.CarUnit.CarVolumeUnit;
 
 import static java.util.Objects.requireNonNull;
 
@@ -23,6 +24,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.hardware.common.CarUnit;
 import androidx.car.app.hardware.common.CarValue;
@@ -54,6 +56,10 @@
     @NonNull
     private final CarValue<@CarDistanceUnit Integer> mDistanceDisplayUnit;
 
+    @Keep
+    @NonNull
+    private final CarValue<@CarVolumeUnit Integer> mFuelVolumeDisplayUnit;
+
     /** Returns the battery percentage remaining from the car hardware. */
     @NonNull
     public CarValue<Float> getBatteryPercent() {
@@ -88,6 +94,17 @@
         return requireNonNull(mDistanceDisplayUnit);
     }
 
+    /** Returns the fuel volume display unit from the car hardware.
+     *
+     * <p>See {@link CarUnit} for possible volume values.
+     */
+    // TODO(b/202303614): Remove this annotation once FuelVolumeDisplayUnit is ready.
+    @ExperimentalCarApi
+    @NonNull
+    public CarValue<@CarVolumeUnit Integer> getFuelVolumeDisplayUnit() {
+        return requireNonNull(mFuelVolumeDisplayUnit);
+    }
+
     @Override
     @NonNull
     public String toString() {
@@ -101,13 +118,15 @@
                 + getRangeRemainingMeters()
                 + ", distance display unit: "
                 + mDistanceDisplayUnit
+                + ", fuel volume display unit: "
+                + mFuelVolumeDisplayUnit
                 + "]";
     }
 
     @Override
     public int hashCode() {
         return Objects.hash(mBatteryPercent, mFuelPercent, mEnergyIsLow, getRangeRemainingMeters(),
-                mDistanceDisplayUnit);
+                mDistanceDisplayUnit, mFuelVolumeDisplayUnit);
     }
 
     @Override
@@ -125,7 +144,8 @@
                 && Objects.equals(mEnergyIsLow, otherEnergyLevel.mEnergyIsLow)
                 && Objects.equals(getRangeRemainingMeters(),
                 otherEnergyLevel.getRangeRemainingMeters())
-                && Objects.equals(mDistanceDisplayUnit, otherEnergyLevel.mDistanceDisplayUnit);
+                && Objects.equals(mDistanceDisplayUnit, otherEnergyLevel.mDistanceDisplayUnit)
+                && Objects.equals(mFuelVolumeDisplayUnit, otherEnergyLevel.mFuelVolumeDisplayUnit);
     }
 
     EnergyLevel(Builder builder) {
@@ -134,6 +154,7 @@
         mEnergyIsLow = requireNonNull(builder.mEnergyIsLow);
         mRangeRemainingMeters = requireNonNull(builder.mRangeRemainingMeters);
         mDistanceDisplayUnit = requireNonNull(builder.mDistanceDisplayUnit);
+        mFuelVolumeDisplayUnit = requireNonNull(builder.mFuelVolumeDisplayUnit);
     }
 
     /** Constructs an empty instance, used by serialization code. */
@@ -143,6 +164,7 @@
         mEnergyIsLow = CarValue.UNIMPLEMENTED_BOOLEAN;
         mRangeRemainingMeters = CarValue.UNIMPLEMENTED_FLOAT;
         mDistanceDisplayUnit = CarValue.UNIMPLEMENTED_INTEGER;
+        mFuelVolumeDisplayUnit = CarValue.UNIMPLEMENTED_INTEGER;
     }
 
     /** A builder of {@link EnergyLevel}. */
@@ -153,6 +175,8 @@
         CarValue<Float> mRangeRemainingMeters = CarValue.UNIMPLEMENTED_FLOAT;
         CarValue<@CarDistanceUnit Integer> mDistanceDisplayUnit =
                 CarValue.UNIMPLEMENTED_INTEGER;
+        CarValue<@CarVolumeUnit Integer> mFuelVolumeDisplayUnit =
+                CarValue.UNIMPLEMENTED_INTEGER;
 
         /** Sets the remaining batter percentage. */
         @NonNull
@@ -209,6 +233,20 @@
         }
 
         /**
+         * Sets the fuel volume display unit.
+         *
+         * @throws NullPointerException if {@code fuelVolumeDisplayUnit} is {@code null}
+         */
+        // TODO(b/202303614): Remove this annotation once FuelVolumeDisplayUnit is ready.
+        @ExperimentalCarApi
+        @NonNull
+        public Builder setFuelVolumeDisplayUnit(@NonNull CarValue<@CarVolumeUnit Integer>
+                fuelVolumeDisplayUnit) {
+            mFuelVolumeDisplayUnit = requireNonNull(fuelVolumeDisplayUnit);
+            return this;
+        }
+
+        /**
          * Constructs the {@link EnergyLevel} defined by this builder.
          */
         @NonNull
diff --git a/car/app/app/src/main/java/androidx/car/app/versioning/CarAppApiLevel.java b/car/app/app/src/main/java/androidx/car/app/versioning/CarAppApiLevel.java
index 9fe4aba..f7993eb 100644
--- a/car/app/app/src/main/java/androidx/car/app/versioning/CarAppApiLevel.java
+++ b/car/app/app/src/main/java/androidx/car/app/versioning/CarAppApiLevel.java
@@ -17,7 +17,9 @@
 package androidx.car.app.versioning;
 
 import androidx.annotation.IntDef;
+import androidx.annotation.OptIn;
 import androidx.annotation.RestrictTo;
+import androidx.car.app.annotations.ExperimentalCarApi;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -25,7 +27,8 @@
 /** @hide */
 @RestrictTo(RestrictTo.Scope.LIBRARY)
 @IntDef(value = {CarAppApiLevels.UNKNOWN, CarAppApiLevels.LEVEL_1, CarAppApiLevels.LEVEL_2,
-        CarAppApiLevels.LEVEL_3})
+        CarAppApiLevels.LEVEL_3, CarAppApiLevels.LEVEL_4})
 @Retention(RetentionPolicy.SOURCE)
+@OptIn(markerClass = ExperimentalCarApi.class) // experimental LEVEL_4
 public @interface CarAppApiLevel {
 }
diff --git a/car/app/app/src/main/java/androidx/car/app/versioning/CarAppApiLevels.java b/car/app/app/src/main/java/androidx/car/app/versioning/CarAppApiLevels.java
index bdc8821..4ed62ab 100644
--- a/car/app/app/src/main/java/androidx/car/app/versioning/CarAppApiLevels.java
+++ b/car/app/app/src/main/java/androidx/car/app/versioning/CarAppApiLevels.java
@@ -18,8 +18,9 @@
 
 import static java.util.Objects.requireNonNull;
 
+import androidx.annotation.OptIn;
 import androidx.annotation.RestrictTo;
-import androidx.car.app.CarContext;
+import androidx.car.app.annotations.ExperimentalCarApi;
 
 import java.io.BufferedReader;
 import java.io.IOException;
@@ -32,10 +33,17 @@
  * <p>Each level denotes a set of elements (classes, fields and methods) known to both clients and
  * hosts.
  *
- * @see CarContext#getCarAppApiLevel()
+ * @see androidx.car.app.CarContext#getCarAppApiLevel()
  */
 public final class CarAppApiLevels {
     /**
+     * API level 4.
+     */
+    @CarAppApiLevel
+    @ExperimentalCarApi
+    public static final int LEVEL_4 = 4;
+
+    /**
      * API level 3.
      *
      * <p>Includes a car hardware manager for access to sensors and other vehicle properties.
@@ -88,6 +96,7 @@
      * Returns the highest API level implemented by this library.
      */
     @CarAppApiLevel
+    @OptIn(markerClass = ExperimentalCarApi.class) // experimental LEVEL_4
     public static int getLatest() {
         // The latest Car API level is defined as java resource, generated via build.gradle. This
         // has to be read through the class loader because we do not have access to the context
@@ -105,18 +114,12 @@
             BufferedReader reader = new BufferedReader(streamReader);
             String line = reader.readLine();
 
-            switch (Integer.parseInt(line)) {
-                case 0:
-                    return UNKNOWN;
-                case 1:
-                    return LEVEL_1;
-                case 2:
-                    return LEVEL_2;
-                case 3:
-                    return LEVEL_3;
-                default:
-                    throw new IllegalStateException("Undefined Car API level: " + line);
+
+            int apiLevel = Integer.parseInt(line);
+            if (apiLevel < LEVEL_1 || apiLevel > LEVEL_4) {
+                throw new IllegalStateException("Unrecognized Car API level: " + line);
             }
+            return apiLevel;
         } catch (IOException e) {
             throw new IllegalStateException("Unable to read Car API level file");
         }
diff --git a/collection/collection-ktx/api/1.2.0-beta02.txt b/collection/collection-ktx/api/1.2.0-beta02.txt
index bca313f..32d9f50 100644
--- a/collection/collection-ktx/api/1.2.0-beta02.txt
+++ b/collection/collection-ktx/api/1.2.0-beta02.txt
@@ -20,6 +20,7 @@
     method public static inline <T> boolean isNotEmpty(androidx.collection.LongSparseArray<T>);
     method public static <T> kotlin.collections.LongIterator keyIterator(androidx.collection.LongSparseArray<T>);
     method public static operator <T> androidx.collection.LongSparseArray<T> plus(androidx.collection.LongSparseArray<T>, androidx.collection.LongSparseArray<T> other);
+    method @Deprecated public static <T> boolean remove(androidx.collection.LongSparseArray<T>, long key, T? value);
     method public static inline operator <T> void set(androidx.collection.LongSparseArray<T>, long key, T? value);
     method public static <T> java.util.Iterator<T> valueIterator(androidx.collection.LongSparseArray<T>);
   }
@@ -37,6 +38,7 @@
     method public static inline <T> boolean isNotEmpty(androidx.collection.SparseArrayCompat<T>);
     method public static <T> kotlin.collections.IntIterator keyIterator(androidx.collection.SparseArrayCompat<T>);
     method public static operator <T> androidx.collection.SparseArrayCompat<T> plus(androidx.collection.SparseArrayCompat<T>, androidx.collection.SparseArrayCompat<T> other);
+    method @Deprecated public static <T> boolean remove(androidx.collection.SparseArrayCompat<T>, int key, T? value);
     method public static inline operator <T> void set(androidx.collection.SparseArrayCompat<T>, int key, T? value);
     method public static <T> java.util.Iterator<T> valueIterator(androidx.collection.SparseArrayCompat<T>);
   }
diff --git a/collection/collection-ktx/api/current.ignore b/collection/collection-ktx/api/current.ignore
deleted file mode 100644
index 16ad393..0000000
--- a/collection/collection-ktx/api/current.ignore
+++ /dev/null
@@ -1,5 +0,0 @@
-// Baseline format: 1.0
-RemovedDeprecatedMethod: androidx.collection.LongSparseArrayKt#remove(androidx.collection.LongSparseArray<T>, long, T):
-    Removed deprecated method androidx.collection.LongSparseArrayKt.remove(androidx.collection.LongSparseArray<T>,long,T)
-RemovedDeprecatedMethod: androidx.collection.SparseArrayKt#remove(androidx.collection.SparseArrayCompat<T>, int, T):
-    Removed deprecated method androidx.collection.SparseArrayKt.remove(androidx.collection.SparseArrayCompat<T>,int,T)
diff --git a/collection/collection-ktx/api/current.txt b/collection/collection-ktx/api/current.txt
index bca313f..32d9f50 100644
--- a/collection/collection-ktx/api/current.txt
+++ b/collection/collection-ktx/api/current.txt
@@ -20,6 +20,7 @@
     method public static inline <T> boolean isNotEmpty(androidx.collection.LongSparseArray<T>);
     method public static <T> kotlin.collections.LongIterator keyIterator(androidx.collection.LongSparseArray<T>);
     method public static operator <T> androidx.collection.LongSparseArray<T> plus(androidx.collection.LongSparseArray<T>, androidx.collection.LongSparseArray<T> other);
+    method @Deprecated public static <T> boolean remove(androidx.collection.LongSparseArray<T>, long key, T? value);
     method public static inline operator <T> void set(androidx.collection.LongSparseArray<T>, long key, T? value);
     method public static <T> java.util.Iterator<T> valueIterator(androidx.collection.LongSparseArray<T>);
   }
@@ -37,6 +38,7 @@
     method public static inline <T> boolean isNotEmpty(androidx.collection.SparseArrayCompat<T>);
     method public static <T> kotlin.collections.IntIterator keyIterator(androidx.collection.SparseArrayCompat<T>);
     method public static operator <T> androidx.collection.SparseArrayCompat<T> plus(androidx.collection.SparseArrayCompat<T>, androidx.collection.SparseArrayCompat<T> other);
+    method @Deprecated public static <T> boolean remove(androidx.collection.SparseArrayCompat<T>, int key, T? value);
     method public static inline operator <T> void set(androidx.collection.SparseArrayCompat<T>, int key, T? value);
     method public static <T> java.util.Iterator<T> valueIterator(androidx.collection.SparseArrayCompat<T>);
   }
diff --git a/collection/collection-ktx/api/public_plus_experimental_1.2.0-beta02.txt b/collection/collection-ktx/api/public_plus_experimental_1.2.0-beta02.txt
index bca313f..32d9f50 100644
--- a/collection/collection-ktx/api/public_plus_experimental_1.2.0-beta02.txt
+++ b/collection/collection-ktx/api/public_plus_experimental_1.2.0-beta02.txt
@@ -20,6 +20,7 @@
     method public static inline <T> boolean isNotEmpty(androidx.collection.LongSparseArray<T>);
     method public static <T> kotlin.collections.LongIterator keyIterator(androidx.collection.LongSparseArray<T>);
     method public static operator <T> androidx.collection.LongSparseArray<T> plus(androidx.collection.LongSparseArray<T>, androidx.collection.LongSparseArray<T> other);
+    method @Deprecated public static <T> boolean remove(androidx.collection.LongSparseArray<T>, long key, T? value);
     method public static inline operator <T> void set(androidx.collection.LongSparseArray<T>, long key, T? value);
     method public static <T> java.util.Iterator<T> valueIterator(androidx.collection.LongSparseArray<T>);
   }
@@ -37,6 +38,7 @@
     method public static inline <T> boolean isNotEmpty(androidx.collection.SparseArrayCompat<T>);
     method public static <T> kotlin.collections.IntIterator keyIterator(androidx.collection.SparseArrayCompat<T>);
     method public static operator <T> androidx.collection.SparseArrayCompat<T> plus(androidx.collection.SparseArrayCompat<T>, androidx.collection.SparseArrayCompat<T> other);
+    method @Deprecated public static <T> boolean remove(androidx.collection.SparseArrayCompat<T>, int key, T? value);
     method public static inline operator <T> void set(androidx.collection.SparseArrayCompat<T>, int key, T? value);
     method public static <T> java.util.Iterator<T> valueIterator(androidx.collection.SparseArrayCompat<T>);
   }
diff --git a/collection/collection-ktx/api/public_plus_experimental_current.txt b/collection/collection-ktx/api/public_plus_experimental_current.txt
index bca313f..32d9f50 100644
--- a/collection/collection-ktx/api/public_plus_experimental_current.txt
+++ b/collection/collection-ktx/api/public_plus_experimental_current.txt
@@ -20,6 +20,7 @@
     method public static inline <T> boolean isNotEmpty(androidx.collection.LongSparseArray<T>);
     method public static <T> kotlin.collections.LongIterator keyIterator(androidx.collection.LongSparseArray<T>);
     method public static operator <T> androidx.collection.LongSparseArray<T> plus(androidx.collection.LongSparseArray<T>, androidx.collection.LongSparseArray<T> other);
+    method @Deprecated public static <T> boolean remove(androidx.collection.LongSparseArray<T>, long key, T? value);
     method public static inline operator <T> void set(androidx.collection.LongSparseArray<T>, long key, T? value);
     method public static <T> java.util.Iterator<T> valueIterator(androidx.collection.LongSparseArray<T>);
   }
@@ -37,6 +38,7 @@
     method public static inline <T> boolean isNotEmpty(androidx.collection.SparseArrayCompat<T>);
     method public static <T> kotlin.collections.IntIterator keyIterator(androidx.collection.SparseArrayCompat<T>);
     method public static operator <T> androidx.collection.SparseArrayCompat<T> plus(androidx.collection.SparseArrayCompat<T>, androidx.collection.SparseArrayCompat<T> other);
+    method @Deprecated public static <T> boolean remove(androidx.collection.SparseArrayCompat<T>, int key, T? value);
     method public static inline operator <T> void set(androidx.collection.SparseArrayCompat<T>, int key, T? value);
     method public static <T> java.util.Iterator<T> valueIterator(androidx.collection.SparseArrayCompat<T>);
   }
diff --git a/collection/collection-ktx/api/restricted_1.2.0-beta02.txt b/collection/collection-ktx/api/restricted_1.2.0-beta02.txt
index bca313f..32d9f50 100644
--- a/collection/collection-ktx/api/restricted_1.2.0-beta02.txt
+++ b/collection/collection-ktx/api/restricted_1.2.0-beta02.txt
@@ -20,6 +20,7 @@
     method public static inline <T> boolean isNotEmpty(androidx.collection.LongSparseArray<T>);
     method public static <T> kotlin.collections.LongIterator keyIterator(androidx.collection.LongSparseArray<T>);
     method public static operator <T> androidx.collection.LongSparseArray<T> plus(androidx.collection.LongSparseArray<T>, androidx.collection.LongSparseArray<T> other);
+    method @Deprecated public static <T> boolean remove(androidx.collection.LongSparseArray<T>, long key, T? value);
     method public static inline operator <T> void set(androidx.collection.LongSparseArray<T>, long key, T? value);
     method public static <T> java.util.Iterator<T> valueIterator(androidx.collection.LongSparseArray<T>);
   }
@@ -37,6 +38,7 @@
     method public static inline <T> boolean isNotEmpty(androidx.collection.SparseArrayCompat<T>);
     method public static <T> kotlin.collections.IntIterator keyIterator(androidx.collection.SparseArrayCompat<T>);
     method public static operator <T> androidx.collection.SparseArrayCompat<T> plus(androidx.collection.SparseArrayCompat<T>, androidx.collection.SparseArrayCompat<T> other);
+    method @Deprecated public static <T> boolean remove(androidx.collection.SparseArrayCompat<T>, int key, T? value);
     method public static inline operator <T> void set(androidx.collection.SparseArrayCompat<T>, int key, T? value);
     method public static <T> java.util.Iterator<T> valueIterator(androidx.collection.SparseArrayCompat<T>);
   }
diff --git a/collection/collection-ktx/api/restricted_current.ignore b/collection/collection-ktx/api/restricted_current.ignore
deleted file mode 100644
index 16ad393..0000000
--- a/collection/collection-ktx/api/restricted_current.ignore
+++ /dev/null
@@ -1,5 +0,0 @@
-// Baseline format: 1.0
-RemovedDeprecatedMethod: androidx.collection.LongSparseArrayKt#remove(androidx.collection.LongSparseArray<T>, long, T):
-    Removed deprecated method androidx.collection.LongSparseArrayKt.remove(androidx.collection.LongSparseArray<T>,long,T)
-RemovedDeprecatedMethod: androidx.collection.SparseArrayKt#remove(androidx.collection.SparseArrayCompat<T>, int, T):
-    Removed deprecated method androidx.collection.SparseArrayKt.remove(androidx.collection.SparseArrayCompat<T>,int,T)
diff --git a/collection/collection-ktx/api/restricted_current.txt b/collection/collection-ktx/api/restricted_current.txt
index bca313f..32d9f50 100644
--- a/collection/collection-ktx/api/restricted_current.txt
+++ b/collection/collection-ktx/api/restricted_current.txt
@@ -20,6 +20,7 @@
     method public static inline <T> boolean isNotEmpty(androidx.collection.LongSparseArray<T>);
     method public static <T> kotlin.collections.LongIterator keyIterator(androidx.collection.LongSparseArray<T>);
     method public static operator <T> androidx.collection.LongSparseArray<T> plus(androidx.collection.LongSparseArray<T>, androidx.collection.LongSparseArray<T> other);
+    method @Deprecated public static <T> boolean remove(androidx.collection.LongSparseArray<T>, long key, T? value);
     method public static inline operator <T> void set(androidx.collection.LongSparseArray<T>, long key, T? value);
     method public static <T> java.util.Iterator<T> valueIterator(androidx.collection.LongSparseArray<T>);
   }
@@ -37,6 +38,7 @@
     method public static inline <T> boolean isNotEmpty(androidx.collection.SparseArrayCompat<T>);
     method public static <T> kotlin.collections.IntIterator keyIterator(androidx.collection.SparseArrayCompat<T>);
     method public static operator <T> androidx.collection.SparseArrayCompat<T> plus(androidx.collection.SparseArrayCompat<T>, androidx.collection.SparseArrayCompat<T> other);
+    method @Deprecated public static <T> boolean remove(androidx.collection.SparseArrayCompat<T>, int key, T? value);
     method public static inline operator <T> void set(androidx.collection.SparseArrayCompat<T>, int key, T? value);
     method public static <T> java.util.Iterator<T> valueIterator(androidx.collection.SparseArrayCompat<T>);
   }
diff --git a/collection/collection/api/current.ignore b/collection/collection/api/current.ignore
deleted file mode 100644
index 7876d30..0000000
--- a/collection/collection/api/current.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-InvalidNullConversion: androidx.collection.ArraySet#valueAt(int):
-    Attempted to remove @Nullable annotation from method androidx.collection.ArraySet.valueAt(int)
diff --git a/collection/collection/api/restricted_current.ignore b/collection/collection/api/restricted_current.ignore
deleted file mode 100644
index 7876d30..0000000
--- a/collection/collection/api/restricted_current.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-InvalidNullConversion: androidx.collection.ArraySet#valueAt(int):
-    Attempted to remove @Nullable annotation from method androidx.collection.ArraySet.valueAt(int)
diff --git a/collection2/collection2/integration-tests/publishing/src/test/kotlin/androidx/room/gradle/CollectionTest.kt b/collection2/collection2/integration-tests/publishing/src/test/kotlin/androidx/room/gradle/CollectionTest.kt
index 9e87e91..bf0dbb03 100644
--- a/collection2/collection2/integration-tests/publishing/src/test/kotlin/androidx/room/gradle/CollectionTest.kt
+++ b/collection2/collection2/integration-tests/publishing/src/test/kotlin/androidx/room/gradle/CollectionTest.kt
@@ -30,18 +30,26 @@
     fun collection2mavenMetadata() {
         val c1metadata = getPublishedFile("androidx/collection/collection/maven-metadata.xml")
         val c2metadata = getPublishedFile("androidx/collection2/collection2/maven-metadata.xml")
+
+        val v1 = getLatestVersion(c1metadata)
+        val v2 = getLatestVersion(c2metadata)
+
         c1metadata.readLines().zip(c2metadata.readLines()).forEach { (c1, c2) ->
-            if (!c1.contains("lastUpdated") && !c1.contains("beta")) {
-                Assert.assertEquals(c1.replace("collection", "collection2"), c2)
+            if (!c1.contains("lastUpdated")) {
+                Assert.assertEquals(c1.replace("collection", "collection2").replace(v1, v2), c2)
             }
         }
     }
 
-    private fun getPublishedFile(name: String) =
-        File(projectSetup.props.localSupportRepo).resolve(name).checkIt { exists() }
+    // Yes, I know https://stackoverflow.com/a/1732454/258688, but it's just a test...
+    private fun getLatestVersion(metadataFile: File) = metadataFile.readLines()
+        .mapNotNull { Regex(".*<latest>(.*?)</latest>.*").find(it)?.groups?.get(1)?.value }.first()
 
-    private fun <T> T.checkIt(eval: T.() -> Boolean): T {
-        if (!eval()) {
+    private fun getPublishedFile(name: String) =
+        File(projectSetup.props.localSupportRepo).resolve(name).check { it.exists() }
+
+    private fun <T> T.check(eval: (T) -> Boolean): T {
+        if (!eval(this)) {
             Assert.fail("Failed assertion: $this")
         }
         return this
diff --git a/collection2/collection2/src/jsTest/kotlin/androidx/collection/testing.kt b/collection2/collection2/src/jsTest/kotlin/androidx/collection/testing.js.kt
similarity index 100%
rename from collection2/collection2/src/jsTest/kotlin/androidx/collection/testing.kt
rename to collection2/collection2/src/jsTest/kotlin/androidx/collection/testing.js.kt
diff --git a/collection2/collection2/src/jvmMain/java/androidx/collection/ArrayMap.java b/collection2/collection2/src/jvmMain/java/androidx/collection/ArrayMap.java
index 473b371..7fdc52d 100644
--- a/collection2/collection2/src/jvmMain/java/androidx/collection/ArrayMap.java
+++ b/collection2/collection2/src/jvmMain/java/androidx/collection/ArrayMap.java
@@ -75,8 +75,8 @@
 
     @Override
     @SuppressWarnings("unchecked")
-    public boolean containsKey(@Nullable Object value) {
-        return super.containsKey((K) value);
+    public boolean containsKey(@Nullable Object key) {
+        return super.containsKey((K) key);
     }
 
     @Override
diff --git a/collection2/collection2/src/jvmMain/kotlin/androidx/collection/LongSparseArray.kt b/collection2/collection2/src/jvmMain/kotlin/androidx/collection/LongSparseArray.jvm.kt
similarity index 100%
rename from collection2/collection2/src/jvmMain/kotlin/androidx/collection/LongSparseArray.kt
rename to collection2/collection2/src/jvmMain/kotlin/androidx/collection/LongSparseArray.jvm.kt
diff --git a/collection2/collection2/src/jvmMain/kotlin/androidx/collection/Platform.kt b/collection2/collection2/src/jvmMain/kotlin/androidx/collection/Platform.jvm.kt
similarity index 100%
rename from collection2/collection2/src/jvmMain/kotlin/androidx/collection/Platform.kt
rename to collection2/collection2/src/jvmMain/kotlin/androidx/collection/Platform.jvm.kt
diff --git a/collection2/collection2/src/jvmMain/kotlin/androidx/collection/SourceCompatibility.kt b/collection2/collection2/src/jvmMain/kotlin/androidx/collection/SourceCompatibility.jvm.kt
similarity index 100%
rename from collection2/collection2/src/jvmMain/kotlin/androidx/collection/SourceCompatibility.kt
rename to collection2/collection2/src/jvmMain/kotlin/androidx/collection/SourceCompatibility.jvm.kt
diff --git a/collection2/collection2/src/jvmMain/kotlin/androidx/collection/SparseArray.kt b/collection2/collection2/src/jvmMain/kotlin/androidx/collection/SparseArray.jvm.kt
similarity index 100%
rename from collection2/collection2/src/jvmMain/kotlin/androidx/collection/SparseArray.kt
rename to collection2/collection2/src/jvmMain/kotlin/androidx/collection/SparseArray.jvm.kt
diff --git a/collection2/collection2/src/jvmTest/kotlin/androidx/collection/ArrayMapThreadedTest.kt b/collection2/collection2/src/jvmTest/kotlin/androidx/collection/ArrayMapThreadedTest.jvm.kt
similarity index 100%
rename from collection2/collection2/src/jvmTest/kotlin/androidx/collection/ArrayMapThreadedTest.kt
rename to collection2/collection2/src/jvmTest/kotlin/androidx/collection/ArrayMapThreadedTest.jvm.kt
diff --git a/collection2/collection2/src/jvmTest/kotlin/androidx/collection/ArraySetThreadedTest.kt b/collection2/collection2/src/jvmTest/kotlin/androidx/collection/ArraySetThreadedTest.jvm.kt
similarity index 100%
rename from collection2/collection2/src/jvmTest/kotlin/androidx/collection/ArraySetThreadedTest.kt
rename to collection2/collection2/src/jvmTest/kotlin/androidx/collection/ArraySetThreadedTest.jvm.kt
diff --git a/collection2/collection2/src/jvmTest/kotlin/androidx/collection/CloneableTest.kt b/collection2/collection2/src/jvmTest/kotlin/androidx/collection/CloneableTest.jvm.kt
similarity index 100%
rename from collection2/collection2/src/jvmTest/kotlin/androidx/collection/CloneableTest.kt
rename to collection2/collection2/src/jvmTest/kotlin/androidx/collection/CloneableTest.jvm.kt
diff --git a/collection2/collection2/src/jvmTest/kotlin/androidx/collection/LruCacheThreadedTest.kt b/collection2/collection2/src/jvmTest/kotlin/androidx/collection/LruCacheThreadedTest.jvm.kt
similarity index 100%
rename from collection2/collection2/src/jvmTest/kotlin/androidx/collection/LruCacheThreadedTest.kt
rename to collection2/collection2/src/jvmTest/kotlin/androidx/collection/LruCacheThreadedTest.jvm.kt
diff --git a/collection2/collection2/src/jvmTest/kotlin/androidx/collection/SimpleArrayMapThreadedTest.kt b/collection2/collection2/src/jvmTest/kotlin/androidx/collection/SimpleArrayMapThreadedTest.jvm.kt
similarity index 100%
rename from collection2/collection2/src/jvmTest/kotlin/androidx/collection/SimpleArrayMapThreadedTest.kt
rename to collection2/collection2/src/jvmTest/kotlin/androidx/collection/SimpleArrayMapThreadedTest.jvm.kt
diff --git a/collection2/collection2/src/jvmTest/kotlin/androidx/collection/testing.kt b/collection2/collection2/src/jvmTest/kotlin/androidx/collection/testing.jvm.kt
similarity index 100%
rename from collection2/collection2/src/jvmTest/kotlin/androidx/collection/testing.kt
rename to collection2/collection2/src/jvmTest/kotlin/androidx/collection/testing.jvm.kt
diff --git a/collection2/collection2/src/nativeTest/kotlin/androidx/collection/testing.kt b/collection2/collection2/src/nativeTest/kotlin/androidx/collection/testing.native.kt
similarity index 100%
rename from collection2/collection2/src/nativeTest/kotlin/androidx/collection/testing.kt
rename to collection2/collection2/src/nativeTest/kotlin/androidx/collection/testing.native.kt
diff --git a/collection2/collection2/src/nonJvmMain/kotlin/androidx/collection/ArrayMap.kt b/collection2/collection2/src/nonJvmMain/kotlin/androidx/collection/ArrayMap.nonJvm.kt
similarity index 100%
rename from collection2/collection2/src/nonJvmMain/kotlin/androidx/collection/ArrayMap.kt
rename to collection2/collection2/src/nonJvmMain/kotlin/androidx/collection/ArrayMap.nonJvm.kt
diff --git a/collection2/collection2/src/nonJvmMain/kotlin/androidx/collection/LongSparseArray.kt b/collection2/collection2/src/nonJvmMain/kotlin/androidx/collection/LongSparseArray.nonJvm.kt
similarity index 100%
rename from collection2/collection2/src/nonJvmMain/kotlin/androidx/collection/LongSparseArray.kt
rename to collection2/collection2/src/nonJvmMain/kotlin/androidx/collection/LongSparseArray.nonJvm.kt
diff --git a/collection2/collection2/src/nonJvmMain/kotlin/androidx/collection/Platform.kt b/collection2/collection2/src/nonJvmMain/kotlin/androidx/collection/Platform.nonJvm.kt
similarity index 100%
rename from collection2/collection2/src/nonJvmMain/kotlin/androidx/collection/Platform.kt
rename to collection2/collection2/src/nonJvmMain/kotlin/androidx/collection/Platform.nonJvm.kt
diff --git a/collection2/collection2/src/nonJvmMain/kotlin/androidx/collection/SparseArray.kt b/collection2/collection2/src/nonJvmMain/kotlin/androidx/collection/SparseArray.nonJvm.kt
similarity index 100%
rename from collection2/collection2/src/nonJvmMain/kotlin/androidx/collection/SparseArray.kt
rename to collection2/collection2/src/nonJvmMain/kotlin/androidx/collection/SparseArray.nonJvm.kt
diff --git a/compose/animation/animation-core/api/1.1.0-beta02.txt b/compose/animation/animation-core/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..1ba2fe9
--- /dev/null
+++ b/compose/animation/animation-core/api/1.1.0-beta02.txt
@@ -0,0 +1,664 @@
+// Signature format: 4.0
+package androidx.compose.animation.core {
+
+  public final class ActualJvmKt {
+  }
+
+  public final class Animatable<T, V extends androidx.compose.animation.core.AnimationVector> {
+    ctor public Animatable(T? initialValue, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, optional T? visibilityThreshold);
+    method public suspend Object? animateDecay(T? initialVelocity, androidx.compose.animation.core.DecayAnimationSpec<T> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Animatable<T,V>,kotlin.Unit>? block, optional kotlin.coroutines.Continuation<? super androidx.compose.animation.core.AnimationResult<T,V>> p);
+    method public suspend Object? animateTo(T? targetValue, optional androidx.compose.animation.core.AnimationSpec<T> animationSpec, optional T? initialVelocity, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Animatable<T,V>,kotlin.Unit>? block, optional kotlin.coroutines.Continuation<? super androidx.compose.animation.core.AnimationResult<T,V>> p);
+    method public androidx.compose.runtime.State<T> asState();
+    method public T? getLowerBound();
+    method public T! getTargetValue();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T? getUpperBound();
+    method public T! getValue();
+    method public T! getVelocity();
+    method public V getVelocityVector();
+    method public boolean isRunning();
+    method public suspend Object? snapTo(T? targetValue, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public suspend Object? stop(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public void updateBounds(optional T? lowerBound, optional T? upperBound);
+    property public final boolean isRunning;
+    property public final T? lowerBound;
+    property public final T! targetValue;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public final T? upperBound;
+    property public final T! value;
+    property public final T! velocity;
+    property public final V velocityVector;
+  }
+
+  public final class AnimatableKt {
+    method public static androidx.compose.animation.core.Animatable<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> Animatable(float initialValue, optional float visibilityThreshold);
+  }
+
+  public final class AnimateAsStateKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> animateDpAsState(float targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.unit.Dp> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.Dp,kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Float> animateFloatAsState(float targetValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional float visibilityThreshold, optional kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Integer> animateIntAsState(int targetValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Integer> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.unit.IntOffset> animateIntOffsetAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntOffset,kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.unit.IntSize> animateIntSizeAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.geometry.Offset> animateOffsetAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.geometry.Offset> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.geometry.Rect> animateRectAsState(androidx.compose.ui.geometry.Rect targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.geometry.Rect> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Rect,kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.geometry.Size> animateSizeAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.geometry.Size> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Size,kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.runtime.State<T> animateValueAsState(T? targetValue, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, optional androidx.compose.animation.core.AnimationSpec<T> animationSpec, optional T? visibilityThreshold, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit>? finishedListener);
+  }
+
+  public interface Animation<T, V extends androidx.compose.animation.core.AnimationVector> {
+    method public long getDurationNanos();
+    method public T! getTargetValue();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValueFromNanos(long playTimeNanos);
+    method public V getVelocityVectorFromNanos(long playTimeNanos);
+    method public default boolean isFinishedFromNanos(long playTimeNanos);
+    method public boolean isInfinite();
+    property public abstract long durationNanos;
+    property public abstract boolean isInfinite;
+    property public abstract T! targetValue;
+    property public abstract androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+  }
+
+  public final class AnimationConstants {
+    field public static final int DefaultDurationMillis = 300; // 0x12c
+    field public static final androidx.compose.animation.core.AnimationConstants INSTANCE;
+    field public static final long UnspecifiedTime = -9223372036854775808L; // 0x8000000000000000L
+  }
+
+  public enum AnimationEndReason {
+    enum_constant public static final androidx.compose.animation.core.AnimationEndReason BoundReached;
+    enum_constant public static final androidx.compose.animation.core.AnimationEndReason Finished;
+  }
+
+  public final class AnimationKt {
+    method public static androidx.compose.animation.core.DecayAnimation<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> DecayAnimation(androidx.compose.animation.core.FloatDecayAnimationSpec animationSpec, float initialValue, optional float initialVelocity);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.TargetBasedAnimation<T,V> TargetBasedAnimation(androidx.compose.animation.core.AnimationSpec<T> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? targetValue, T? initialVelocity);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> T! getVelocityFromNanos(androidx.compose.animation.core.Animation<T,V>, long playTimeNanos);
+  }
+
+  public final class AnimationResult<T, V extends androidx.compose.animation.core.AnimationVector> {
+    ctor public AnimationResult(androidx.compose.animation.core.AnimationState<T,V> endState, androidx.compose.animation.core.AnimationEndReason endReason);
+    method public androidx.compose.animation.core.AnimationEndReason getEndReason();
+    method public androidx.compose.animation.core.AnimationState<T,V> getEndState();
+    property public final androidx.compose.animation.core.AnimationEndReason endReason;
+    property public final androidx.compose.animation.core.AnimationState<T,V> endState;
+  }
+
+  public final class AnimationScope<T, V extends androidx.compose.animation.core.AnimationVector> {
+    method public void cancelAnimation();
+    method public long getFinishedTimeNanos();
+    method public long getLastFrameTimeNanos();
+    method public long getStartTimeNanos();
+    method public T! getTargetValue();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValue();
+    method public T! getVelocity();
+    method public V getVelocityVector();
+    method public boolean isRunning();
+    method public androidx.compose.animation.core.AnimationState<T,V> toAnimationState();
+    property public final long finishedTimeNanos;
+    property public final boolean isRunning;
+    property public final long lastFrameTimeNanos;
+    property public final long startTimeNanos;
+    property public final T! targetValue;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public final T! value;
+    property public final T! velocity;
+    property public final V velocityVector;
+  }
+
+  public interface AnimationSpec<T> {
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+  }
+
+  public final class AnimationSpecKt {
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.InfiniteRepeatableSpec<T> infiniteRepeatable(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.InfiniteRepeatableSpec<T>! infiniteRepeatable(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.KeyframesSpec<T> keyframes(kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.KeyframesSpec.KeyframesSpecConfig<T>,kotlin.Unit> init);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.RepeatableSpec<T> repeatable(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.RepeatableSpec<T>! repeatable(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.SnapSpec<T> snap(optional int delayMillis);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.SpringSpec<T> spring(optional float dampingRatio, optional float stiffness, optional T? visibilityThreshold);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.TweenSpec<T> tween(optional int durationMillis, optional int delayMillis, optional androidx.compose.animation.core.Easing easing);
+  }
+
+  public final class AnimationState<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.runtime.State<T> {
+    ctor public AnimationState(androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, optional V? initialVelocityVector, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public long getFinishedTimeNanos();
+    method public long getLastFrameTimeNanos();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValue();
+    method public T! getVelocity();
+    method public V getVelocityVector();
+    method public boolean isRunning();
+    property public final long finishedTimeNanos;
+    property public final boolean isRunning;
+    property public final long lastFrameTimeNanos;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public T! value;
+    property public final T! velocity;
+    property public final V velocityVector;
+  }
+
+  public final class AnimationStateKt {
+    method public static androidx.compose.animation.core.AnimationState<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> AnimationState(float initialValue, optional float initialVelocity, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.AnimationState<T,V> AnimationState(androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? initialVelocity, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.AnimationState<T,V> copy(androidx.compose.animation.core.AnimationState<T,V>, optional T? value, optional V? velocityVector, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public static androidx.compose.animation.core.AnimationState<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> copy(androidx.compose.animation.core.AnimationState<java.lang.Float,androidx.compose.animation.core.AnimationVector1D>, optional float value, optional float velocity, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> V createZeroVectorFrom(androidx.compose.animation.core.TwoWayConverter<T,V>, T? value);
+    method public static boolean isFinished(androidx.compose.animation.core.AnimationState<?,?>);
+  }
+
+  public abstract sealed class AnimationVector {
+  }
+
+  public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector1D(float initVal);
+    method public float getValue();
+    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 getV1();
+    method public float getV2();
+    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 getV1();
+    method public float getV2();
+    method public float getV3();
+    property public final float v1;
+    property public final float v2;
+    property public final float v3;
+  }
+
+  public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
+    method public float getV1();
+    method public float getV2();
+    method public float getV3();
+    method public float getV4();
+    property public final float v1;
+    property public final float v2;
+    property public final float v3;
+    property public final float v4;
+  }
+
+  public final class AnimationVectorsKt {
+    method public static androidx.compose.animation.core.AnimationVector1D AnimationVector(float v1);
+    method public static androidx.compose.animation.core.AnimationVector2D AnimationVector(float v1, float v2);
+    method public static androidx.compose.animation.core.AnimationVector3D AnimationVector(float v1, float v2, float v3);
+    method public static androidx.compose.animation.core.AnimationVector4D AnimationVector(float v1, float v2, float v3, float v4);
+  }
+
+  public final class ComplexDoubleKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class CubicBezierEasing implements androidx.compose.animation.core.Easing {
+    ctor public CubicBezierEasing(float a, float b, float c, float d);
+    method public float transform(float fraction);
+  }
+
+  public final class DecayAnimation<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.Animation<T,V> {
+    ctor public DecayAnimation(androidx.compose.animation.core.VectorizedDecayAnimationSpec<V> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, V initialVelocityVector);
+    ctor public DecayAnimation(androidx.compose.animation.core.DecayAnimationSpec<T> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, V initialVelocityVector);
+    ctor public DecayAnimation(androidx.compose.animation.core.DecayAnimationSpec<T> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? initialVelocity);
+    method public long getDurationNanos();
+    method public T! getInitialValue();
+    method public V getInitialVelocityVector();
+    method public T! getTargetValue();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValueFromNanos(long playTimeNanos);
+    method public V getVelocityVectorFromNanos(long playTimeNanos);
+    method public boolean isInfinite();
+    property public long durationNanos;
+    property public final T! initialValue;
+    property public final V initialVelocityVector;
+    property public boolean isInfinite;
+    property public T! targetValue;
+    property public androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+  }
+
+  public interface DecayAnimationSpec<T> {
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedDecayAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter);
+  }
+
+  public final class DecayAnimationSpecKt {
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> T! calculateTargetValue(androidx.compose.animation.core.DecayAnimationSpec<T>, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? initialVelocity);
+    method public static float calculateTargetValue(androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float>, float initialValue, float initialVelocity);
+    method public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> exponentialDecay(optional float frictionMultiplier, optional float absVelocityThreshold);
+    method public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> generateDecayAnimationSpec(androidx.compose.animation.core.FloatDecayAnimationSpec);
+  }
+
+  public interface DurationBasedAnimationSpec<T> extends androidx.compose.animation.core.FiniteAnimationSpec<T> {
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+  }
+
+  @androidx.compose.runtime.Stable public fun interface Easing {
+    method public float transform(float fraction);
+  }
+
+  public final class EasingKt {
+    method public static androidx.compose.animation.core.Easing getFastOutLinearInEasing();
+    method public static androidx.compose.animation.core.Easing getFastOutSlowInEasing();
+    method public static androidx.compose.animation.core.Easing getLinearEasing();
+    method public static androidx.compose.animation.core.Easing getLinearOutSlowInEasing();
+    property public static final androidx.compose.animation.core.Easing FastOutLinearInEasing;
+    property public static final androidx.compose.animation.core.Easing FastOutSlowInEasing;
+    property public static final androidx.compose.animation.core.Easing LinearEasing;
+    property public static final androidx.compose.animation.core.Easing LinearOutSlowInEasing;
+  }
+
+  public interface FiniteAnimationSpec<T> extends androidx.compose.animation.core.AnimationSpec<T> {
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+  }
+
+  public interface FloatAnimationSpec extends androidx.compose.animation.core.AnimationSpec<java.lang.Float> {
+    method public long getDurationNanos(float initialValue, float targetValue, float initialVelocity);
+    method public default float getEndVelocity(float initialValue, float targetValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    method public default <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedFloatAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<java.lang.Float,V> converter);
+  }
+
+  public interface FloatDecayAnimationSpec {
+    method public float getAbsVelocityThreshold();
+    method public long getDurationNanos(float initialValue, float initialVelocity);
+    method public float getTargetValue(float initialValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    property public abstract float absVelocityThreshold;
+  }
+
+  public final class FloatDecayAnimationSpecKt {
+  }
+
+  public final class FloatExponentialDecaySpec implements androidx.compose.animation.core.FloatDecayAnimationSpec {
+    ctor public FloatExponentialDecaySpec(optional float frictionMultiplier, optional float absVelocityThreshold);
+    method public float getAbsVelocityThreshold();
+    method public long getDurationNanos(float initialValue, float initialVelocity);
+    method public float getTargetValue(float initialValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    property public float absVelocityThreshold;
+  }
+
+  public final class FloatSpringSpec implements androidx.compose.animation.core.FloatAnimationSpec {
+    ctor public FloatSpringSpec(optional float dampingRatio, optional float stiffness, optional float visibilityThreshold);
+    method public float getDampingRatio();
+    method public long getDurationNanos(float initialValue, float targetValue, float initialVelocity);
+    method public float getStiffness();
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    property public final float dampingRatio;
+    property public final float stiffness;
+  }
+
+  public final class FloatTweenSpec implements androidx.compose.animation.core.FloatAnimationSpec {
+    ctor public FloatTweenSpec(optional int duration, optional int delay, optional androidx.compose.animation.core.Easing easing);
+    method public int getDelay();
+    method public int getDuration();
+    method public long getDurationNanos(float initialValue, float targetValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    property public final int delay;
+    property public final int duration;
+  }
+
+  public final class InfiniteAnimationPolicyKt {
+    method public static suspend inline <R> Object? withInfiniteAnimationFrameMillis(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+    method public static suspend <R> Object? withInfiniteAnimationFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+  }
+
+  public final class InfiniteRepeatableSpec<T> implements androidx.compose.animation.core.AnimationSpec<T> {
+    ctor public InfiniteRepeatableSpec(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated public androidx.compose.animation.core.InfiniteRepeatableSpec<T>! InfiniteRepeatableSpec(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
+    method public androidx.compose.animation.core.DurationBasedAnimationSpec<T> getAnimation();
+    method public long getInitialStartOffset();
+    method public androidx.compose.animation.core.RepeatMode getRepeatMode();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation;
+    property public final long initialStartOffset;
+    property public final androidx.compose.animation.core.RepeatMode repeatMode;
+  }
+
+  public final class InfiniteTransition {
+  }
+
+  public final class InfiniteTransitionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Float> animateFloat(androidx.compose.animation.core.InfiniteTransition, float initialValue, float targetValue, androidx.compose.animation.core.InfiniteRepeatableSpec<java.lang.Float> animationSpec);
+    method @androidx.compose.runtime.Composable public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.runtime.State<T> animateValue(androidx.compose.animation.core.InfiniteTransition, T? initialValue, T? targetValue, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, androidx.compose.animation.core.InfiniteRepeatableSpec<T> animationSpec);
+    method @androidx.compose.runtime.Composable public static androidx.compose.animation.core.InfiniteTransition rememberInfiniteTransition();
+  }
+
+  @androidx.compose.runtime.Immutable public final class KeyframesSpec<T> implements androidx.compose.animation.core.DurationBasedAnimationSpec<T> {
+    ctor public KeyframesSpec(androidx.compose.animation.core.KeyframesSpec.KeyframesSpecConfig<T> config);
+    method public androidx.compose.animation.core.KeyframesSpec.KeyframesSpecConfig<T> getConfig();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedKeyframesSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final androidx.compose.animation.core.KeyframesSpec.KeyframesSpecConfig<T> config;
+  }
+
+  public static final class KeyframesSpec.KeyframeEntity<T> {
+  }
+
+  public static final class KeyframesSpec.KeyframesSpecConfig<T> {
+    ctor public KeyframesSpec.KeyframesSpecConfig();
+    method public infix androidx.compose.animation.core.KeyframesSpec.KeyframeEntity<T> at(T?, int timeStamp);
+    method public int getDelayMillis();
+    method public int getDurationMillis();
+    method public void setDelayMillis(int delayMillis);
+    method public void setDurationMillis(int durationMillis);
+    method public infix void with(androidx.compose.animation.core.KeyframesSpec.KeyframeEntity<T>, androidx.compose.animation.core.Easing easing);
+    property public final int delayMillis;
+    property public final int durationMillis;
+  }
+
+  public final class MutableTransitionState<S> {
+    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;
+  }
+
+  public enum RepeatMode {
+    enum_constant public static final androidx.compose.animation.core.RepeatMode Restart;
+    enum_constant public static final androidx.compose.animation.core.RepeatMode Reverse;
+  }
+
+  @androidx.compose.runtime.Immutable public final class RepeatableSpec<T> implements androidx.compose.animation.core.FiniteAnimationSpec<T> {
+    ctor public RepeatableSpec(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated public androidx.compose.animation.core.RepeatableSpec<T>! RepeatableSpec(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
+    method public androidx.compose.animation.core.DurationBasedAnimationSpec<T> getAnimation();
+    method public long getInitialStartOffset();
+    method public int getIterations();
+    method public androidx.compose.animation.core.RepeatMode getRepeatMode();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation;
+    property public final long initialStartOffset;
+    property public final int iterations;
+    property public final androidx.compose.animation.core.RepeatMode repeatMode;
+  }
+
+  @androidx.compose.runtime.Immutable public final class SnapSpec<T> implements androidx.compose.animation.core.DurationBasedAnimationSpec<T> {
+    ctor public SnapSpec(optional int delay);
+    method public int getDelay();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final int delay;
+  }
+
+  public final class Spring {
+    field public static final float DampingRatioHighBouncy = 0.2f;
+    field public static final float DampingRatioLowBouncy = 0.75f;
+    field public static final float DampingRatioMediumBouncy = 0.5f;
+    field public static final float DampingRatioNoBouncy = 1.0f;
+    field public static final float DefaultDisplacementThreshold = 0.01f;
+    field public static final androidx.compose.animation.core.Spring INSTANCE;
+    field public static final float StiffnessHigh = 10000.0f;
+    field public static final float StiffnessLow = 200.0f;
+    field public static final float StiffnessMedium = 1500.0f;
+    field public static final float StiffnessMediumLow = 400.0f;
+    field public static final float StiffnessVeryLow = 50.0f;
+  }
+
+  public final class SpringEstimationKt {
+  }
+
+  public final class SpringSimulationKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class SpringSpec<T> implements androidx.compose.animation.core.FiniteAnimationSpec<T> {
+    ctor public SpringSpec(optional float dampingRatio, optional float stiffness, optional T? visibilityThreshold);
+    method public float getDampingRatio();
+    method public float getStiffness();
+    method public T? getVisibilityThreshold();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedSpringSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final float dampingRatio;
+    property public final float stiffness;
+    property public final T? visibilityThreshold;
+  }
+
+  public final inline class StartOffset {
+    ctor public StartOffset();
+  }
+
+  public final inline class StartOffsetType {
+    ctor public StartOffsetType();
+  }
+
+  public static final class StartOffsetType.Companion {
+    method public int getDelay();
+    method public int getFastForward();
+    property public final int Delay;
+    property public final int FastForward;
+  }
+
+  public final class SuspendAnimationKt {
+    method public static suspend Object? animate(float initialValue, float targetValue, optional float initialVelocity, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> block, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend <T, V extends androidx.compose.animation.core.AnimationVector> Object? animate(androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? targetValue, optional T? initialVelocity, optional androidx.compose.animation.core.AnimationSpec<T> animationSpec, kotlin.jvm.functions.Function2<? super T,? super T,kotlin.Unit> block, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? animateDecay(float initialValue, float initialVelocity, androidx.compose.animation.core.FloatDecayAnimationSpec animationSpec, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> block, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend <T, V extends androidx.compose.animation.core.AnimationVector> Object? animateDecay(androidx.compose.animation.core.AnimationState<T,V>, androidx.compose.animation.core.DecayAnimationSpec<T> animationSpec, optional boolean sequentialAnimation, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.AnimationScope<T,V>,kotlin.Unit> block, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend <T, V extends androidx.compose.animation.core.AnimationVector> Object? animateTo(androidx.compose.animation.core.AnimationState<T,V>, T? targetValue, optional androidx.compose.animation.core.AnimationSpec<T> animationSpec, optional boolean sequentialAnimation, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.AnimationScope<T,V>,kotlin.Unit> block, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+  }
+
+  public final class TargetBasedAnimation<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.Animation<T,V> {
+    ctor public TargetBasedAnimation(androidx.compose.animation.core.AnimationSpec<T> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? targetValue, optional V? initialVelocityVector);
+    method public long getDurationNanos();
+    method public T! getInitialValue();
+    method public T! getTargetValue();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValueFromNanos(long playTimeNanos);
+    method public V getVelocityVectorFromNanos(long playTimeNanos);
+    method public boolean isInfinite();
+    property public long durationNanos;
+    property public final T! initialValue;
+    property public boolean isInfinite;
+    property public T! targetValue;
+    property public androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+  }
+
+  @androidx.compose.runtime.Stable public final class Transition<S> {
+    method public java.util.List<androidx.compose.animation.core.Transition<S>.TransitionAnimationState<?,?>> getAnimations();
+    method public S! getCurrentState();
+    method public String? getLabel();
+    method public androidx.compose.animation.core.Transition.Segment<S> getSegment();
+    method public S! getTargetState();
+    method public long getTotalDurationNanos();
+    method public java.util.List<androidx.compose.animation.core.Transition<?>> getTransitions();
+    method public boolean isRunning();
+    property public final java.util.List<androidx.compose.animation.core.Transition<S>.TransitionAnimationState<?,?>> animations;
+    property public final S! currentState;
+    property public final boolean isRunning;
+    property public final String? label;
+    property public final androidx.compose.animation.core.Transition.Segment<S> segment;
+    property public final S! targetState;
+    property public final long totalDurationNanos;
+    property public final java.util.List<androidx.compose.animation.core.Transition<?>> transitions;
+  }
+
+  public static interface Transition.Segment<S> {
+    method public S! getInitialState();
+    method public S! getTargetState();
+    method public default infix boolean isTransitioningTo(S?, S? targetState);
+    property public abstract S! initialState;
+    property public abstract S! targetState;
+  }
+
+  @androidx.compose.runtime.Stable public final class Transition.TransitionAnimationState<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.runtime.State<T> {
+    method public androidx.compose.animation.core.TargetBasedAnimation<T,V> getAnimation();
+    method public androidx.compose.animation.core.FiniteAnimationSpec<T> getAnimationSpec();
+    method public String getLabel();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValue();
+    property public final androidx.compose.animation.core.TargetBasedAnimation<T,V> animation;
+    property public final androidx.compose.animation.core.FiniteAnimationSpec<T> animationSpec;
+    property public final String label;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public T! value;
+  }
+
+  public final class TransitionKt {
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> animateDp(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.Dp>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.unit.Dp> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<java.lang.Float> animateFloat(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,java.lang.Float> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<java.lang.Integer> animateInt(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Integer>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,java.lang.Integer> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.unit.IntOffset> animateIntOffset(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.unit.IntOffset> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.unit.IntSize> animateIntSize(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.unit.IntSize> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.geometry.Offset> animateOffset(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.geometry.Offset>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.geometry.Offset> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.geometry.Rect> animateRect(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.geometry.Rect>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.geometry.Rect> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.geometry.Size> animateSize(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.geometry.Size>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.geometry.Size> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S, T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.runtime.State<T> animateValue(androidx.compose.animation.core.Transition<S>, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<T>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,? extends T> targetValueByState);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.animation.core.Transition<T> updateTransition(T? targetState, optional String? label);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.animation.core.Transition<T> updateTransition(androidx.compose.animation.core.MutableTransitionState<T> transitionState, optional String? label);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TweenSpec<T> implements androidx.compose.animation.core.DurationBasedAnimationSpec<T> {
+    ctor public TweenSpec(optional int durationMillis, optional int delay, optional androidx.compose.animation.core.Easing easing);
+    method public int getDelay();
+    method public int getDurationMillis();
+    method public androidx.compose.animation.core.Easing getEasing();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedTweenSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final int delay;
+    property public final int durationMillis;
+    property public final androidx.compose.animation.core.Easing easing;
+  }
+
+  public interface TwoWayConverter<T, V extends androidx.compose.animation.core.AnimationVector> {
+    method public kotlin.jvm.functions.Function1<V,T> getConvertFromVector();
+    method public kotlin.jvm.functions.Function1<T,V> getConvertToVector();
+    property public abstract kotlin.jvm.functions.Function1<V,T> convertFromVector;
+    property public abstract kotlin.jvm.functions.Function1<T,V> convertToVector;
+  }
+
+  public final class VectorConvertersKt {
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.TwoWayConverter<T,V> TwoWayConverter(kotlin.jvm.functions.Function1<? super T,? extends V> convertToVector, kotlin.jvm.functions.Function1<? super V,? extends T> convertFromVector);
+    method public static androidx.compose.animation.core.TwoWayConverter<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> getVectorConverter(kotlin.jvm.internal.FloatCompanionObject);
+    method public static androidx.compose.animation.core.TwoWayConverter<java.lang.Integer,androidx.compose.animation.core.AnimationVector1D> getVectorConverter(kotlin.jvm.internal.IntCompanionObject);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.geometry.Rect,androidx.compose.animation.core.AnimationVector4D> getVectorConverter(androidx.compose.ui.geometry.Rect.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.unit.Dp,androidx.compose.animation.core.AnimationVector1D> getVectorConverter(androidx.compose.ui.unit.Dp.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.unit.DpOffset,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.unit.DpOffset.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.geometry.Size,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.geometry.Size.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.geometry.Offset,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.geometry.Offset.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.unit.IntOffset,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.unit.IntOffset.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.unit.IntSize,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.unit.IntSize.Companion);
+  }
+
+  public interface VectorizedAnimationSpec<V extends androidx.compose.animation.core.AnimationVector> {
+    method public long getDurationNanos(V initialValue, V targetValue, V initialVelocity);
+    method public default V getEndVelocity(V initialValue, V targetValue, V initialVelocity);
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public boolean isInfinite();
+    property public abstract boolean isInfinite;
+  }
+
+  public final class VectorizedAnimationSpecKt {
+  }
+
+  public interface VectorizedDecayAnimationSpec<V extends androidx.compose.animation.core.AnimationVector> {
+    method public float getAbsVelocityThreshold();
+    method public long getDurationNanos(V initialValue, V initialVelocity);
+    method public V getTargetValue(V initialValue, V initialVelocity);
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V initialVelocity);
+    property public abstract float absVelocityThreshold;
+  }
+
+  public interface VectorizedDurationBasedAnimationSpec<V extends androidx.compose.animation.core.AnimationVector> extends androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> {
+    method public int getDelayMillis();
+    method public int getDurationMillis();
+    method public default long getDurationNanos(V initialValue, V targetValue, V initialVelocity);
+    property public abstract int delayMillis;
+    property public abstract int durationMillis;
+  }
+
+  public interface VectorizedFiniteAnimationSpec<V extends androidx.compose.animation.core.AnimationVector> extends androidx.compose.animation.core.VectorizedAnimationSpec<V> {
+    method public default boolean isInfinite();
+    property public default boolean isInfinite;
+  }
+
+  public final class VectorizedFloatAnimationSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> {
+    ctor public VectorizedFloatAnimationSpec(androidx.compose.animation.core.FloatAnimationSpec anim);
+    method public long getDurationNanos(V initialValue, V targetValue, V initialVelocity);
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+  }
+
+  public final class VectorizedInfiniteRepeatableSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedAnimationSpec<V> {
+    ctor public VectorizedInfiniteRepeatableSpec(androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated public androidx.compose.animation.core.VectorizedInfiniteRepeatableSpec<V>! VectorizedInfiniteRepeatableSpec(androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
+    method public long getDurationNanos(V initialValue, V targetValue, V initialVelocity);
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public boolean isInfinite();
+    property public boolean isInfinite;
+  }
+
+  public final class VectorizedKeyframesSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> {
+    ctor public VectorizedKeyframesSpec(java.util.Map<java.lang.Integer,? extends kotlin.Pair<? extends V,? extends androidx.compose.animation.core.Easing>> keyframes, int durationMillis, optional int delayMillis);
+    method public int getDelayMillis();
+    method public int getDurationMillis();
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    property public int delayMillis;
+    property public int durationMillis;
+  }
+
+  public final class VectorizedRepeatableSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> {
+    ctor public VectorizedRepeatableSpec(int iterations, androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated public androidx.compose.animation.core.VectorizedRepeatableSpec<V>! VectorizedRepeatableSpec(int iterations, androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
+    method public long getDurationNanos(V initialValue, V targetValue, V initialVelocity);
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+  }
+
+  public final class VectorizedSnapSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> {
+    ctor public VectorizedSnapSpec(optional int delayMillis);
+    method public int getDelayMillis();
+    method public int getDurationMillis();
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    property public int delayMillis;
+    property public int durationMillis;
+  }
+
+  public final class VectorizedSpringSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> {
+    ctor public VectorizedSpringSpec(optional float dampingRatio, optional float stiffness, optional V? visibilityThreshold);
+    method public float getDampingRatio();
+    method public float getStiffness();
+    property public final float dampingRatio;
+    property public final float stiffness;
+  }
+
+  public final class VectorizedTweenSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> {
+    ctor public VectorizedTweenSpec(optional int durationMillis, optional int delayMillis, optional androidx.compose.animation.core.Easing easing);
+    method public int getDelayMillis();
+    method public int getDurationMillis();
+    method public androidx.compose.animation.core.Easing getEasing();
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    property public int delayMillis;
+    property public int durationMillis;
+    property public final androidx.compose.animation.core.Easing easing;
+  }
+
+  public final class VisibilityThresholdsKt {
+    method public static long getVisibilityThreshold(androidx.compose.ui.unit.IntOffset.Companion);
+    method public static long getVisibilityThreshold(androidx.compose.ui.geometry.Offset.Companion);
+    method public static int getVisibilityThreshold(kotlin.jvm.internal.IntCompanionObject);
+    method public static float getVisibilityThreshold(androidx.compose.ui.unit.Dp.Companion);
+    method public static long getVisibilityThreshold(androidx.compose.ui.unit.DpOffset.Companion);
+    method public static long getVisibilityThreshold(androidx.compose.ui.geometry.Size.Companion);
+    method public static long getVisibilityThreshold(androidx.compose.ui.unit.IntSize.Companion);
+    method public static androidx.compose.ui.geometry.Rect getVisibilityThreshold(androidx.compose.ui.geometry.Rect.Companion);
+  }
+
+}
+
diff --git a/compose/animation/animation-core/api/current.ignore b/compose/animation/animation-core/api/current.ignore
index aa35d9e..6c59d8c 100644
--- a/compose/animation/animation-core/api/current.ignore
+++ b/compose/animation/animation-core/api/current.ignore
@@ -1,12 +1,14 @@
 // Baseline format: 1.0
+InvalidNullConversion: androidx.compose.animation.core.AnimationSpecKt#infiniteRepeatable(androidx.compose.animation.core.DurationBasedAnimationSpec<T>, androidx.compose.animation.core.RepeatMode):
+    Attempted to remove @NonNull annotation from method androidx.compose.animation.core.AnimationSpecKt.infiniteRepeatable(androidx.compose.animation.core.DurationBasedAnimationSpec<T>,androidx.compose.animation.core.RepeatMode)
+InvalidNullConversion: androidx.compose.animation.core.AnimationSpecKt#repeatable(int, androidx.compose.animation.core.DurationBasedAnimationSpec<T>, androidx.compose.animation.core.RepeatMode):
+    Attempted to remove @NonNull annotation from method androidx.compose.animation.core.AnimationSpecKt.repeatable(int,androidx.compose.animation.core.DurationBasedAnimationSpec<T>,androidx.compose.animation.core.RepeatMode)
+
+
 RemovedInterface: androidx.compose.animation.core.InfiniteAnimationPolicy:
     Removed class androidx.compose.animation.core.InfiniteAnimationPolicy
 
 
-RemovedMethod: androidx.compose.animation.core.AnimationSpecKt#infiniteRepeatable(androidx.compose.animation.core.DurationBasedAnimationSpec<T>, androidx.compose.animation.core.RepeatMode):
-    Removed method androidx.compose.animation.core.AnimationSpecKt.infiniteRepeatable(androidx.compose.animation.core.DurationBasedAnimationSpec<T>,androidx.compose.animation.core.RepeatMode)
-RemovedMethod: androidx.compose.animation.core.AnimationSpecKt#repeatable(int, androidx.compose.animation.core.DurationBasedAnimationSpec<T>, androidx.compose.animation.core.RepeatMode):
-    Removed method androidx.compose.animation.core.AnimationSpecKt.repeatable(int,androidx.compose.animation.core.DurationBasedAnimationSpec<T>,androidx.compose.animation.core.RepeatMode)
 RemovedMethod: androidx.compose.animation.core.InfiniteRepeatableSpec#InfiniteRepeatableSpec(androidx.compose.animation.core.DurationBasedAnimationSpec<T>, androidx.compose.animation.core.RepeatMode):
     Removed constructor androidx.compose.animation.core.InfiniteRepeatableSpec(androidx.compose.animation.core.DurationBasedAnimationSpec<T>,androidx.compose.animation.core.RepeatMode)
 RemovedMethod: androidx.compose.animation.core.RepeatableSpec#RepeatableSpec(int, androidx.compose.animation.core.DurationBasedAnimationSpec<T>, androidx.compose.animation.core.RepeatMode):
diff --git a/compose/animation/animation-core/api/current.txt b/compose/animation/animation-core/api/current.txt
index 07dd416..1ba2fe9 100644
--- a/compose/animation/animation-core/api/current.txt
+++ b/compose/animation/animation-core/api/current.txt
@@ -114,8 +114,10 @@
 
   public final class AnimationSpecKt {
     method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.InfiniteRepeatableSpec<T> infiniteRepeatable(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.InfiniteRepeatableSpec<T>! infiniteRepeatable(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
     method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.KeyframesSpec<T> keyframes(kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.KeyframesSpec.KeyframesSpecConfig<T>,kotlin.Unit> init);
     method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.RepeatableSpec<T> repeatable(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.RepeatableSpec<T>! repeatable(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
     method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.SnapSpec<T> snap(optional int delayMillis);
     method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.SpringSpec<T> spring(optional float dampingRatio, optional float stiffness, optional T? visibilityThreshold);
     method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.TweenSpec<T> tween(optional int durationMillis, optional int delayMillis, optional androidx.compose.animation.core.Easing easing);
@@ -246,6 +248,10 @@
     method public static androidx.compose.animation.core.Easing getFastOutSlowInEasing();
     method public static androidx.compose.animation.core.Easing getLinearEasing();
     method public static androidx.compose.animation.core.Easing getLinearOutSlowInEasing();
+    property public static final androidx.compose.animation.core.Easing FastOutLinearInEasing;
+    property public static final androidx.compose.animation.core.Easing FastOutSlowInEasing;
+    property public static final androidx.compose.animation.core.Easing LinearEasing;
+    property public static final androidx.compose.animation.core.Easing LinearOutSlowInEasing;
   }
 
   public interface FiniteAnimationSpec<T> extends androidx.compose.animation.core.AnimationSpec<T> {
@@ -311,6 +317,7 @@
 
   public final class InfiniteRepeatableSpec<T> implements androidx.compose.animation.core.AnimationSpec<T> {
     ctor public InfiniteRepeatableSpec(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated public androidx.compose.animation.core.InfiniteRepeatableSpec<T>! InfiniteRepeatableSpec(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
     method public androidx.compose.animation.core.DurationBasedAnimationSpec<T> getAnimation();
     method public long getInitialStartOffset();
     method public androidx.compose.animation.core.RepeatMode getRepeatMode();
@@ -369,6 +376,7 @@
 
   @androidx.compose.runtime.Immutable public final class RepeatableSpec<T> implements androidx.compose.animation.core.FiniteAnimationSpec<T> {
     ctor public RepeatableSpec(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated public androidx.compose.animation.core.RepeatableSpec<T>! RepeatableSpec(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
     method public androidx.compose.animation.core.DurationBasedAnimationSpec<T> getAnimation();
     method public long getInitialStartOffset();
     method public int getIterations();
@@ -458,16 +466,22 @@
   }
 
   @androidx.compose.runtime.Stable public final class Transition<S> {
+    method public java.util.List<androidx.compose.animation.core.Transition<S>.TransitionAnimationState<?,?>> getAnimations();
     method public S! getCurrentState();
     method public String? getLabel();
     method public androidx.compose.animation.core.Transition.Segment<S> getSegment();
     method public S! getTargetState();
+    method public long getTotalDurationNanos();
+    method public java.util.List<androidx.compose.animation.core.Transition<?>> getTransitions();
     method public boolean isRunning();
+    property public final java.util.List<androidx.compose.animation.core.Transition<S>.TransitionAnimationState<?,?>> animations;
     property public final S! currentState;
     property public final boolean isRunning;
     property public final String? label;
     property public final androidx.compose.animation.core.Transition.Segment<S> segment;
     property public final S! targetState;
+    property public final long totalDurationNanos;
+    property public final java.util.List<androidx.compose.animation.core.Transition<?>> transitions;
   }
 
   public static interface Transition.Segment<S> {
@@ -478,6 +492,19 @@
     property public abstract S! targetState;
   }
 
+  @androidx.compose.runtime.Stable public final class Transition.TransitionAnimationState<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.runtime.State<T> {
+    method public androidx.compose.animation.core.TargetBasedAnimation<T,V> getAnimation();
+    method public androidx.compose.animation.core.FiniteAnimationSpec<T> getAnimationSpec();
+    method public String getLabel();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValue();
+    property public final androidx.compose.animation.core.TargetBasedAnimation<T,V> animation;
+    property public final androidx.compose.animation.core.FiniteAnimationSpec<T> animationSpec;
+    property public final String label;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public T! value;
+  }
+
   public final class TransitionKt {
     method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> animateDp(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.Dp>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.unit.Dp> targetValueByState);
     method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<java.lang.Float> animateFloat(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,java.lang.Float> targetValueByState);
@@ -566,6 +593,7 @@
 
   public final class VectorizedInfiniteRepeatableSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedAnimationSpec<V> {
     ctor public VectorizedInfiniteRepeatableSpec(androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated public androidx.compose.animation.core.VectorizedInfiniteRepeatableSpec<V>! VectorizedInfiniteRepeatableSpec(androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
     method public long getDurationNanos(V initialValue, V targetValue, V initialVelocity);
     method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
     method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
@@ -585,6 +613,7 @@
 
   public final class VectorizedRepeatableSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> {
     ctor public VectorizedRepeatableSpec(int iterations, androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated public androidx.compose.animation.core.VectorizedRepeatableSpec<V>! VectorizedRepeatableSpec(int iterations, androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
     method public long getDurationNanos(V initialValue, V targetValue, V initialVelocity);
     method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
     method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
diff --git a/compose/animation/animation-core/api/public_plus_experimental_1.1.0-beta02.txt b/compose/animation/animation-core/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..9ece088
--- /dev/null
+++ b/compose/animation/animation-core/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,671 @@
+// Signature format: 4.0
+package androidx.compose.animation.core {
+
+  public final class ActualJvmKt {
+  }
+
+  public final class Animatable<T, V extends androidx.compose.animation.core.AnimationVector> {
+    ctor public Animatable(T? initialValue, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, optional T? visibilityThreshold);
+    method public suspend Object? animateDecay(T? initialVelocity, androidx.compose.animation.core.DecayAnimationSpec<T> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Animatable<T,V>,kotlin.Unit>? block, optional kotlin.coroutines.Continuation<? super androidx.compose.animation.core.AnimationResult<T,V>> p);
+    method public suspend Object? animateTo(T? targetValue, optional androidx.compose.animation.core.AnimationSpec<T> animationSpec, optional T? initialVelocity, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Animatable<T,V>,kotlin.Unit>? block, optional kotlin.coroutines.Continuation<? super androidx.compose.animation.core.AnimationResult<T,V>> p);
+    method public androidx.compose.runtime.State<T> asState();
+    method public T? getLowerBound();
+    method public T! getTargetValue();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T? getUpperBound();
+    method public T! getValue();
+    method public T! getVelocity();
+    method public V getVelocityVector();
+    method public boolean isRunning();
+    method public suspend Object? snapTo(T? targetValue, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public suspend Object? stop(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public void updateBounds(optional T? lowerBound, optional T? upperBound);
+    property public final boolean isRunning;
+    property public final T? lowerBound;
+    property public final T! targetValue;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public final T? upperBound;
+    property public final T! value;
+    property public final T! velocity;
+    property public final V velocityVector;
+  }
+
+  public final class AnimatableKt {
+    method public static androidx.compose.animation.core.Animatable<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> Animatable(float initialValue, optional float visibilityThreshold);
+  }
+
+  public final class AnimateAsStateKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> animateDpAsState(float targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.unit.Dp> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.Dp,kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Float> animateFloatAsState(float targetValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional float visibilityThreshold, optional kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Integer> animateIntAsState(int targetValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Integer> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.unit.IntOffset> animateIntOffsetAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntOffset,kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.unit.IntSize> animateIntSizeAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.geometry.Offset> animateOffsetAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.geometry.Offset> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.geometry.Rect> animateRectAsState(androidx.compose.ui.geometry.Rect targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.geometry.Rect> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Rect,kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.geometry.Size> animateSizeAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.geometry.Size> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Size,kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.runtime.State<T> animateValueAsState(T? targetValue, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, optional androidx.compose.animation.core.AnimationSpec<T> animationSpec, optional T? visibilityThreshold, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit>? finishedListener);
+  }
+
+  public interface Animation<T, V extends androidx.compose.animation.core.AnimationVector> {
+    method public long getDurationNanos();
+    method public T! getTargetValue();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValueFromNanos(long playTimeNanos);
+    method public V getVelocityVectorFromNanos(long playTimeNanos);
+    method public default boolean isFinishedFromNanos(long playTimeNanos);
+    method public boolean isInfinite();
+    property public abstract long durationNanos;
+    property public abstract boolean isInfinite;
+    property public abstract T! targetValue;
+    property public abstract androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+  }
+
+  public final class AnimationConstants {
+    field public static final int DefaultDurationMillis = 300; // 0x12c
+    field public static final androidx.compose.animation.core.AnimationConstants INSTANCE;
+    field public static final long UnspecifiedTime = -9223372036854775808L; // 0x8000000000000000L
+  }
+
+  public enum AnimationEndReason {
+    enum_constant public static final androidx.compose.animation.core.AnimationEndReason BoundReached;
+    enum_constant public static final androidx.compose.animation.core.AnimationEndReason Finished;
+  }
+
+  public final class AnimationKt {
+    method public static androidx.compose.animation.core.DecayAnimation<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> DecayAnimation(androidx.compose.animation.core.FloatDecayAnimationSpec animationSpec, float initialValue, optional float initialVelocity);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.TargetBasedAnimation<T,V> TargetBasedAnimation(androidx.compose.animation.core.AnimationSpec<T> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? targetValue, T? initialVelocity);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> T! getVelocityFromNanos(androidx.compose.animation.core.Animation<T,V>, long playTimeNanos);
+  }
+
+  public final class AnimationResult<T, V extends androidx.compose.animation.core.AnimationVector> {
+    ctor public AnimationResult(androidx.compose.animation.core.AnimationState<T,V> endState, androidx.compose.animation.core.AnimationEndReason endReason);
+    method public androidx.compose.animation.core.AnimationEndReason getEndReason();
+    method public androidx.compose.animation.core.AnimationState<T,V> getEndState();
+    property public final androidx.compose.animation.core.AnimationEndReason endReason;
+    property public final androidx.compose.animation.core.AnimationState<T,V> endState;
+  }
+
+  public final class AnimationScope<T, V extends androidx.compose.animation.core.AnimationVector> {
+    method public void cancelAnimation();
+    method public long getFinishedTimeNanos();
+    method public long getLastFrameTimeNanos();
+    method public long getStartTimeNanos();
+    method public T! getTargetValue();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValue();
+    method public T! getVelocity();
+    method public V getVelocityVector();
+    method public boolean isRunning();
+    method public androidx.compose.animation.core.AnimationState<T,V> toAnimationState();
+    property public final long finishedTimeNanos;
+    property public final boolean isRunning;
+    property public final long lastFrameTimeNanos;
+    property public final long startTimeNanos;
+    property public final T! targetValue;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public final T! value;
+    property public final T! velocity;
+    property public final V velocityVector;
+  }
+
+  public interface AnimationSpec<T> {
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+  }
+
+  public final class AnimationSpecKt {
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.InfiniteRepeatableSpec<T> infiniteRepeatable(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.InfiniteRepeatableSpec<T>! infiniteRepeatable(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.KeyframesSpec<T> keyframes(kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.KeyframesSpec.KeyframesSpecConfig<T>,kotlin.Unit> init);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.RepeatableSpec<T> repeatable(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.RepeatableSpec<T>! repeatable(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.SnapSpec<T> snap(optional int delayMillis);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.SpringSpec<T> spring(optional float dampingRatio, optional float stiffness, optional T? visibilityThreshold);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.TweenSpec<T> tween(optional int durationMillis, optional int delayMillis, optional androidx.compose.animation.core.Easing easing);
+  }
+
+  public final class AnimationState<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.runtime.State<T> {
+    ctor public AnimationState(androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, optional V? initialVelocityVector, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public long getFinishedTimeNanos();
+    method public long getLastFrameTimeNanos();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValue();
+    method public T! getVelocity();
+    method public V getVelocityVector();
+    method public boolean isRunning();
+    property public final long finishedTimeNanos;
+    property public final boolean isRunning;
+    property public final long lastFrameTimeNanos;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public T! value;
+    property public final T! velocity;
+    property public final V velocityVector;
+  }
+
+  public final class AnimationStateKt {
+    method public static androidx.compose.animation.core.AnimationState<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> AnimationState(float initialValue, optional float initialVelocity, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.AnimationState<T,V> AnimationState(androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? initialVelocity, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.AnimationState<T,V> copy(androidx.compose.animation.core.AnimationState<T,V>, optional T? value, optional V? velocityVector, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public static androidx.compose.animation.core.AnimationState<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> copy(androidx.compose.animation.core.AnimationState<java.lang.Float,androidx.compose.animation.core.AnimationVector1D>, optional float value, optional float velocity, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> V createZeroVectorFrom(androidx.compose.animation.core.TwoWayConverter<T,V>, T? value);
+    method public static boolean isFinished(androidx.compose.animation.core.AnimationState<?,?>);
+  }
+
+  public abstract sealed class AnimationVector {
+  }
+
+  public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector1D(float initVal);
+    method public float getValue();
+    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 getV1();
+    method public float getV2();
+    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 getV1();
+    method public float getV2();
+    method public float getV3();
+    property public final float v1;
+    property public final float v2;
+    property public final float v3;
+  }
+
+  public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
+    method public float getV1();
+    method public float getV2();
+    method public float getV3();
+    method public float getV4();
+    property public final float v1;
+    property public final float v2;
+    property public final float v3;
+    property public final float v4;
+  }
+
+  public final class AnimationVectorsKt {
+    method public static androidx.compose.animation.core.AnimationVector1D AnimationVector(float v1);
+    method public static androidx.compose.animation.core.AnimationVector2D AnimationVector(float v1, float v2);
+    method public static androidx.compose.animation.core.AnimationVector3D AnimationVector(float v1, float v2, float v3);
+    method public static androidx.compose.animation.core.AnimationVector4D AnimationVector(float v1, float v2, float v3, float v4);
+  }
+
+  public final class ComplexDoubleKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class CubicBezierEasing implements androidx.compose.animation.core.Easing {
+    ctor public CubicBezierEasing(float a, float b, float c, float d);
+    method public float transform(float fraction);
+  }
+
+  public final class DecayAnimation<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.Animation<T,V> {
+    ctor public DecayAnimation(androidx.compose.animation.core.VectorizedDecayAnimationSpec<V> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, V initialVelocityVector);
+    ctor public DecayAnimation(androidx.compose.animation.core.DecayAnimationSpec<T> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, V initialVelocityVector);
+    ctor public DecayAnimation(androidx.compose.animation.core.DecayAnimationSpec<T> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? initialVelocity);
+    method public long getDurationNanos();
+    method public T! getInitialValue();
+    method public V getInitialVelocityVector();
+    method public T! getTargetValue();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValueFromNanos(long playTimeNanos);
+    method public V getVelocityVectorFromNanos(long playTimeNanos);
+    method public boolean isInfinite();
+    property public long durationNanos;
+    property public final T! initialValue;
+    property public final V initialVelocityVector;
+    property public boolean isInfinite;
+    property public T! targetValue;
+    property public androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+  }
+
+  public interface DecayAnimationSpec<T> {
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedDecayAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter);
+  }
+
+  public final class DecayAnimationSpecKt {
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> T! calculateTargetValue(androidx.compose.animation.core.DecayAnimationSpec<T>, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? initialVelocity);
+    method public static float calculateTargetValue(androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float>, float initialValue, float initialVelocity);
+    method public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> exponentialDecay(optional float frictionMultiplier, optional float absVelocityThreshold);
+    method public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> generateDecayAnimationSpec(androidx.compose.animation.core.FloatDecayAnimationSpec);
+  }
+
+  public interface DurationBasedAnimationSpec<T> extends androidx.compose.animation.core.FiniteAnimationSpec<T> {
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+  }
+
+  @androidx.compose.runtime.Stable public fun interface Easing {
+    method public float transform(float fraction);
+  }
+
+  public final class EasingKt {
+    method public static androidx.compose.animation.core.Easing getFastOutLinearInEasing();
+    method public static androidx.compose.animation.core.Easing getFastOutSlowInEasing();
+    method public static androidx.compose.animation.core.Easing getLinearEasing();
+    method public static androidx.compose.animation.core.Easing getLinearOutSlowInEasing();
+    property public static final androidx.compose.animation.core.Easing FastOutLinearInEasing;
+    property public static final androidx.compose.animation.core.Easing FastOutSlowInEasing;
+    property public static final androidx.compose.animation.core.Easing LinearEasing;
+    property public static final androidx.compose.animation.core.Easing LinearOutSlowInEasing;
+  }
+
+  @kotlin.RequiresOptIn(message="This is an experimental animation API for Transition. It may change in the future.") public @interface ExperimentalTransitionApi {
+  }
+
+  public interface FiniteAnimationSpec<T> extends androidx.compose.animation.core.AnimationSpec<T> {
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+  }
+
+  public interface FloatAnimationSpec extends androidx.compose.animation.core.AnimationSpec<java.lang.Float> {
+    method public long getDurationNanos(float initialValue, float targetValue, float initialVelocity);
+    method public default float getEndVelocity(float initialValue, float targetValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    method public default <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedFloatAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<java.lang.Float,V> converter);
+  }
+
+  public interface FloatDecayAnimationSpec {
+    method public float getAbsVelocityThreshold();
+    method public long getDurationNanos(float initialValue, float initialVelocity);
+    method public float getTargetValue(float initialValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    property public abstract float absVelocityThreshold;
+  }
+
+  public final class FloatDecayAnimationSpecKt {
+  }
+
+  public final class FloatExponentialDecaySpec implements androidx.compose.animation.core.FloatDecayAnimationSpec {
+    ctor public FloatExponentialDecaySpec(optional float frictionMultiplier, optional float absVelocityThreshold);
+    method public float getAbsVelocityThreshold();
+    method public long getDurationNanos(float initialValue, float initialVelocity);
+    method public float getTargetValue(float initialValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    property public float absVelocityThreshold;
+  }
+
+  public final class FloatSpringSpec implements androidx.compose.animation.core.FloatAnimationSpec {
+    ctor public FloatSpringSpec(optional float dampingRatio, optional float stiffness, optional float visibilityThreshold);
+    method public float getDampingRatio();
+    method public long getDurationNanos(float initialValue, float targetValue, float initialVelocity);
+    method public float getStiffness();
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    property public final float dampingRatio;
+    property public final float stiffness;
+  }
+
+  public final class FloatTweenSpec implements androidx.compose.animation.core.FloatAnimationSpec {
+    ctor public FloatTweenSpec(optional int duration, optional int delay, optional androidx.compose.animation.core.Easing easing);
+    method public int getDelay();
+    method public int getDuration();
+    method public long getDurationNanos(float initialValue, float targetValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    property public final int delay;
+    property public final int duration;
+  }
+
+  public final class InfiniteAnimationPolicyKt {
+    method public static suspend inline <R> Object? withInfiniteAnimationFrameMillis(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+    method public static suspend <R> Object? withInfiniteAnimationFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+  }
+
+  public final class InfiniteRepeatableSpec<T> implements androidx.compose.animation.core.AnimationSpec<T> {
+    ctor public InfiniteRepeatableSpec(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated public androidx.compose.animation.core.InfiniteRepeatableSpec<T>! InfiniteRepeatableSpec(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
+    method public androidx.compose.animation.core.DurationBasedAnimationSpec<T> getAnimation();
+    method public long getInitialStartOffset();
+    method public androidx.compose.animation.core.RepeatMode getRepeatMode();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation;
+    property public final long initialStartOffset;
+    property public final androidx.compose.animation.core.RepeatMode repeatMode;
+  }
+
+  public final class InfiniteTransition {
+  }
+
+  public final class InfiniteTransitionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Float> animateFloat(androidx.compose.animation.core.InfiniteTransition, float initialValue, float targetValue, androidx.compose.animation.core.InfiniteRepeatableSpec<java.lang.Float> animationSpec);
+    method @androidx.compose.runtime.Composable public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.runtime.State<T> animateValue(androidx.compose.animation.core.InfiniteTransition, T? initialValue, T? targetValue, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, androidx.compose.animation.core.InfiniteRepeatableSpec<T> animationSpec);
+    method @androidx.compose.runtime.Composable public static androidx.compose.animation.core.InfiniteTransition rememberInfiniteTransition();
+  }
+
+  @kotlin.RequiresOptIn(message="This API is internal to library.") @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface InternalAnimationApi {
+  }
+
+  @androidx.compose.runtime.Immutable public final class KeyframesSpec<T> implements androidx.compose.animation.core.DurationBasedAnimationSpec<T> {
+    ctor public KeyframesSpec(androidx.compose.animation.core.KeyframesSpec.KeyframesSpecConfig<T> config);
+    method public androidx.compose.animation.core.KeyframesSpec.KeyframesSpecConfig<T> getConfig();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedKeyframesSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final androidx.compose.animation.core.KeyframesSpec.KeyframesSpecConfig<T> config;
+  }
+
+  public static final class KeyframesSpec.KeyframeEntity<T> {
+  }
+
+  public static final class KeyframesSpec.KeyframesSpecConfig<T> {
+    ctor public KeyframesSpec.KeyframesSpecConfig();
+    method public infix androidx.compose.animation.core.KeyframesSpec.KeyframeEntity<T> at(T?, int timeStamp);
+    method public int getDelayMillis();
+    method public int getDurationMillis();
+    method public void setDelayMillis(int delayMillis);
+    method public void setDurationMillis(int durationMillis);
+    method public infix void with(androidx.compose.animation.core.KeyframesSpec.KeyframeEntity<T>, androidx.compose.animation.core.Easing easing);
+    property public final int delayMillis;
+    property public final int durationMillis;
+  }
+
+  public final class MutableTransitionState<S> {
+    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;
+  }
+
+  public enum RepeatMode {
+    enum_constant public static final androidx.compose.animation.core.RepeatMode Restart;
+    enum_constant public static final androidx.compose.animation.core.RepeatMode Reverse;
+  }
+
+  @androidx.compose.runtime.Immutable public final class RepeatableSpec<T> implements androidx.compose.animation.core.FiniteAnimationSpec<T> {
+    ctor public RepeatableSpec(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated public androidx.compose.animation.core.RepeatableSpec<T>! RepeatableSpec(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
+    method public androidx.compose.animation.core.DurationBasedAnimationSpec<T> getAnimation();
+    method public long getInitialStartOffset();
+    method public int getIterations();
+    method public androidx.compose.animation.core.RepeatMode getRepeatMode();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation;
+    property public final long initialStartOffset;
+    property public final int iterations;
+    property public final androidx.compose.animation.core.RepeatMode repeatMode;
+  }
+
+  @androidx.compose.runtime.Immutable public final class SnapSpec<T> implements androidx.compose.animation.core.DurationBasedAnimationSpec<T> {
+    ctor public SnapSpec(optional int delay);
+    method public int getDelay();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final int delay;
+  }
+
+  public final class Spring {
+    field public static final float DampingRatioHighBouncy = 0.2f;
+    field public static final float DampingRatioLowBouncy = 0.75f;
+    field public static final float DampingRatioMediumBouncy = 0.5f;
+    field public static final float DampingRatioNoBouncy = 1.0f;
+    field public static final float DefaultDisplacementThreshold = 0.01f;
+    field public static final androidx.compose.animation.core.Spring INSTANCE;
+    field public static final float StiffnessHigh = 10000.0f;
+    field public static final float StiffnessLow = 200.0f;
+    field public static final float StiffnessMedium = 1500.0f;
+    field public static final float StiffnessMediumLow = 400.0f;
+    field public static final float StiffnessVeryLow = 50.0f;
+  }
+
+  public final class SpringEstimationKt {
+  }
+
+  public final class SpringSimulationKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class SpringSpec<T> implements androidx.compose.animation.core.FiniteAnimationSpec<T> {
+    ctor public SpringSpec(optional float dampingRatio, optional float stiffness, optional T? visibilityThreshold);
+    method public float getDampingRatio();
+    method public float getStiffness();
+    method public T? getVisibilityThreshold();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedSpringSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final float dampingRatio;
+    property public final float stiffness;
+    property public final T? visibilityThreshold;
+  }
+
+  public final inline class StartOffset {
+    ctor public StartOffset();
+  }
+
+  public final inline class StartOffsetType {
+    ctor public StartOffsetType();
+  }
+
+  public static final class StartOffsetType.Companion {
+    method public int getDelay();
+    method public int getFastForward();
+    property public final int Delay;
+    property public final int FastForward;
+  }
+
+  public final class SuspendAnimationKt {
+    method public static suspend Object? animate(float initialValue, float targetValue, optional float initialVelocity, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> block, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend <T, V extends androidx.compose.animation.core.AnimationVector> Object? animate(androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? targetValue, optional T? initialVelocity, optional androidx.compose.animation.core.AnimationSpec<T> animationSpec, kotlin.jvm.functions.Function2<? super T,? super T,kotlin.Unit> block, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? animateDecay(float initialValue, float initialVelocity, androidx.compose.animation.core.FloatDecayAnimationSpec animationSpec, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> block, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend <T, V extends androidx.compose.animation.core.AnimationVector> Object? animateDecay(androidx.compose.animation.core.AnimationState<T,V>, androidx.compose.animation.core.DecayAnimationSpec<T> animationSpec, optional boolean sequentialAnimation, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.AnimationScope<T,V>,kotlin.Unit> block, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend <T, V extends androidx.compose.animation.core.AnimationVector> Object? animateTo(androidx.compose.animation.core.AnimationState<T,V>, T? targetValue, optional androidx.compose.animation.core.AnimationSpec<T> animationSpec, optional boolean sequentialAnimation, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.AnimationScope<T,V>,kotlin.Unit> block, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+  }
+
+  public final class TargetBasedAnimation<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.Animation<T,V> {
+    ctor public TargetBasedAnimation(androidx.compose.animation.core.AnimationSpec<T> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? targetValue, optional V? initialVelocityVector);
+    method public long getDurationNanos();
+    method public T! getInitialValue();
+    method public T! getTargetValue();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValueFromNanos(long playTimeNanos);
+    method public V getVelocityVectorFromNanos(long playTimeNanos);
+    method public boolean isInfinite();
+    property public long durationNanos;
+    property public final T! initialValue;
+    property public boolean isInfinite;
+    property public T! targetValue;
+    property public androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+  }
+
+  @androidx.compose.runtime.Stable public final class Transition<S> {
+    method public java.util.List<androidx.compose.animation.core.Transition<S>.TransitionAnimationState<?,?>> getAnimations();
+    method public S! getCurrentState();
+    method public String? getLabel();
+    method public androidx.compose.animation.core.Transition.Segment<S> getSegment();
+    method public S! getTargetState();
+    method public long getTotalDurationNanos();
+    method public java.util.List<androidx.compose.animation.core.Transition<?>> getTransitions();
+    method public boolean isRunning();
+    property public final java.util.List<androidx.compose.animation.core.Transition<S>.TransitionAnimationState<?,?>> animations;
+    property public final S! currentState;
+    property public final boolean isRunning;
+    property public final String? label;
+    property public final androidx.compose.animation.core.Transition.Segment<S> segment;
+    property public final S! targetState;
+    property public final long totalDurationNanos;
+    property public final java.util.List<androidx.compose.animation.core.Transition<?>> transitions;
+  }
+
+  public static interface Transition.Segment<S> {
+    method public S! getInitialState();
+    method public S! getTargetState();
+    method public default infix boolean isTransitioningTo(S?, S? targetState);
+    property public abstract S! initialState;
+    property public abstract S! targetState;
+  }
+
+  @androidx.compose.runtime.Stable public final class Transition.TransitionAnimationState<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.runtime.State<T> {
+    method public androidx.compose.animation.core.TargetBasedAnimation<T,V> getAnimation();
+    method public androidx.compose.animation.core.FiniteAnimationSpec<T> getAnimationSpec();
+    method public String getLabel();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValue();
+    property public final androidx.compose.animation.core.TargetBasedAnimation<T,V> animation;
+    property public final androidx.compose.animation.core.FiniteAnimationSpec<T> animationSpec;
+    property public final String label;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public T! value;
+  }
+
+  public final class TransitionKt {
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> animateDp(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.Dp>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.unit.Dp> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<java.lang.Float> animateFloat(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,java.lang.Float> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<java.lang.Integer> animateInt(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Integer>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,java.lang.Integer> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.unit.IntOffset> animateIntOffset(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.unit.IntOffset> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.unit.IntSize> animateIntSize(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.unit.IntSize> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.geometry.Offset> animateOffset(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.geometry.Offset>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.geometry.Offset> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.geometry.Rect> animateRect(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.geometry.Rect>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.geometry.Rect> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.geometry.Size> animateSize(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.geometry.Size>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.geometry.Size> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S, T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.runtime.State<T> animateValue(androidx.compose.animation.core.Transition<S>, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<T>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,? extends T> targetValueByState);
+    method @androidx.compose.animation.core.ExperimentalTransitionApi @androidx.compose.runtime.Composable public static inline <S, T> androidx.compose.animation.core.Transition<T> createChildTransition(androidx.compose.animation.core.Transition<S>, optional String label, kotlin.jvm.functions.Function1<? super S,? extends T> transformToChildState);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.animation.core.Transition<T> updateTransition(T? targetState, optional String? label);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.animation.core.Transition<T> updateTransition(androidx.compose.animation.core.MutableTransitionState<T> transitionState, optional String? label);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TweenSpec<T> implements androidx.compose.animation.core.DurationBasedAnimationSpec<T> {
+    ctor public TweenSpec(optional int durationMillis, optional int delay, optional androidx.compose.animation.core.Easing easing);
+    method public int getDelay();
+    method public int getDurationMillis();
+    method public androidx.compose.animation.core.Easing getEasing();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedTweenSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final int delay;
+    property public final int durationMillis;
+    property public final androidx.compose.animation.core.Easing easing;
+  }
+
+  public interface TwoWayConverter<T, V extends androidx.compose.animation.core.AnimationVector> {
+    method public kotlin.jvm.functions.Function1<V,T> getConvertFromVector();
+    method public kotlin.jvm.functions.Function1<T,V> getConvertToVector();
+    property public abstract kotlin.jvm.functions.Function1<V,T> convertFromVector;
+    property public abstract kotlin.jvm.functions.Function1<T,V> convertToVector;
+  }
+
+  public final class VectorConvertersKt {
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.TwoWayConverter<T,V> TwoWayConverter(kotlin.jvm.functions.Function1<? super T,? extends V> convertToVector, kotlin.jvm.functions.Function1<? super V,? extends T> convertFromVector);
+    method public static androidx.compose.animation.core.TwoWayConverter<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> getVectorConverter(kotlin.jvm.internal.FloatCompanionObject);
+    method public static androidx.compose.animation.core.TwoWayConverter<java.lang.Integer,androidx.compose.animation.core.AnimationVector1D> getVectorConverter(kotlin.jvm.internal.IntCompanionObject);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.geometry.Rect,androidx.compose.animation.core.AnimationVector4D> getVectorConverter(androidx.compose.ui.geometry.Rect.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.unit.Dp,androidx.compose.animation.core.AnimationVector1D> getVectorConverter(androidx.compose.ui.unit.Dp.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.unit.DpOffset,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.unit.DpOffset.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.geometry.Size,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.geometry.Size.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.geometry.Offset,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.geometry.Offset.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.unit.IntOffset,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.unit.IntOffset.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.unit.IntSize,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.unit.IntSize.Companion);
+  }
+
+  public interface VectorizedAnimationSpec<V extends androidx.compose.animation.core.AnimationVector> {
+    method public long getDurationNanos(V initialValue, V targetValue, V initialVelocity);
+    method public default V getEndVelocity(V initialValue, V targetValue, V initialVelocity);
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public boolean isInfinite();
+    property public abstract boolean isInfinite;
+  }
+
+  public final class VectorizedAnimationSpecKt {
+  }
+
+  public interface VectorizedDecayAnimationSpec<V extends androidx.compose.animation.core.AnimationVector> {
+    method public float getAbsVelocityThreshold();
+    method public long getDurationNanos(V initialValue, V initialVelocity);
+    method public V getTargetValue(V initialValue, V initialVelocity);
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V initialVelocity);
+    property public abstract float absVelocityThreshold;
+  }
+
+  public interface VectorizedDurationBasedAnimationSpec<V extends androidx.compose.animation.core.AnimationVector> extends androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> {
+    method public int getDelayMillis();
+    method public int getDurationMillis();
+    method public default long getDurationNanos(V initialValue, V targetValue, V initialVelocity);
+    property public abstract int delayMillis;
+    property public abstract int durationMillis;
+  }
+
+  public interface VectorizedFiniteAnimationSpec<V extends androidx.compose.animation.core.AnimationVector> extends androidx.compose.animation.core.VectorizedAnimationSpec<V> {
+    method public default boolean isInfinite();
+    property public default boolean isInfinite;
+  }
+
+  public final class VectorizedFloatAnimationSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> {
+    ctor public VectorizedFloatAnimationSpec(androidx.compose.animation.core.FloatAnimationSpec anim);
+    method public long getDurationNanos(V initialValue, V targetValue, V initialVelocity);
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+  }
+
+  public final class VectorizedInfiniteRepeatableSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedAnimationSpec<V> {
+    ctor public VectorizedInfiniteRepeatableSpec(androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated public androidx.compose.animation.core.VectorizedInfiniteRepeatableSpec<V>! VectorizedInfiniteRepeatableSpec(androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
+    method public long getDurationNanos(V initialValue, V targetValue, V initialVelocity);
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public boolean isInfinite();
+    property public boolean isInfinite;
+  }
+
+  public final class VectorizedKeyframesSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> {
+    ctor public VectorizedKeyframesSpec(java.util.Map<java.lang.Integer,? extends kotlin.Pair<? extends V,? extends androidx.compose.animation.core.Easing>> keyframes, int durationMillis, optional int delayMillis);
+    method public int getDelayMillis();
+    method public int getDurationMillis();
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    property public int delayMillis;
+    property public int durationMillis;
+  }
+
+  public final class VectorizedRepeatableSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> {
+    ctor public VectorizedRepeatableSpec(int iterations, androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated public androidx.compose.animation.core.VectorizedRepeatableSpec<V>! VectorizedRepeatableSpec(int iterations, androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
+    method public long getDurationNanos(V initialValue, V targetValue, V initialVelocity);
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+  }
+
+  public final class VectorizedSnapSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> {
+    ctor public VectorizedSnapSpec(optional int delayMillis);
+    method public int getDelayMillis();
+    method public int getDurationMillis();
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    property public int delayMillis;
+    property public int durationMillis;
+  }
+
+  public final class VectorizedSpringSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> {
+    ctor public VectorizedSpringSpec(optional float dampingRatio, optional float stiffness, optional V? visibilityThreshold);
+    method public float getDampingRatio();
+    method public float getStiffness();
+    property public final float dampingRatio;
+    property public final float stiffness;
+  }
+
+  public final class VectorizedTweenSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> {
+    ctor public VectorizedTweenSpec(optional int durationMillis, optional int delayMillis, optional androidx.compose.animation.core.Easing easing);
+    method public int getDelayMillis();
+    method public int getDurationMillis();
+    method public androidx.compose.animation.core.Easing getEasing();
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    property public int delayMillis;
+    property public int durationMillis;
+    property public final androidx.compose.animation.core.Easing easing;
+  }
+
+  public final class VisibilityThresholdsKt {
+    method public static long getVisibilityThreshold(androidx.compose.ui.unit.IntOffset.Companion);
+    method public static long getVisibilityThreshold(androidx.compose.ui.geometry.Offset.Companion);
+    method public static int getVisibilityThreshold(kotlin.jvm.internal.IntCompanionObject);
+    method public static float getVisibilityThreshold(androidx.compose.ui.unit.Dp.Companion);
+    method public static long getVisibilityThreshold(androidx.compose.ui.unit.DpOffset.Companion);
+    method public static long getVisibilityThreshold(androidx.compose.ui.geometry.Size.Companion);
+    method public static long getVisibilityThreshold(androidx.compose.ui.unit.IntSize.Companion);
+    method public static androidx.compose.ui.geometry.Rect getVisibilityThreshold(androidx.compose.ui.geometry.Rect.Companion);
+  }
+
+}
+
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 86f2996..9ece088 100644
--- a/compose/animation/animation-core/api/public_plus_experimental_current.txt
+++ b/compose/animation/animation-core/api/public_plus_experimental_current.txt
@@ -114,8 +114,10 @@
 
   public final class AnimationSpecKt {
     method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.InfiniteRepeatableSpec<T> infiniteRepeatable(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.InfiniteRepeatableSpec<T>! infiniteRepeatable(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
     method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.KeyframesSpec<T> keyframes(kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.KeyframesSpec.KeyframesSpecConfig<T>,kotlin.Unit> init);
     method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.RepeatableSpec<T> repeatable(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.RepeatableSpec<T>! repeatable(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
     method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.SnapSpec<T> snap(optional int delayMillis);
     method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.SpringSpec<T> spring(optional float dampingRatio, optional float stiffness, optional T? visibilityThreshold);
     method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.TweenSpec<T> tween(optional int durationMillis, optional int delayMillis, optional androidx.compose.animation.core.Easing easing);
@@ -246,6 +248,10 @@
     method public static androidx.compose.animation.core.Easing getFastOutSlowInEasing();
     method public static androidx.compose.animation.core.Easing getLinearEasing();
     method public static androidx.compose.animation.core.Easing getLinearOutSlowInEasing();
+    property public static final androidx.compose.animation.core.Easing FastOutLinearInEasing;
+    property public static final androidx.compose.animation.core.Easing FastOutSlowInEasing;
+    property public static final androidx.compose.animation.core.Easing LinearEasing;
+    property public static final androidx.compose.animation.core.Easing LinearOutSlowInEasing;
   }
 
   @kotlin.RequiresOptIn(message="This is an experimental animation API for Transition. It may change in the future.") public @interface ExperimentalTransitionApi {
@@ -314,6 +320,7 @@
 
   public final class InfiniteRepeatableSpec<T> implements androidx.compose.animation.core.AnimationSpec<T> {
     ctor public InfiniteRepeatableSpec(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated public androidx.compose.animation.core.InfiniteRepeatableSpec<T>! InfiniteRepeatableSpec(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
     method public androidx.compose.animation.core.DurationBasedAnimationSpec<T> getAnimation();
     method public long getInitialStartOffset();
     method public androidx.compose.animation.core.RepeatMode getRepeatMode();
@@ -375,6 +382,7 @@
 
   @androidx.compose.runtime.Immutable public final class RepeatableSpec<T> implements androidx.compose.animation.core.FiniteAnimationSpec<T> {
     ctor public RepeatableSpec(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated public androidx.compose.animation.core.RepeatableSpec<T>! RepeatableSpec(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
     method public androidx.compose.animation.core.DurationBasedAnimationSpec<T> getAnimation();
     method public long getInitialStartOffset();
     method public int getIterations();
@@ -464,16 +472,22 @@
   }
 
   @androidx.compose.runtime.Stable public final class Transition<S> {
+    method public java.util.List<androidx.compose.animation.core.Transition<S>.TransitionAnimationState<?,?>> getAnimations();
     method public S! getCurrentState();
     method public String? getLabel();
     method public androidx.compose.animation.core.Transition.Segment<S> getSegment();
     method public S! getTargetState();
+    method public long getTotalDurationNanos();
+    method public java.util.List<androidx.compose.animation.core.Transition<?>> getTransitions();
     method public boolean isRunning();
+    property public final java.util.List<androidx.compose.animation.core.Transition<S>.TransitionAnimationState<?,?>> animations;
     property public final S! currentState;
     property public final boolean isRunning;
     property public final String? label;
     property public final androidx.compose.animation.core.Transition.Segment<S> segment;
     property public final S! targetState;
+    property public final long totalDurationNanos;
+    property public final java.util.List<androidx.compose.animation.core.Transition<?>> transitions;
   }
 
   public static interface Transition.Segment<S> {
@@ -484,6 +498,19 @@
     property public abstract S! targetState;
   }
 
+  @androidx.compose.runtime.Stable public final class Transition.TransitionAnimationState<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.runtime.State<T> {
+    method public androidx.compose.animation.core.TargetBasedAnimation<T,V> getAnimation();
+    method public androidx.compose.animation.core.FiniteAnimationSpec<T> getAnimationSpec();
+    method public String getLabel();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValue();
+    property public final androidx.compose.animation.core.TargetBasedAnimation<T,V> animation;
+    property public final androidx.compose.animation.core.FiniteAnimationSpec<T> animationSpec;
+    property public final String label;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public T! value;
+  }
+
   public final class TransitionKt {
     method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> animateDp(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.Dp>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.unit.Dp> targetValueByState);
     method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<java.lang.Float> animateFloat(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,java.lang.Float> targetValueByState);
@@ -573,6 +600,7 @@
 
   public final class VectorizedInfiniteRepeatableSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedAnimationSpec<V> {
     ctor public VectorizedInfiniteRepeatableSpec(androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated public androidx.compose.animation.core.VectorizedInfiniteRepeatableSpec<V>! VectorizedInfiniteRepeatableSpec(androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
     method public long getDurationNanos(V initialValue, V targetValue, V initialVelocity);
     method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
     method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
@@ -592,6 +620,7 @@
 
   public final class VectorizedRepeatableSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> {
     ctor public VectorizedRepeatableSpec(int iterations, androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated public androidx.compose.animation.core.VectorizedRepeatableSpec<V>! VectorizedRepeatableSpec(int iterations, androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
     method public long getDurationNanos(V initialValue, V targetValue, V initialVelocity);
     method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
     method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/animation/animation-core/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to compose/animation/animation-core/api/res-1.1.0-beta02.txt
diff --git a/compose/animation/animation-core/api/restricted_1.1.0-beta02.txt b/compose/animation/animation-core/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..df9d1b7
--- /dev/null
+++ b/compose/animation/animation-core/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,667 @@
+// Signature format: 4.0
+package androidx.compose.animation.core {
+
+  public final class ActualJvmKt {
+  }
+
+  public final class Animatable<T, V extends androidx.compose.animation.core.AnimationVector> {
+    ctor public Animatable(T? initialValue, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, optional T? visibilityThreshold);
+    method public suspend Object? animateDecay(T? initialVelocity, androidx.compose.animation.core.DecayAnimationSpec<T> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Animatable<T,V>,kotlin.Unit>? block, optional kotlin.coroutines.Continuation<? super androidx.compose.animation.core.AnimationResult<T,V>> p);
+    method public suspend Object? animateTo(T? targetValue, optional androidx.compose.animation.core.AnimationSpec<T> animationSpec, optional T? initialVelocity, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Animatable<T,V>,kotlin.Unit>? block, optional kotlin.coroutines.Continuation<? super androidx.compose.animation.core.AnimationResult<T,V>> p);
+    method public androidx.compose.runtime.State<T> asState();
+    method public T? getLowerBound();
+    method public T! getTargetValue();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T? getUpperBound();
+    method public T! getValue();
+    method public T! getVelocity();
+    method public V getVelocityVector();
+    method public boolean isRunning();
+    method public suspend Object? snapTo(T? targetValue, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public suspend Object? stop(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public void updateBounds(optional T? lowerBound, optional T? upperBound);
+    property public final boolean isRunning;
+    property public final T? lowerBound;
+    property public final T! targetValue;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public final T? upperBound;
+    property public final T! value;
+    property public final T! velocity;
+    property public final V velocityVector;
+  }
+
+  public final class AnimatableKt {
+    method public static androidx.compose.animation.core.Animatable<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> Animatable(float initialValue, optional float visibilityThreshold);
+  }
+
+  public final class AnimateAsStateKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> animateDpAsState(float targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.unit.Dp> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.Dp,kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Float> animateFloatAsState(float targetValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional float visibilityThreshold, optional kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Integer> animateIntAsState(int targetValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Integer> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.unit.IntOffset> animateIntOffsetAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntOffset,kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.unit.IntSize> animateIntSizeAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.geometry.Offset> animateOffsetAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.geometry.Offset> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.geometry.Rect> animateRectAsState(androidx.compose.ui.geometry.Rect targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.geometry.Rect> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Rect,kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.geometry.Size> animateSizeAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.geometry.Size> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Size,kotlin.Unit>? finishedListener);
+    method @androidx.compose.runtime.Composable public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.runtime.State<T> animateValueAsState(T? targetValue, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, optional androidx.compose.animation.core.AnimationSpec<T> animationSpec, optional T? visibilityThreshold, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit>? finishedListener);
+  }
+
+  public interface Animation<T, V extends androidx.compose.animation.core.AnimationVector> {
+    method public long getDurationNanos();
+    method public T! getTargetValue();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValueFromNanos(long playTimeNanos);
+    method public V getVelocityVectorFromNanos(long playTimeNanos);
+    method public default boolean isFinishedFromNanos(long playTimeNanos);
+    method public boolean isInfinite();
+    property public abstract long durationNanos;
+    property public abstract boolean isInfinite;
+    property public abstract T! targetValue;
+    property public abstract androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+  }
+
+  public final class AnimationConstants {
+    field public static final int DefaultDurationMillis = 300; // 0x12c
+    field public static final androidx.compose.animation.core.AnimationConstants INSTANCE;
+    field public static final long UnspecifiedTime = -9223372036854775808L; // 0x8000000000000000L
+  }
+
+  public enum AnimationEndReason {
+    enum_constant public static final androidx.compose.animation.core.AnimationEndReason BoundReached;
+    enum_constant public static final androidx.compose.animation.core.AnimationEndReason Finished;
+  }
+
+  public final class AnimationKt {
+    method public static androidx.compose.animation.core.DecayAnimation<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> DecayAnimation(androidx.compose.animation.core.FloatDecayAnimationSpec animationSpec, float initialValue, optional float initialVelocity);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.TargetBasedAnimation<T,V> TargetBasedAnimation(androidx.compose.animation.core.AnimationSpec<T> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? targetValue, T? initialVelocity);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> T! getVelocityFromNanos(androidx.compose.animation.core.Animation<T,V>, long playTimeNanos);
+  }
+
+  public final class AnimationResult<T, V extends androidx.compose.animation.core.AnimationVector> {
+    ctor public AnimationResult(androidx.compose.animation.core.AnimationState<T,V> endState, androidx.compose.animation.core.AnimationEndReason endReason);
+    method public androidx.compose.animation.core.AnimationEndReason getEndReason();
+    method public androidx.compose.animation.core.AnimationState<T,V> getEndState();
+    property public final androidx.compose.animation.core.AnimationEndReason endReason;
+    property public final androidx.compose.animation.core.AnimationState<T,V> endState;
+  }
+
+  public final class AnimationScope<T, V extends androidx.compose.animation.core.AnimationVector> {
+    method public void cancelAnimation();
+    method public long getFinishedTimeNanos();
+    method public long getLastFrameTimeNanos();
+    method public long getStartTimeNanos();
+    method public T! getTargetValue();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValue();
+    method public T! getVelocity();
+    method public V getVelocityVector();
+    method public boolean isRunning();
+    method public androidx.compose.animation.core.AnimationState<T,V> toAnimationState();
+    property public final long finishedTimeNanos;
+    property public final boolean isRunning;
+    property public final long lastFrameTimeNanos;
+    property public final long startTimeNanos;
+    property public final T! targetValue;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public final T! value;
+    property public final T! velocity;
+    property public final V velocityVector;
+  }
+
+  public interface AnimationSpec<T> {
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+  }
+
+  public final class AnimationSpecKt {
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.InfiniteRepeatableSpec<T> infiniteRepeatable(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.InfiniteRepeatableSpec<T>! infiniteRepeatable(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.KeyframesSpec<T> keyframes(kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.KeyframesSpec.KeyframesSpecConfig<T>,kotlin.Unit> init);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.RepeatableSpec<T> repeatable(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.RepeatableSpec<T>! repeatable(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.SnapSpec<T> snap(optional int delayMillis);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.SpringSpec<T> spring(optional float dampingRatio, optional float stiffness, optional T? visibilityThreshold);
+    method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.TweenSpec<T> tween(optional int durationMillis, optional int delayMillis, optional androidx.compose.animation.core.Easing easing);
+  }
+
+  public final class AnimationState<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.runtime.State<T> {
+    ctor public AnimationState(androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, optional V? initialVelocityVector, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public long getFinishedTimeNanos();
+    method public long getLastFrameTimeNanos();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValue();
+    method public T! getVelocity();
+    method public V getVelocityVector();
+    method public boolean isRunning();
+    property public final long finishedTimeNanos;
+    property public final boolean isRunning;
+    property public final long lastFrameTimeNanos;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public T! value;
+    property public final T! velocity;
+    property public final V velocityVector;
+  }
+
+  public final class AnimationStateKt {
+    method public static androidx.compose.animation.core.AnimationState<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> AnimationState(float initialValue, optional float initialVelocity, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.AnimationState<T,V> AnimationState(androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? initialVelocity, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.AnimationState<T,V> copy(androidx.compose.animation.core.AnimationState<T,V>, optional T? value, optional V? velocityVector, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public static androidx.compose.animation.core.AnimationState<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> copy(androidx.compose.animation.core.AnimationState<java.lang.Float,androidx.compose.animation.core.AnimationVector1D>, optional float value, optional float velocity, optional long lastFrameTimeNanos, optional long finishedTimeNanos, optional boolean isRunning);
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> V createZeroVectorFrom(androidx.compose.animation.core.TwoWayConverter<T,V>, T? value);
+    method public static boolean isFinished(androidx.compose.animation.core.AnimationState<?,?>);
+  }
+
+  public abstract sealed class AnimationVector {
+  }
+
+  public final class AnimationVector1D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector1D(float initVal);
+    method public float getValue();
+    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 getV1();
+    method public float getV2();
+    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 getV1();
+    method public float getV2();
+    method public float getV3();
+    property public final float v1;
+    property public final float v2;
+    property public final float v3;
+  }
+
+  public final class AnimationVector4D extends androidx.compose.animation.core.AnimationVector {
+    ctor public AnimationVector4D(float v1, float v2, float v3, float v4);
+    method public float getV1();
+    method public float getV2();
+    method public float getV3();
+    method public float getV4();
+    property public final float v1;
+    property public final float v2;
+    property public final float v3;
+    property public final float v4;
+  }
+
+  public final class AnimationVectorsKt {
+    method public static androidx.compose.animation.core.AnimationVector1D AnimationVector(float v1);
+    method public static androidx.compose.animation.core.AnimationVector2D AnimationVector(float v1, float v2);
+    method public static androidx.compose.animation.core.AnimationVector3D AnimationVector(float v1, float v2, float v3);
+    method public static androidx.compose.animation.core.AnimationVector4D AnimationVector(float v1, float v2, float v3, float v4);
+  }
+
+  public final class ComplexDoubleKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class CubicBezierEasing implements androidx.compose.animation.core.Easing {
+    ctor public CubicBezierEasing(float a, float b, float c, float d);
+    method public float transform(float fraction);
+  }
+
+  public final class DecayAnimation<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.Animation<T,V> {
+    ctor public DecayAnimation(androidx.compose.animation.core.VectorizedDecayAnimationSpec<V> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, V initialVelocityVector);
+    ctor public DecayAnimation(androidx.compose.animation.core.DecayAnimationSpec<T> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, V initialVelocityVector);
+    ctor public DecayAnimation(androidx.compose.animation.core.DecayAnimationSpec<T> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? initialVelocity);
+    method public long getDurationNanos();
+    method public T! getInitialValue();
+    method public V getInitialVelocityVector();
+    method public T! getTargetValue();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValueFromNanos(long playTimeNanos);
+    method public V getVelocityVectorFromNanos(long playTimeNanos);
+    method public boolean isInfinite();
+    property public long durationNanos;
+    property public final T! initialValue;
+    property public final V initialVelocityVector;
+    property public boolean isInfinite;
+    property public T! targetValue;
+    property public androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+  }
+
+  public interface DecayAnimationSpec<T> {
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedDecayAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter);
+  }
+
+  public final class DecayAnimationSpecKt {
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> T! calculateTargetValue(androidx.compose.animation.core.DecayAnimationSpec<T>, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? initialVelocity);
+    method public static float calculateTargetValue(androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float>, float initialValue, float initialVelocity);
+    method public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> exponentialDecay(optional float frictionMultiplier, optional float absVelocityThreshold);
+    method public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> generateDecayAnimationSpec(androidx.compose.animation.core.FloatDecayAnimationSpec);
+  }
+
+  public interface DurationBasedAnimationSpec<T> extends androidx.compose.animation.core.FiniteAnimationSpec<T> {
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+  }
+
+  @androidx.compose.runtime.Stable public fun interface Easing {
+    method public float transform(float fraction);
+  }
+
+  public final class EasingKt {
+    method public static androidx.compose.animation.core.Easing getFastOutLinearInEasing();
+    method public static androidx.compose.animation.core.Easing getFastOutSlowInEasing();
+    method public static androidx.compose.animation.core.Easing getLinearEasing();
+    method public static androidx.compose.animation.core.Easing getLinearOutSlowInEasing();
+    property public static final androidx.compose.animation.core.Easing FastOutLinearInEasing;
+    property public static final androidx.compose.animation.core.Easing FastOutSlowInEasing;
+    property public static final androidx.compose.animation.core.Easing LinearEasing;
+    property public static final androidx.compose.animation.core.Easing LinearOutSlowInEasing;
+  }
+
+  public interface FiniteAnimationSpec<T> extends androidx.compose.animation.core.AnimationSpec<T> {
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+  }
+
+  public interface FloatAnimationSpec extends androidx.compose.animation.core.AnimationSpec<java.lang.Float> {
+    method public long getDurationNanos(float initialValue, float targetValue, float initialVelocity);
+    method public default float getEndVelocity(float initialValue, float targetValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    method public default <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedFloatAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<java.lang.Float,V> converter);
+  }
+
+  public interface FloatDecayAnimationSpec {
+    method public float getAbsVelocityThreshold();
+    method public long getDurationNanos(float initialValue, float initialVelocity);
+    method public float getTargetValue(float initialValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    property public abstract float absVelocityThreshold;
+  }
+
+  public final class FloatDecayAnimationSpecKt {
+  }
+
+  public final class FloatExponentialDecaySpec implements androidx.compose.animation.core.FloatDecayAnimationSpec {
+    ctor public FloatExponentialDecaySpec(optional float frictionMultiplier, optional float absVelocityThreshold);
+    method public float getAbsVelocityThreshold();
+    method public long getDurationNanos(float initialValue, float initialVelocity);
+    method public float getTargetValue(float initialValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    property public float absVelocityThreshold;
+  }
+
+  public final class FloatSpringSpec implements androidx.compose.animation.core.FloatAnimationSpec {
+    ctor public FloatSpringSpec(optional float dampingRatio, optional float stiffness, optional float visibilityThreshold);
+    method public float getDampingRatio();
+    method public long getDurationNanos(float initialValue, float targetValue, float initialVelocity);
+    method public float getStiffness();
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    property public final float dampingRatio;
+    property public final float stiffness;
+  }
+
+  public final class FloatTweenSpec implements androidx.compose.animation.core.FloatAnimationSpec {
+    ctor public FloatTweenSpec(optional int duration, optional int delay, optional androidx.compose.animation.core.Easing easing);
+    method public int getDelay();
+    method public int getDuration();
+    method public long getDurationNanos(float initialValue, float targetValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float targetValue, float initialVelocity);
+    property public final int delay;
+    property public final int duration;
+  }
+
+  public final class InfiniteAnimationPolicyKt {
+    method public static suspend inline <R> Object? withInfiniteAnimationFrameMillis(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+    method public static suspend <R> Object? withInfiniteAnimationFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+  }
+
+  public final class InfiniteRepeatableSpec<T> implements androidx.compose.animation.core.AnimationSpec<T> {
+    ctor public InfiniteRepeatableSpec(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated public androidx.compose.animation.core.InfiniteRepeatableSpec<T>! InfiniteRepeatableSpec(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
+    method public androidx.compose.animation.core.DurationBasedAnimationSpec<T> getAnimation();
+    method public long getInitialStartOffset();
+    method public androidx.compose.animation.core.RepeatMode getRepeatMode();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation;
+    property public final long initialStartOffset;
+    property public final androidx.compose.animation.core.RepeatMode repeatMode;
+  }
+
+  public final class InfiniteTransition {
+  }
+
+  public final class InfiniteTransitionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Float> animateFloat(androidx.compose.animation.core.InfiniteTransition, float initialValue, float targetValue, androidx.compose.animation.core.InfiniteRepeatableSpec<java.lang.Float> animationSpec);
+    method @androidx.compose.runtime.Composable public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.runtime.State<T> animateValue(androidx.compose.animation.core.InfiniteTransition, T? initialValue, T? targetValue, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, androidx.compose.animation.core.InfiniteRepeatableSpec<T> animationSpec);
+    method @androidx.compose.runtime.Composable public static androidx.compose.animation.core.InfiniteTransition rememberInfiniteTransition();
+  }
+
+  @androidx.compose.runtime.Immutable public final class KeyframesSpec<T> implements androidx.compose.animation.core.DurationBasedAnimationSpec<T> {
+    ctor public KeyframesSpec(androidx.compose.animation.core.KeyframesSpec.KeyframesSpecConfig<T> config);
+    method public androidx.compose.animation.core.KeyframesSpec.KeyframesSpecConfig<T> getConfig();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedKeyframesSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final androidx.compose.animation.core.KeyframesSpec.KeyframesSpecConfig<T> config;
+  }
+
+  public static final class KeyframesSpec.KeyframeEntity<T> {
+  }
+
+  public static final class KeyframesSpec.KeyframesSpecConfig<T> {
+    ctor public KeyframesSpec.KeyframesSpecConfig();
+    method public infix androidx.compose.animation.core.KeyframesSpec.KeyframeEntity<T> at(T?, int timeStamp);
+    method public int getDelayMillis();
+    method public int getDurationMillis();
+    method public void setDelayMillis(int delayMillis);
+    method public void setDurationMillis(int durationMillis);
+    method public infix void with(androidx.compose.animation.core.KeyframesSpec.KeyframeEntity<T>, androidx.compose.animation.core.Easing easing);
+    property public final int delayMillis;
+    property public final int durationMillis;
+  }
+
+  public final class MutableTransitionState<S> {
+    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;
+  }
+
+  public enum RepeatMode {
+    enum_constant public static final androidx.compose.animation.core.RepeatMode Restart;
+    enum_constant public static final androidx.compose.animation.core.RepeatMode Reverse;
+  }
+
+  @androidx.compose.runtime.Immutable public final class RepeatableSpec<T> implements androidx.compose.animation.core.FiniteAnimationSpec<T> {
+    ctor public RepeatableSpec(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated public androidx.compose.animation.core.RepeatableSpec<T>! RepeatableSpec(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
+    method public androidx.compose.animation.core.DurationBasedAnimationSpec<T> getAnimation();
+    method public long getInitialStartOffset();
+    method public int getIterations();
+    method public androidx.compose.animation.core.RepeatMode getRepeatMode();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation;
+    property public final long initialStartOffset;
+    property public final int iterations;
+    property public final androidx.compose.animation.core.RepeatMode repeatMode;
+  }
+
+  @androidx.compose.runtime.Immutable public final class SnapSpec<T> implements androidx.compose.animation.core.DurationBasedAnimationSpec<T> {
+    ctor public SnapSpec(optional int delay);
+    method public int getDelay();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final int delay;
+  }
+
+  public final class Spring {
+    field public static final float DampingRatioHighBouncy = 0.2f;
+    field public static final float DampingRatioLowBouncy = 0.75f;
+    field public static final float DampingRatioMediumBouncy = 0.5f;
+    field public static final float DampingRatioNoBouncy = 1.0f;
+    field public static final float DefaultDisplacementThreshold = 0.01f;
+    field public static final androidx.compose.animation.core.Spring INSTANCE;
+    field public static final float StiffnessHigh = 10000.0f;
+    field public static final float StiffnessLow = 200.0f;
+    field public static final float StiffnessMedium = 1500.0f;
+    field public static final float StiffnessMediumLow = 400.0f;
+    field public static final float StiffnessVeryLow = 50.0f;
+  }
+
+  public final class SpringEstimationKt {
+  }
+
+  public final class SpringSimulationKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class SpringSpec<T> implements androidx.compose.animation.core.FiniteAnimationSpec<T> {
+    ctor public SpringSpec(optional float dampingRatio, optional float stiffness, optional T? visibilityThreshold);
+    method public float getDampingRatio();
+    method public float getStiffness();
+    method public T? getVisibilityThreshold();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedSpringSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final float dampingRatio;
+    property public final float stiffness;
+    property public final T? visibilityThreshold;
+  }
+
+  public final inline class StartOffset {
+    ctor public StartOffset();
+  }
+
+  public final inline class StartOffsetType {
+    ctor public StartOffsetType();
+  }
+
+  public static final class StartOffsetType.Companion {
+    method public int getDelay();
+    method public int getFastForward();
+    property public final int Delay;
+    property public final int FastForward;
+  }
+
+  public final class SuspendAnimationKt {
+    method public static suspend Object? animate(float initialValue, float targetValue, optional float initialVelocity, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> block, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend <T, V extends androidx.compose.animation.core.AnimationVector> Object? animate(androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? targetValue, optional T? initialVelocity, optional androidx.compose.animation.core.AnimationSpec<T> animationSpec, kotlin.jvm.functions.Function2<? super T,? super T,kotlin.Unit> block, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? animateDecay(float initialValue, float initialVelocity, androidx.compose.animation.core.FloatDecayAnimationSpec animationSpec, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> block, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend <T, V extends androidx.compose.animation.core.AnimationVector> Object? animateDecay(androidx.compose.animation.core.AnimationState<T,V>, androidx.compose.animation.core.DecayAnimationSpec<T> animationSpec, optional boolean sequentialAnimation, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.AnimationScope<T,V>,kotlin.Unit> block, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend <T, V extends androidx.compose.animation.core.AnimationVector> Object? animateTo(androidx.compose.animation.core.AnimationState<T,V>, T? targetValue, optional androidx.compose.animation.core.AnimationSpec<T> animationSpec, optional boolean sequentialAnimation, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.AnimationScope<T,V>,kotlin.Unit> block, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+  }
+
+  public final class TargetBasedAnimation<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.Animation<T,V> {
+    ctor public TargetBasedAnimation(androidx.compose.animation.core.AnimationSpec<T> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, T? initialValue, T? targetValue, optional V? initialVelocityVector);
+    method public long getDurationNanos();
+    method public T! getInitialValue();
+    method public T! getTargetValue();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValueFromNanos(long playTimeNanos);
+    method public V getVelocityVectorFromNanos(long playTimeNanos);
+    method public boolean isInfinite();
+    property public long durationNanos;
+    property public final T! initialValue;
+    property public boolean isInfinite;
+    property public T! targetValue;
+    property public androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+  }
+
+  @androidx.compose.runtime.Stable public final class Transition<S> {
+    ctor @kotlin.PublishedApi internal Transition(androidx.compose.animation.core.MutableTransitionState<S> transitionState, optional String? label);
+    method public java.util.List<androidx.compose.animation.core.Transition<S>.TransitionAnimationState<?,?>> getAnimations();
+    method public S! getCurrentState();
+    method public String? getLabel();
+    method public androidx.compose.animation.core.Transition.Segment<S> getSegment();
+    method public S! getTargetState();
+    method public long getTotalDurationNanos();
+    method public java.util.List<androidx.compose.animation.core.Transition<?>> getTransitions();
+    method public boolean isRunning();
+    property public final java.util.List<androidx.compose.animation.core.Transition<S>.TransitionAnimationState<?,?>> animations;
+    property public final S! currentState;
+    property public final boolean isRunning;
+    property public final String? label;
+    property public final androidx.compose.animation.core.Transition.Segment<S> segment;
+    property public final S! targetState;
+    property public final long totalDurationNanos;
+    property public final java.util.List<androidx.compose.animation.core.Transition<?>> transitions;
+  }
+
+  public static interface Transition.Segment<S> {
+    method public S! getInitialState();
+    method public S! getTargetState();
+    method public default infix boolean isTransitioningTo(S?, S? targetState);
+    property public abstract S! initialState;
+    property public abstract S! targetState;
+  }
+
+  @androidx.compose.runtime.Stable public final class Transition.TransitionAnimationState<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.runtime.State<T> {
+    method public androidx.compose.animation.core.TargetBasedAnimation<T,V> getAnimation();
+    method public androidx.compose.animation.core.FiniteAnimationSpec<T> getAnimationSpec();
+    method public String getLabel();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValue();
+    property public final androidx.compose.animation.core.TargetBasedAnimation<T,V> animation;
+    property public final androidx.compose.animation.core.FiniteAnimationSpec<T> animationSpec;
+    property public final String label;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public T! value;
+  }
+
+  public final class TransitionKt {
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> animateDp(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.Dp>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.unit.Dp> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<java.lang.Float> animateFloat(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,java.lang.Float> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<java.lang.Integer> animateInt(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Integer>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,java.lang.Integer> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.unit.IntOffset> animateIntOffset(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.unit.IntOffset> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.unit.IntSize> animateIntSize(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.unit.IntSize> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.geometry.Offset> animateOffset(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.geometry.Offset>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.geometry.Offset> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.geometry.Rect> animateRect(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.geometry.Rect>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.geometry.Rect> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.geometry.Size> animateSize(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.geometry.Size>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.geometry.Size> targetValueByState);
+    method @androidx.compose.runtime.Composable public static inline <S, T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.runtime.State<T> animateValue(androidx.compose.animation.core.Transition<S>, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<T>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,? extends T> targetValueByState);
+    method @androidx.compose.runtime.Composable @kotlin.PublishedApi internal static <S, T> androidx.compose.animation.core.Transition<T> createChildTransitionInternal(androidx.compose.animation.core.Transition<S>, T? initialState, T? targetState, String childLabel);
+    method @androidx.compose.runtime.Composable @kotlin.PublishedApi internal static <S, T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.runtime.State<T> createTransitionAnimation(androidx.compose.animation.core.Transition<S>, T? initialValue, T? targetValue, androidx.compose.animation.core.FiniteAnimationSpec<T> animationSpec, androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter, String label);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.animation.core.Transition<T> updateTransition(T? targetState, optional String? label);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.animation.core.Transition<T> updateTransition(androidx.compose.animation.core.MutableTransitionState<T> transitionState, optional String? label);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TweenSpec<T> implements androidx.compose.animation.core.DurationBasedAnimationSpec<T> {
+    ctor public TweenSpec(optional int durationMillis, optional int delay, optional androidx.compose.animation.core.Easing easing);
+    method public int getDelay();
+    method public int getDurationMillis();
+    method public androidx.compose.animation.core.Easing getEasing();
+    method public <V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.VectorizedTweenSpec<V> vectorize(androidx.compose.animation.core.TwoWayConverter<T,V> converter);
+    property public final int delay;
+    property public final int durationMillis;
+    property public final androidx.compose.animation.core.Easing easing;
+  }
+
+  public interface TwoWayConverter<T, V extends androidx.compose.animation.core.AnimationVector> {
+    method public kotlin.jvm.functions.Function1<V,T> getConvertFromVector();
+    method public kotlin.jvm.functions.Function1<T,V> getConvertToVector();
+    property public abstract kotlin.jvm.functions.Function1<V,T> convertFromVector;
+    property public abstract kotlin.jvm.functions.Function1<T,V> convertToVector;
+  }
+
+  public final class VectorConvertersKt {
+    method public static <T, V extends androidx.compose.animation.core.AnimationVector> androidx.compose.animation.core.TwoWayConverter<T,V> TwoWayConverter(kotlin.jvm.functions.Function1<? super T,? extends V> convertToVector, kotlin.jvm.functions.Function1<? super V,? extends T> convertFromVector);
+    method public static androidx.compose.animation.core.TwoWayConverter<java.lang.Float,androidx.compose.animation.core.AnimationVector1D> getVectorConverter(kotlin.jvm.internal.FloatCompanionObject);
+    method public static androidx.compose.animation.core.TwoWayConverter<java.lang.Integer,androidx.compose.animation.core.AnimationVector1D> getVectorConverter(kotlin.jvm.internal.IntCompanionObject);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.geometry.Rect,androidx.compose.animation.core.AnimationVector4D> getVectorConverter(androidx.compose.ui.geometry.Rect.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.unit.Dp,androidx.compose.animation.core.AnimationVector1D> getVectorConverter(androidx.compose.ui.unit.Dp.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.unit.DpOffset,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.unit.DpOffset.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.geometry.Size,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.geometry.Size.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.geometry.Offset,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.geometry.Offset.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.unit.IntOffset,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.unit.IntOffset.Companion);
+    method public static androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.unit.IntSize,androidx.compose.animation.core.AnimationVector2D> getVectorConverter(androidx.compose.ui.unit.IntSize.Companion);
+  }
+
+  public interface VectorizedAnimationSpec<V extends androidx.compose.animation.core.AnimationVector> {
+    method public long getDurationNanos(V initialValue, V targetValue, V initialVelocity);
+    method public default V getEndVelocity(V initialValue, V targetValue, V initialVelocity);
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public boolean isInfinite();
+    property public abstract boolean isInfinite;
+  }
+
+  public final class VectorizedAnimationSpecKt {
+  }
+
+  public interface VectorizedDecayAnimationSpec<V extends androidx.compose.animation.core.AnimationVector> {
+    method public float getAbsVelocityThreshold();
+    method public long getDurationNanos(V initialValue, V initialVelocity);
+    method public V getTargetValue(V initialValue, V initialVelocity);
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V initialVelocity);
+    property public abstract float absVelocityThreshold;
+  }
+
+  public interface VectorizedDurationBasedAnimationSpec<V extends androidx.compose.animation.core.AnimationVector> extends androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> {
+    method public int getDelayMillis();
+    method public int getDurationMillis();
+    method public default long getDurationNanos(V initialValue, V targetValue, V initialVelocity);
+    property public abstract int delayMillis;
+    property public abstract int durationMillis;
+  }
+
+  public interface VectorizedFiniteAnimationSpec<V extends androidx.compose.animation.core.AnimationVector> extends androidx.compose.animation.core.VectorizedAnimationSpec<V> {
+    method public default boolean isInfinite();
+    property public default boolean isInfinite;
+  }
+
+  public final class VectorizedFloatAnimationSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> {
+    ctor public VectorizedFloatAnimationSpec(androidx.compose.animation.core.FloatAnimationSpec anim);
+    method public long getDurationNanos(V initialValue, V targetValue, V initialVelocity);
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+  }
+
+  public final class VectorizedInfiniteRepeatableSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedAnimationSpec<V> {
+    ctor public VectorizedInfiniteRepeatableSpec(androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated public androidx.compose.animation.core.VectorizedInfiniteRepeatableSpec<V>! VectorizedInfiniteRepeatableSpec(androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
+    method public long getDurationNanos(V initialValue, V targetValue, V initialVelocity);
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public boolean isInfinite();
+    property public boolean isInfinite;
+  }
+
+  public final class VectorizedKeyframesSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> {
+    ctor public VectorizedKeyframesSpec(java.util.Map<java.lang.Integer,? extends kotlin.Pair<? extends V,? extends androidx.compose.animation.core.Easing>> keyframes, int durationMillis, optional int delayMillis);
+    method public int getDelayMillis();
+    method public int getDurationMillis();
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    property public int delayMillis;
+    property public int durationMillis;
+  }
+
+  public final class VectorizedRepeatableSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> {
+    ctor public VectorizedRepeatableSpec(int iterations, androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated public androidx.compose.animation.core.VectorizedRepeatableSpec<V>! VectorizedRepeatableSpec(int iterations, androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
+    method public long getDurationNanos(V initialValue, V targetValue, V initialVelocity);
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+  }
+
+  public final class VectorizedSnapSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> {
+    ctor public VectorizedSnapSpec(optional int delayMillis);
+    method public int getDelayMillis();
+    method public int getDurationMillis();
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    property public int delayMillis;
+    property public int durationMillis;
+  }
+
+  public final class VectorizedSpringSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> {
+    ctor public VectorizedSpringSpec(optional float dampingRatio, optional float stiffness, optional V? visibilityThreshold);
+    method public float getDampingRatio();
+    method public float getStiffness();
+    property public final float dampingRatio;
+    property public final float stiffness;
+  }
+
+  public final class VectorizedTweenSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> {
+    ctor public VectorizedTweenSpec(optional int durationMillis, optional int delayMillis, optional androidx.compose.animation.core.Easing easing);
+    method public int getDelayMillis();
+    method public int getDurationMillis();
+    method public androidx.compose.animation.core.Easing getEasing();
+    method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
+    property public int delayMillis;
+    property public int durationMillis;
+    property public final androidx.compose.animation.core.Easing easing;
+  }
+
+  public final class VisibilityThresholdsKt {
+    method public static long getVisibilityThreshold(androidx.compose.ui.unit.IntOffset.Companion);
+    method public static long getVisibilityThreshold(androidx.compose.ui.geometry.Offset.Companion);
+    method public static int getVisibilityThreshold(kotlin.jvm.internal.IntCompanionObject);
+    method public static float getVisibilityThreshold(androidx.compose.ui.unit.Dp.Companion);
+    method public static long getVisibilityThreshold(androidx.compose.ui.unit.DpOffset.Companion);
+    method public static long getVisibilityThreshold(androidx.compose.ui.geometry.Size.Companion);
+    method public static long getVisibilityThreshold(androidx.compose.ui.unit.IntSize.Companion);
+    method public static androidx.compose.ui.geometry.Rect getVisibilityThreshold(androidx.compose.ui.geometry.Rect.Companion);
+  }
+
+}
+
diff --git a/compose/animation/animation-core/api/restricted_current.ignore b/compose/animation/animation-core/api/restricted_current.ignore
index 905a609..ce4555e 100644
--- a/compose/animation/animation-core/api/restricted_current.ignore
+++ b/compose/animation/animation-core/api/restricted_current.ignore
@@ -1,4 +1,10 @@
 // Baseline format: 1.0
+InvalidNullConversion: androidx.compose.animation.core.AnimationSpecKt#infiniteRepeatable(androidx.compose.animation.core.DurationBasedAnimationSpec<T>, androidx.compose.animation.core.RepeatMode):
+    Attempted to remove @NonNull annotation from method androidx.compose.animation.core.AnimationSpecKt.infiniteRepeatable(androidx.compose.animation.core.DurationBasedAnimationSpec<T>,androidx.compose.animation.core.RepeatMode)
+InvalidNullConversion: androidx.compose.animation.core.AnimationSpecKt#repeatable(int, androidx.compose.animation.core.DurationBasedAnimationSpec<T>, androidx.compose.animation.core.RepeatMode):
+    Attempted to remove @NonNull annotation from method androidx.compose.animation.core.AnimationSpecKt.repeatable(int,androidx.compose.animation.core.DurationBasedAnimationSpec<T>,androidx.compose.animation.core.RepeatMode)
+
+
 ParameterNameChange: androidx.compose.animation.core.TransitionKt#createChildTransitionInternal(androidx.compose.animation.core.Transition<S>, T, T, String) parameter #3:
     Attempted to change parameter name from label to childLabel in method androidx.compose.animation.core.TransitionKt.createChildTransitionInternal
 
@@ -11,10 +17,6 @@
     Removed class androidx.compose.animation.core.InfiniteAnimationPolicy
 
 
-RemovedMethod: androidx.compose.animation.core.AnimationSpecKt#infiniteRepeatable(androidx.compose.animation.core.DurationBasedAnimationSpec<T>, androidx.compose.animation.core.RepeatMode):
-    Removed method androidx.compose.animation.core.AnimationSpecKt.infiniteRepeatable(androidx.compose.animation.core.DurationBasedAnimationSpec<T>,androidx.compose.animation.core.RepeatMode)
-RemovedMethod: androidx.compose.animation.core.AnimationSpecKt#repeatable(int, androidx.compose.animation.core.DurationBasedAnimationSpec<T>, androidx.compose.animation.core.RepeatMode):
-    Removed method androidx.compose.animation.core.AnimationSpecKt.repeatable(int,androidx.compose.animation.core.DurationBasedAnimationSpec<T>,androidx.compose.animation.core.RepeatMode)
 RemovedMethod: androidx.compose.animation.core.InfiniteRepeatableSpec#InfiniteRepeatableSpec(androidx.compose.animation.core.DurationBasedAnimationSpec<T>, androidx.compose.animation.core.RepeatMode):
     Removed constructor androidx.compose.animation.core.InfiniteRepeatableSpec(androidx.compose.animation.core.DurationBasedAnimationSpec<T>,androidx.compose.animation.core.RepeatMode)
 RemovedMethod: androidx.compose.animation.core.RepeatableSpec#RepeatableSpec(int, androidx.compose.animation.core.DurationBasedAnimationSpec<T>, androidx.compose.animation.core.RepeatMode):
diff --git a/compose/animation/animation-core/api/restricted_current.txt b/compose/animation/animation-core/api/restricted_current.txt
index 8cdd3c0..df9d1b7 100644
--- a/compose/animation/animation-core/api/restricted_current.txt
+++ b/compose/animation/animation-core/api/restricted_current.txt
@@ -114,8 +114,10 @@
 
   public final class AnimationSpecKt {
     method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.InfiniteRepeatableSpec<T> infiniteRepeatable(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.InfiniteRepeatableSpec<T>! infiniteRepeatable(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
     method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.KeyframesSpec<T> keyframes(kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.KeyframesSpec.KeyframesSpecConfig<T>,kotlin.Unit> init);
     method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.RepeatableSpec<T> repeatable(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.RepeatableSpec<T>! repeatable(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
     method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.SnapSpec<T> snap(optional int delayMillis);
     method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.SpringSpec<T> spring(optional float dampingRatio, optional float stiffness, optional T? visibilityThreshold);
     method @androidx.compose.runtime.Stable public static <T> androidx.compose.animation.core.TweenSpec<T> tween(optional int durationMillis, optional int delayMillis, optional androidx.compose.animation.core.Easing easing);
@@ -246,6 +248,10 @@
     method public static androidx.compose.animation.core.Easing getFastOutSlowInEasing();
     method public static androidx.compose.animation.core.Easing getLinearEasing();
     method public static androidx.compose.animation.core.Easing getLinearOutSlowInEasing();
+    property public static final androidx.compose.animation.core.Easing FastOutLinearInEasing;
+    property public static final androidx.compose.animation.core.Easing FastOutSlowInEasing;
+    property public static final androidx.compose.animation.core.Easing LinearEasing;
+    property public static final androidx.compose.animation.core.Easing LinearOutSlowInEasing;
   }
 
   public interface FiniteAnimationSpec<T> extends androidx.compose.animation.core.AnimationSpec<T> {
@@ -311,6 +317,7 @@
 
   public final class InfiniteRepeatableSpec<T> implements androidx.compose.animation.core.AnimationSpec<T> {
     ctor public InfiniteRepeatableSpec(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated public androidx.compose.animation.core.InfiniteRepeatableSpec<T>! InfiniteRepeatableSpec(androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
     method public androidx.compose.animation.core.DurationBasedAnimationSpec<T> getAnimation();
     method public long getInitialStartOffset();
     method public androidx.compose.animation.core.RepeatMode getRepeatMode();
@@ -369,6 +376,7 @@
 
   @androidx.compose.runtime.Immutable public final class RepeatableSpec<T> implements androidx.compose.animation.core.FiniteAnimationSpec<T> {
     ctor public RepeatableSpec(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated public androidx.compose.animation.core.RepeatableSpec<T>! RepeatableSpec(int iterations, androidx.compose.animation.core.DurationBasedAnimationSpec<T> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
     method public androidx.compose.animation.core.DurationBasedAnimationSpec<T> getAnimation();
     method public long getInitialStartOffset();
     method public int getIterations();
@@ -459,16 +467,22 @@
 
   @androidx.compose.runtime.Stable public final class Transition<S> {
     ctor @kotlin.PublishedApi internal Transition(androidx.compose.animation.core.MutableTransitionState<S> transitionState, optional String? label);
+    method public java.util.List<androidx.compose.animation.core.Transition<S>.TransitionAnimationState<?,?>> getAnimations();
     method public S! getCurrentState();
     method public String? getLabel();
     method public androidx.compose.animation.core.Transition.Segment<S> getSegment();
     method public S! getTargetState();
+    method public long getTotalDurationNanos();
+    method public java.util.List<androidx.compose.animation.core.Transition<?>> getTransitions();
     method public boolean isRunning();
+    property public final java.util.List<androidx.compose.animation.core.Transition<S>.TransitionAnimationState<?,?>> animations;
     property public final S! currentState;
     property public final boolean isRunning;
     property public final String? label;
     property public final androidx.compose.animation.core.Transition.Segment<S> segment;
     property public final S! targetState;
+    property public final long totalDurationNanos;
+    property public final java.util.List<androidx.compose.animation.core.Transition<?>> transitions;
   }
 
   public static interface Transition.Segment<S> {
@@ -479,6 +493,19 @@
     property public abstract S! targetState;
   }
 
+  @androidx.compose.runtime.Stable public final class Transition.TransitionAnimationState<T, V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.runtime.State<T> {
+    method public androidx.compose.animation.core.TargetBasedAnimation<T,V> getAnimation();
+    method public androidx.compose.animation.core.FiniteAnimationSpec<T> getAnimationSpec();
+    method public String getLabel();
+    method public androidx.compose.animation.core.TwoWayConverter<T,V> getTypeConverter();
+    method public T! getValue();
+    property public final androidx.compose.animation.core.TargetBasedAnimation<T,V> animation;
+    property public final androidx.compose.animation.core.FiniteAnimationSpec<T> animationSpec;
+    property public final String label;
+    property public final androidx.compose.animation.core.TwoWayConverter<T,V> typeConverter;
+    property public T! value;
+  }
+
   public final class TransitionKt {
     method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> animateDp(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.Dp>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.unit.Dp> targetValueByState);
     method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<java.lang.Float> animateFloat(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,java.lang.Float> targetValueByState);
@@ -569,6 +596,7 @@
 
   public final class VectorizedInfiniteRepeatableSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedAnimationSpec<V> {
     ctor public VectorizedInfiniteRepeatableSpec(androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated public androidx.compose.animation.core.VectorizedInfiniteRepeatableSpec<V>! VectorizedInfiniteRepeatableSpec(androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
     method public long getDurationNanos(V initialValue, V targetValue, V initialVelocity);
     method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
     method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
@@ -588,6 +616,7 @@
 
   public final class VectorizedRepeatableSpec<V extends androidx.compose.animation.core.AnimationVector> implements androidx.compose.animation.core.VectorizedFiniteAnimationSpec<V> {
     ctor public VectorizedRepeatableSpec(int iterations, androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> animation, optional androidx.compose.animation.core.RepeatMode repeatMode, optional long initialStartOffset);
+    method @Deprecated public androidx.compose.animation.core.VectorizedRepeatableSpec<V>! VectorizedRepeatableSpec(int iterations, androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec<V> animation, optional androidx.compose.animation.core.RepeatMode repeatMode);
     method public long getDurationNanos(V initialValue, V targetValue, V initialVelocity);
     method public V getValueFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
     method public V getVelocityFromNanos(long playTimeNanos, V initialValue, V targetValue, V initialVelocity);
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 bc8fad3..9d038dd 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
@@ -24,8 +24,9 @@
 import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.Stable
 import androidx.compose.runtime.State
-import androidx.compose.runtime.collection.mutableVectorOf
+import androidx.compose.runtime.derivedStateOf
 import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateListOf
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
@@ -37,6 +38,7 @@
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
 import kotlin.math.max
+import kotlin.jvm.JvmName
 
 /**
  * This sets up a [Transition], and updates it with the target provided by [targetState]. When
@@ -234,16 +236,20 @@
     // This gets calculated every time child is updated/added
     internal var updateChildrenNeeded: Boolean by mutableStateOf(true)
 
-    private val _animations = mutableVectorOf<TransitionAnimationState<*, *>>()
-    private val _transitions = mutableVectorOf<Transition<*>>()
+    private val _animations = mutableStateListOf<TransitionAnimationState<*, *>>()
+    private val _transitions = mutableStateListOf<Transition<*>>()
 
-    /** @suppress **/
-    @InternalAnimationApi
-    val transitions: List<Transition<*>> = _transitions.asMutableList()
+    /**
+     * List of child transitions in a [Transition].
+     */
+    val transitions: List<Transition<*>>
+        get() = _transitions
 
-    /** @suppress **/
-    @InternalAnimationApi
-    val animations: List<TransitionAnimationState<*, *>> = _animations.asMutableList()
+    /**
+     * List of [TransitionAnimationState]s that are in a [Transition].
+     */
+    val animations: List<TransitionAnimationState<*, *>>
+        get() = _animations
 
     // Seeking related
     /** @suppress **/
@@ -252,20 +258,27 @@
         internal set
     internal var lastSeekedTimeNanos: Long = 0L
 
-    @Suppress("EXPERIMENTAL_ANNOTATION_ON_WRONG_TARGET")
-    @get:InternalAnimationApi
-    val totalDurationNanos: Long
-        /** @suppress **/
-        get() {
-            var maxDurationNanos = 0L
-            _animations.forEach {
-                maxDurationNanos = max(maxDurationNanos, it.durationNanos)
-            }
-            _transitions.forEach {
-                maxDurationNanos = max(maxDurationNanos, it.totalDurationNanos)
-            }
-            return maxDurationNanos
+    /**
+     * Total duration of the [Transition], accounting for all the animations and child transitions
+     * defined on the [Transition].
+     *
+     * Note: The total duration is subject to change as more animations/child transitions get added
+     * to [Transition]. It's strongly recommended to query this *after* all the animations in the
+     * [Transition] are set up.
+     */
+    val totalDurationNanos: Long by derivedStateOf {
+        var maxDurationNanos = 0L
+        _animations.forEach {
+            maxDurationNanos = max(maxDurationNanos, it.durationNanos)
         }
+        _transitions.forEach {
+            maxDurationNanos = max(
+                maxDurationNanos,
+                it.totalDurationNanos
+            )
+        }
+        maxDurationNanos
+    }
 
     internal fun onFrame(frameTimeNanos: Long) {
         if (startTimeNanos == AnimationConstants.UnspecifiedTime) {
@@ -314,11 +327,28 @@
     }
 
     /**
-     * This allows tools to set the transition (between initial and target state) to any time.
+     * This allows tools to set the transition (between initial and target state) to a specific
+     * [playTimeNanos].
+     *
+     * Note: This function is intended for tooling use only.
+     *
+     * __Caveat:__  Once [initialState] or [targetState] changes, it needs to take a whole
+     * composition pass for all the animations and child transitions to recompose with the
+     * new [initialState] and [targetState]. Subsequently all the animations will be updated to the
+     * given play time.
+     *
+     * __Caveat:__ This function puts [Transition] in a manual playtime setting mode. From then on
+     * the [Transition] will not resume normal animation runs.
+     *
+     * // TODO: Replace @suppress with @RestrictTo
      * @suppress
      */
-    @InternalAnimationApi
-    fun seek(initialState: S, targetState: S, playTimeNanos: Long) {
+    @JvmName("seek")
+    fun setPlaytimeAfterInitialAndTargetStateEstablished(
+        initialState: S,
+        targetState: S,
+        playTimeNanos: Long
+    ) {
         // Reset running state
         startTimeNanos = AnimationConstants.UnspecifiedTime
         transitionState.isRunning = false
@@ -334,7 +364,11 @@
             @Suppress("UNCHECKED_CAST")
             (it as Transition<Any>).let {
                 if (it.isSeeking) {
-                    it.seek(it.currentState, it.targetState, playTimeNanos)
+                    it.setPlaytimeAfterInitialAndTargetStateEstablished(
+                        it.currentState,
+                        it.targetState,
+                        playTimeNanos
+                    )
                 }
             }
         }
@@ -424,9 +458,11 @@
         }
     }
 
-    // TODO: Consider making this public
-    /** @suppress **/
-    @InternalAnimationApi
+    /**
+     * Each animation created using [animateFloat], [animateDp], etc is represented as a
+     * [TransitionAnimationState] in [Transition].
+     */
+    @Stable
     inner class TransitionAnimationState<T, V : AnimationVector> internal constructor(
         initialValue: T,
         initialVelocityVector: V,
@@ -437,13 +473,17 @@
         // Changed during composition, may rollback
         private var targetValue: T by mutableStateOf(initialValue)
 
-        @Suppress("EXPERIMENTAL_ANNOTATION_ON_WRONG_TARGET")
-        @get:InternalAnimationApi
+        /**
+         * [AnimationSpec] that is used for current animation run. This can change when
+         * [targetState] changes.
+         */
         var animationSpec: FiniteAnimationSpec<T> by mutableStateOf(spring())
             private set
 
-        @Suppress("EXPERIMENTAL_ANNOTATION_ON_WRONG_TARGET")
-        @get:InternalAnimationApi
+        /**
+         * All the animation configurations including initial value/velocity & target value for
+         * animating from [currentState] to [targetState] are captured in [animation].
+         */
         var animation: TargetBasedAnimation<T, V> by mutableStateOf(
             TargetBasedAnimation(
                 animationSpec, typeConverter, initialValue, targetValue,
@@ -451,6 +491,7 @@
             )
         )
             private set
+
         internal var isFinished: Boolean by mutableStateOf(true)
         private var offsetTimeNanos by mutableStateOf(0L)
         private var needsReset by mutableStateOf(false)
@@ -619,6 +660,7 @@
                     animation.updateTargetValue(targetValue, segment.transitionSpec())
                 }
             }
+
             override val value: T
                 get() {
                     updateAnimationStates(segment)
@@ -753,7 +795,11 @@
     }
 
     if (isSeeking) {
-        transition.seek(initialState, targetState, this.lastSeekedTimeNanos)
+        transition.setPlaytimeAfterInitialAndTargetStateEstablished(
+            initialState,
+            targetState,
+            this.lastSeekedTimeNanos
+        )
     } else {
         transition.updateTarget(targetState)
         transition.isSeeking = false
@@ -873,7 +919,7 @@
 @Composable
 inline fun <S> Transition<S>.animateFloat(
     noinline transitionSpec:
-        @Composable Transition.Segment<S>.() -> FiniteAnimationSpec<Float> = { spring() },
+    @Composable Transition.Segment<S>.() -> FiniteAnimationSpec<Float> = { spring() },
     label: String = "FloatAnimation",
     targetValueByState: @Composable (state: S) -> Float
 ): State<Float> =
@@ -996,8 +1042,8 @@
 @Composable
 inline fun <S> Transition<S>.animateIntOffset(
     noinline transitionSpec:
-        @Composable Transition.Segment<S>.() -> FiniteAnimationSpec<IntOffset> =
-            { spring(visibilityThreshold = IntOffset(1, 1)) },
+    @Composable Transition.Segment<S>.() -> FiniteAnimationSpec<IntOffset> =
+        { spring(visibilityThreshold = IntOffset(1, 1)) },
     label: String = "IntOffsetAnimation",
     targetValueByState: @Composable (state: S) -> IntOffset
 ): State<IntOffset> =
diff --git a/compose/animation/animation-graphics/api/1.1.0-beta02.txt b/compose/animation/animation-graphics/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..5522e93
--- /dev/null
+++ b/compose/animation/animation-graphics/api/1.1.0-beta02.txt
@@ -0,0 +1,31 @@
+// Signature format: 4.0
+package androidx.compose.animation.graphics.res {
+
+  public final class AnimatedVectorResources_androidKt {
+  }
+
+  public final class AnimatorResources_androidKt {
+  }
+
+}
+
+package androidx.compose.animation.graphics.vector {
+
+  public final class AnimatorKt {
+  }
+
+}
+
+package androidx.compose.animation.graphics.vector.compat {
+
+  public final class XmlAnimatedVectorParser_androidKt {
+  }
+
+  public final class XmlAnimatorParser_androidKt {
+  }
+
+  public final class XmlPullParserUtils_androidKt {
+  }
+
+}
+
diff --git a/compose/animation/animation-graphics/api/public_plus_experimental_1.1.0-beta02.txt b/compose/animation/animation-graphics/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..b3d6b90
--- /dev/null
+++ b/compose/animation/animation-graphics/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,47 @@
+// Signature format: 4.0
+package androidx.compose.animation.graphics {
+
+  @kotlin.RequiresOptIn(message="This is an experimental animation graphics API.") @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ExperimentalAnimationGraphicsApi {
+  }
+
+}
+
+package androidx.compose.animation.graphics.res {
+
+  public final class AnimatedVectorResources_androidKt {
+    method @androidx.compose.animation.graphics.ExperimentalAnimationGraphicsApi @androidx.compose.runtime.Composable public static androidx.compose.animation.graphics.vector.AnimatedImageVector animatedVectorResource(@DrawableRes int id);
+  }
+
+  public final class AnimatorResources_androidKt {
+  }
+
+}
+
+package androidx.compose.animation.graphics.vector {
+
+  @androidx.compose.animation.graphics.ExperimentalAnimationGraphicsApi @androidx.compose.runtime.Immutable public final class AnimatedImageVector {
+    method public androidx.compose.ui.graphics.vector.ImageVector getImageVector();
+    method public int getTotalDuration();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.painter.Painter painterFor(boolean atEnd);
+    property public final androidx.compose.ui.graphics.vector.ImageVector imageVector;
+    property public final int totalDuration;
+  }
+
+  public final class AnimatorKt {
+  }
+
+}
+
+package androidx.compose.animation.graphics.vector.compat {
+
+  public final class XmlAnimatedVectorParser_androidKt {
+  }
+
+  public final class XmlAnimatorParser_androidKt {
+  }
+
+  public final class XmlPullParserUtils_androidKt {
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/animation/animation-graphics/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to compose/animation/animation-graphics/api/res-1.1.0-beta02.txt
diff --git a/compose/animation/animation-graphics/api/restricted_1.1.0-beta02.txt b/compose/animation/animation-graphics/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..5522e93
--- /dev/null
+++ b/compose/animation/animation-graphics/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,31 @@
+// Signature format: 4.0
+package androidx.compose.animation.graphics.res {
+
+  public final class AnimatedVectorResources_androidKt {
+  }
+
+  public final class AnimatorResources_androidKt {
+  }
+
+}
+
+package androidx.compose.animation.graphics.vector {
+
+  public final class AnimatorKt {
+  }
+
+}
+
+package androidx.compose.animation.graphics.vector.compat {
+
+  public final class XmlAnimatedVectorParser_androidKt {
+  }
+
+  public final class XmlAnimatorParser_androidKt {
+  }
+
+  public final class XmlPullParserUtils_androidKt {
+  }
+
+}
+
diff --git a/compose/animation/animation-graphics/src/commonMain/kotlin/androidx/compose/animation/graphics/vector/Animator.kt b/compose/animation/animation-graphics/src/commonMain/kotlin/androidx/compose/animation/graphics/vector/Animator.kt
index 846fe231c..12766ce 100644
--- a/compose/animation/animation-graphics/src/commonMain/kotlin/androidx/compose/animation/graphics/vector/Animator.kt
+++ b/compose/animation/animation-graphics/src/commonMain/kotlin/androidx/compose/animation/graphics/vector/Animator.kt
@@ -26,7 +26,6 @@
 import androidx.compose.animation.core.keyframes
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.State
-import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.SolidColor
 import androidx.compose.ui.graphics.vector.PathNode
@@ -40,7 +39,6 @@
 internal sealed class Animator {
     abstract val totalDuration: Int
 
-    @OptIn(ExperimentalComposeUiApi::class)
     @Composable
     fun createVectorConfig(
         transition: Transition<Boolean>,
@@ -451,7 +449,6 @@
     Sequentially
 }
 
-@OptIn(ExperimentalComposeUiApi::class)
 internal class StateVectorConfig : VectorConfig {
 
     var rotationState: State<Float>? = null
diff --git a/compose/animation/animation-tooling-internal/api/1.1.0-beta02.txt b/compose/animation/animation-tooling-internal/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..bf1f86e
--- /dev/null
+++ b/compose/animation/animation-tooling-internal/api/1.1.0-beta02.txt
@@ -0,0 +1,47 @@
+// Signature format: 4.0
+package androidx.compose.animation.tooling {
+
+  public final class ComposeAnimatedProperty {
+    ctor public ComposeAnimatedProperty(String label, Object value);
+    method public String component1();
+    method public Object component2();
+    method public androidx.compose.animation.tooling.ComposeAnimatedProperty copy(String label, Object value);
+    method public String getLabel();
+    method public Object getValue();
+    property public final String label;
+    property public final Object value;
+  }
+
+  public interface ComposeAnimation {
+    method public Object getAnimationObject();
+    method public default String? getLabel();
+    method public default java.util.Set<java.lang.Object> getStates();
+    method public androidx.compose.animation.tooling.ComposeAnimationType getType();
+    property public abstract Object animationObject;
+    property public default String? label;
+    property public default java.util.Set<java.lang.Object> states;
+    property public abstract androidx.compose.animation.tooling.ComposeAnimationType type;
+  }
+
+  public enum ComposeAnimationType {
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_VALUE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_VISIBILITY;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType TRANSITION_ANIMATION;
+  }
+
+  public final class TransitionInfo {
+    ctor public TransitionInfo(String label, String specType, long startTimeMillis, long endTimeMillis, java.util.Map<java.lang.Long,?> values);
+    method public long getEndTimeMillis();
+    method public String getLabel();
+    method public String getSpecType();
+    method public long getStartTimeMillis();
+    method public java.util.Map<java.lang.Long,java.lang.Object> getValues();
+    property public final long endTimeMillis;
+    property public final String label;
+    property public final String specType;
+    property public final long startTimeMillis;
+    property public final java.util.Map<java.lang.Long,java.lang.Object> values;
+  }
+
+}
+
diff --git a/compose/animation/animation-tooling-internal/api/public_plus_experimental_1.1.0-beta02.txt b/compose/animation/animation-tooling-internal/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..bf1f86e
--- /dev/null
+++ b/compose/animation/animation-tooling-internal/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,47 @@
+// Signature format: 4.0
+package androidx.compose.animation.tooling {
+
+  public final class ComposeAnimatedProperty {
+    ctor public ComposeAnimatedProperty(String label, Object value);
+    method public String component1();
+    method public Object component2();
+    method public androidx.compose.animation.tooling.ComposeAnimatedProperty copy(String label, Object value);
+    method public String getLabel();
+    method public Object getValue();
+    property public final String label;
+    property public final Object value;
+  }
+
+  public interface ComposeAnimation {
+    method public Object getAnimationObject();
+    method public default String? getLabel();
+    method public default java.util.Set<java.lang.Object> getStates();
+    method public androidx.compose.animation.tooling.ComposeAnimationType getType();
+    property public abstract Object animationObject;
+    property public default String? label;
+    property public default java.util.Set<java.lang.Object> states;
+    property public abstract androidx.compose.animation.tooling.ComposeAnimationType type;
+  }
+
+  public enum ComposeAnimationType {
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_VALUE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_VISIBILITY;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType TRANSITION_ANIMATION;
+  }
+
+  public final class TransitionInfo {
+    ctor public TransitionInfo(String label, String specType, long startTimeMillis, long endTimeMillis, java.util.Map<java.lang.Long,?> values);
+    method public long getEndTimeMillis();
+    method public String getLabel();
+    method public String getSpecType();
+    method public long getStartTimeMillis();
+    method public java.util.Map<java.lang.Long,java.lang.Object> getValues();
+    property public final long endTimeMillis;
+    property public final String label;
+    property public final String specType;
+    property public final long startTimeMillis;
+    property public final java.util.Map<java.lang.Long,java.lang.Object> values;
+  }
+
+}
+
diff --git a/compose/animation/animation-tooling-internal/api/restricted_1.1.0-beta02.txt b/compose/animation/animation-tooling-internal/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..bf1f86e
--- /dev/null
+++ b/compose/animation/animation-tooling-internal/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,47 @@
+// Signature format: 4.0
+package androidx.compose.animation.tooling {
+
+  public final class ComposeAnimatedProperty {
+    ctor public ComposeAnimatedProperty(String label, Object value);
+    method public String component1();
+    method public Object component2();
+    method public androidx.compose.animation.tooling.ComposeAnimatedProperty copy(String label, Object value);
+    method public String getLabel();
+    method public Object getValue();
+    property public final String label;
+    property public final Object value;
+  }
+
+  public interface ComposeAnimation {
+    method public Object getAnimationObject();
+    method public default String? getLabel();
+    method public default java.util.Set<java.lang.Object> getStates();
+    method public androidx.compose.animation.tooling.ComposeAnimationType getType();
+    property public abstract Object animationObject;
+    property public default String? label;
+    property public default java.util.Set<java.lang.Object> states;
+    property public abstract androidx.compose.animation.tooling.ComposeAnimationType type;
+  }
+
+  public enum ComposeAnimationType {
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_VALUE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_VISIBILITY;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType TRANSITION_ANIMATION;
+  }
+
+  public final class TransitionInfo {
+    ctor public TransitionInfo(String label, String specType, long startTimeMillis, long endTimeMillis, java.util.Map<java.lang.Long,?> values);
+    method public long getEndTimeMillis();
+    method public String getLabel();
+    method public String getSpecType();
+    method public long getStartTimeMillis();
+    method public java.util.Map<java.lang.Long,java.lang.Object> getValues();
+    property public final long endTimeMillis;
+    property public final String label;
+    property public final String specType;
+    property public final long startTimeMillis;
+    property public final java.util.Map<java.lang.Long,java.lang.Object> values;
+  }
+
+}
+
diff --git a/compose/animation/animation/api/1.1.0-beta02.txt b/compose/animation/animation/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..4f8ad04
--- /dev/null
+++ b/compose/animation/animation/api/1.1.0-beta02.txt
@@ -0,0 +1,105 @@
+// Signature format: 4.0
+package androidx.compose.animation {
+
+  public final class AndroidActualDefaultDecayAnimationSpec_androidKt {
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float> defaultDecayAnimationSpec();
+  }
+
+  public final class AnimatedContentKt {
+  }
+
+  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 {
+    method public static androidx.compose.ui.Modifier animateContentSize(androidx.compose.ui.Modifier, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional kotlin.jvm.functions.Function2<? super androidx.compose.ui.unit.IntSize,? super androidx.compose.ui.unit.IntSize,kotlin.Unit>? finishedListener);
+  }
+
+  public final class ColorVectorConverterKt {
+    method public static kotlin.jvm.functions.Function1<androidx.compose.ui.graphics.colorspace.ColorSpace,androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.graphics.Color,androidx.compose.animation.core.AnimationVector4D>> getVectorConverter(androidx.compose.ui.graphics.Color.Companion);
+  }
+
+  public final class CrossfadeKt {
+    method @androidx.compose.runtime.Composable public static <T> void Crossfade(T? targetState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> content);
+  }
+
+  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 {
+  }
+
+  public final class SingleValueAnimationKt {
+    method public static androidx.compose.animation.core.Animatable<androidx.compose.ui.graphics.Color,androidx.compose.animation.core.AnimationVector4D> Animatable(long initialValue);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColorAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.graphics.Color> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Color,kotlin.Unit>? finishedListener);
+  }
+
+  public final class SplineBasedDecayKt {
+    method public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> splineBasedDecay(androidx.compose.ui.unit.Density density);
+  }
+
+  public final class SplineBasedFloatDecayAnimationSpec implements androidx.compose.animation.core.FloatDecayAnimationSpec {
+    ctor public SplineBasedFloatDecayAnimationSpec(androidx.compose.ui.unit.Density density);
+    method public float getAbsVelocityThreshold();
+    method public long getDurationNanos(float initialValue, float initialVelocity);
+    method public float getTargetValue(float initialValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    property public float absVelocityThreshold;
+  }
+
+  public final class SplineBasedFloatDecayAnimationSpec_androidKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> rememberSplineBasedDecay();
+    method @Deprecated public static <T> androidx.compose.animation.core.DecayAnimationSpec<T>! splineBasedDecayDeprecated(androidx.compose.ui.unit.Density density);
+  }
+
+  public final class TransitionKt {
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColor(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.graphics.Color>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.graphics.Color> targetValueByState);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColor(androidx.compose.animation.core.InfiniteTransition, long initialValue, long targetValue, androidx.compose.animation.core.InfiniteRepeatableSpec<androidx.compose.ui.graphics.Color> animationSpec);
+  }
+
+}
+
diff --git a/compose/animation/animation/api/current.txt b/compose/animation/animation/api/current.txt
index efcf96a..4f8ad04 100644
--- a/compose/animation/animation/api/current.txt
+++ b/compose/animation/animation/api/current.txt
@@ -93,6 +93,7 @@
 
   public final class SplineBasedFloatDecayAnimationSpec_androidKt {
     method @androidx.compose.runtime.Composable public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> rememberSplineBasedDecay();
+    method @Deprecated public static <T> androidx.compose.animation.core.DecayAnimationSpec<T>! splineBasedDecayDeprecated(androidx.compose.ui.unit.Density density);
   }
 
   public final class TransitionKt {
diff --git a/compose/animation/animation/api/public_plus_experimental_1.1.0-beta02.txt b/compose/animation/animation/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..2e58d7d
--- /dev/null
+++ b/compose/animation/animation/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,173 @@
+// Signature format: 4.0
+package androidx.compose.animation {
+
+  public final class AndroidActualDefaultDecayAnimationSpec_androidKt {
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float> defaultDecayAnimationSpec();
+  }
+
+  public final class AnimatedContentKt {
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Composable public static <S> void AnimatedContent(S? targetState, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedContentScope<S>,androidx.compose.animation.ContentTransform> transitionSpec, optional androidx.compose.ui.Alignment contentAlignment, kotlin.jvm.functions.Function2<? super androidx.compose.animation.AnimatedVisibilityScope,? super S,kotlin.Unit> content);
+    method @androidx.compose.animation.ExperimentalAnimationApi @androidx.compose.runtime.Composable public static <S> void AnimatedContent(androidx.compose.animation.core.Transition<S>, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.AnimatedContentScope<S>,androidx.compose.animation.ContentTransform> transitionSpec, optional androidx.compose.ui.Alignment contentAlignment, optional kotlin.jvm.functions.Function1<? super S,?> contentKey, kotlin.jvm.functions.Function2<? super androidx.compose.animation.AnimatedVisibilityScope,? super S,kotlin.Unit> content);
+    method @androidx.compose.animation.ExperimentalAnimationApi public static androidx.compose.animation.SizeTransform SizeTransform(optional boolean clip, optional kotlin.jvm.functions.Function2<? super androidx.compose.ui.unit.IntSize,? super androidx.compose.ui.unit.IntSize,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize>> sizeAnimationSpec);
+    method @androidx.compose.animation.ExperimentalAnimationApi public static infix androidx.compose.animation.ContentTransform with(androidx.compose.animation.EnterTransition, androidx.compose.animation.ExitTransition exit);
+  }
+
+  @androidx.compose.animation.ExperimentalAnimationApi public final class AnimatedContentScope<S> implements androidx.compose.animation.core.Transition.Segment<S> {
+    method public S! getInitialState();
+    method public S! getTargetState();
+    method public androidx.compose.animation.EnterTransition slideIntoContainer(int towards, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> initialOffset);
+    method public androidx.compose.animation.ExitTransition slideOutOfContainer(int towards, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntOffset> animationSpec, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> targetOffset);
+    method @androidx.compose.animation.ExperimentalAnimationApi public infix androidx.compose.animation.ContentTransform using(androidx.compose.animation.ContentTransform, androidx.compose.animation.SizeTransform? sizeTransform);
+    property public S! initialState;
+    property public S! targetState;
+  }
+
+  @androidx.compose.runtime.Immutable public static final inline class AnimatedContentScope.SlideDirection {
+    ctor public AnimatedContentScope.SlideDirection();
+  }
+
+  public static final class AnimatedContentScope.SlideDirection.Companion {
+    method public int getDown();
+    method public int getEnd();
+    method public int getLeft();
+    method public int getRight();
+    method public int getStart();
+    method public int getUp();
+    property public final int Down;
+    property public final int End;
+    property public final int Left;
+    property public final int Right;
+    property public final int Start;
+    property public final int Up;
+  }
+
+  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);
+    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);
+  }
+
+  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 {
+    method public static androidx.compose.ui.Modifier animateContentSize(androidx.compose.ui.Modifier, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional kotlin.jvm.functions.Function2<? super androidx.compose.ui.unit.IntSize,? super androidx.compose.ui.unit.IntSize,kotlin.Unit>? finishedListener);
+  }
+
+  public final class ColorVectorConverterKt {
+    method public static kotlin.jvm.functions.Function1<androidx.compose.ui.graphics.colorspace.ColorSpace,androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.graphics.Color,androidx.compose.animation.core.AnimationVector4D>> getVectorConverter(androidx.compose.ui.graphics.Color.Companion);
+  }
+
+  @androidx.compose.animation.ExperimentalAnimationApi public final class ContentTransform {
+    ctor public ContentTransform(androidx.compose.animation.EnterTransition targetContentEnter, androidx.compose.animation.ExitTransition initialContentExit, optional float targetContentZIndex, optional androidx.compose.animation.SizeTransform? sizeTransform);
+    method public androidx.compose.animation.ExitTransition getInitialContentExit();
+    method public androidx.compose.animation.SizeTransform? getSizeTransform();
+    method public androidx.compose.animation.EnterTransition getTargetContentEnter();
+    method public float getTargetContentZIndex();
+    method public void setTargetContentZIndex(float targetContentZIndex);
+    property public final androidx.compose.animation.ExitTransition initialContentExit;
+    property public final androidx.compose.animation.SizeTransform? sizeTransform;
+    property public final androidx.compose.animation.EnterTransition targetContentEnter;
+    property public final float targetContentZIndex;
+  }
+
+  public final class CrossfadeKt {
+    method @androidx.compose.runtime.Composable public static <T> void Crossfade(T? targetState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> content);
+  }
+
+  @androidx.compose.animation.ExperimentalAnimationApi public enum EnterExitState {
+    enum_constant public static final androidx.compose.animation.EnterExitState PostExit;
+    enum_constant public static final androidx.compose.animation.EnterExitState PreEnter;
+    enum_constant public static final androidx.compose.animation.EnterExitState Visible;
+  }
+
+  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.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.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;
+  }
+
+  @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 {
+  }
+
+  public final class SingleValueAnimationKt {
+    method public static androidx.compose.animation.core.Animatable<androidx.compose.ui.graphics.Color,androidx.compose.animation.core.AnimationVector4D> Animatable(long initialValue);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColorAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.graphics.Color> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Color,kotlin.Unit>? finishedListener);
+  }
+
+  @androidx.compose.animation.ExperimentalAnimationApi public interface SizeTransform {
+    method public androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> createAnimationSpec(long initialSize, long targetSize);
+    method public boolean getClip();
+    property public abstract boolean clip;
+  }
+
+  public final class SplineBasedDecayKt {
+    method public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> splineBasedDecay(androidx.compose.ui.unit.Density density);
+  }
+
+  public final class SplineBasedFloatDecayAnimationSpec implements androidx.compose.animation.core.FloatDecayAnimationSpec {
+    ctor public SplineBasedFloatDecayAnimationSpec(androidx.compose.ui.unit.Density density);
+    method public float getAbsVelocityThreshold();
+    method public long getDurationNanos(float initialValue, float initialVelocity);
+    method public float getTargetValue(float initialValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    property public float absVelocityThreshold;
+  }
+
+  public final class SplineBasedFloatDecayAnimationSpec_androidKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> rememberSplineBasedDecay();
+    method @Deprecated public static <T> androidx.compose.animation.core.DecayAnimationSpec<T>! splineBasedDecayDeprecated(androidx.compose.ui.unit.Density density);
+  }
+
+  public final class TransitionKt {
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColor(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.graphics.Color>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.graphics.Color> targetValueByState);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColor(androidx.compose.animation.core.InfiniteTransition, long initialValue, long targetValue, androidx.compose.animation.core.InfiniteRepeatableSpec<androidx.compose.ui.graphics.Color> animationSpec);
+  }
+
+}
+
diff --git a/compose/animation/animation/api/public_plus_experimental_current.txt b/compose/animation/animation/api/public_plus_experimental_current.txt
index e9fef24..2e58d7d 100644
--- a/compose/animation/animation/api/public_plus_experimental_current.txt
+++ b/compose/animation/animation/api/public_plus_experimental_current.txt
@@ -161,6 +161,7 @@
 
   public final class SplineBasedFloatDecayAnimationSpec_androidKt {
     method @androidx.compose.runtime.Composable public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> rememberSplineBasedDecay();
+    method @Deprecated public static <T> androidx.compose.animation.core.DecayAnimationSpec<T>! splineBasedDecayDeprecated(androidx.compose.ui.unit.Density density);
   }
 
   public final class TransitionKt {
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/animation/animation/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to compose/animation/animation/api/res-1.1.0-beta02.txt
diff --git a/compose/animation/animation/api/restricted_1.1.0-beta02.txt b/compose/animation/animation/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..4f8ad04
--- /dev/null
+++ b/compose/animation/animation/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,105 @@
+// Signature format: 4.0
+package androidx.compose.animation {
+
+  public final class AndroidActualDefaultDecayAnimationSpec_androidKt {
+    method @Deprecated @androidx.compose.runtime.Composable public static androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float> defaultDecayAnimationSpec();
+  }
+
+  public final class AnimatedContentKt {
+  }
+
+  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 {
+    method public static androidx.compose.ui.Modifier animateContentSize(androidx.compose.ui.Modifier, optional androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.unit.IntSize> animationSpec, optional kotlin.jvm.functions.Function2<? super androidx.compose.ui.unit.IntSize,? super androidx.compose.ui.unit.IntSize,kotlin.Unit>? finishedListener);
+  }
+
+  public final class ColorVectorConverterKt {
+    method public static kotlin.jvm.functions.Function1<androidx.compose.ui.graphics.colorspace.ColorSpace,androidx.compose.animation.core.TwoWayConverter<androidx.compose.ui.graphics.Color,androidx.compose.animation.core.AnimationVector4D>> getVectorConverter(androidx.compose.ui.graphics.Color.Companion);
+  }
+
+  public final class CrossfadeKt {
+    method @androidx.compose.runtime.Composable public static <T> void Crossfade(T? targetState, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.animation.core.FiniteAnimationSpec<java.lang.Float> animationSpec, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> content);
+  }
+
+  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 {
+  }
+
+  public final class SingleValueAnimationKt {
+    method public static androidx.compose.animation.core.Animatable<androidx.compose.ui.graphics.Color,androidx.compose.animation.core.AnimationVector4D> Animatable(long initialValue);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColorAsState(long targetValue, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.graphics.Color> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Color,kotlin.Unit>? finishedListener);
+  }
+
+  public final class SplineBasedDecayKt {
+    method public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> splineBasedDecay(androidx.compose.ui.unit.Density density);
+  }
+
+  public final class SplineBasedFloatDecayAnimationSpec implements androidx.compose.animation.core.FloatDecayAnimationSpec {
+    ctor public SplineBasedFloatDecayAnimationSpec(androidx.compose.ui.unit.Density density);
+    method public float getAbsVelocityThreshold();
+    method public long getDurationNanos(float initialValue, float initialVelocity);
+    method public float getTargetValue(float initialValue, float initialVelocity);
+    method public float getValueFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    method public float getVelocityFromNanos(long playTimeNanos, float initialValue, float initialVelocity);
+    property public float absVelocityThreshold;
+  }
+
+  public final class SplineBasedFloatDecayAnimationSpec_androidKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> rememberSplineBasedDecay();
+    method @Deprecated public static <T> androidx.compose.animation.core.DecayAnimationSpec<T>! splineBasedDecayDeprecated(androidx.compose.ui.unit.Density density);
+  }
+
+  public final class TransitionKt {
+    method @androidx.compose.runtime.Composable public static inline <S> androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColor(androidx.compose.animation.core.Transition<S>, optional kotlin.jvm.functions.Function1<? super androidx.compose.animation.core.Transition.Segment<S>,? extends androidx.compose.animation.core.FiniteAnimationSpec<androidx.compose.ui.graphics.Color>> transitionSpec, optional String label, kotlin.jvm.functions.Function1<? super S,androidx.compose.ui.graphics.Color> targetValueByState);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> animateColor(androidx.compose.animation.core.InfiniteTransition, long initialValue, long targetValue, androidx.compose.animation.core.InfiniteRepeatableSpec<androidx.compose.ui.graphics.Color> animationSpec);
+  }
+
+}
+
diff --git a/compose/animation/animation/api/restricted_current.txt b/compose/animation/animation/api/restricted_current.txt
index efcf96a..4f8ad04 100644
--- a/compose/animation/animation/api/restricted_current.txt
+++ b/compose/animation/animation/api/restricted_current.txt
@@ -93,6 +93,7 @@
 
   public final class SplineBasedFloatDecayAnimationSpec_androidKt {
     method @androidx.compose.runtime.Composable public static <T> androidx.compose.animation.core.DecayAnimationSpec<T> rememberSplineBasedDecay();
+    method @Deprecated public static <T> androidx.compose.animation.core.DecayAnimationSpec<T>! splineBasedDecayDeprecated(androidx.compose.ui.unit.Density density);
   }
 
   public final class TransitionKt {
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/AnimationDemos.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/AnimationDemos.kt
index 5a5c306..a9111fc 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/AnimationDemos.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/AnimationDemos.kt
@@ -57,8 +57,10 @@
             listOf(
                 ComposableDemo("Animated scrolling") { FancyScrollingDemo() },
                 ComposableDemo("animateColorAsState") { SingleValueAnimationDemo() },
+                ComposableDemo("Double Tap To Like") { SuspendDoubleTapToLikeDemo() },
                 ComposableDemo("Follow the tap") { SuspendAnimationDemo() },
                 ComposableDemo("Infinitely Animating") { InfiniteAnimationDemo() },
+                ComposableDemo("Loading Animation Demo") { LoadingAnimationDemo() },
                 ComposableDemo("Spring back scrolling") { SpringBackScrollingDemo() },
                 ComposableDemo("Swipe to dismiss") { SwipeToDismissDemo() },
             )
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/LoadingAnimationDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/LoadingAnimationDemo.kt
new file mode 100644
index 0000000..5390755
--- /dev/null
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/LoadingAnimationDemo.kt
@@ -0,0 +1,167 @@
+/*
+ * 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.animation.demos
+
+import android.graphics.Typeface
+import androidx.compose.animation.core.Animatable
+import androidx.compose.animation.core.tween
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.background
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material.Surface
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.State
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.drawWithCache
+import androidx.compose.ui.graphics.Brush
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.text.font.FontFamily
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import kotlinx.coroutines.delay
+
+@Composable
+fun LoadingAnimationDemo() {
+    val isLoading = remember { mutableStateOf(true) }
+    Box(Modifier.fillMaxSize().background(BackgroundColor).clickable {
+        isLoading.value = false
+    }) {
+        ActualContent()
+        LoadingOverlay(isLoading = isLoading)
+    }
+    // Add a 10-second time out on the loading animation
+    LaunchedEffect(Unit) {
+        delay(10_000)
+        isLoading.value = false
+    }
+}
+
+@Composable
+fun ActualContent() {
+    Column(Modifier.padding(top = 20.dp, start = 20.dp, end = 20.dp)) {
+        Surface(
+            shape = RoundedCornerShape(10.dp),
+        ) {
+            val painter = painterResource(R.drawable.yt_profile)
+            Image(
+                painter,
+                "Profile Picture",
+            )
+        }
+        Text(
+            text = "YT (油条)",
+            fontFamily = FontFamily(typeface = Typeface.SANS_SERIF),
+            fontSize = 40.sp,
+            color = Color(0xff173d6e),
+            modifier = Modifier.align(Alignment.CenterHorizontally)
+                .padding(top = 10.dp, bottom = 5.dp)
+        )
+        Row {
+            Text(
+                "Age:",
+                fontWeight = FontWeight.Bold,
+                modifier = Modifier.width(80.dp)
+            )
+            Text("10")
+        }
+        Row {
+            Text(
+                "Breed:",
+                fontWeight = FontWeight.Bold,
+                modifier = Modifier.width(80.dp)
+            )
+            Text("Tabby")
+        }
+        Text(
+            "About Me:",
+            fontWeight = FontWeight.Bold,
+        )
+        Text(
+            "I have been taking care of the humans in my household since 10 years ago." +
+                " They like to stare at various sized glowing boxes for hours on end. I need" +
+                " to remind them that life is more than that, by sitting between them and the" +
+                " glowing boxes. They often take the hint and break out a toy, sometimes a laser" +
+                " pointer, sometimes it's a bird attached to a fishing pole like contraption." +
+                " Whatever it is, I pretend that I like chasing them until the humans are tired." +
+                " It is my responsibility to make sure they have enough exercise. "
+        )
+    }
+}
+
+val GradientColor: Color = Color(0xff173d6e)
+val BackgroundColor: Color = Color(0xffdbe5ef)
+
+@Composable
+fun LoadingOverlay(
+    isLoading: State<Boolean>
+) {
+    val fraction = remember { Animatable(0f) }
+    var reveal by remember { mutableStateOf(false) }
+    LaunchedEffect(Unit) {
+        while (isLoading.value) {
+            fraction.animateTo(1f, tween(2000))
+            fraction.snapTo(0f)
+        }
+        reveal = true
+        fraction.animateTo(1f, tween(1000))
+    }
+
+    if (!reveal) { // Draw a cover
+        Box(Modifier.fillMaxSize().background(BackgroundColor)) {
+            Text(
+                "Tap anywhere to finish loading. \n Time out in 10 seconds.",
+                Modifier.align(Alignment.Center)
+            )
+        }
+    }
+
+    // Draw gradient..
+    Box(
+        Modifier
+            .fillMaxSize()
+            .drawWithCache {
+                val gradient = Brush.verticalGradient(
+                    listOf(
+                        Color.Transparent,
+                        GradientColor.copy(alpha = 0.2f),
+                        BackgroundColor
+                    ),
+                    startY = size.height * (fraction.value - 0.1f),
+                    endY = size.height * (fraction.value + 0.1f)
+                )
+                onDrawWithContent {
+                    drawRect(gradient)
+                }
+            }
+    )
+}
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SeekingDebugging.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SeekingDebugging.kt
index 22934c9..b218195 100644
--- a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SeekingDebugging.kt
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SeekingDebugging.kt
@@ -99,9 +99,13 @@
         }.collect {
             val totalDuration = transition.totalDurationNanos
             if (entering) {
-                transition.seek(false, true, (abs(it) * totalDuration).toLong())
+                transition.setPlaytimeAfterInitialAndTargetStateEstablished(
+                    false, true, (abs(it) * totalDuration).toLong()
+                )
             } else {
-                transition.seek(true, false, (abs(it) * totalDuration).toLong())
+                transition.setPlaytimeAfterInitialAndTargetStateEstablished(
+                    true, false, (abs(it) * totalDuration).toLong()
+                )
             }
         }
     }
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SuspendDoubleTapToLikeDemo.kt b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SuspendDoubleTapToLikeDemo.kt
new file mode 100644
index 0000000..81ebd7a
--- /dev/null
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SuspendDoubleTapToLikeDemo.kt
@@ -0,0 +1,105 @@
+/*
+ * 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.animation.demos
+
+import androidx.compose.animation.core.animate
+import androidx.compose.foundation.MutatorMutex
+import androidx.compose.foundation.background
+import androidx.compose.foundation.gestures.detectTapGestures
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.material.Icon
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Favorite
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.graphicsLayer
+import androidx.compose.ui.input.pointer.pointerInput
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.launch
+
+@Composable
+fun SuspendDoubleTapToLikeDemo() {
+    var alpha by remember { mutableStateOf(0f) }
+    var scale by remember { mutableStateOf(0f) }
+
+    val mutatorMutex = MutatorMutex()
+    val scope = rememberCoroutineScope()
+    Box(
+        Modifier.fillMaxSize().background(Color.White).pointerInput(Unit) {
+            detectTapGestures(
+                onDoubleTap = {
+                    scope.launch {
+                        // MutatorMutex cancels the previous job (i.e. animations) before starting
+                        // a new job. This ensures the mutable states only being mutated by one
+                        // animation at a time.
+                        mutatorMutex.mutate {
+                            coroutineScope {
+                                // `launch` creates a new coroutine without blocking. This allows
+                                // the two animations in this CoroutineScope to run together.
+                                launch {
+                                    animate(0f, 1f) { value, _ ->
+                                        alpha = value
+                                    }
+                                }
+                                launch {
+                                    animate(0f, 2f) { value, _ ->
+                                        scale = value
+                                    }
+                                }
+                            }
+                            // CoroutineScope doesn't return until all animations in the scope
+                            // finish. So by the time we get here, the enter animations from the
+                            // previous CoroutineScope have all finished.
+                            coroutineScope {
+                                launch {
+                                    animate(alpha, 0f) { value, _ ->
+                                        alpha = value
+                                    }
+                                }
+                                launch {
+                                    animate(scale, 4f) { value, _ ->
+                                        scale = value
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            )
+        }
+    ) {
+        Icon(
+            Icons.Filled.Favorite,
+            "Like",
+            Modifier.align(Alignment.Center)
+                .graphicsLayer(
+                    alpha = alpha,
+                    scaleX = scale,
+                    scaleY = scale
+                ),
+            tint = Color.Red
+        )
+    }
+}
diff --git a/compose/animation/animation/integration-tests/animation-demos/src/main/res/drawable/yt_profile.jpg b/compose/animation/animation/integration-tests/animation-demos/src/main/res/drawable/yt_profile.jpg
new file mode 100644
index 0000000..ffe59ad
--- /dev/null
+++ b/compose/animation/animation/integration-tests/animation-demos/src/main/res/drawable/yt_profile.jpg
Binary files differ
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 c4f2bbb..94a0da5 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
@@ -611,7 +611,9 @@
         var playTimeMs = 0
         while (true) {
             // Seeking the enter transition, and check alpha & slide
-            transition.seek(false, true, playTimeMs * 1_000_000L)
+            transition.setPlaytimeAfterInitialAndTargetStateEstablished(
+                false, true, playTimeMs * 1_000_000L
+            )
             rule.waitForIdle()
             assertEquals(200_000_000L, transition.totalDurationNanos)
 
@@ -637,7 +639,9 @@
 
         while (true) {
             // Seeking the exit transition, and check scale & shrink
-            transition.seek(true, false, playTimeMs * 1_000_000L)
+            transition.setPlaytimeAfterInitialAndTargetStateEstablished(
+                true, false, playTimeMs * 1_000_000L
+            )
             rule.waitForIdle()
             assertEquals(200_000_000L, transition.totalDurationNanos)
 
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/AbstractCodegenTest.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/AbstractCodegenTest.kt
index eb31c69..8122c82 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/AbstractCodegenTest.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/AbstractCodegenTest.kt
@@ -17,6 +17,7 @@
 package androidx.compose.compiler.plugins.kotlin
 
 import com.intellij.openapi.project.Project
+import com.intellij.openapi.util.io.FileUtil
 import com.intellij.openapi.util.text.StringUtilRt
 import com.intellij.openapi.vfs.CharsetToolkit
 import com.intellij.psi.PsiFileFactory
@@ -265,3 +266,7 @@
 
     return factory.trySetupPsiForFile(virtualFile, KotlinLanguage.INSTANCE, true, false) as KtFile
 }
+
+fun tmpDir(name: String): File {
+    return FileUtil.createTempDirectory(name, "", false).canonicalFile
+}
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposerParamSignatureTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposerParamSignatureTests.kt
index 2918915..e140173 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposerParamSignatureTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposerParamSignatureTests.kt
@@ -168,6 +168,25 @@
     )
 
     @Test
+    fun testCaptureIssue23(): Unit = codegen(
+        """
+            import androidx.compose.animation.AnimatedContent
+            import androidx.compose.animation.ExperimentalAnimationApi
+            import androidx.compose.runtime.Composable
+
+            @OptIn(ExperimentalAnimationApi::class)
+            @Composable
+            fun SimpleAnimatedContentSample() {
+                @Composable fun Foo() {}
+
+                AnimatedContent(1f) {
+                    Foo()
+                }
+            }
+        """
+    )
+
+    @Test
     fun test32Params(): Unit = codegen(
         """
         @Composable
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/KtxCrossModuleTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/KtxCrossModuleTests.kt
index 665aaa3..9d475d2 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/KtxCrossModuleTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/KtxCrossModuleTests.kt
@@ -1056,7 +1056,3 @@
     FileUtil.writeToFile(File(directory, relativePath), asByteArray())
 
 fun Collection<OutputFile>.writeToDir(directory: File) = forEach { it.writeToDir(directory) }
-
-fun tmpDir(name: String): File {
-    return FileUtil.createTempDirectory(name, "", false).canonicalFile
-}
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationTransformTests.kt
index 732e8bf..d37af66 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationTransformTests.kt
@@ -109,6 +109,171 @@
         """
     )
 
+    // Fixes b/201252574
+    @Test
+    fun testLocalFunCaptures(): Unit = verifyComposeIrTransform(
+        """
+            import androidx.compose.runtime.NonRestartableComposable
+            import androidx.compose.runtime.Composable
+
+            @NonRestartableComposable
+            @Composable
+            fun Err() {
+                // `x` is not a capture of handler, but is treated as such.
+                fun handler() {
+                    { x: Int -> x }
+                }
+                // Lambda calling handler. To find captures, we need captures of `handler`.
+                {
+                  handler()
+                }
+            }
+        """,
+        """
+            @NonRestartableComposable
+            @Composable
+            fun Err(%composer: Composer?, %changed: Int) {
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Err):Test.kt")
+              fun handler() {
+                { x: Int ->
+                  x
+                }
+              }
+              {
+                handler()
+              }
+              %composer.endReplaceableGroup()
+            }
+        """,
+        """
+        """
+    )
+
+    @Test
+    fun testLocalClassCaptures1(): Unit = verifyComposeIrTransform(
+        """
+            import androidx.compose.runtime.NonRestartableComposable
+            import androidx.compose.runtime.Composable
+
+            @NonRestartableComposable
+            @Composable
+            fun Err(y: Int, z: Int) {
+                class Local {
+                    val w = z
+                    fun something(x: Int): Int { return x + y + w }
+                }
+                {
+                  Local().something(2)
+                }
+            }
+        """,
+        """
+            @NonRestartableComposable
+            @Composable
+            fun Err(y: Int, z: Int, %composer: Composer?, %changed: Int) {
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Err)<{>:Test.kt")
+              class Local {
+                val w: Int = z
+                fun something(x: Int): Int {
+                  return x + y + w
+                }
+              }
+              remember(y, z, {
+                {
+                  Local().something(2)
+                }
+              }, %composer, 0)
+              %composer.endReplaceableGroup()
+            }
+        """,
+        """
+        """
+    )
+
+    @Test
+    fun testLocalClassCaptures2(): Unit = verifyComposeIrTransform(
+        """
+            import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.NonRestartableComposable
+
+            @NonRestartableComposable
+            @Composable
+            fun Example(z: Int) {
+                class Foo(val x: Int) { val y = z }
+                val lambda: () -> Any = {
+                    Foo(1)
+                }
+            }
+        """,
+        """
+            @NonRestartableComposable
+            @Composable
+            fun Example(z: Int, %composer: Composer?, %changed: Int) {
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Example)<{>:Test.kt")
+              class Foo(val x: Int) {
+                val y: Int = z
+              }
+              val lambda = remember(z, {
+                {
+                  Foo(1)
+                }
+              }, %composer, 0)
+              %composer.endReplaceableGroup()
+            }
+        """,
+        """
+        """
+    )
+
+    @Test
+    fun testLocalFunCaptures3(): Unit = verifyComposeIrTransform(
+        """
+            import androidx.compose.animation.AnimatedContent
+            import androidx.compose.animation.ExperimentalAnimationApi
+            import androidx.compose.runtime.Composable
+
+            @OptIn(ExperimentalAnimationApi::class)
+            @Composable
+            fun SimpleAnimatedContentSample() {
+                @Composable fun Foo() {}
+
+                AnimatedContent(1f) {
+                    Foo()
+                }
+            }
+        """,
+        """
+            @OptIn(markerClass = ExperimentalAnimationApi::class)
+            @Composable
+            fun SimpleAnimatedContentSample(%composer: Composer?, %changed: Int) {
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(SimpleAnimatedContentSample)<Animat...>:Test.kt")
+              if (%changed !== 0 || !%composer.skipping) {
+                @Composable
+                fun Foo(%composer: Composer?, %changed: Int) {
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "C(Foo):Test.kt")
+                  %composer.endReplaceableGroup()
+                }
+                AnimatedContent(1.0f, null, null, null, composableLambda(%composer, <>, false) { it: Float, %composer: Composer?, %changed: Int ->
+                  sourceInformation(%composer, "C<Foo()>:Test.kt")
+                  Foo(%composer, 0)
+                }, %composer, 0b0110000000000110, 0b1110)
+              } else {
+                %composer.skipToGroupEnd()
+              }
+              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+                SimpleAnimatedContentSample(%composer, %changed or 0b0001)
+              }
+            }
+        """,
+        """
+        """
+    )
+
     @Test
     fun testStateDelegateCapture(): Unit = verifyComposeIrTransform(
         """
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 73a6146..349e315 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
@@ -56,7 +56,8 @@
             4300 to "1.1.0-alpha04",
             4400 to "1.1.0-alpha05",
             4500 to "1.1.0-alpha06",
-            4600 to "1.1.0-alpha07",
+            4600 to "1.1.0-beta01",
+            4700 to "1.1.0-beta02",
         )
 
         /**
@@ -69,7 +70,7 @@
          * The maven version string of this compiler. This string should be updated before/after every
          * release.
          */
-        const val compilerVersion: String = "1.1.0-alpha07"
+        const val compilerVersion: String = "1.1.0-beta02"
         private val minimumRuntimeVersion: String
             get() = versionTable[minimumRuntimeVersionInt] ?: "unknown"
     }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposerLambdaMemoization.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposerLambdaMemoization.kt
index 04d8902..bb88a82 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposerLambdaMemoization.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposerLambdaMemoization.kt
@@ -53,6 +53,7 @@
 import org.jetbrains.kotlin.ir.builders.irTemporary
 import org.jetbrains.kotlin.ir.declarations.IrAttributeContainer
 import org.jetbrains.kotlin.ir.declarations.IrClass
+import org.jetbrains.kotlin.ir.declarations.IrConstructor
 import org.jetbrains.kotlin.ir.declarations.IrDeclarationBase
 import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
 import org.jetbrains.kotlin.ir.declarations.IrFile
@@ -63,6 +64,7 @@
 import org.jetbrains.kotlin.ir.declarations.IrVariable
 import org.jetbrains.kotlin.ir.declarations.copyAttributes
 import org.jetbrains.kotlin.ir.expressions.IrCall
+import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
 import org.jetbrains.kotlin.ir.expressions.IrExpression
 import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
 import org.jetbrains.kotlin.ir.expressions.IrFunctionExpression
@@ -97,53 +99,85 @@
 
 private class CaptureCollector {
     val captures = mutableSetOf<IrValueDeclaration>()
-    val capturedFunctions = mutableSetOf<IrFunction>()
-    val hasCaptures: Boolean get() = captures.isNotEmpty() || capturedFunctions.isNotEmpty()
+    val capturedDeclarations = mutableSetOf<IrSymbolOwner>()
+    val hasCaptures: Boolean get() = captures.isNotEmpty() || capturedDeclarations.isNotEmpty()
 
     fun recordCapture(local: IrValueDeclaration) {
         captures.add(local)
     }
 
-    fun recordCapture(local: IrFunction) {
-        capturedFunctions.add(local)
+    fun recordCapture(local: IrSymbolOwner) {
+        capturedDeclarations.add(local)
     }
 }
 
 private abstract class DeclarationContext {
+    val localDeclarationCaptures = mutableMapOf<IrSymbolOwner, Set<IrValueDeclaration>>()
+    fun recordLocalDeclaration(local: DeclarationContext) {
+        localDeclarationCaptures[local.declaration] = local.captures
+    }
     abstract val composable: Boolean
     abstract val symbol: IrSymbol
+    abstract val declaration: IrSymbolOwner
+    abstract val captures: Set<IrValueDeclaration>
     abstract val functionContext: FunctionContext?
     abstract fun declareLocal(local: IrValueDeclaration?)
-    abstract fun recordLocalFunction(local: FunctionContext)
-    abstract fun recordCapture(local: IrValueDeclaration?)
-    abstract fun recordCapture(local: IrFunction?)
+    abstract fun recordCapture(local: IrValueDeclaration?): Boolean
+    abstract fun recordCapture(local: IrSymbolOwner?)
     abstract fun pushCollector(collector: CaptureCollector)
     abstract fun popCollector(collector: CaptureCollector)
 }
 
-private class SymbolOwnerContext(val declaration: IrSymbolOwner) : DeclarationContext() {
+private fun List<DeclarationContext>.recordCapture(value: IrValueDeclaration) {
+    for (dec in reversed()) {
+        val shouldBreak = dec.recordCapture(value)
+        if (shouldBreak) break
+    }
+}
+
+private fun List<DeclarationContext>.recordLocalDeclaration(local: DeclarationContext) {
+    for (dec in reversed()) {
+        dec.recordLocalDeclaration(local)
+    }
+}
+
+private fun List<DeclarationContext>.recordLocalCapture(local: IrSymbolOwner) {
+    val capturesForLocal = reversed().firstNotNullOfOrNull { it.localDeclarationCaptures[local] }
+    if (capturesForLocal != null) {
+        capturesForLocal.forEach { recordCapture(it) }
+        for (dec in reversed()) {
+            dec.recordCapture(local)
+            if (dec.localDeclarationCaptures.containsKey(local)) {
+                // this is the scope that the class was defined in, so above this we don't need
+                // to do anything
+                break
+            }
+        }
+    }
+}
+
+private class SymbolOwnerContext(override val declaration: IrSymbolOwner) : DeclarationContext() {
     override val composable get() = false
     override val functionContext: FunctionContext? get() = null
     override val symbol get() = declaration.symbol
+    override val captures: Set<IrValueDeclaration> get() = emptySet()
     override fun declareLocal(local: IrValueDeclaration?) { }
-    override fun recordLocalFunction(local: FunctionContext) { }
-    override fun recordCapture(local: IrValueDeclaration?) { }
-    override fun recordCapture(local: IrFunction?) { }
+    override fun recordCapture(local: IrValueDeclaration?): Boolean { return false }
+    override fun recordCapture(local: IrSymbolOwner?) { }
     override fun pushCollector(collector: CaptureCollector) { }
     override fun popCollector(collector: CaptureCollector) { }
 }
 
 private class FunctionLocalSymbol(
-    val declaration: IrSymbolOwner,
+    override val declaration: IrSymbolOwner,
     override val functionContext: FunctionContext
 ) : DeclarationContext() {
     override val composable: Boolean get() = functionContext.composable
     override val symbol: IrSymbol get() = declaration.symbol
+    override val captures: Set<IrValueDeclaration> get() = functionContext.captures
     override fun declareLocal(local: IrValueDeclaration?) = functionContext.declareLocal(local)
-    override fun recordLocalFunction(local: FunctionContext) =
-        functionContext.recordLocalFunction(local)
     override fun recordCapture(local: IrValueDeclaration?) = functionContext.recordCapture(local)
-    override fun recordCapture(local: IrFunction?) = functionContext.recordCapture(local)
+    override fun recordCapture(local: IrSymbolOwner?) = functionContext.recordCapture(local)
     override fun pushCollector(collector: CaptureCollector) =
         functionContext.pushCollector(collector)
     override fun popCollector(collector: CaptureCollector) =
@@ -151,16 +185,15 @@
 }
 
 private class FunctionContext(
-    val declaration: IrFunction,
+    override val declaration: IrFunction,
     override val composable: Boolean,
     val canRemember: Boolean
 ) : DeclarationContext() {
     override val symbol get() = declaration.symbol
     override val functionContext: FunctionContext? get() = this
     val locals = mutableSetOf<IrValueDeclaration>()
-    val captures = mutableSetOf<IrValueDeclaration>()
+    override val captures: MutableSet<IrValueDeclaration> = mutableSetOf()
     var collectors = mutableListOf<CaptureCollector>()
-    val localFunctionCaptures = mutableMapOf<IrFunction, Set<IrValueDeclaration>>()
 
     init {
         declaration.valueParameters.forEach {
@@ -176,26 +209,22 @@
         }
     }
 
-    override fun recordLocalFunction(local: FunctionContext) {
-        if (local.captures.isNotEmpty() && local.declaration.isLocal) {
-            localFunctionCaptures[local.declaration] = local.captures
-        }
-    }
-
-    override fun recordCapture(local: IrValueDeclaration?) {
-        if (local != null && collectors.isNotEmpty() && locals.contains(local)) {
+    override fun recordCapture(local: IrValueDeclaration?): Boolean {
+        val containsLocal = locals.contains(local)
+        if (local != null && collectors.isNotEmpty() && containsLocal) {
             for (collector in collectors) {
                 collector.recordCapture(local)
             }
         }
-        if (local != null && declaration.isLocal && !locals.contains(local)) {
+        if (local != null && declaration.isLocal && !containsLocal) {
             captures.add(local)
         }
+        return containsLocal
     }
 
-    override fun recordCapture(local: IrFunction?) {
+    override fun recordCapture(local: IrSymbolOwner?) {
         if (local != null) {
-            val captures = localFunctionCaptures[local]
+            val captures = localDeclarationCaptures[local]
             for (collector in collectors) {
                 collector.recordCapture(local)
                 if (captures != null) {
@@ -217,22 +246,28 @@
     }
 }
 
-private class ClassContext(val declaration: IrClass) : DeclarationContext() {
+private class ClassContext(override val declaration: IrClass) : DeclarationContext() {
     override val composable: Boolean = false
     override val symbol get() = declaration.symbol
     override val functionContext: FunctionContext? = null
+    override val captures: MutableSet<IrValueDeclaration> = mutableSetOf()
     val thisParam: IrValueDeclaration? = declaration.thisReceiver!!
     var collectors = mutableListOf<CaptureCollector>()
     override fun declareLocal(local: IrValueDeclaration?) { }
-    override fun recordLocalFunction(local: FunctionContext) { }
-    override fun recordCapture(local: IrValueDeclaration?) {
-        if (local != null && collectors.isNotEmpty() && local == thisParam) {
+    override fun recordCapture(local: IrValueDeclaration?): Boolean {
+        val isThis = local == thisParam
+        val isCtorParam = (local?.parent as? IrConstructor)?.parent === declaration
+        if (local != null && collectors.isNotEmpty() && isThis) {
             for (collector in collectors) {
                 collector.recordCapture(local)
             }
         }
+        if (local != null && declaration.isLocal && !isThis && !isCtorParam) {
+            captures.add(local)
+        }
+        return isThis || isCtorParam
     }
-    override fun recordCapture(local: IrFunction?) { }
+    override fun recordCapture(local: IrSymbolOwner?) { }
     override fun pushCollector(collector: CaptureCollector) {
         collectors.add(collector)
     }
@@ -383,7 +418,7 @@
         val result = super.visitFunction(declaration)
         declarationContextStack.pop()
         if (declaration.isLocal) {
-            declarationContextStack.peek()?.recordLocalFunction(context)
+            declarationContextStack.recordLocalDeclaration(context)
         }
         return result
     }
@@ -393,6 +428,9 @@
         declarationContextStack.push(context)
         val result = super.visitClass(declaration)
         declarationContextStack.pop()
+        if (declaration.isLocal) {
+            declarationContextStack.recordLocalDeclaration(context)
+        }
         return result
     }
 
@@ -402,9 +440,7 @@
     }
 
     override fun visitValueAccess(expression: IrValueAccessExpression): IrExpression {
-        declarationContextStack.forEach {
-            it.recordCapture(expression.symbol.owner)
-        }
+        declarationContextStack.recordCapture(expression.symbol.owner)
         return super.visitValueAccess(expression)
     }
 
@@ -514,13 +550,20 @@
     override fun visitCall(expression: IrCall): IrExpression {
         val fn = expression.symbol.owner
         if (fn.isLocal) {
-            declarationContextStack.forEach {
-                it.recordCapture(fn)
-            }
+            declarationContextStack.recordLocalCapture(fn)
         }
         return super.visitCall(expression)
     }
 
+    override fun visitConstructorCall(expression: IrConstructorCall): IrExpression {
+        val fn = expression.symbol.owner
+        val cls = fn.parent as? IrClass
+        if (cls != null && fn.isLocal) {
+            declarationContextStack.recordLocalCapture(cls)
+        }
+        return super.visitConstructorCall(expression)
+    }
+
     @ObsoleteDescriptorBasedAPI
     private fun visitComposableFunctionExpression(
         expression: IrFunctionExpression,
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/CreateDecoysTransformer.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/CreateDecoysTransformer.kt
index b6b129c..11ee9dd 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/CreateDecoysTransformer.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/CreateDecoysTransformer.kt
@@ -55,7 +55,9 @@
 import org.jetbrains.kotlin.ir.util.defaultType
 import org.jetbrains.kotlin.ir.util.hasAnnotation
 import org.jetbrains.kotlin.ir.util.hasDefaultValue
+import org.jetbrains.kotlin.ir.util.isEnumClass
 import org.jetbrains.kotlin.ir.util.isLocal
+import org.jetbrains.kotlin.ir.util.parentAsClass
 import org.jetbrains.kotlin.ir.util.patchDeclarationParents
 import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
 import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
@@ -185,6 +187,7 @@
             name = newName
             returnType = original.returnType
             isPrimary = false
+            isOperator = false
         }
         newFunction.annotations = original.annotations
         newFunction.metadata = original.metadata
@@ -307,7 +310,9 @@
     }
 
     private fun IrFunction.shouldBeRemapped(): Boolean =
-        !isLocalFunction() && (hasComposableAnnotation() || hasComposableParameter())
+        !isLocalFunction() &&
+            !isEnumConstructor() &&
+            (hasComposableAnnotation() || hasComposableParameter())
 
     private fun IrFunction.isLocalFunction(): Boolean =
         origin == IrDeclarationOrigin.LOCAL_FUNCTION_FOR_LAMBDA ||
@@ -322,6 +327,9 @@
         valueParameters.any { it.type.hasComposable() } ||
             extensionReceiverParameter?.type?.hasComposable() == true
 
+    private fun IrFunction.isEnumConstructor() =
+        this is IrConstructor && parentAsClass.isEnumClass
+
     private fun IrType.hasComposable(): Boolean {
         if (hasAnnotation(ComposeFqNames.Composable)) {
             return true
diff --git a/compose/desktop/desktop/build.gradle b/compose/desktop/desktop/build.gradle
index 0428946..0153f3c 100644
--- a/compose/desktop/desktop/build.gradle
+++ b/compose/desktop/desktop/build.gradle
@@ -23,6 +23,7 @@
 
 plugins {
     id("AndroidXPlugin")
+    id("java") // https://github.com/gradle/gradle/issues/18622
     id("AndroidXComposePlugin")
     id("kotlin-multiplatform")
 }
diff --git a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/example1/Main.jvm.kt b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/example1/Main.jvm.kt
index 87ce6c3..956c5fe7 100644
--- a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/example1/Main.jvm.kt
+++ b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/example1/Main.jvm.kt
@@ -91,6 +91,8 @@
 import androidx.compose.ui.input.key.key
 import androidx.compose.ui.input.key.onPreviewKeyEvent
 import androidx.compose.ui.input.pointer.PointerEventType
+import androidx.compose.ui.input.pointer.PointerIconDefaults
+import androidx.compose.ui.input.pointer.pointerHoverIcon
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.platform.LocalUriHandler
 import androidx.compose.ui.res.painterResource
@@ -367,7 +369,7 @@
 
         Row(verticalAlignment = Alignment.CenterVertically) {
             Button(
-                modifier = Modifier.padding(4.dp),
+                modifier = Modifier.padding(4.dp).pointerHoverIcon(PointerIconDefaults.Hand),
                 onClick = {
                     amount.value++
                 }
diff --git a/compose/foundation/foundation-layout/api/1.1.0-beta02.txt b/compose/foundation/foundation-layout/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..e6a0884
--- /dev/null
+++ b/compose/foundation/foundation-layout/api/1.1.0-beta02.txt
@@ -0,0 +1,210 @@
+// Signature format: 4.0
+package androidx.compose.foundation.layout {
+
+  public final class AlignmentLineKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFrom(androidx.compose.ui.Modifier, androidx.compose.ui.layout.AlignmentLine alignmentLine, optional float before, optional float after);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFrom(androidx.compose.ui.Modifier, androidx.compose.ui.layout.AlignmentLine alignmentLine, optional long before, optional long after);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFromBaseline(androidx.compose.ui.Modifier, optional float top, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFromBaseline(androidx.compose.ui.Modifier, optional long top, optional long bottom);
+  }
+
+  @androidx.compose.runtime.Immutable public final class Arrangement {
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal aligned(androidx.compose.ui.Alignment.Horizontal alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical aligned(androidx.compose.ui.Alignment.Vertical alignment);
+    method public androidx.compose.foundation.layout.Arrangement.Vertical getBottom();
+    method public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical getCenter();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getEnd();
+    method public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical getSpaceAround();
+    method public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical getSpaceBetween();
+    method public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical getSpaceEvenly();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getStart();
+    method public androidx.compose.foundation.layout.Arrangement.Vertical getTop();
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical spacedBy(float space);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal spacedBy(float space, androidx.compose.ui.Alignment.Horizontal alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical spacedBy(float space, androidx.compose.ui.Alignment.Vertical alignment);
+    property public final androidx.compose.foundation.layout.Arrangement.Vertical Bottom;
+    property public final androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical Center;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal End;
+    property public final androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical SpaceAround;
+    property public final androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical SpaceBetween;
+    property public final androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical SpaceEvenly;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal Start;
+    property public final androidx.compose.foundation.layout.Arrangement.Vertical Top;
+    field public static final androidx.compose.foundation.layout.Arrangement INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class Arrangement.Absolute {
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal aligned(androidx.compose.ui.Alignment.Horizontal alignment);
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getCenter();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getLeft();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getRight();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getSpaceAround();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getSpaceBetween();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getSpaceEvenly();
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical spacedBy(float space);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal spacedBy(float space, androidx.compose.ui.Alignment.Horizontal alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical spacedBy(float space, androidx.compose.ui.Alignment.Vertical alignment);
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal Center;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal Left;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal Right;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal SpaceAround;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal SpaceBetween;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal SpaceEvenly;
+    field public static final androidx.compose.foundation.layout.Arrangement.Absolute INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public static interface Arrangement.Horizontal {
+    method public void arrange(androidx.compose.ui.unit.Density, int totalSize, int[] sizes, androidx.compose.ui.unit.LayoutDirection layoutDirection, int[] outPositions);
+    method public default float getSpacing();
+    property public default float spacing;
+  }
+
+  @androidx.compose.runtime.Stable public static interface Arrangement.HorizontalOrVertical extends androidx.compose.foundation.layout.Arrangement.Horizontal androidx.compose.foundation.layout.Arrangement.Vertical {
+    property public default float spacing;
+  }
+
+  @androidx.compose.runtime.Stable public static interface Arrangement.Vertical {
+    method public void arrange(androidx.compose.ui.unit.Density, int totalSize, int[] sizes, int[] outPositions);
+    method public default float getSpacing();
+    property public default float spacing;
+  }
+
+  public final class AspectRatioKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier aspectRatio(androidx.compose.ui.Modifier, float ratio, optional boolean matchHeightConstraintsFirst);
+  }
+
+  public final class BoxKt {
+    method @androidx.compose.runtime.Composable public static inline void Box(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment contentAlignment, optional boolean propagateMinConstraints, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Box(androidx.compose.ui.Modifier modifier);
+  }
+
+  @androidx.compose.foundation.layout.LayoutScopeMarker @androidx.compose.runtime.Immutable public interface BoxScope {
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier align(androidx.compose.ui.Modifier, androidx.compose.ui.Alignment alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier matchParentSize(androidx.compose.ui.Modifier);
+  }
+
+  public final class BoxWithConstraintsKt {
+    method @androidx.compose.runtime.Composable public static void BoxWithConstraints(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment contentAlignment, optional boolean propagateMinConstraints, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxWithConstraintsScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Stable public interface BoxWithConstraintsScope extends androidx.compose.foundation.layout.BoxScope {
+    method public long getConstraints();
+    method public float getMaxHeight();
+    method public float getMaxWidth();
+    method public float getMinHeight();
+    method public float getMinWidth();
+    property public abstract long constraints;
+    property public abstract float maxHeight;
+    property public abstract float maxWidth;
+    property public abstract float minHeight;
+    property public abstract float minWidth;
+  }
+
+  public final class ColumnKt {
+    method @androidx.compose.runtime.Composable public static inline void Column(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.ui.Alignment.Horizontal horizontalAlignment, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.foundation.layout.LayoutScopeMarker @androidx.compose.runtime.Immutable public interface ColumnScope {
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier align(androidx.compose.ui.Modifier, androidx.compose.ui.Alignment.Horizontal alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier alignBy(androidx.compose.ui.Modifier, androidx.compose.ui.layout.VerticalAlignmentLine alignmentLine);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier alignBy(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.Measured,java.lang.Integer> alignmentLineBlock);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier weight(androidx.compose.ui.Modifier, float weight, optional boolean fill);
+  }
+
+  public final class IntrinsicKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier height(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.IntrinsicSize intrinsicSize);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeight(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.IntrinsicSize intrinsicSize);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredWidth(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.IntrinsicSize intrinsicSize);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier width(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.IntrinsicSize intrinsicSize);
+  }
+
+  public enum IntrinsicSize {
+    enum_constant public static final androidx.compose.foundation.layout.IntrinsicSize Max;
+    enum_constant public static final androidx.compose.foundation.layout.IntrinsicSize Min;
+  }
+
+  @kotlin.DslMarker public @interface LayoutScopeMarker {
+  }
+
+  public final class OffsetKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier absoluteOffset(androidx.compose.ui.Modifier, optional float x, optional float y);
+    method public static androidx.compose.ui.Modifier absoluteOffset(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.Density,androidx.compose.ui.unit.IntOffset> offset);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier offset(androidx.compose.ui.Modifier, optional float x, optional float y);
+    method public static androidx.compose.ui.Modifier offset(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.Density,androidx.compose.ui.unit.IntOffset> offset);
+  }
+
+  public final class PaddingKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues(float all);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues(optional float horizontal, optional float vertical);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues(optional float start, optional float top, optional float end, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier absolutePadding(androidx.compose.ui.Modifier, optional float left, optional float top, optional float right, optional float bottom);
+    method @androidx.compose.runtime.Stable public static float calculateEndPadding(androidx.compose.foundation.layout.PaddingValues, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Stable public static float calculateStartPadding(androidx.compose.foundation.layout.PaddingValues, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, optional float start, optional float top, optional float end, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, optional float horizontal, optional float vertical);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, float all);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.PaddingValues paddingValues);
+  }
+
+  @androidx.compose.runtime.Stable public interface PaddingValues {
+    method public float calculateBottomPadding();
+    method public float calculateLeftPadding(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateRightPadding(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateTopPadding();
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PaddingValues.Absolute implements androidx.compose.foundation.layout.PaddingValues {
+    ctor public PaddingValues.Absolute(optional @androidx.compose.runtime.Stable float left, optional @androidx.compose.runtime.Stable float top, optional @androidx.compose.runtime.Stable float right, optional @androidx.compose.runtime.Stable float bottom);
+    method public float calculateBottomPadding();
+    method public float calculateLeftPadding(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateRightPadding(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateTopPadding();
+  }
+
+  public final class RowColumnImplKt {
+  }
+
+  public final class RowKt {
+    method @androidx.compose.runtime.Composable public static inline void Row(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.ui.Alignment.Vertical verticalAlignment, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.foundation.layout.LayoutScopeMarker @androidx.compose.runtime.Immutable public interface RowScope {
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier align(androidx.compose.ui.Modifier, androidx.compose.ui.Alignment.Vertical alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier alignBy(androidx.compose.ui.Modifier, androidx.compose.ui.layout.HorizontalAlignmentLine alignmentLine);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier alignBy(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.Measured,java.lang.Integer> alignmentLineBlock);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier alignByBaseline(androidx.compose.ui.Modifier);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier weight(androidx.compose.ui.Modifier, float weight, optional boolean fill);
+  }
+
+  public final class SizeKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier defaultMinSize(androidx.compose.ui.Modifier, optional float minWidth, optional float minHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier fillMaxHeight(androidx.compose.ui.Modifier, optional float fraction);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier fillMaxSize(androidx.compose.ui.Modifier, optional float fraction);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier fillMaxWidth(androidx.compose.ui.Modifier, optional float fraction);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier height(androidx.compose.ui.Modifier, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier heightIn(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeight(androidx.compose.ui.Modifier, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeightIn(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize(androidx.compose.ui.Modifier, float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize(androidx.compose.ui.Modifier, float width, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize(androidx.compose.ui.Modifier, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSizeIn(androidx.compose.ui.Modifier, optional float minWidth, optional float minHeight, optional float maxWidth, optional float maxHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredWidth(androidx.compose.ui.Modifier, float width);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredWidthIn(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size(androidx.compose.ui.Modifier, float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size(androidx.compose.ui.Modifier, float width, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size(androidx.compose.ui.Modifier, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier sizeIn(androidx.compose.ui.Modifier, optional float minWidth, optional float minHeight, optional float maxWidth, optional float maxHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier width(androidx.compose.ui.Modifier, float width);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier widthIn(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier wrapContentHeight(androidx.compose.ui.Modifier, optional androidx.compose.ui.Alignment.Vertical align, optional boolean unbounded);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier wrapContentSize(androidx.compose.ui.Modifier, optional androidx.compose.ui.Alignment align, optional boolean unbounded);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier wrapContentWidth(androidx.compose.ui.Modifier, optional androidx.compose.ui.Alignment.Horizontal align, optional boolean unbounded);
+  }
+
+  public final class SpacerKt {
+    method @androidx.compose.runtime.Composable public static void Spacer(androidx.compose.ui.Modifier modifier);
+  }
+
+}
+
diff --git a/compose/foundation/foundation-layout/api/public_plus_experimental_1.1.0-beta02.txt b/compose/foundation/foundation-layout/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..134a3a5
--- /dev/null
+++ b/compose/foundation/foundation-layout/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,213 @@
+// Signature format: 4.0
+package androidx.compose.foundation.layout {
+
+  public final class AlignmentLineKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFrom(androidx.compose.ui.Modifier, androidx.compose.ui.layout.AlignmentLine alignmentLine, optional float before, optional float after);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFrom(androidx.compose.ui.Modifier, androidx.compose.ui.layout.AlignmentLine alignmentLine, optional long before, optional long after);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFromBaseline(androidx.compose.ui.Modifier, optional float top, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFromBaseline(androidx.compose.ui.Modifier, optional long top, optional long bottom);
+  }
+
+  @androidx.compose.runtime.Immutable public final class Arrangement {
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal aligned(androidx.compose.ui.Alignment.Horizontal alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical aligned(androidx.compose.ui.Alignment.Vertical alignment);
+    method public androidx.compose.foundation.layout.Arrangement.Vertical getBottom();
+    method public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical getCenter();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getEnd();
+    method public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical getSpaceAround();
+    method public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical getSpaceBetween();
+    method public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical getSpaceEvenly();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getStart();
+    method public androidx.compose.foundation.layout.Arrangement.Vertical getTop();
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical spacedBy(float space);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal spacedBy(float space, androidx.compose.ui.Alignment.Horizontal alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical spacedBy(float space, androidx.compose.ui.Alignment.Vertical alignment);
+    property public final androidx.compose.foundation.layout.Arrangement.Vertical Bottom;
+    property public final androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical Center;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal End;
+    property public final androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical SpaceAround;
+    property public final androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical SpaceBetween;
+    property public final androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical SpaceEvenly;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal Start;
+    property public final androidx.compose.foundation.layout.Arrangement.Vertical Top;
+    field public static final androidx.compose.foundation.layout.Arrangement INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class Arrangement.Absolute {
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal aligned(androidx.compose.ui.Alignment.Horizontal alignment);
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getCenter();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getLeft();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getRight();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getSpaceAround();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getSpaceBetween();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getSpaceEvenly();
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical spacedBy(float space);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal spacedBy(float space, androidx.compose.ui.Alignment.Horizontal alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical spacedBy(float space, androidx.compose.ui.Alignment.Vertical alignment);
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal Center;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal Left;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal Right;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal SpaceAround;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal SpaceBetween;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal SpaceEvenly;
+    field public static final androidx.compose.foundation.layout.Arrangement.Absolute INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public static interface Arrangement.Horizontal {
+    method public void arrange(androidx.compose.ui.unit.Density, int totalSize, int[] sizes, androidx.compose.ui.unit.LayoutDirection layoutDirection, int[] outPositions);
+    method public default float getSpacing();
+    property public default float spacing;
+  }
+
+  @androidx.compose.runtime.Stable public static interface Arrangement.HorizontalOrVertical extends androidx.compose.foundation.layout.Arrangement.Horizontal androidx.compose.foundation.layout.Arrangement.Vertical {
+    property public default float spacing;
+  }
+
+  @androidx.compose.runtime.Stable public static interface Arrangement.Vertical {
+    method public void arrange(androidx.compose.ui.unit.Density, int totalSize, int[] sizes, int[] outPositions);
+    method public default float getSpacing();
+    property public default float spacing;
+  }
+
+  public final class AspectRatioKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier aspectRatio(androidx.compose.ui.Modifier, float ratio, optional boolean matchHeightConstraintsFirst);
+  }
+
+  public final class BoxKt {
+    method @androidx.compose.runtime.Composable public static inline void Box(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment contentAlignment, optional boolean propagateMinConstraints, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Box(androidx.compose.ui.Modifier modifier);
+  }
+
+  @androidx.compose.foundation.layout.LayoutScopeMarker @androidx.compose.runtime.Immutable public interface BoxScope {
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier align(androidx.compose.ui.Modifier, androidx.compose.ui.Alignment alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier matchParentSize(androidx.compose.ui.Modifier);
+  }
+
+  public final class BoxWithConstraintsKt {
+    method @androidx.compose.runtime.Composable public static void BoxWithConstraints(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment contentAlignment, optional boolean propagateMinConstraints, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxWithConstraintsScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Stable public interface BoxWithConstraintsScope extends androidx.compose.foundation.layout.BoxScope {
+    method public long getConstraints();
+    method public float getMaxHeight();
+    method public float getMaxWidth();
+    method public float getMinHeight();
+    method public float getMinWidth();
+    property public abstract long constraints;
+    property public abstract float maxHeight;
+    property public abstract float maxWidth;
+    property public abstract float minHeight;
+    property public abstract float minWidth;
+  }
+
+  public final class ColumnKt {
+    method @androidx.compose.runtime.Composable public static inline void Column(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.ui.Alignment.Horizontal horizontalAlignment, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.foundation.layout.LayoutScopeMarker @androidx.compose.runtime.Immutable public interface ColumnScope {
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier align(androidx.compose.ui.Modifier, androidx.compose.ui.Alignment.Horizontal alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier alignBy(androidx.compose.ui.Modifier, androidx.compose.ui.layout.VerticalAlignmentLine alignmentLine);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier alignBy(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.Measured,java.lang.Integer> alignmentLineBlock);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier weight(androidx.compose.ui.Modifier, float weight, optional boolean fill);
+  }
+
+  @kotlin.RequiresOptIn(message="The API of this layout is experimental and is likely to change in the future.") public @interface ExperimentalLayoutApi {
+  }
+
+  public final class IntrinsicKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier height(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.IntrinsicSize intrinsicSize);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeight(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.IntrinsicSize intrinsicSize);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredWidth(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.IntrinsicSize intrinsicSize);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier width(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.IntrinsicSize intrinsicSize);
+  }
+
+  public enum IntrinsicSize {
+    enum_constant public static final androidx.compose.foundation.layout.IntrinsicSize Max;
+    enum_constant public static final androidx.compose.foundation.layout.IntrinsicSize Min;
+  }
+
+  @kotlin.DslMarker public @interface LayoutScopeMarker {
+  }
+
+  public final class OffsetKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier absoluteOffset(androidx.compose.ui.Modifier, optional float x, optional float y);
+    method public static androidx.compose.ui.Modifier absoluteOffset(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.Density,androidx.compose.ui.unit.IntOffset> offset);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier offset(androidx.compose.ui.Modifier, optional float x, optional float y);
+    method public static androidx.compose.ui.Modifier offset(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.Density,androidx.compose.ui.unit.IntOffset> offset);
+  }
+
+  public final class PaddingKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues(float all);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues(optional float horizontal, optional float vertical);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues(optional float start, optional float top, optional float end, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier absolutePadding(androidx.compose.ui.Modifier, optional float left, optional float top, optional float right, optional float bottom);
+    method @androidx.compose.runtime.Stable public static float calculateEndPadding(androidx.compose.foundation.layout.PaddingValues, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Stable public static float calculateStartPadding(androidx.compose.foundation.layout.PaddingValues, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, optional float start, optional float top, optional float end, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, optional float horizontal, optional float vertical);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, float all);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.PaddingValues paddingValues);
+  }
+
+  @androidx.compose.runtime.Stable public interface PaddingValues {
+    method public float calculateBottomPadding();
+    method public float calculateLeftPadding(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateRightPadding(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateTopPadding();
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PaddingValues.Absolute implements androidx.compose.foundation.layout.PaddingValues {
+    ctor public PaddingValues.Absolute(optional @androidx.compose.runtime.Stable float left, optional @androidx.compose.runtime.Stable float top, optional @androidx.compose.runtime.Stable float right, optional @androidx.compose.runtime.Stable float bottom);
+    method public float calculateBottomPadding();
+    method public float calculateLeftPadding(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateRightPadding(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateTopPadding();
+  }
+
+  public final class RowColumnImplKt {
+  }
+
+  public final class RowKt {
+    method @androidx.compose.runtime.Composable public static inline void Row(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.ui.Alignment.Vertical verticalAlignment, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.foundation.layout.LayoutScopeMarker @androidx.compose.runtime.Immutable public interface RowScope {
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier align(androidx.compose.ui.Modifier, androidx.compose.ui.Alignment.Vertical alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier alignBy(androidx.compose.ui.Modifier, androidx.compose.ui.layout.HorizontalAlignmentLine alignmentLine);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier alignBy(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.Measured,java.lang.Integer> alignmentLineBlock);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier alignByBaseline(androidx.compose.ui.Modifier);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier weight(androidx.compose.ui.Modifier, float weight, optional boolean fill);
+  }
+
+  public final class SizeKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier defaultMinSize(androidx.compose.ui.Modifier, optional float minWidth, optional float minHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier fillMaxHeight(androidx.compose.ui.Modifier, optional float fraction);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier fillMaxSize(androidx.compose.ui.Modifier, optional float fraction);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier fillMaxWidth(androidx.compose.ui.Modifier, optional float fraction);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier height(androidx.compose.ui.Modifier, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier heightIn(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeight(androidx.compose.ui.Modifier, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeightIn(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize(androidx.compose.ui.Modifier, float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize(androidx.compose.ui.Modifier, float width, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize(androidx.compose.ui.Modifier, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSizeIn(androidx.compose.ui.Modifier, optional float minWidth, optional float minHeight, optional float maxWidth, optional float maxHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredWidth(androidx.compose.ui.Modifier, float width);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredWidthIn(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size(androidx.compose.ui.Modifier, float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size(androidx.compose.ui.Modifier, float width, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size(androidx.compose.ui.Modifier, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier sizeIn(androidx.compose.ui.Modifier, optional float minWidth, optional float minHeight, optional float maxWidth, optional float maxHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier width(androidx.compose.ui.Modifier, float width);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier widthIn(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier wrapContentHeight(androidx.compose.ui.Modifier, optional androidx.compose.ui.Alignment.Vertical align, optional boolean unbounded);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier wrapContentSize(androidx.compose.ui.Modifier, optional androidx.compose.ui.Alignment align, optional boolean unbounded);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier wrapContentWidth(androidx.compose.ui.Modifier, optional androidx.compose.ui.Alignment.Horizontal align, optional boolean unbounded);
+  }
+
+  public final class SpacerKt {
+    method @androidx.compose.runtime.Composable public static void Spacer(androidx.compose.ui.Modifier modifier);
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/foundation/foundation-layout/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to compose/foundation/foundation-layout/api/res-1.1.0-beta02.txt
diff --git a/compose/foundation/foundation-layout/api/restricted_1.1.0-beta02.txt b/compose/foundation/foundation-layout/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..e680861
--- /dev/null
+++ b/compose/foundation/foundation-layout/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,215 @@
+// Signature format: 4.0
+package androidx.compose.foundation.layout {
+
+  public final class AlignmentLineKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFrom(androidx.compose.ui.Modifier, androidx.compose.ui.layout.AlignmentLine alignmentLine, optional float before, optional float after);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFrom(androidx.compose.ui.Modifier, androidx.compose.ui.layout.AlignmentLine alignmentLine, optional long before, optional long after);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFromBaseline(androidx.compose.ui.Modifier, optional float top, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier paddingFromBaseline(androidx.compose.ui.Modifier, optional long top, optional long bottom);
+  }
+
+  @androidx.compose.runtime.Immutable public final class Arrangement {
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal aligned(androidx.compose.ui.Alignment.Horizontal alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical aligned(androidx.compose.ui.Alignment.Vertical alignment);
+    method public androidx.compose.foundation.layout.Arrangement.Vertical getBottom();
+    method public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical getCenter();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getEnd();
+    method public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical getSpaceAround();
+    method public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical getSpaceBetween();
+    method public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical getSpaceEvenly();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getStart();
+    method public androidx.compose.foundation.layout.Arrangement.Vertical getTop();
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical spacedBy(float space);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal spacedBy(float space, androidx.compose.ui.Alignment.Horizontal alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical spacedBy(float space, androidx.compose.ui.Alignment.Vertical alignment);
+    property public final androidx.compose.foundation.layout.Arrangement.Vertical Bottom;
+    property public final androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical Center;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal End;
+    property public final androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical SpaceAround;
+    property public final androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical SpaceBetween;
+    property public final androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical SpaceEvenly;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal Start;
+    property public final androidx.compose.foundation.layout.Arrangement.Vertical Top;
+    field public static final androidx.compose.foundation.layout.Arrangement INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class Arrangement.Absolute {
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal aligned(androidx.compose.ui.Alignment.Horizontal alignment);
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getCenter();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getLeft();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getRight();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getSpaceAround();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getSpaceBetween();
+    method public androidx.compose.foundation.layout.Arrangement.Horizontal getSpaceEvenly();
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.HorizontalOrVertical spacedBy(float space);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Horizontal spacedBy(float space, androidx.compose.ui.Alignment.Horizontal alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.foundation.layout.Arrangement.Vertical spacedBy(float space, androidx.compose.ui.Alignment.Vertical alignment);
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal Center;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal Left;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal Right;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal SpaceAround;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal SpaceBetween;
+    property public final androidx.compose.foundation.layout.Arrangement.Horizontal SpaceEvenly;
+    field public static final androidx.compose.foundation.layout.Arrangement.Absolute INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public static interface Arrangement.Horizontal {
+    method public void arrange(androidx.compose.ui.unit.Density, int totalSize, int[] sizes, androidx.compose.ui.unit.LayoutDirection layoutDirection, int[] outPositions);
+    method public default float getSpacing();
+    property public default float spacing;
+  }
+
+  @androidx.compose.runtime.Stable public static interface Arrangement.HorizontalOrVertical extends androidx.compose.foundation.layout.Arrangement.Horizontal androidx.compose.foundation.layout.Arrangement.Vertical {
+    property public default float spacing;
+  }
+
+  @androidx.compose.runtime.Stable public static interface Arrangement.Vertical {
+    method public void arrange(androidx.compose.ui.unit.Density, int totalSize, int[] sizes, int[] outPositions);
+    method public default float getSpacing();
+    property public default float spacing;
+  }
+
+  public final class AspectRatioKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier aspectRatio(androidx.compose.ui.Modifier, float ratio, optional boolean matchHeightConstraintsFirst);
+  }
+
+  public final class BoxKt {
+    method @androidx.compose.runtime.Composable public static inline void Box(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment contentAlignment, optional boolean propagateMinConstraints, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Box(androidx.compose.ui.Modifier modifier);
+    method @androidx.compose.runtime.Composable @kotlin.PublishedApi internal static androidx.compose.ui.layout.MeasurePolicy rememberBoxMeasurePolicy(androidx.compose.ui.Alignment alignment, boolean propagateMinConstraints);
+  }
+
+  @androidx.compose.foundation.layout.LayoutScopeMarker @androidx.compose.runtime.Immutable public interface BoxScope {
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier align(androidx.compose.ui.Modifier, androidx.compose.ui.Alignment alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier matchParentSize(androidx.compose.ui.Modifier);
+  }
+
+  public final class BoxWithConstraintsKt {
+    method @androidx.compose.runtime.Composable public static void BoxWithConstraints(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment contentAlignment, optional boolean propagateMinConstraints, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxWithConstraintsScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Stable public interface BoxWithConstraintsScope extends androidx.compose.foundation.layout.BoxScope {
+    method public long getConstraints();
+    method public float getMaxHeight();
+    method public float getMaxWidth();
+    method public float getMinHeight();
+    method public float getMinWidth();
+    property public abstract long constraints;
+    property public abstract float maxHeight;
+    property public abstract float maxWidth;
+    property public abstract float minHeight;
+    property public abstract float minWidth;
+  }
+
+  public final class ColumnKt {
+    method @androidx.compose.runtime.Composable public static inline void Column(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.ui.Alignment.Horizontal horizontalAlignment, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @kotlin.PublishedApi internal static androidx.compose.ui.layout.MeasurePolicy columnMeasurePolicy(androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, androidx.compose.ui.Alignment.Horizontal horizontalAlignment);
+    field @kotlin.PublishedApi internal static final androidx.compose.ui.layout.MeasurePolicy DefaultColumnMeasurePolicy;
+  }
+
+  @androidx.compose.foundation.layout.LayoutScopeMarker @androidx.compose.runtime.Immutable public interface ColumnScope {
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier align(androidx.compose.ui.Modifier, androidx.compose.ui.Alignment.Horizontal alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier alignBy(androidx.compose.ui.Modifier, androidx.compose.ui.layout.VerticalAlignmentLine alignmentLine);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier alignBy(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.Measured,java.lang.Integer> alignmentLineBlock);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier weight(androidx.compose.ui.Modifier, float weight, optional boolean fill);
+  }
+
+  public final class IntrinsicKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier height(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.IntrinsicSize intrinsicSize);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeight(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.IntrinsicSize intrinsicSize);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredWidth(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.IntrinsicSize intrinsicSize);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier width(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.IntrinsicSize intrinsicSize);
+  }
+
+  public enum IntrinsicSize {
+    enum_constant public static final androidx.compose.foundation.layout.IntrinsicSize Max;
+    enum_constant public static final androidx.compose.foundation.layout.IntrinsicSize Min;
+  }
+
+  @kotlin.DslMarker public @interface LayoutScopeMarker {
+  }
+
+  public final class OffsetKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier absoluteOffset(androidx.compose.ui.Modifier, optional float x, optional float y);
+    method public static androidx.compose.ui.Modifier absoluteOffset(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.Density,androidx.compose.ui.unit.IntOffset> offset);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier offset(androidx.compose.ui.Modifier, optional float x, optional float y);
+    method public static androidx.compose.ui.Modifier offset(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.Density,androidx.compose.ui.unit.IntOffset> offset);
+  }
+
+  public final class PaddingKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues(float all);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues(optional float horizontal, optional float vertical);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.layout.PaddingValues PaddingValues(optional float start, optional float top, optional float end, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier absolutePadding(androidx.compose.ui.Modifier, optional float left, optional float top, optional float right, optional float bottom);
+    method @androidx.compose.runtime.Stable public static float calculateEndPadding(androidx.compose.foundation.layout.PaddingValues, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Stable public static float calculateStartPadding(androidx.compose.foundation.layout.PaddingValues, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, optional float start, optional float top, optional float end, optional float bottom);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, optional float horizontal, optional float vertical);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, float all);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier padding(androidx.compose.ui.Modifier, androidx.compose.foundation.layout.PaddingValues paddingValues);
+  }
+
+  @androidx.compose.runtime.Stable public interface PaddingValues {
+    method public float calculateBottomPadding();
+    method public float calculateLeftPadding(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateRightPadding(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateTopPadding();
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PaddingValues.Absolute implements androidx.compose.foundation.layout.PaddingValues {
+    ctor public PaddingValues.Absolute(optional @androidx.compose.runtime.Stable float left, optional @androidx.compose.runtime.Stable float top, optional @androidx.compose.runtime.Stable float right, optional @androidx.compose.runtime.Stable float bottom);
+    method public float calculateBottomPadding();
+    method public float calculateLeftPadding(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateRightPadding(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float calculateTopPadding();
+  }
+
+  public final class RowColumnImplKt {
+  }
+
+  public final class RowKt {
+    method @androidx.compose.runtime.Composable public static inline void Row(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.ui.Alignment.Vertical verticalAlignment, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @kotlin.PublishedApi internal static androidx.compose.ui.layout.MeasurePolicy rowMeasurePolicy(androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, androidx.compose.ui.Alignment.Vertical verticalAlignment);
+    field @kotlin.PublishedApi internal static final androidx.compose.ui.layout.MeasurePolicy DefaultRowMeasurePolicy;
+  }
+
+  @androidx.compose.foundation.layout.LayoutScopeMarker @androidx.compose.runtime.Immutable public interface RowScope {
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier align(androidx.compose.ui.Modifier, androidx.compose.ui.Alignment.Vertical alignment);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier alignBy(androidx.compose.ui.Modifier, androidx.compose.ui.layout.HorizontalAlignmentLine alignmentLine);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier alignBy(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.Measured,java.lang.Integer> alignmentLineBlock);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier alignByBaseline(androidx.compose.ui.Modifier);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.Modifier weight(androidx.compose.ui.Modifier, float weight, optional boolean fill);
+  }
+
+  public final class SizeKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier defaultMinSize(androidx.compose.ui.Modifier, optional float minWidth, optional float minHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier fillMaxHeight(androidx.compose.ui.Modifier, optional float fraction);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier fillMaxSize(androidx.compose.ui.Modifier, optional float fraction);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier fillMaxWidth(androidx.compose.ui.Modifier, optional float fraction);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier height(androidx.compose.ui.Modifier, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier heightIn(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeight(androidx.compose.ui.Modifier, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredHeightIn(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize(androidx.compose.ui.Modifier, float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize(androidx.compose.ui.Modifier, float width, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSize(androidx.compose.ui.Modifier, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredSizeIn(androidx.compose.ui.Modifier, optional float minWidth, optional float minHeight, optional float maxWidth, optional float maxHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredWidth(androidx.compose.ui.Modifier, float width);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier requiredWidthIn(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size(androidx.compose.ui.Modifier, float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size(androidx.compose.ui.Modifier, float width, float height);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier size(androidx.compose.ui.Modifier, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier sizeIn(androidx.compose.ui.Modifier, optional float minWidth, optional float minHeight, optional float maxWidth, optional float maxHeight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier width(androidx.compose.ui.Modifier, float width);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier widthIn(androidx.compose.ui.Modifier, optional float min, optional float max);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier wrapContentHeight(androidx.compose.ui.Modifier, optional androidx.compose.ui.Alignment.Vertical align, optional boolean unbounded);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier wrapContentSize(androidx.compose.ui.Modifier, optional androidx.compose.ui.Alignment align, optional boolean unbounded);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier wrapContentWidth(androidx.compose.ui.Modifier, optional androidx.compose.ui.Alignment.Horizontal align, optional boolean unbounded);
+  }
+
+  public final class SpacerKt {
+    method @androidx.compose.runtime.Composable public static void Spacer(androidx.compose.ui.Modifier modifier);
+  }
+
+}
+
diff --git a/compose/foundation/foundation-layout/benchmark/build.gradle b/compose/foundation/foundation-layout/benchmark/build.gradle
index 8d5de4f..5505ba1 100644
--- a/compose/foundation/foundation-layout/benchmark/build.gradle
+++ b/compose/foundation/foundation-layout/benchmark/build.gradle
@@ -26,7 +26,6 @@
     kotlinPlugin project(":compose:compiler:compiler")
 
     androidTestImplementation project(":benchmark:benchmark-junit4")
-    androidTestImplementation project(":benchmark:benchmark-macro-junit4")
     androidTestImplementation project(":compose:foundation:foundation-layout")
     androidTestImplementation project(":compose:material:material")
     androidTestImplementation project(":compose:runtime:runtime")
diff --git a/compose/foundation/foundation/api/1.1.0-beta02.txt b/compose/foundation/foundation/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..e06e978
--- /dev/null
+++ b/compose/foundation/foundation/api/1.1.0-beta02.txt
@@ -0,0 +1,840 @@
+// Signature format: 4.0
+package androidx.compose.foundation {
+
+  public final class ActualJvmKt {
+  }
+
+  public final class BackgroundKt {
+    method public static androidx.compose.ui.Modifier background(androidx.compose.ui.Modifier, long color, optional androidx.compose.ui.graphics.Shape shape);
+    method public static androidx.compose.ui.Modifier background(androidx.compose.ui.Modifier, androidx.compose.ui.graphics.Brush brush, optional androidx.compose.ui.graphics.Shape shape, optional float alpha);
+  }
+
+  public final class BorderKt {
+    method public static androidx.compose.ui.Modifier border(androidx.compose.ui.Modifier, androidx.compose.foundation.BorderStroke border, optional androidx.compose.ui.graphics.Shape shape);
+    method public static androidx.compose.ui.Modifier border(androidx.compose.ui.Modifier, float width, long color, optional androidx.compose.ui.graphics.Shape shape);
+    method public static androidx.compose.ui.Modifier border(androidx.compose.ui.Modifier, float width, androidx.compose.ui.graphics.Brush brush, androidx.compose.ui.graphics.Shape shape);
+  }
+
+  @androidx.compose.runtime.Immutable public final class BorderStroke {
+    ctor public BorderStroke(float width, androidx.compose.ui.graphics.Brush brush);
+    method public androidx.compose.foundation.BorderStroke copy(optional float width, optional androidx.compose.ui.graphics.Brush brush);
+    method public androidx.compose.ui.graphics.Brush getBrush();
+    method public float getWidth();
+    property public final androidx.compose.ui.graphics.Brush brush;
+    property public final float width;
+  }
+
+  public final class BorderStrokeKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.BorderStroke BorderStroke(float width, long color);
+  }
+
+  public final class CanvasKt {
+    method @androidx.compose.runtime.Composable public static void Canvas(androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> onDraw);
+  }
+
+  public final class ClickableKt {
+    method public static androidx.compose.ui.Modifier clickable(androidx.compose.ui.Modifier, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static androidx.compose.ui.Modifier clickable(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+  }
+
+  public final class Clickable_androidKt {
+  }
+
+  public final class DarkThemeKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean isSystemInDarkTheme();
+  }
+
+  public final class DarkTheme_androidKt {
+  }
+
+  public final class FocusableKt {
+    method public static androidx.compose.ui.Modifier focusable(androidx.compose.ui.Modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource? interactionSource);
+  }
+
+  public final class HoverableKt {
+    method public static androidx.compose.ui.Modifier hoverable(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional boolean enabled);
+  }
+
+  public final class ImageKt {
+    method @androidx.compose.runtime.Composable public static void Image(androidx.compose.ui.graphics.ImageBitmap bitmap, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int filterQuality);
+    method @androidx.compose.runtime.Composable public static void Image(androidx.compose.ui.graphics.vector.ImageVector imageVector, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method @androidx.compose.runtime.Composable public static void Image(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method @Deprecated @androidx.compose.runtime.Composable public static void Image(androidx.compose.ui.graphics.ImageBitmap bitmap, String contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+  }
+
+  @androidx.compose.runtime.Stable public interface Indication {
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.IndicationInstance rememberUpdatedInstance(androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
+  public interface IndicationInstance {
+    method public void drawIndication(androidx.compose.ui.graphics.drawscope.ContentDrawScope);
+  }
+
+  public final class IndicationKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.Indication> getLocalIndication();
+    method public static androidx.compose.ui.Modifier indication(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.InteractionSource interactionSource, androidx.compose.foundation.Indication? indication);
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.Indication> LocalIndication;
+  }
+
+  public enum MutatePriority {
+    enum_constant public static final androidx.compose.foundation.MutatePriority Default;
+    enum_constant public static final androidx.compose.foundation.MutatePriority PreventUserInput;
+    enum_constant public static final androidx.compose.foundation.MutatePriority UserInput;
+  }
+
+  @androidx.compose.runtime.Stable public final class MutatorMutex {
+    ctor public MutatorMutex();
+    method public suspend <R> Object? mutate(optional androidx.compose.foundation.MutatePriority priority, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R> p);
+    method public suspend <T, R> Object? mutateWith(T? receiver, optional androidx.compose.foundation.MutatePriority priority, kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R> p);
+  }
+
+  public final class ProgressSemanticsKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier progressSemantics(androidx.compose.ui.Modifier, float value, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional int steps);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier progressSemantics(androidx.compose.ui.Modifier);
+  }
+
+  public final class ScrollKt {
+    method public static androidx.compose.ui.Modifier horizontalScroll(androidx.compose.ui.Modifier, androidx.compose.foundation.ScrollState state, optional boolean enabled, optional androidx.compose.foundation.gestures.FlingBehavior? flingBehavior, optional boolean reverseScrolling);
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.ScrollState rememberScrollState(optional int initial);
+    method public static androidx.compose.ui.Modifier verticalScroll(androidx.compose.ui.Modifier, androidx.compose.foundation.ScrollState state, optional boolean enabled, optional androidx.compose.foundation.gestures.FlingBehavior? flingBehavior, optional boolean reverseScrolling);
+  }
+
+  @androidx.compose.runtime.Stable public final class ScrollState implements androidx.compose.foundation.gestures.ScrollableState {
+    ctor public ScrollState(int initial);
+    method public suspend Object? animateScrollTo(int value, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public float dispatchRawDelta(float delta);
+    method public androidx.compose.foundation.interaction.InteractionSource getInteractionSource();
+    method public int getMaxValue();
+    method public int getValue();
+    method public boolean isScrollInProgress();
+    method public suspend Object? scroll(androidx.compose.foundation.MutatePriority scrollPriority, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.gestures.ScrollScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public suspend Object? scrollTo(int value, kotlin.coroutines.Continuation<? super java.lang.Float> p);
+    property public final androidx.compose.foundation.interaction.InteractionSource interactionSource;
+    property public boolean isScrollInProgress;
+    property public final int maxValue;
+    property public final int value;
+    field public static final androidx.compose.foundation.ScrollState.Companion Companion;
+  }
+
+  public static final class ScrollState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.ScrollState,?> getSaver();
+    property public final androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.ScrollState,?> Saver;
+  }
+
+  public final class TempListUtilsKt {
+  }
+
+}
+
+package androidx.compose.foundation.gestures {
+
+  public final class AndroidOverScrollKt {
+  }
+
+  public final class AndroidScrollable_androidKt {
+  }
+
+  public final class DragGestureDetectorKt {
+    method public static suspend Object? awaitDragOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
+    method public static suspend Object? awaitHorizontalDragOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
+    method public static suspend Object? awaitHorizontalTouchSlopOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super java.lang.Float,kotlin.Unit> onTouchSlopReached, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
+    method public static suspend Object? awaitTouchSlopOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onTouchSlopReached, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
+    method public static suspend Object? awaitVerticalDragOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
+    method public static suspend Object? awaitVerticalTouchSlopOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super java.lang.Float,kotlin.Unit> onTouchSlopReached, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
+    method public static suspend Object? detectDragGestures(androidx.compose.ui.input.pointer.PointerInputScope, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDragStart, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragEnd, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragCancel, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? detectDragGesturesAfterLongPress(androidx.compose.ui.input.pointer.PointerInputScope, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDragStart, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragEnd, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragCancel, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? detectHorizontalDragGestures(androidx.compose.ui.input.pointer.PointerInputScope, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDragStart, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragEnd, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragCancel, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super java.lang.Float,kotlin.Unit> onHorizontalDrag, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? detectVerticalDragGestures(androidx.compose.ui.input.pointer.PointerInputScope, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDragStart, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragEnd, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragCancel, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super java.lang.Float,kotlin.Unit> onVerticalDrag, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? drag(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.pointer.PointerInputChange,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
+    method public static suspend Object? horizontalDrag(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.pointer.PointerInputChange,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
+    method public static suspend Object? verticalDrag(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.pointer.PointerInputChange,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
+  }
+
+  public interface DragScope {
+    method public void dragBy(float pixels);
+  }
+
+  public final class DraggableKt {
+    method public static androidx.compose.foundation.gestures.DraggableState DraggableState(kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onDelta);
+    method public static androidx.compose.ui.Modifier draggable(androidx.compose.ui.Modifier, androidx.compose.foundation.gestures.DraggableState state, androidx.compose.foundation.gestures.Orientation orientation, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource? interactionSource, optional boolean startDragImmediately, optional kotlin.jvm.functions.Function3<? super kotlinx.coroutines.CoroutineScope,? super androidx.compose.ui.geometry.Offset,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> onDragStarted, optional kotlin.jvm.functions.Function3<? super kotlinx.coroutines.CoroutineScope,? super java.lang.Float,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> onDragStopped, optional boolean reverseDirection);
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.gestures.DraggableState rememberDraggableState(kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onDelta);
+  }
+
+  public interface DraggableState {
+    method public void dispatchRawDelta(float delta);
+    method public suspend Object? drag(optional androidx.compose.foundation.MutatePriority dragPriority, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.gestures.DragScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+  }
+
+  @androidx.compose.runtime.Stable public interface FlingBehavior {
+    method public suspend Object? performFling(androidx.compose.foundation.gestures.ScrollScope, float initialVelocity, kotlin.coroutines.Continuation<? super java.lang.Float> p);
+  }
+
+  public final class ForEachGestureKt {
+    method public static suspend Object? forEachGesture(androidx.compose.ui.input.pointer.PointerInputScope, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+  }
+
+  public final class GestureCancellationException extends java.util.concurrent.CancellationException {
+    ctor public GestureCancellationException(optional String? message);
+  }
+
+  public enum Orientation {
+    enum_constant public static final androidx.compose.foundation.gestures.Orientation Horizontal;
+    enum_constant public static final androidx.compose.foundation.gestures.Orientation Vertical;
+  }
+
+  public final class OverScrollConfigurationKt {
+  }
+
+  public interface PressGestureScope extends androidx.compose.ui.unit.Density {
+    method public suspend Object? awaitRelease(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public suspend Object? tryAwaitRelease(kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
+  }
+
+  public final class ScrollExtensionsKt {
+    method public static suspend Object? animateScrollBy(androidx.compose.foundation.gestures.ScrollableState, float value, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.coroutines.Continuation<? super java.lang.Float> p);
+    method public static suspend Object? scrollBy(androidx.compose.foundation.gestures.ScrollableState, float value, kotlin.coroutines.Continuation<? super java.lang.Float> p);
+    method public static suspend Object? stopScroll(androidx.compose.foundation.gestures.ScrollableState, optional androidx.compose.foundation.MutatePriority scrollPriority, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+  }
+
+  public interface ScrollScope {
+    method public float scrollBy(float pixels);
+  }
+
+  public final class ScrollableDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.gestures.FlingBehavior flingBehavior();
+    field public static final androidx.compose.foundation.gestures.ScrollableDefaults INSTANCE;
+  }
+
+  public final class ScrollableKt {
+    method public static androidx.compose.ui.Modifier scrollable(androidx.compose.ui.Modifier, androidx.compose.foundation.gestures.ScrollableState state, androidx.compose.foundation.gestures.Orientation orientation, optional boolean enabled, optional boolean reverseDirection, optional androidx.compose.foundation.gestures.FlingBehavior? flingBehavior, optional androidx.compose.foundation.interaction.MutableInteractionSource? interactionSource);
+  }
+
+  public interface ScrollableState {
+    method public float dispatchRawDelta(float delta);
+    method public boolean isScrollInProgress();
+    method public suspend Object? scroll(optional androidx.compose.foundation.MutatePriority scrollPriority, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.gestures.ScrollScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    property public abstract boolean isScrollInProgress;
+  }
+
+  public final class ScrollableStateKt {
+    method public static androidx.compose.foundation.gestures.ScrollableState ScrollableState(kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> consumeScrollDelta);
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.gestures.ScrollableState rememberScrollableState(kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> consumeScrollDelta);
+  }
+
+  public final class TapGestureDetectorKt {
+    method public static suspend Object? awaitFirstDown(androidx.compose.ui.input.pointer.AwaitPointerEventScope, optional boolean requireUnconsumed, optional kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
+    method public static suspend Object? detectTapGestures(androidx.compose.ui.input.pointer.PointerInputScope, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit>? onDoubleTap, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit>? onLongPress, optional kotlin.jvm.functions.Function3<? super androidx.compose.foundation.gestures.PressGestureScope,? super androidx.compose.ui.geometry.Offset,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> onPress, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit>? onTap, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? waitForUpOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
+  }
+
+  public final class TransformGestureDetectorKt {
+    method public static long calculateCentroid(androidx.compose.ui.input.pointer.PointerEvent, optional boolean useCurrent);
+    method public static float calculateCentroidSize(androidx.compose.ui.input.pointer.PointerEvent, optional boolean useCurrent);
+    method public static long calculatePan(androidx.compose.ui.input.pointer.PointerEvent);
+    method public static float calculateRotation(androidx.compose.ui.input.pointer.PointerEvent);
+    method public static float calculateZoom(androidx.compose.ui.input.pointer.PointerEvent);
+    method public static suspend Object? detectTransformGestures(androidx.compose.ui.input.pointer.PointerInputScope, optional boolean panZoomLock, kotlin.jvm.functions.Function4<? super androidx.compose.ui.geometry.Offset,? super androidx.compose.ui.geometry.Offset,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> onGesture, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+  }
+
+  public interface TransformScope {
+    method public void transformBy(optional float zoomChange, optional long panChange, optional float rotationChange);
+  }
+
+  public final class TransformableKt {
+    method public static androidx.compose.ui.Modifier transformable(androidx.compose.ui.Modifier, androidx.compose.foundation.gestures.TransformableState state, optional boolean lockRotationOnZoomPan, optional boolean enabled);
+  }
+
+  public interface TransformableState {
+    method public boolean isTransformInProgress();
+    method public suspend Object? transform(optional androidx.compose.foundation.MutatePriority transformPriority, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.gestures.TransformScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    property public abstract boolean isTransformInProgress;
+  }
+
+  public final class TransformableStateKt {
+    method public static androidx.compose.foundation.gestures.TransformableState TransformableState(kotlin.jvm.functions.Function3<? super java.lang.Float,? super androidx.compose.ui.geometry.Offset,? super java.lang.Float,kotlin.Unit> onTransformation);
+    method public static suspend Object? animatePanBy(androidx.compose.foundation.gestures.TransformableState, long offset, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.geometry.Offset> animationSpec, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? animateRotateBy(androidx.compose.foundation.gestures.TransformableState, float degrees, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? animateZoomBy(androidx.compose.foundation.gestures.TransformableState, float zoomFactor, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? panBy(androidx.compose.foundation.gestures.TransformableState, long offset, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.gestures.TransformableState rememberTransformableState(kotlin.jvm.functions.Function3<? super java.lang.Float,? super androidx.compose.ui.geometry.Offset,? super java.lang.Float,kotlin.Unit> onTransformation);
+    method public static suspend Object? rotateBy(androidx.compose.foundation.gestures.TransformableState, float degrees, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? stopTransformation(androidx.compose.foundation.gestures.TransformableState, optional androidx.compose.foundation.MutatePriority terminationPriority, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? zoomBy(androidx.compose.foundation.gestures.TransformableState, float zoomFactor, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+  }
+
+}
+
+package androidx.compose.foundation.interaction {
+
+  public interface DragInteraction extends androidx.compose.foundation.interaction.Interaction {
+  }
+
+  public static final class DragInteraction.Cancel implements androidx.compose.foundation.interaction.DragInteraction {
+    ctor public DragInteraction.Cancel(androidx.compose.foundation.interaction.DragInteraction.Start start);
+    method public androidx.compose.foundation.interaction.DragInteraction.Start getStart();
+    property public final androidx.compose.foundation.interaction.DragInteraction.Start start;
+  }
+
+  public static final class DragInteraction.Start implements androidx.compose.foundation.interaction.DragInteraction {
+    ctor public DragInteraction.Start();
+  }
+
+  public static final class DragInteraction.Stop implements androidx.compose.foundation.interaction.DragInteraction {
+    ctor public DragInteraction.Stop(androidx.compose.foundation.interaction.DragInteraction.Start start);
+    method public androidx.compose.foundation.interaction.DragInteraction.Start getStart();
+    property public final androidx.compose.foundation.interaction.DragInteraction.Start start;
+  }
+
+  public final class DragInteractionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> collectIsDraggedAsState(androidx.compose.foundation.interaction.InteractionSource);
+  }
+
+  public interface FocusInteraction extends androidx.compose.foundation.interaction.Interaction {
+  }
+
+  public static final class FocusInteraction.Focus implements androidx.compose.foundation.interaction.FocusInteraction {
+    ctor public FocusInteraction.Focus();
+  }
+
+  public static final class FocusInteraction.Unfocus implements androidx.compose.foundation.interaction.FocusInteraction {
+    ctor public FocusInteraction.Unfocus(androidx.compose.foundation.interaction.FocusInteraction.Focus focus);
+    method public androidx.compose.foundation.interaction.FocusInteraction.Focus getFocus();
+    property public final androidx.compose.foundation.interaction.FocusInteraction.Focus focus;
+  }
+
+  public final class FocusInteractionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> collectIsFocusedAsState(androidx.compose.foundation.interaction.InteractionSource);
+  }
+
+  public interface HoverInteraction extends androidx.compose.foundation.interaction.Interaction {
+  }
+
+  public static final class HoverInteraction.Enter implements androidx.compose.foundation.interaction.HoverInteraction {
+    ctor public HoverInteraction.Enter();
+  }
+
+  public static final class HoverInteraction.Exit implements androidx.compose.foundation.interaction.HoverInteraction {
+    ctor public HoverInteraction.Exit(androidx.compose.foundation.interaction.HoverInteraction.Enter enter);
+    method public androidx.compose.foundation.interaction.HoverInteraction.Enter getEnter();
+    property public final androidx.compose.foundation.interaction.HoverInteraction.Enter enter;
+  }
+
+  public final class HoverInteractionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> collectIsHoveredAsState(androidx.compose.foundation.interaction.InteractionSource);
+  }
+
+  public interface Interaction {
+  }
+
+  @androidx.compose.runtime.Stable public interface InteractionSource {
+    method public kotlinx.coroutines.flow.Flow<androidx.compose.foundation.interaction.Interaction> getInteractions();
+    property public abstract kotlinx.coroutines.flow.Flow<androidx.compose.foundation.interaction.Interaction> interactions;
+  }
+
+  public final class InteractionSourceKt {
+    method public static androidx.compose.foundation.interaction.MutableInteractionSource MutableInteractionSource();
+  }
+
+  @androidx.compose.runtime.Stable public interface MutableInteractionSource extends androidx.compose.foundation.interaction.InteractionSource {
+    method public suspend Object? emit(androidx.compose.foundation.interaction.Interaction interaction, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public boolean tryEmit(androidx.compose.foundation.interaction.Interaction interaction);
+  }
+
+  public interface PressInteraction extends androidx.compose.foundation.interaction.Interaction {
+  }
+
+  public static final class PressInteraction.Cancel implements androidx.compose.foundation.interaction.PressInteraction {
+    ctor public PressInteraction.Cancel(androidx.compose.foundation.interaction.PressInteraction.Press press);
+    method public androidx.compose.foundation.interaction.PressInteraction.Press getPress();
+    property public final androidx.compose.foundation.interaction.PressInteraction.Press press;
+  }
+
+  public static final class PressInteraction.Press implements androidx.compose.foundation.interaction.PressInteraction {
+    ctor public PressInteraction.Press(long pressPosition);
+    method public long getPressPosition();
+    property public final long pressPosition;
+  }
+
+  public static final class PressInteraction.Release implements androidx.compose.foundation.interaction.PressInteraction {
+    ctor public PressInteraction.Release(androidx.compose.foundation.interaction.PressInteraction.Press press);
+    method public androidx.compose.foundation.interaction.PressInteraction.Press getPress();
+    property public final androidx.compose.foundation.interaction.PressInteraction.Press press;
+  }
+
+  public final class PressInteractionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> collectIsPressedAsState(androidx.compose.foundation.interaction.InteractionSource);
+  }
+
+}
+
+package androidx.compose.foundation.lazy {
+
+  public final class IntervalListKt {
+  }
+
+  public final class LazyDslKt {
+    method @androidx.compose.runtime.Composable public static void LazyColumn(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.LazyListState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.ui.Alignment.Horizontal horizontalAlignment, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void LazyRow(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.LazyListState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.ui.Alignment.Vertical verticalAlignment, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,kotlin.Unit> content);
+    method public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function1<? super T,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+    method public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, T![] items, optional kotlin.jvm.functions.Function1<? super T,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+    method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+    method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+  }
+
+  public final class LazyGridKt {
+  }
+
+  @androidx.compose.foundation.lazy.LazyScopeMarker @androidx.compose.runtime.Stable public interface LazyItemScope {
+    method public androidx.compose.ui.Modifier fillParentMaxHeight(androidx.compose.ui.Modifier, optional float fraction);
+    method public androidx.compose.ui.Modifier fillParentMaxSize(androidx.compose.ui.Modifier, optional float fraction);
+    method public androidx.compose.ui.Modifier fillParentMaxWidth(androidx.compose.ui.Modifier, optional float fraction);
+  }
+
+  public final class LazyListHeadersKt {
+  }
+
+  public interface LazyListItemInfo {
+    method public int getIndex();
+    method public Object getKey();
+    method public int getOffset();
+    method public int getSize();
+    property public abstract int index;
+    property public abstract Object key;
+    property public abstract int offset;
+    property public abstract int size;
+  }
+
+  public final class LazyListItemsProviderImplKt {
+  }
+
+  public final class LazyListKt {
+  }
+
+  public interface LazyListLayoutInfo {
+    method public int getTotalItemsCount();
+    method public int getViewportEndOffset();
+    method public int getViewportStartOffset();
+    method public java.util.List<androidx.compose.foundation.lazy.LazyListItemInfo> getVisibleItemsInfo();
+    property public abstract int totalItemsCount;
+    property public abstract int viewportEndOffset;
+    property public abstract int viewportStartOffset;
+    property public abstract java.util.List<androidx.compose.foundation.lazy.LazyListItemInfo> visibleItemsInfo;
+  }
+
+  public final class LazyListMeasureKt {
+  }
+
+  @androidx.compose.foundation.lazy.LazyScopeMarker public interface LazyListScope {
+    method public void item(optional Object? key, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
+    method public void items(int count, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
+  }
+
+  public final class LazyListScrollingKt {
+  }
+
+  @androidx.compose.runtime.Stable public final class LazyListState implements androidx.compose.foundation.gestures.ScrollableState {
+    ctor public LazyListState(optional int firstVisibleItemIndex, optional int firstVisibleItemScrollOffset);
+    method public suspend Object? animateScrollToItem(int index, optional int scrollOffset, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public float dispatchRawDelta(float delta);
+    method public int getFirstVisibleItemIndex();
+    method public int getFirstVisibleItemScrollOffset();
+    method public androidx.compose.foundation.interaction.InteractionSource getInteractionSource();
+    method public androidx.compose.foundation.lazy.LazyListLayoutInfo getLayoutInfo();
+    method public boolean isScrollInProgress();
+    method public suspend Object? scroll(androidx.compose.foundation.MutatePriority scrollPriority, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.gestures.ScrollScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public suspend Object? scrollToItem(int index, optional int scrollOffset, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    property public final int firstVisibleItemIndex;
+    property public final int firstVisibleItemScrollOffset;
+    property public final androidx.compose.foundation.interaction.InteractionSource interactionSource;
+    property public boolean isScrollInProgress;
+    property public final androidx.compose.foundation.lazy.LazyListLayoutInfo layoutInfo;
+    field public static final androidx.compose.foundation.lazy.LazyListState.Companion Companion;
+  }
+
+  public static final class LazyListState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.lazy.LazyListState,?> getSaver();
+    property public final androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.lazy.LazyListState,?> Saver;
+  }
+
+  public final class LazyListStateKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.lazy.LazyListState rememberLazyListState(optional int initialFirstVisibleItemIndex, optional int initialFirstVisibleItemScrollOffset);
+  }
+
+  @kotlin.DslMarker public @interface LazyScopeMarker {
+  }
+
+  public final class LazySemanticsKt {
+  }
+
+  public final class Lazy_androidKt {
+  }
+
+}
+
+package androidx.compose.foundation.lazy.layout {
+
+  public final class LazyLayoutItemContentFactoryKt {
+  }
+
+  public final class LazyLayoutKt {
+  }
+
+  public final class LazyLayoutPrefetchPolicyKt {
+  }
+
+  public final class LazyLayoutPrefetcher_androidKt {
+  }
+
+  public final class LazyLayoutStateKt {
+  }
+
+}
+
+package androidx.compose.foundation.relocation {
+
+  public final class BringIntoViewRequesterKt {
+  }
+
+  public final class BringRectangleOnScreen_androidKt {
+  }
+
+}
+
+package androidx.compose.foundation.selection {
+
+  public final class SelectableGroupKt {
+    method public static androidx.compose.ui.Modifier selectableGroup(androidx.compose.ui.Modifier);
+  }
+
+  public final class SelectableKt {
+    method public static androidx.compose.ui.Modifier selectable(androidx.compose.ui.Modifier, boolean selected, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static androidx.compose.ui.Modifier selectable(androidx.compose.ui.Modifier, boolean selected, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+  }
+
+  public final class ToggleableKt {
+    method public static androidx.compose.ui.Modifier toggleable(androidx.compose.ui.Modifier, boolean value, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange);
+    method public static androidx.compose.ui.Modifier toggleable(androidx.compose.ui.Modifier, boolean value, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange);
+    method public static androidx.compose.ui.Modifier triStateToggleable(androidx.compose.ui.Modifier, androidx.compose.ui.state.ToggleableState state, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static androidx.compose.ui.Modifier triStateToggleable(androidx.compose.ui.Modifier, androidx.compose.ui.state.ToggleableState state, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+  }
+
+}
+
+package androidx.compose.foundation.shape {
+
+  public final class AbsoluteCutCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public AbsoluteCutCornerShape(androidx.compose.foundation.shape.CornerSize topLeft, androidx.compose.foundation.shape.CornerSize topRight, androidx.compose.foundation.shape.CornerSize bottomRight, androidx.compose.foundation.shape.CornerSize bottomLeft);
+    method public androidx.compose.foundation.shape.AbsoluteCutCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class AbsoluteCutCornerShapeKt {
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(optional int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+  }
+
+  public final class AbsoluteRoundedCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public AbsoluteRoundedCornerShape(androidx.compose.foundation.shape.CornerSize topLeft, androidx.compose.foundation.shape.CornerSize topRight, androidx.compose.foundation.shape.CornerSize bottomRight, androidx.compose.foundation.shape.CornerSize bottomLeft);
+    method public androidx.compose.foundation.shape.AbsoluteRoundedCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class AbsoluteRoundedCornerShapeKt {
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(optional int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+  }
+
+  public abstract class CornerBasedShape implements androidx.compose.ui.graphics.Shape {
+    ctor public CornerBasedShape(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public abstract androidx.compose.foundation.shape.CornerBasedShape copy(optional androidx.compose.foundation.shape.CornerSize topStart, optional androidx.compose.foundation.shape.CornerSize topEnd, optional androidx.compose.foundation.shape.CornerSize bottomEnd, optional androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public final androidx.compose.foundation.shape.CornerBasedShape copy(androidx.compose.foundation.shape.CornerSize all);
+    method public final androidx.compose.ui.graphics.Outline createOutline(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+    method public abstract androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public final androidx.compose.foundation.shape.CornerSize getBottomEnd();
+    method public final androidx.compose.foundation.shape.CornerSize getBottomStart();
+    method public final androidx.compose.foundation.shape.CornerSize getTopEnd();
+    method public final androidx.compose.foundation.shape.CornerSize getTopStart();
+    property public final androidx.compose.foundation.shape.CornerSize bottomEnd;
+    property public final androidx.compose.foundation.shape.CornerSize bottomStart;
+    property public final androidx.compose.foundation.shape.CornerSize topEnd;
+    property public final androidx.compose.foundation.shape.CornerSize topStart;
+  }
+
+  @androidx.compose.runtime.Immutable public interface CornerSize {
+    method public float toPx(long shapeSize, androidx.compose.ui.unit.Density density);
+  }
+
+  public final class CornerSizeKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(int percent);
+    method public static androidx.compose.foundation.shape.CornerSize getZeroCornerSize();
+    property public static final androidx.compose.foundation.shape.CornerSize ZeroCornerSize;
+  }
+
+  public final class CutCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public CutCornerShape(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.foundation.shape.CutCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class CutCornerShapeKt {
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(optional int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+  }
+
+  public final class GenericShape implements androidx.compose.ui.graphics.Shape {
+    ctor public GenericShape(kotlin.jvm.functions.Function3<? super androidx.compose.ui.graphics.Path,? super androidx.compose.ui.geometry.Size,? super androidx.compose.ui.unit.LayoutDirection,kotlin.Unit> builder);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+  }
+
+  public final class RoundedCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public RoundedCornerShape(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.foundation.shape.RoundedCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class RoundedCornerShapeKt {
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape getCircleShape();
+    property public static final androidx.compose.foundation.shape.RoundedCornerShape CircleShape;
+  }
+
+}
+
+package androidx.compose.foundation.text {
+
+  public final class AndroidCursorHandle_androidKt {
+  }
+
+  public final class BasicTextFieldKt {
+    method @androidx.compose.runtime.Composable public static void BasicTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Brush cursorBrush, optional kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> decorationBox);
+    method @androidx.compose.runtime.Composable public static void BasicTextField(androidx.compose.ui.text.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.TextFieldValue,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Brush cursorBrush, optional kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> decorationBox);
+  }
+
+  public final class BasicTextKt {
+    method @androidx.compose.runtime.Composable public static void BasicText(String text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional int overflow, optional boolean softWrap, optional int maxLines);
+    method @androidx.compose.runtime.Composable public static void BasicText(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.Map<java.lang.String,androidx.compose.foundation.text.InlineTextContent> inlineContent);
+  }
+
+  public final class ClickableTextKt {
+    method @androidx.compose.runtime.Composable public static void ClickableText(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional boolean softWrap, optional int overflow, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
+  }
+
+  public final class CoreTextFieldKt {
+  }
+
+  public final class CoreTextKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class InlineTextContent {
+    ctor public InlineTextContent(androidx.compose.ui.text.Placeholder placeholder, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> children);
+    method public kotlin.jvm.functions.Function1<java.lang.String,kotlin.Unit> getChildren();
+    method public androidx.compose.ui.text.Placeholder getPlaceholder();
+    property public final kotlin.jvm.functions.Function1<java.lang.String,kotlin.Unit> children;
+    property public final androidx.compose.ui.text.Placeholder placeholder;
+  }
+
+  public final class InlineTextContentKt {
+    method public static void appendInlineContent(androidx.compose.ui.text.AnnotatedString.Builder, String id, optional String alternateText);
+  }
+
+  public final class KeyEventHelpers_androidKt {
+  }
+
+  public final class KeyMappingKt {
+  }
+
+  public final class KeyMapping_androidKt {
+  }
+
+  public interface KeyboardActionScope {
+    method public void defaultKeyboardAction(int imeAction);
+  }
+
+  public final class KeyboardActions {
+    ctor public KeyboardActions(optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onDone, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onGo, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onNext, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onPrevious, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSearch, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSend);
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnDone();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnGo();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnNext();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnPrevious();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnSearch();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnSend();
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onDone;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onGo;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onNext;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onPrevious;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSearch;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSend;
+    field public static final androidx.compose.foundation.text.KeyboardActions.Companion Companion;
+  }
+
+  public static final class KeyboardActions.Companion {
+    method public androidx.compose.foundation.text.KeyboardActions getDefault();
+    property public final androidx.compose.foundation.text.KeyboardActions Default;
+  }
+
+  public final class KeyboardActionsKt {
+    method public static androidx.compose.foundation.text.KeyboardActions KeyboardActions(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit> onAny);
+  }
+
+  @androidx.compose.runtime.Immutable public final class KeyboardOptions {
+    ctor public KeyboardOptions(optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public androidx.compose.foundation.text.KeyboardOptions copy(optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public boolean getAutoCorrect();
+    method public int getCapitalization();
+    method public int getImeAction();
+    method public int getKeyboardType();
+    property public final boolean autoCorrect;
+    property public final int capitalization;
+    property public final int imeAction;
+    property public final int keyboardType;
+    field public static final androidx.compose.foundation.text.KeyboardOptions.Companion Companion;
+  }
+
+  public static final class KeyboardOptions.Companion {
+    method public androidx.compose.foundation.text.KeyboardOptions getDefault();
+    property public final androidx.compose.foundation.text.KeyboardOptions Default;
+  }
+
+  public final class LongPressTextDragObserverKt {
+  }
+
+  public final class MaxLinesHeightModifierKt {
+  }
+
+  public final class StringHelpersKt {
+  }
+
+  public final class StringHelpers_androidKt {
+  }
+
+  public final class StringHelpers_jvmKt {
+  }
+
+  public final class TextFieldCursorKt {
+  }
+
+  public final class TextFieldDelegateKt {
+  }
+
+  public final class TextFieldGestureModifiersKt {
+  }
+
+  public final class TextFieldKeyInputKt {
+  }
+
+  public final class TextFieldKeyInput_androidKt {
+  }
+
+  public final class TextFieldPressGestureFilterKt {
+  }
+
+  public final class TextFieldScrollKt {
+  }
+
+  public final class TextFieldSizeKt {
+  }
+
+  public final class TextLayoutHelperKt {
+  }
+
+  public final class TextLayoutResultProxyKt {
+  }
+
+  public final class TextPointerIcon_androidKt {
+  }
+
+  public final class TouchMode_androidKt {
+  }
+
+  public final class UndoManagerKt {
+  }
+
+  public final class UndoManager_jvmKt {
+  }
+
+}
+
+package androidx.compose.foundation.text.selection {
+
+  public final class AndroidSelectionHandles_androidKt {
+  }
+
+  public final class MultiWidgetSelectionDelegateKt {
+  }
+
+  public final class SelectionAdjustmentKt {
+  }
+
+  public final class SelectionContainerKt {
+    method @androidx.compose.runtime.Composable public static void DisableSelection(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void SelectionContainer(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class SelectionHandlesKt {
+  }
+
+  public final class SelectionManagerKt {
+  }
+
+  public final class SelectionManager_androidKt {
+  }
+
+  public final class SelectionRegistrarKt {
+  }
+
+  public final class SimpleLayoutKt {
+  }
+
+  public final class TextFieldSelectionDelegateKt {
+  }
+
+  public final class TextFieldSelectionManagerKt {
+  }
+
+  public final class TextFieldSelectionManager_androidKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextSelectionColors {
+    ctor public TextSelectionColors(long handleColor, long backgroundColor);
+    method public long getBackgroundColor();
+    method public long getHandleColor();
+    property public final long backgroundColor;
+    property public final long handleColor;
+  }
+
+  public final class TextSelectionColorsKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> getLocalTextSelectionColors();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> LocalTextSelectionColors;
+  }
+
+  public final class TextSelectionDelegateKt {
+  }
+
+  public final class TextSelectionMouseDetectorKt {
+  }
+
+}
+
diff --git a/compose/foundation/foundation/api/current.ignore b/compose/foundation/foundation/api/current.ignore
index 110a916..a3cabae 100644
--- a/compose/foundation/foundation/api/current.ignore
+++ b/compose/foundation/foundation/api/current.ignore
@@ -1,11 +1,11 @@
 // Baseline format: 1.0
+InvalidNullConversion: androidx.compose.foundation.ImageKt#Image(androidx.compose.ui.graphics.ImageBitmap, String, androidx.compose.ui.Modifier, androidx.compose.ui.Alignment, androidx.compose.ui.layout.ContentScale, float, androidx.compose.ui.graphics.ColorFilter) parameter #1:
+    Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter contentDescription in androidx.compose.foundation.ImageKt.Image(androidx.compose.ui.graphics.ImageBitmap bitmap, String contentDescription, androidx.compose.ui.Modifier modifier, androidx.compose.ui.Alignment alignment, androidx.compose.ui.layout.ContentScale contentScale, float alpha, androidx.compose.ui.graphics.ColorFilter colorFilter)
+
+
 RemovedClass: androidx.compose.foundation.gestures.RelativeVelocityTrackerKt:
     Removed class androidx.compose.foundation.gestures.RelativeVelocityTrackerKt
 RemovedClass: androidx.compose.foundation.lazy.LazyListItemContentFactoryKt:
     Removed class androidx.compose.foundation.lazy.LazyListItemContentFactoryKt
 RemovedClass: androidx.compose.foundation.lazy.LazyListPrefetcher_androidKt:
     Removed class androidx.compose.foundation.lazy.LazyListPrefetcher_androidKt
-
-
-RemovedMethod: androidx.compose.foundation.ImageKt#Image(androidx.compose.ui.graphics.ImageBitmap, String, androidx.compose.ui.Modifier, androidx.compose.ui.Alignment, androidx.compose.ui.layout.ContentScale, float, androidx.compose.ui.graphics.ColorFilter):
-    Removed method androidx.compose.foundation.ImageKt.Image(androidx.compose.ui.graphics.ImageBitmap,String,androidx.compose.ui.Modifier,androidx.compose.ui.Alignment,androidx.compose.ui.layout.ContentScale,float,androidx.compose.ui.graphics.ColorFilter)
diff --git a/compose/foundation/foundation/api/current.txt b/compose/foundation/foundation/api/current.txt
index 26fd022..e06e978 100644
--- a/compose/foundation/foundation/api/current.txt
+++ b/compose/foundation/foundation/api/current.txt
@@ -59,6 +59,7 @@
     method @androidx.compose.runtime.Composable public static void Image(androidx.compose.ui.graphics.ImageBitmap bitmap, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int filterQuality);
     method @androidx.compose.runtime.Composable public static void Image(androidx.compose.ui.graphics.vector.ImageVector imageVector, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
     method @androidx.compose.runtime.Composable public static void Image(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method @Deprecated @androidx.compose.runtime.Composable public static void Image(androidx.compose.ui.graphics.ImageBitmap bitmap, String contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
   }
 
   @androidx.compose.runtime.Stable public interface Indication {
@@ -72,6 +73,7 @@
   public final class IndicationKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.Indication> getLocalIndication();
     method public static androidx.compose.ui.Modifier indication(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.InteractionSource interactionSource, androidx.compose.foundation.Indication? indication);
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.Indication> LocalIndication;
   }
 
   public enum MutatePriority {
@@ -488,6 +490,16 @@
 
 }
 
+package androidx.compose.foundation.relocation {
+
+  public final class BringIntoViewRequesterKt {
+  }
+
+  public final class BringRectangleOnScreen_androidKt {
+  }
+
+}
+
 package androidx.compose.foundation.selection {
 
   public final class SelectableGroupKt {
@@ -567,6 +579,7 @@
     method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(float size);
     method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(int percent);
     method public static androidx.compose.foundation.shape.CornerSize getZeroCornerSize();
+    property public static final androidx.compose.foundation.shape.CornerSize ZeroCornerSize;
   }
 
   public final class CutCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
@@ -605,6 +618,7 @@
     method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
     method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
     method public static androidx.compose.foundation.shape.RoundedCornerShape getCircleShape();
+    property public static final androidx.compose.foundation.shape.RoundedCornerShape CircleShape;
   }
 
 }
@@ -749,6 +763,9 @@
   public final class TextLayoutResultProxyKt {
   }
 
+  public final class TextPointerIcon_androidKt {
+  }
+
   public final class TouchMode_androidKt {
   }
 
@@ -810,6 +827,7 @@
 
   public final class TextSelectionColorsKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> getLocalTextSelectionColors();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> LocalTextSelectionColors;
   }
 
   public final class TextSelectionDelegateKt {
diff --git a/compose/foundation/foundation/api/public_plus_experimental_1.1.0-beta02.txt b/compose/foundation/foundation/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..b9fe538
--- /dev/null
+++ b/compose/foundation/foundation/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,909 @@
+// Signature format: 4.0
+package androidx.compose.foundation {
+
+  public final class ActualJvmKt {
+  }
+
+  public final class BackgroundKt {
+    method public static androidx.compose.ui.Modifier background(androidx.compose.ui.Modifier, long color, optional androidx.compose.ui.graphics.Shape shape);
+    method public static androidx.compose.ui.Modifier background(androidx.compose.ui.Modifier, androidx.compose.ui.graphics.Brush brush, optional androidx.compose.ui.graphics.Shape shape, optional float alpha);
+  }
+
+  public final class BorderKt {
+    method public static androidx.compose.ui.Modifier border(androidx.compose.ui.Modifier, androidx.compose.foundation.BorderStroke border, optional androidx.compose.ui.graphics.Shape shape);
+    method public static androidx.compose.ui.Modifier border(androidx.compose.ui.Modifier, float width, long color, optional androidx.compose.ui.graphics.Shape shape);
+    method public static androidx.compose.ui.Modifier border(androidx.compose.ui.Modifier, float width, androidx.compose.ui.graphics.Brush brush, androidx.compose.ui.graphics.Shape shape);
+  }
+
+  @androidx.compose.runtime.Immutable public final class BorderStroke {
+    ctor public BorderStroke(float width, androidx.compose.ui.graphics.Brush brush);
+    method public androidx.compose.foundation.BorderStroke copy(optional float width, optional androidx.compose.ui.graphics.Brush brush);
+    method public androidx.compose.ui.graphics.Brush getBrush();
+    method public float getWidth();
+    property public final androidx.compose.ui.graphics.Brush brush;
+    property public final float width;
+  }
+
+  public final class BorderStrokeKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.BorderStroke BorderStroke(float width, long color);
+  }
+
+  public final class CanvasKt {
+    method @androidx.compose.runtime.Composable public static void Canvas(androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> onDraw);
+    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static void Canvas(androidx.compose.ui.Modifier modifier, String contentDescription, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> onDraw);
+  }
+
+  public final class ClickableKt {
+    method public static androidx.compose.ui.Modifier clickable(androidx.compose.ui.Modifier, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static androidx.compose.ui.Modifier clickable(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.ui.Modifier combinedClickable(androidx.compose.ui.Modifier, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, optional String? onLongClickLabel, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onLongClick, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDoubleClick, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.ui.Modifier combinedClickable(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, optional String? onLongClickLabel, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onLongClick, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDoubleClick, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+  }
+
+  public final class Clickable_androidKt {
+  }
+
+  public final class DarkThemeKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean isSystemInDarkTheme();
+  }
+
+  public final class DarkTheme_androidKt {
+  }
+
+  @kotlin.RequiresOptIn(message="This foundation API is experimental and is likely to change or be removed in the " + "future.") public @interface ExperimentalFoundationApi {
+  }
+
+  public final class FocusableKt {
+    method public static androidx.compose.ui.Modifier focusable(androidx.compose.ui.Modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource? interactionSource);
+  }
+
+  public final class HoverableKt {
+    method public static androidx.compose.ui.Modifier hoverable(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional boolean enabled);
+  }
+
+  public final class ImageKt {
+    method @androidx.compose.runtime.Composable public static void Image(androidx.compose.ui.graphics.ImageBitmap bitmap, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int filterQuality);
+    method @androidx.compose.runtime.Composable public static void Image(androidx.compose.ui.graphics.vector.ImageVector imageVector, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method @androidx.compose.runtime.Composable public static void Image(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method @Deprecated @androidx.compose.runtime.Composable public static void Image(androidx.compose.ui.graphics.ImageBitmap bitmap, String contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+  }
+
+  @androidx.compose.runtime.Stable public interface Indication {
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.IndicationInstance rememberUpdatedInstance(androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
+  public interface IndicationInstance {
+    method public void drawIndication(androidx.compose.ui.graphics.drawscope.ContentDrawScope);
+  }
+
+  public final class IndicationKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.Indication> getLocalIndication();
+    method public static androidx.compose.ui.Modifier indication(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.InteractionSource interactionSource, androidx.compose.foundation.Indication? indication);
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.Indication> LocalIndication;
+  }
+
+  @kotlin.RequiresOptIn(message="This API is internal to library.") @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface InternalFoundationApi {
+  }
+
+  public enum MutatePriority {
+    enum_constant public static final androidx.compose.foundation.MutatePriority Default;
+    enum_constant public static final androidx.compose.foundation.MutatePriority PreventUserInput;
+    enum_constant public static final androidx.compose.foundation.MutatePriority UserInput;
+  }
+
+  @androidx.compose.runtime.Stable public final class MutatorMutex {
+    ctor public MutatorMutex();
+    method public suspend <R> Object? mutate(optional androidx.compose.foundation.MutatePriority priority, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R> p);
+    method public suspend <T, R> Object? mutateWith(T? receiver, optional androidx.compose.foundation.MutatePriority priority, kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R> p);
+  }
+
+  public final class ProgressSemanticsKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier progressSemantics(androidx.compose.ui.Modifier, float value, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional int steps);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier progressSemantics(androidx.compose.ui.Modifier);
+  }
+
+  public final class ScrollKt {
+    method public static androidx.compose.ui.Modifier horizontalScroll(androidx.compose.ui.Modifier, androidx.compose.foundation.ScrollState state, optional boolean enabled, optional androidx.compose.foundation.gestures.FlingBehavior? flingBehavior, optional boolean reverseScrolling);
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.ScrollState rememberScrollState(optional int initial);
+    method public static androidx.compose.ui.Modifier verticalScroll(androidx.compose.ui.Modifier, androidx.compose.foundation.ScrollState state, optional boolean enabled, optional androidx.compose.foundation.gestures.FlingBehavior? flingBehavior, optional boolean reverseScrolling);
+  }
+
+  @androidx.compose.runtime.Stable public final class ScrollState implements androidx.compose.foundation.gestures.ScrollableState {
+    ctor public ScrollState(int initial);
+    method public suspend Object? animateScrollTo(int value, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public float dispatchRawDelta(float delta);
+    method public androidx.compose.foundation.interaction.InteractionSource getInteractionSource();
+    method public int getMaxValue();
+    method public int getValue();
+    method public boolean isScrollInProgress();
+    method public suspend Object? scroll(androidx.compose.foundation.MutatePriority scrollPriority, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.gestures.ScrollScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public suspend Object? scrollTo(int value, kotlin.coroutines.Continuation<? super java.lang.Float> p);
+    property public final androidx.compose.foundation.interaction.InteractionSource interactionSource;
+    property public boolean isScrollInProgress;
+    property public final int maxValue;
+    property public final int value;
+    field public static final androidx.compose.foundation.ScrollState.Companion Companion;
+  }
+
+  public static final class ScrollState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.ScrollState,?> getSaver();
+    property public final androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.ScrollState,?> Saver;
+  }
+
+  public final class TempListUtilsKt {
+  }
+
+}
+
+package androidx.compose.foundation.gestures {
+
+  public final class AndroidOverScrollKt {
+  }
+
+  public final class AndroidScrollable_androidKt {
+  }
+
+  public final class DragGestureDetectorKt {
+    method public static suspend Object? awaitDragOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
+    method public static suspend Object? awaitHorizontalDragOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
+    method public static suspend Object? awaitHorizontalTouchSlopOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super java.lang.Float,kotlin.Unit> onTouchSlopReached, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
+    method public static suspend Object? awaitTouchSlopOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onTouchSlopReached, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
+    method public static suspend Object? awaitVerticalDragOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
+    method public static suspend Object? awaitVerticalTouchSlopOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super java.lang.Float,kotlin.Unit> onTouchSlopReached, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
+    method public static suspend Object? detectDragGestures(androidx.compose.ui.input.pointer.PointerInputScope, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDragStart, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragEnd, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragCancel, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? detectDragGesturesAfterLongPress(androidx.compose.ui.input.pointer.PointerInputScope, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDragStart, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragEnd, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragCancel, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? detectHorizontalDragGestures(androidx.compose.ui.input.pointer.PointerInputScope, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDragStart, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragEnd, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragCancel, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super java.lang.Float,kotlin.Unit> onHorizontalDrag, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? detectVerticalDragGestures(androidx.compose.ui.input.pointer.PointerInputScope, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDragStart, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragEnd, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragCancel, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super java.lang.Float,kotlin.Unit> onVerticalDrag, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? drag(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.pointer.PointerInputChange,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
+    method public static suspend Object? horizontalDrag(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.pointer.PointerInputChange,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
+    method public static suspend Object? verticalDrag(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.pointer.PointerInputChange,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
+  }
+
+  public interface DragScope {
+    method public void dragBy(float pixels);
+  }
+
+  public final class DraggableKt {
+    method public static androidx.compose.foundation.gestures.DraggableState DraggableState(kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onDelta);
+    method public static androidx.compose.ui.Modifier draggable(androidx.compose.ui.Modifier, androidx.compose.foundation.gestures.DraggableState state, androidx.compose.foundation.gestures.Orientation orientation, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource? interactionSource, optional boolean startDragImmediately, optional kotlin.jvm.functions.Function3<? super kotlinx.coroutines.CoroutineScope,? super androidx.compose.ui.geometry.Offset,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> onDragStarted, optional kotlin.jvm.functions.Function3<? super kotlinx.coroutines.CoroutineScope,? super java.lang.Float,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> onDragStopped, optional boolean reverseDirection);
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.gestures.DraggableState rememberDraggableState(kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onDelta);
+  }
+
+  public interface DraggableState {
+    method public void dispatchRawDelta(float delta);
+    method public suspend Object? drag(optional androidx.compose.foundation.MutatePriority dragPriority, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.gestures.DragScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+  }
+
+  @androidx.compose.runtime.Stable public interface FlingBehavior {
+    method public suspend Object? performFling(androidx.compose.foundation.gestures.ScrollScope, float initialVelocity, kotlin.coroutines.Continuation<? super java.lang.Float> p);
+  }
+
+  public final class ForEachGestureKt {
+    method public static suspend Object? forEachGesture(androidx.compose.ui.input.pointer.PointerInputScope, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+  }
+
+  public final class GestureCancellationException extends java.util.concurrent.CancellationException {
+    ctor public GestureCancellationException(optional String? message);
+  }
+
+  public enum Orientation {
+    enum_constant public static final androidx.compose.foundation.gestures.Orientation Horizontal;
+    enum_constant public static final androidx.compose.foundation.gestures.Orientation Vertical;
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Stable public final class OverScrollConfiguration {
+    ctor public OverScrollConfiguration(optional long glowColor, optional boolean forceShowAlways, optional androidx.compose.foundation.layout.PaddingValues drawPadding);
+    method public androidx.compose.foundation.layout.PaddingValues getDrawPadding();
+    method public boolean getForceShowAlways();
+    method public long getGlowColor();
+    property public final androidx.compose.foundation.layout.PaddingValues drawPadding;
+    property public final boolean forceShowAlways;
+    property public final long glowColor;
+  }
+
+  public final class OverScrollConfigurationKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.gestures.OverScrollConfiguration> getLocalOverScrollConfiguration();
+    property @androidx.compose.foundation.ExperimentalFoundationApi public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.gestures.OverScrollConfiguration> LocalOverScrollConfiguration;
+  }
+
+  public interface PressGestureScope extends androidx.compose.ui.unit.Density {
+    method public suspend Object? awaitRelease(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public suspend Object? tryAwaitRelease(kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
+  }
+
+  public final class ScrollExtensionsKt {
+    method public static suspend Object? animateScrollBy(androidx.compose.foundation.gestures.ScrollableState, float value, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.coroutines.Continuation<? super java.lang.Float> p);
+    method public static suspend Object? scrollBy(androidx.compose.foundation.gestures.ScrollableState, float value, kotlin.coroutines.Continuation<? super java.lang.Float> p);
+    method public static suspend Object? stopScroll(androidx.compose.foundation.gestures.ScrollableState, optional androidx.compose.foundation.MutatePriority scrollPriority, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+  }
+
+  public interface ScrollScope {
+    method public float scrollBy(float pixels);
+  }
+
+  public final class ScrollableDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.gestures.FlingBehavior flingBehavior();
+    field public static final androidx.compose.foundation.gestures.ScrollableDefaults INSTANCE;
+  }
+
+  public final class ScrollableKt {
+    method public static androidx.compose.ui.Modifier scrollable(androidx.compose.ui.Modifier, androidx.compose.foundation.gestures.ScrollableState state, androidx.compose.foundation.gestures.Orientation orientation, optional boolean enabled, optional boolean reverseDirection, optional androidx.compose.foundation.gestures.FlingBehavior? flingBehavior, optional androidx.compose.foundation.interaction.MutableInteractionSource? interactionSource);
+  }
+
+  public interface ScrollableState {
+    method public float dispatchRawDelta(float delta);
+    method public boolean isScrollInProgress();
+    method public suspend Object? scroll(optional androidx.compose.foundation.MutatePriority scrollPriority, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.gestures.ScrollScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    property public abstract boolean isScrollInProgress;
+  }
+
+  public final class ScrollableStateKt {
+    method public static androidx.compose.foundation.gestures.ScrollableState ScrollableState(kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> consumeScrollDelta);
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.gestures.ScrollableState rememberScrollableState(kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> consumeScrollDelta);
+  }
+
+  public final class TapGestureDetectorKt {
+    method public static suspend Object? awaitFirstDown(androidx.compose.ui.input.pointer.AwaitPointerEventScope, optional boolean requireUnconsumed, optional kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
+    method public static suspend Object? detectTapGestures(androidx.compose.ui.input.pointer.PointerInputScope, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit>? onDoubleTap, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit>? onLongPress, optional kotlin.jvm.functions.Function3<? super androidx.compose.foundation.gestures.PressGestureScope,? super androidx.compose.ui.geometry.Offset,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> onPress, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit>? onTap, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? waitForUpOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
+  }
+
+  public final class TransformGestureDetectorKt {
+    method public static long calculateCentroid(androidx.compose.ui.input.pointer.PointerEvent, optional boolean useCurrent);
+    method public static float calculateCentroidSize(androidx.compose.ui.input.pointer.PointerEvent, optional boolean useCurrent);
+    method public static long calculatePan(androidx.compose.ui.input.pointer.PointerEvent);
+    method public static float calculateRotation(androidx.compose.ui.input.pointer.PointerEvent);
+    method public static float calculateZoom(androidx.compose.ui.input.pointer.PointerEvent);
+    method public static suspend Object? detectTransformGestures(androidx.compose.ui.input.pointer.PointerInputScope, optional boolean panZoomLock, kotlin.jvm.functions.Function4<? super androidx.compose.ui.geometry.Offset,? super androidx.compose.ui.geometry.Offset,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> onGesture, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+  }
+
+  public interface TransformScope {
+    method public void transformBy(optional float zoomChange, optional long panChange, optional float rotationChange);
+  }
+
+  public final class TransformableKt {
+    method public static androidx.compose.ui.Modifier transformable(androidx.compose.ui.Modifier, androidx.compose.foundation.gestures.TransformableState state, optional boolean lockRotationOnZoomPan, optional boolean enabled);
+  }
+
+  public interface TransformableState {
+    method public boolean isTransformInProgress();
+    method public suspend Object? transform(optional androidx.compose.foundation.MutatePriority transformPriority, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.gestures.TransformScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    property public abstract boolean isTransformInProgress;
+  }
+
+  public final class TransformableStateKt {
+    method public static androidx.compose.foundation.gestures.TransformableState TransformableState(kotlin.jvm.functions.Function3<? super java.lang.Float,? super androidx.compose.ui.geometry.Offset,? super java.lang.Float,kotlin.Unit> onTransformation);
+    method public static suspend Object? animatePanBy(androidx.compose.foundation.gestures.TransformableState, long offset, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.geometry.Offset> animationSpec, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? animateRotateBy(androidx.compose.foundation.gestures.TransformableState, float degrees, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? animateZoomBy(androidx.compose.foundation.gestures.TransformableState, float zoomFactor, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? panBy(androidx.compose.foundation.gestures.TransformableState, long offset, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.gestures.TransformableState rememberTransformableState(kotlin.jvm.functions.Function3<? super java.lang.Float,? super androidx.compose.ui.geometry.Offset,? super java.lang.Float,kotlin.Unit> onTransformation);
+    method public static suspend Object? rotateBy(androidx.compose.foundation.gestures.TransformableState, float degrees, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? stopTransformation(androidx.compose.foundation.gestures.TransformableState, optional androidx.compose.foundation.MutatePriority terminationPriority, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? zoomBy(androidx.compose.foundation.gestures.TransformableState, float zoomFactor, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+  }
+
+}
+
+package androidx.compose.foundation.interaction {
+
+  public interface DragInteraction extends androidx.compose.foundation.interaction.Interaction {
+  }
+
+  public static final class DragInteraction.Cancel implements androidx.compose.foundation.interaction.DragInteraction {
+    ctor public DragInteraction.Cancel(androidx.compose.foundation.interaction.DragInteraction.Start start);
+    method public androidx.compose.foundation.interaction.DragInteraction.Start getStart();
+    property public final androidx.compose.foundation.interaction.DragInteraction.Start start;
+  }
+
+  public static final class DragInteraction.Start implements androidx.compose.foundation.interaction.DragInteraction {
+    ctor public DragInteraction.Start();
+  }
+
+  public static final class DragInteraction.Stop implements androidx.compose.foundation.interaction.DragInteraction {
+    ctor public DragInteraction.Stop(androidx.compose.foundation.interaction.DragInteraction.Start start);
+    method public androidx.compose.foundation.interaction.DragInteraction.Start getStart();
+    property public final androidx.compose.foundation.interaction.DragInteraction.Start start;
+  }
+
+  public final class DragInteractionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> collectIsDraggedAsState(androidx.compose.foundation.interaction.InteractionSource);
+  }
+
+  public interface FocusInteraction extends androidx.compose.foundation.interaction.Interaction {
+  }
+
+  public static final class FocusInteraction.Focus implements androidx.compose.foundation.interaction.FocusInteraction {
+    ctor public FocusInteraction.Focus();
+  }
+
+  public static final class FocusInteraction.Unfocus implements androidx.compose.foundation.interaction.FocusInteraction {
+    ctor public FocusInteraction.Unfocus(androidx.compose.foundation.interaction.FocusInteraction.Focus focus);
+    method public androidx.compose.foundation.interaction.FocusInteraction.Focus getFocus();
+    property public final androidx.compose.foundation.interaction.FocusInteraction.Focus focus;
+  }
+
+  public final class FocusInteractionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> collectIsFocusedAsState(androidx.compose.foundation.interaction.InteractionSource);
+  }
+
+  public interface HoverInteraction extends androidx.compose.foundation.interaction.Interaction {
+  }
+
+  public static final class HoverInteraction.Enter implements androidx.compose.foundation.interaction.HoverInteraction {
+    ctor public HoverInteraction.Enter();
+  }
+
+  public static final class HoverInteraction.Exit implements androidx.compose.foundation.interaction.HoverInteraction {
+    ctor public HoverInteraction.Exit(androidx.compose.foundation.interaction.HoverInteraction.Enter enter);
+    method public androidx.compose.foundation.interaction.HoverInteraction.Enter getEnter();
+    property public final androidx.compose.foundation.interaction.HoverInteraction.Enter enter;
+  }
+
+  public final class HoverInteractionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> collectIsHoveredAsState(androidx.compose.foundation.interaction.InteractionSource);
+  }
+
+  public interface Interaction {
+  }
+
+  @androidx.compose.runtime.Stable public interface InteractionSource {
+    method public kotlinx.coroutines.flow.Flow<androidx.compose.foundation.interaction.Interaction> getInteractions();
+    property public abstract kotlinx.coroutines.flow.Flow<androidx.compose.foundation.interaction.Interaction> interactions;
+  }
+
+  public final class InteractionSourceKt {
+    method public static androidx.compose.foundation.interaction.MutableInteractionSource MutableInteractionSource();
+  }
+
+  @androidx.compose.runtime.Stable public interface MutableInteractionSource extends androidx.compose.foundation.interaction.InteractionSource {
+    method public suspend Object? emit(androidx.compose.foundation.interaction.Interaction interaction, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public boolean tryEmit(androidx.compose.foundation.interaction.Interaction interaction);
+  }
+
+  public interface PressInteraction extends androidx.compose.foundation.interaction.Interaction {
+  }
+
+  public static final class PressInteraction.Cancel implements androidx.compose.foundation.interaction.PressInteraction {
+    ctor public PressInteraction.Cancel(androidx.compose.foundation.interaction.PressInteraction.Press press);
+    method public androidx.compose.foundation.interaction.PressInteraction.Press getPress();
+    property public final androidx.compose.foundation.interaction.PressInteraction.Press press;
+  }
+
+  public static final class PressInteraction.Press implements androidx.compose.foundation.interaction.PressInteraction {
+    ctor public PressInteraction.Press(long pressPosition);
+    method public long getPressPosition();
+    property public final long pressPosition;
+  }
+
+  public static final class PressInteraction.Release implements androidx.compose.foundation.interaction.PressInteraction {
+    ctor public PressInteraction.Release(androidx.compose.foundation.interaction.PressInteraction.Press press);
+    method public androidx.compose.foundation.interaction.PressInteraction.Press getPress();
+    property public final androidx.compose.foundation.interaction.PressInteraction.Press press;
+  }
+
+  public final class PressInteractionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> collectIsPressedAsState(androidx.compose.foundation.interaction.InteractionSource);
+  }
+
+}
+
+package androidx.compose.foundation.lazy {
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public abstract sealed class GridCells {
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public static final class GridCells.Adaptive extends androidx.compose.foundation.lazy.GridCells {
+    ctor public GridCells.Adaptive(float minSize);
+    method public float getMinSize();
+    property public final float minSize;
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public static final class GridCells.Fixed extends androidx.compose.foundation.lazy.GridCells {
+    ctor public GridCells.Fixed(int count);
+    method public int getCount();
+    property public final int count;
+  }
+
+  public final class IntervalListKt {
+  }
+
+  public final class LazyDslKt {
+    method @androidx.compose.runtime.Composable public static void LazyColumn(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.LazyListState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.ui.Alignment.Horizontal horizontalAlignment, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void LazyRow(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.LazyListState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.ui.Alignment.Vertical verticalAlignment, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,kotlin.Unit> content);
+    method public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function1<? super T,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+    method public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, T![] items, optional kotlin.jvm.functions.Function1<? super T,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+    method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+    method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+  }
+
+  public final class LazyGridKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi @androidx.compose.runtime.Composable public static void LazyVerticalGrid(androidx.compose.foundation.lazy.GridCells cells, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.LazyListState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyGridScope,kotlin.Unit> content);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static inline <T> void items(androidx.compose.foundation.lazy.LazyGridScope, java.util.List<? extends T> items, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static inline <T> void items(androidx.compose.foundation.lazy.LazyGridScope, T![] items, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyGridScope, java.util.List<? extends T> items, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyGridScope, T![] items, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public interface LazyGridScope {
+    method public void item(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
+    method public void items(int count, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
+  }
+
+  @androidx.compose.foundation.lazy.LazyScopeMarker @androidx.compose.runtime.Stable public interface LazyItemScope {
+    method public androidx.compose.ui.Modifier fillParentMaxHeight(androidx.compose.ui.Modifier, optional float fraction);
+    method public androidx.compose.ui.Modifier fillParentMaxSize(androidx.compose.ui.Modifier, optional float fraction);
+    method public androidx.compose.ui.Modifier fillParentMaxWidth(androidx.compose.ui.Modifier, optional float fraction);
+  }
+
+  public final class LazyListHeadersKt {
+  }
+
+  public interface LazyListItemInfo {
+    method public int getIndex();
+    method public Object getKey();
+    method public int getOffset();
+    method public int getSize();
+    property public abstract int index;
+    property public abstract Object key;
+    property public abstract int offset;
+    property public abstract int size;
+  }
+
+  public final class LazyListItemsProviderImplKt {
+  }
+
+  public final class LazyListKt {
+  }
+
+  public interface LazyListLayoutInfo {
+    method public int getTotalItemsCount();
+    method public int getViewportEndOffset();
+    method public int getViewportStartOffset();
+    method public java.util.List<androidx.compose.foundation.lazy.LazyListItemInfo> getVisibleItemsInfo();
+    property public abstract int totalItemsCount;
+    property public abstract int viewportEndOffset;
+    property public abstract int viewportStartOffset;
+    property public abstract java.util.List<androidx.compose.foundation.lazy.LazyListItemInfo> visibleItemsInfo;
+  }
+
+  public final class LazyListMeasureKt {
+  }
+
+  @androidx.compose.foundation.lazy.LazyScopeMarker public interface LazyListScope {
+    method public void item(optional Object? key, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
+    method public void items(int count, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public void stickyHeader(optional Object? key, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
+  }
+
+  public final class LazyListScrollingKt {
+  }
+
+  @androidx.compose.runtime.Stable public final class LazyListState implements androidx.compose.foundation.gestures.ScrollableState {
+    ctor public LazyListState(optional int firstVisibleItemIndex, optional int firstVisibleItemScrollOffset);
+    method public suspend Object? animateScrollToItem(int index, optional int scrollOffset, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public float dispatchRawDelta(float delta);
+    method public int getFirstVisibleItemIndex();
+    method public int getFirstVisibleItemScrollOffset();
+    method public androidx.compose.foundation.interaction.InteractionSource getInteractionSource();
+    method public androidx.compose.foundation.lazy.LazyListLayoutInfo getLayoutInfo();
+    method public boolean isScrollInProgress();
+    method public suspend Object? scroll(androidx.compose.foundation.MutatePriority scrollPriority, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.gestures.ScrollScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public suspend Object? scrollToItem(int index, optional int scrollOffset, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    property public final int firstVisibleItemIndex;
+    property public final int firstVisibleItemScrollOffset;
+    property public final androidx.compose.foundation.interaction.InteractionSource interactionSource;
+    property public boolean isScrollInProgress;
+    property public final androidx.compose.foundation.lazy.LazyListLayoutInfo layoutInfo;
+    field public static final androidx.compose.foundation.lazy.LazyListState.Companion Companion;
+  }
+
+  public static final class LazyListState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.lazy.LazyListState,?> getSaver();
+    property public final androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.lazy.LazyListState,?> Saver;
+  }
+
+  public final class LazyListStateKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.lazy.LazyListState rememberLazyListState(optional int initialFirstVisibleItemIndex, optional int initialFirstVisibleItemScrollOffset);
+  }
+
+  @kotlin.DslMarker public @interface LazyScopeMarker {
+  }
+
+  public final class LazySemanticsKt {
+  }
+
+  public final class Lazy_androidKt {
+  }
+
+}
+
+package androidx.compose.foundation.lazy.layout {
+
+  public final class LazyLayoutItemContentFactoryKt {
+  }
+
+  public final class LazyLayoutKt {
+  }
+
+  public final class LazyLayoutPrefetchPolicyKt {
+  }
+
+  public final class LazyLayoutPrefetcher_androidKt {
+  }
+
+  public final class LazyLayoutStateKt {
+  }
+
+}
+
+package androidx.compose.foundation.relocation {
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public sealed interface BringIntoViewRequester {
+    method public suspend Object? bringIntoView(optional androidx.compose.ui.geometry.Rect? rect, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+  }
+
+  public final class BringIntoViewRequesterKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.foundation.relocation.BringIntoViewRequester BringIntoViewRequester();
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.ui.Modifier bringIntoViewRequester(androidx.compose.ui.Modifier, androidx.compose.foundation.relocation.BringIntoViewRequester bringIntoViewRequester);
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public interface BringIntoViewResponder {
+    method public suspend Object? bringIntoView(androidx.compose.ui.geometry.Rect rect, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public androidx.compose.ui.geometry.Rect toLocalRect(androidx.compose.ui.geometry.Rect rect, androidx.compose.ui.layout.LayoutCoordinates layoutCoordinates);
+    field public static final androidx.compose.foundation.relocation.BringIntoViewResponder.Companion Companion;
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public static final class BringIntoViewResponder.Companion {
+    method public androidx.compose.ui.modifier.ProvidableModifierLocal<androidx.compose.foundation.relocation.BringIntoViewResponder> getModifierLocalBringIntoViewResponder();
+    method public androidx.compose.foundation.relocation.BringIntoViewResponder getRootBringIntoViewResponder();
+    property public final androidx.compose.ui.modifier.ProvidableModifierLocal<androidx.compose.foundation.relocation.BringIntoViewResponder> ModifierLocalBringIntoViewResponder;
+    property public final androidx.compose.foundation.relocation.BringIntoViewResponder RootBringIntoViewResponder;
+  }
+
+  public final class BringRectangleOnScreen_androidKt {
+  }
+
+}
+
+package androidx.compose.foundation.selection {
+
+  public final class SelectableGroupKt {
+    method public static androidx.compose.ui.Modifier selectableGroup(androidx.compose.ui.Modifier);
+  }
+
+  public final class SelectableKt {
+    method public static androidx.compose.ui.Modifier selectable(androidx.compose.ui.Modifier, boolean selected, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static androidx.compose.ui.Modifier selectable(androidx.compose.ui.Modifier, boolean selected, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+  }
+
+  public final class ToggleableKt {
+    method public static androidx.compose.ui.Modifier toggleable(androidx.compose.ui.Modifier, boolean value, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange);
+    method public static androidx.compose.ui.Modifier toggleable(androidx.compose.ui.Modifier, boolean value, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange);
+    method public static androidx.compose.ui.Modifier triStateToggleable(androidx.compose.ui.Modifier, androidx.compose.ui.state.ToggleableState state, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static androidx.compose.ui.Modifier triStateToggleable(androidx.compose.ui.Modifier, androidx.compose.ui.state.ToggleableState state, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+  }
+
+}
+
+package androidx.compose.foundation.shape {
+
+  public final class AbsoluteCutCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public AbsoluteCutCornerShape(androidx.compose.foundation.shape.CornerSize topLeft, androidx.compose.foundation.shape.CornerSize topRight, androidx.compose.foundation.shape.CornerSize bottomRight, androidx.compose.foundation.shape.CornerSize bottomLeft);
+    method public androidx.compose.foundation.shape.AbsoluteCutCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class AbsoluteCutCornerShapeKt {
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(optional int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+  }
+
+  public final class AbsoluteRoundedCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public AbsoluteRoundedCornerShape(androidx.compose.foundation.shape.CornerSize topLeft, androidx.compose.foundation.shape.CornerSize topRight, androidx.compose.foundation.shape.CornerSize bottomRight, androidx.compose.foundation.shape.CornerSize bottomLeft);
+    method public androidx.compose.foundation.shape.AbsoluteRoundedCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class AbsoluteRoundedCornerShapeKt {
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(optional int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+  }
+
+  public abstract class CornerBasedShape implements androidx.compose.ui.graphics.Shape {
+    ctor public CornerBasedShape(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public abstract androidx.compose.foundation.shape.CornerBasedShape copy(optional androidx.compose.foundation.shape.CornerSize topStart, optional androidx.compose.foundation.shape.CornerSize topEnd, optional androidx.compose.foundation.shape.CornerSize bottomEnd, optional androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public final androidx.compose.foundation.shape.CornerBasedShape copy(androidx.compose.foundation.shape.CornerSize all);
+    method public final androidx.compose.ui.graphics.Outline createOutline(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+    method public abstract androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public final androidx.compose.foundation.shape.CornerSize getBottomEnd();
+    method public final androidx.compose.foundation.shape.CornerSize getBottomStart();
+    method public final androidx.compose.foundation.shape.CornerSize getTopEnd();
+    method public final androidx.compose.foundation.shape.CornerSize getTopStart();
+    property public final androidx.compose.foundation.shape.CornerSize bottomEnd;
+    property public final androidx.compose.foundation.shape.CornerSize bottomStart;
+    property public final androidx.compose.foundation.shape.CornerSize topEnd;
+    property public final androidx.compose.foundation.shape.CornerSize topStart;
+  }
+
+  @androidx.compose.runtime.Immutable public interface CornerSize {
+    method public float toPx(long shapeSize, androidx.compose.ui.unit.Density density);
+  }
+
+  public final class CornerSizeKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(int percent);
+    method public static androidx.compose.foundation.shape.CornerSize getZeroCornerSize();
+    property public static final androidx.compose.foundation.shape.CornerSize ZeroCornerSize;
+  }
+
+  public final class CutCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public CutCornerShape(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.foundation.shape.CutCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class CutCornerShapeKt {
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(optional int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+  }
+
+  public final class GenericShape implements androidx.compose.ui.graphics.Shape {
+    ctor public GenericShape(kotlin.jvm.functions.Function3<? super androidx.compose.ui.graphics.Path,? super androidx.compose.ui.geometry.Size,? super androidx.compose.ui.unit.LayoutDirection,kotlin.Unit> builder);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+  }
+
+  public final class RoundedCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public RoundedCornerShape(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.foundation.shape.RoundedCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class RoundedCornerShapeKt {
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape getCircleShape();
+    property public static final androidx.compose.foundation.shape.RoundedCornerShape CircleShape;
+  }
+
+}
+
+package androidx.compose.foundation.text {
+
+  public final class AndroidCursorHandle_androidKt {
+  }
+
+  public final class BasicTextFieldKt {
+    method @androidx.compose.runtime.Composable public static void BasicTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Brush cursorBrush, optional kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> decorationBox);
+    method @androidx.compose.runtime.Composable public static void BasicTextField(androidx.compose.ui.text.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.TextFieldValue,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Brush cursorBrush, optional kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> decorationBox);
+  }
+
+  public final class BasicTextKt {
+    method @androidx.compose.runtime.Composable public static void BasicText(String text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional int overflow, optional boolean softWrap, optional int maxLines);
+    method @androidx.compose.runtime.Composable public static void BasicText(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.Map<java.lang.String,androidx.compose.foundation.text.InlineTextContent> inlineContent);
+  }
+
+  public final class ClickableTextKt {
+    method @androidx.compose.runtime.Composable public static void ClickableText(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional boolean softWrap, optional int overflow, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
+  }
+
+  public final class CoreTextFieldKt {
+  }
+
+  public final class CoreTextKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class InlineTextContent {
+    ctor public InlineTextContent(androidx.compose.ui.text.Placeholder placeholder, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> children);
+    method public kotlin.jvm.functions.Function1<java.lang.String,kotlin.Unit> getChildren();
+    method public androidx.compose.ui.text.Placeholder getPlaceholder();
+    property public final kotlin.jvm.functions.Function1<java.lang.String,kotlin.Unit> children;
+    property public final androidx.compose.ui.text.Placeholder placeholder;
+  }
+
+  public final class InlineTextContentKt {
+    method public static void appendInlineContent(androidx.compose.ui.text.AnnotatedString.Builder, String id, optional String alternateText);
+  }
+
+  @kotlin.RequiresOptIn(message="Internal/Unstable API for use only between foundation modules sharing " + "the same exact version, subject to change without notice.") @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface InternalFoundationTextApi {
+  }
+
+  public final class KeyEventHelpers_androidKt {
+  }
+
+  public final class KeyMappingKt {
+  }
+
+  public final class KeyMapping_androidKt {
+  }
+
+  public interface KeyboardActionScope {
+    method public void defaultKeyboardAction(int imeAction);
+  }
+
+  public final class KeyboardActions {
+    ctor public KeyboardActions(optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onDone, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onGo, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onNext, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onPrevious, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSearch, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSend);
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnDone();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnGo();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnNext();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnPrevious();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnSearch();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnSend();
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onDone;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onGo;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onNext;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onPrevious;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSearch;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSend;
+    field public static final androidx.compose.foundation.text.KeyboardActions.Companion Companion;
+  }
+
+  public static final class KeyboardActions.Companion {
+    method public androidx.compose.foundation.text.KeyboardActions getDefault();
+    property public final androidx.compose.foundation.text.KeyboardActions Default;
+  }
+
+  public final class KeyboardActionsKt {
+    method public static androidx.compose.foundation.text.KeyboardActions KeyboardActions(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit> onAny);
+  }
+
+  @androidx.compose.runtime.Immutable public final class KeyboardOptions {
+    ctor public KeyboardOptions(optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public androidx.compose.foundation.text.KeyboardOptions copy(optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public boolean getAutoCorrect();
+    method public int getCapitalization();
+    method public int getImeAction();
+    method public int getKeyboardType();
+    property public final boolean autoCorrect;
+    property public final int capitalization;
+    property public final int imeAction;
+    property public final int keyboardType;
+    field public static final androidx.compose.foundation.text.KeyboardOptions.Companion Companion;
+  }
+
+  public static final class KeyboardOptions.Companion {
+    method public androidx.compose.foundation.text.KeyboardOptions getDefault();
+    property public final androidx.compose.foundation.text.KeyboardOptions Default;
+  }
+
+  public final class LongPressTextDragObserverKt {
+  }
+
+  public final class MaxLinesHeightModifierKt {
+  }
+
+  public final class StringHelpersKt {
+  }
+
+  public final class StringHelpers_androidKt {
+  }
+
+  public final class StringHelpers_jvmKt {
+  }
+
+  public final class TextFieldCursorKt {
+  }
+
+  public final class TextFieldDelegateKt {
+  }
+
+  public final class TextFieldGestureModifiersKt {
+  }
+
+  public final class TextFieldKeyInputKt {
+  }
+
+  public final class TextFieldKeyInput_androidKt {
+  }
+
+  public final class TextFieldPressGestureFilterKt {
+  }
+
+  public final class TextFieldScrollKt {
+  }
+
+  public final class TextFieldSizeKt {
+  }
+
+  public final class TextLayoutHelperKt {
+  }
+
+  public final class TextLayoutResultProxyKt {
+  }
+
+  public final class TextPointerIcon_androidKt {
+  }
+
+  public final class TouchMode_androidKt {
+  }
+
+  public final class UndoManagerKt {
+  }
+
+  public final class UndoManager_jvmKt {
+  }
+
+}
+
+package androidx.compose.foundation.text.selection {
+
+  public final class AndroidSelectionHandles_androidKt {
+  }
+
+  public final class MultiWidgetSelectionDelegateKt {
+  }
+
+  public final class SelectionAdjustmentKt {
+  }
+
+  public final class SelectionContainerKt {
+    method @androidx.compose.runtime.Composable public static void DisableSelection(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void SelectionContainer(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class SelectionHandlesKt {
+  }
+
+  public final class SelectionManagerKt {
+  }
+
+  public final class SelectionManager_androidKt {
+  }
+
+  public final class SelectionRegistrarKt {
+  }
+
+  public final class SimpleLayoutKt {
+  }
+
+  public final class TextFieldSelectionDelegateKt {
+  }
+
+  public final class TextFieldSelectionManagerKt {
+  }
+
+  public final class TextFieldSelectionManager_androidKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextSelectionColors {
+    ctor public TextSelectionColors(long handleColor, long backgroundColor);
+    method public long getBackgroundColor();
+    method public long getHandleColor();
+    property public final long backgroundColor;
+    property public final long handleColor;
+  }
+
+  public final class TextSelectionColorsKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> getLocalTextSelectionColors();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> LocalTextSelectionColors;
+  }
+
+  public final class TextSelectionDelegateKt {
+  }
+
+  public final class TextSelectionMouseDetectorKt {
+  }
+
+}
+
diff --git a/compose/foundation/foundation/api/public_plus_experimental_current.txt b/compose/foundation/foundation/api/public_plus_experimental_current.txt
index 56f8458..b9fe538 100644
--- a/compose/foundation/foundation/api/public_plus_experimental_current.txt
+++ b/compose/foundation/foundation/api/public_plus_experimental_current.txt
@@ -65,6 +65,7 @@
     method @androidx.compose.runtime.Composable public static void Image(androidx.compose.ui.graphics.ImageBitmap bitmap, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int filterQuality);
     method @androidx.compose.runtime.Composable public static void Image(androidx.compose.ui.graphics.vector.ImageVector imageVector, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
     method @androidx.compose.runtime.Composable public static void Image(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method @Deprecated @androidx.compose.runtime.Composable public static void Image(androidx.compose.ui.graphics.ImageBitmap bitmap, String contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
   }
 
   @androidx.compose.runtime.Stable public interface Indication {
@@ -78,6 +79,7 @@
   public final class IndicationKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.Indication> getLocalIndication();
     method public static androidx.compose.ui.Modifier indication(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.InteractionSource interactionSource, androidx.compose.foundation.Indication? indication);
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.Indication> LocalIndication;
   }
 
   @kotlin.RequiresOptIn(message="This API is internal to library.") @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface InternalFoundationApi {
@@ -201,6 +203,7 @@
 
   public final class OverScrollConfigurationKt {
     method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.gestures.OverScrollConfiguration> getLocalOverScrollConfiguration();
+    property @androidx.compose.foundation.ExperimentalFoundationApi public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.gestures.OverScrollConfiguration> LocalOverScrollConfiguration;
   }
 
   public interface PressGestureScope extends androidx.compose.ui.unit.Density {
@@ -534,6 +537,35 @@
 
 }
 
+package androidx.compose.foundation.relocation {
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public sealed interface BringIntoViewRequester {
+    method public suspend Object? bringIntoView(optional androidx.compose.ui.geometry.Rect? rect, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+  }
+
+  public final class BringIntoViewRequesterKt {
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.foundation.relocation.BringIntoViewRequester BringIntoViewRequester();
+    method @androidx.compose.foundation.ExperimentalFoundationApi public static androidx.compose.ui.Modifier bringIntoViewRequester(androidx.compose.ui.Modifier, androidx.compose.foundation.relocation.BringIntoViewRequester bringIntoViewRequester);
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public interface BringIntoViewResponder {
+    method public suspend Object? bringIntoView(androidx.compose.ui.geometry.Rect rect, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public androidx.compose.ui.geometry.Rect toLocalRect(androidx.compose.ui.geometry.Rect rect, androidx.compose.ui.layout.LayoutCoordinates layoutCoordinates);
+    field public static final androidx.compose.foundation.relocation.BringIntoViewResponder.Companion Companion;
+  }
+
+  @androidx.compose.foundation.ExperimentalFoundationApi public static final class BringIntoViewResponder.Companion {
+    method public androidx.compose.ui.modifier.ProvidableModifierLocal<androidx.compose.foundation.relocation.BringIntoViewResponder> getModifierLocalBringIntoViewResponder();
+    method public androidx.compose.foundation.relocation.BringIntoViewResponder getRootBringIntoViewResponder();
+    property public final androidx.compose.ui.modifier.ProvidableModifierLocal<androidx.compose.foundation.relocation.BringIntoViewResponder> ModifierLocalBringIntoViewResponder;
+    property public final androidx.compose.foundation.relocation.BringIntoViewResponder RootBringIntoViewResponder;
+  }
+
+  public final class BringRectangleOnScreen_androidKt {
+  }
+
+}
+
 package androidx.compose.foundation.selection {
 
   public final class SelectableGroupKt {
@@ -613,6 +645,7 @@
     method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(float size);
     method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(int percent);
     method public static androidx.compose.foundation.shape.CornerSize getZeroCornerSize();
+    property public static final androidx.compose.foundation.shape.CornerSize ZeroCornerSize;
   }
 
   public final class CutCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
@@ -651,6 +684,7 @@
     method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
     method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
     method public static androidx.compose.foundation.shape.RoundedCornerShape getCircleShape();
+    property public static final androidx.compose.foundation.shape.RoundedCornerShape CircleShape;
   }
 
 }
@@ -798,6 +832,9 @@
   public final class TextLayoutResultProxyKt {
   }
 
+  public final class TextPointerIcon_androidKt {
+  }
+
   public final class TouchMode_androidKt {
   }
 
@@ -859,6 +896,7 @@
 
   public final class TextSelectionColorsKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> getLocalTextSelectionColors();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> LocalTextSelectionColors;
   }
 
   public final class TextSelectionDelegateKt {
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/foundation/foundation/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to compose/foundation/foundation/api/res-1.1.0-beta02.txt
diff --git a/compose/foundation/foundation/api/restricted_1.1.0-beta02.txt b/compose/foundation/foundation/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..e06e978
--- /dev/null
+++ b/compose/foundation/foundation/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,840 @@
+// Signature format: 4.0
+package androidx.compose.foundation {
+
+  public final class ActualJvmKt {
+  }
+
+  public final class BackgroundKt {
+    method public static androidx.compose.ui.Modifier background(androidx.compose.ui.Modifier, long color, optional androidx.compose.ui.graphics.Shape shape);
+    method public static androidx.compose.ui.Modifier background(androidx.compose.ui.Modifier, androidx.compose.ui.graphics.Brush brush, optional androidx.compose.ui.graphics.Shape shape, optional float alpha);
+  }
+
+  public final class BorderKt {
+    method public static androidx.compose.ui.Modifier border(androidx.compose.ui.Modifier, androidx.compose.foundation.BorderStroke border, optional androidx.compose.ui.graphics.Shape shape);
+    method public static androidx.compose.ui.Modifier border(androidx.compose.ui.Modifier, float width, long color, optional androidx.compose.ui.graphics.Shape shape);
+    method public static androidx.compose.ui.Modifier border(androidx.compose.ui.Modifier, float width, androidx.compose.ui.graphics.Brush brush, androidx.compose.ui.graphics.Shape shape);
+  }
+
+  @androidx.compose.runtime.Immutable public final class BorderStroke {
+    ctor public BorderStroke(float width, androidx.compose.ui.graphics.Brush brush);
+    method public androidx.compose.foundation.BorderStroke copy(optional float width, optional androidx.compose.ui.graphics.Brush brush);
+    method public androidx.compose.ui.graphics.Brush getBrush();
+    method public float getWidth();
+    property public final androidx.compose.ui.graphics.Brush brush;
+    property public final float width;
+  }
+
+  public final class BorderStrokeKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.BorderStroke BorderStroke(float width, long color);
+  }
+
+  public final class CanvasKt {
+    method @androidx.compose.runtime.Composable public static void Canvas(androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> onDraw);
+  }
+
+  public final class ClickableKt {
+    method public static androidx.compose.ui.Modifier clickable(androidx.compose.ui.Modifier, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static androidx.compose.ui.Modifier clickable(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+  }
+
+  public final class Clickable_androidKt {
+  }
+
+  public final class DarkThemeKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean isSystemInDarkTheme();
+  }
+
+  public final class DarkTheme_androidKt {
+  }
+
+  public final class FocusableKt {
+    method public static androidx.compose.ui.Modifier focusable(androidx.compose.ui.Modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource? interactionSource);
+  }
+
+  public final class HoverableKt {
+    method public static androidx.compose.ui.Modifier hoverable(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional boolean enabled);
+  }
+
+  public final class ImageKt {
+    method @androidx.compose.runtime.Composable public static void Image(androidx.compose.ui.graphics.ImageBitmap bitmap, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int filterQuality);
+    method @androidx.compose.runtime.Composable public static void Image(androidx.compose.ui.graphics.vector.ImageVector imageVector, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method @androidx.compose.runtime.Composable public static void Image(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method @Deprecated @androidx.compose.runtime.Composable public static void Image(androidx.compose.ui.graphics.ImageBitmap bitmap, String contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+  }
+
+  @androidx.compose.runtime.Stable public interface Indication {
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.IndicationInstance rememberUpdatedInstance(androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
+  public interface IndicationInstance {
+    method public void drawIndication(androidx.compose.ui.graphics.drawscope.ContentDrawScope);
+  }
+
+  public final class IndicationKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.Indication> getLocalIndication();
+    method public static androidx.compose.ui.Modifier indication(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.InteractionSource interactionSource, androidx.compose.foundation.Indication? indication);
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.Indication> LocalIndication;
+  }
+
+  public enum MutatePriority {
+    enum_constant public static final androidx.compose.foundation.MutatePriority Default;
+    enum_constant public static final androidx.compose.foundation.MutatePriority PreventUserInput;
+    enum_constant public static final androidx.compose.foundation.MutatePriority UserInput;
+  }
+
+  @androidx.compose.runtime.Stable public final class MutatorMutex {
+    ctor public MutatorMutex();
+    method public suspend <R> Object? mutate(optional androidx.compose.foundation.MutatePriority priority, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R> p);
+    method public suspend <T, R> Object? mutateWith(T? receiver, optional androidx.compose.foundation.MutatePriority priority, kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R> p);
+  }
+
+  public final class ProgressSemanticsKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier progressSemantics(androidx.compose.ui.Modifier, float value, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional int steps);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier progressSemantics(androidx.compose.ui.Modifier);
+  }
+
+  public final class ScrollKt {
+    method public static androidx.compose.ui.Modifier horizontalScroll(androidx.compose.ui.Modifier, androidx.compose.foundation.ScrollState state, optional boolean enabled, optional androidx.compose.foundation.gestures.FlingBehavior? flingBehavior, optional boolean reverseScrolling);
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.ScrollState rememberScrollState(optional int initial);
+    method public static androidx.compose.ui.Modifier verticalScroll(androidx.compose.ui.Modifier, androidx.compose.foundation.ScrollState state, optional boolean enabled, optional androidx.compose.foundation.gestures.FlingBehavior? flingBehavior, optional boolean reverseScrolling);
+  }
+
+  @androidx.compose.runtime.Stable public final class ScrollState implements androidx.compose.foundation.gestures.ScrollableState {
+    ctor public ScrollState(int initial);
+    method public suspend Object? animateScrollTo(int value, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public float dispatchRawDelta(float delta);
+    method public androidx.compose.foundation.interaction.InteractionSource getInteractionSource();
+    method public int getMaxValue();
+    method public int getValue();
+    method public boolean isScrollInProgress();
+    method public suspend Object? scroll(androidx.compose.foundation.MutatePriority scrollPriority, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.gestures.ScrollScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public suspend Object? scrollTo(int value, kotlin.coroutines.Continuation<? super java.lang.Float> p);
+    property public final androidx.compose.foundation.interaction.InteractionSource interactionSource;
+    property public boolean isScrollInProgress;
+    property public final int maxValue;
+    property public final int value;
+    field public static final androidx.compose.foundation.ScrollState.Companion Companion;
+  }
+
+  public static final class ScrollState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.ScrollState,?> getSaver();
+    property public final androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.ScrollState,?> Saver;
+  }
+
+  public final class TempListUtilsKt {
+  }
+
+}
+
+package androidx.compose.foundation.gestures {
+
+  public final class AndroidOverScrollKt {
+  }
+
+  public final class AndroidScrollable_androidKt {
+  }
+
+  public final class DragGestureDetectorKt {
+    method public static suspend Object? awaitDragOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
+    method public static suspend Object? awaitHorizontalDragOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
+    method public static suspend Object? awaitHorizontalTouchSlopOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super java.lang.Float,kotlin.Unit> onTouchSlopReached, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
+    method public static suspend Object? awaitTouchSlopOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onTouchSlopReached, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
+    method public static suspend Object? awaitVerticalDragOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
+    method public static suspend Object? awaitVerticalTouchSlopOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super java.lang.Float,kotlin.Unit> onTouchSlopReached, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
+    method public static suspend Object? detectDragGestures(androidx.compose.ui.input.pointer.PointerInputScope, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDragStart, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragEnd, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragCancel, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? detectDragGesturesAfterLongPress(androidx.compose.ui.input.pointer.PointerInputScope, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDragStart, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragEnd, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragCancel, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? detectHorizontalDragGestures(androidx.compose.ui.input.pointer.PointerInputScope, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDragStart, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragEnd, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragCancel, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super java.lang.Float,kotlin.Unit> onHorizontalDrag, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? detectVerticalDragGestures(androidx.compose.ui.input.pointer.PointerInputScope, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit> onDragStart, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragEnd, optional kotlin.jvm.functions.Function0<kotlin.Unit> onDragCancel, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputChange,? super java.lang.Float,kotlin.Unit> onVerticalDrag, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? drag(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.pointer.PointerInputChange,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
+    method public static suspend Object? horizontalDrag(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.pointer.PointerInputChange,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
+    method public static suspend Object? verticalDrag(androidx.compose.ui.input.pointer.AwaitPointerEventScope, long pointerId, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.pointer.PointerInputChange,kotlin.Unit> onDrag, kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
+  }
+
+  public interface DragScope {
+    method public void dragBy(float pixels);
+  }
+
+  public final class DraggableKt {
+    method public static androidx.compose.foundation.gestures.DraggableState DraggableState(kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onDelta);
+    method public static androidx.compose.ui.Modifier draggable(androidx.compose.ui.Modifier, androidx.compose.foundation.gestures.DraggableState state, androidx.compose.foundation.gestures.Orientation orientation, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource? interactionSource, optional boolean startDragImmediately, optional kotlin.jvm.functions.Function3<? super kotlinx.coroutines.CoroutineScope,? super androidx.compose.ui.geometry.Offset,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> onDragStarted, optional kotlin.jvm.functions.Function3<? super kotlinx.coroutines.CoroutineScope,? super java.lang.Float,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> onDragStopped, optional boolean reverseDirection);
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.gestures.DraggableState rememberDraggableState(kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onDelta);
+  }
+
+  public interface DraggableState {
+    method public void dispatchRawDelta(float delta);
+    method public suspend Object? drag(optional androidx.compose.foundation.MutatePriority dragPriority, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.gestures.DragScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+  }
+
+  @androidx.compose.runtime.Stable public interface FlingBehavior {
+    method public suspend Object? performFling(androidx.compose.foundation.gestures.ScrollScope, float initialVelocity, kotlin.coroutines.Continuation<? super java.lang.Float> p);
+  }
+
+  public final class ForEachGestureKt {
+    method public static suspend Object? forEachGesture(androidx.compose.ui.input.pointer.PointerInputScope, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+  }
+
+  public final class GestureCancellationException extends java.util.concurrent.CancellationException {
+    ctor public GestureCancellationException(optional String? message);
+  }
+
+  public enum Orientation {
+    enum_constant public static final androidx.compose.foundation.gestures.Orientation Horizontal;
+    enum_constant public static final androidx.compose.foundation.gestures.Orientation Vertical;
+  }
+
+  public final class OverScrollConfigurationKt {
+  }
+
+  public interface PressGestureScope extends androidx.compose.ui.unit.Density {
+    method public suspend Object? awaitRelease(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public suspend Object? tryAwaitRelease(kotlin.coroutines.Continuation<? super java.lang.Boolean> p);
+  }
+
+  public final class ScrollExtensionsKt {
+    method public static suspend Object? animateScrollBy(androidx.compose.foundation.gestures.ScrollableState, float value, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.coroutines.Continuation<? super java.lang.Float> p);
+    method public static suspend Object? scrollBy(androidx.compose.foundation.gestures.ScrollableState, float value, kotlin.coroutines.Continuation<? super java.lang.Float> p);
+    method public static suspend Object? stopScroll(androidx.compose.foundation.gestures.ScrollableState, optional androidx.compose.foundation.MutatePriority scrollPriority, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+  }
+
+  public interface ScrollScope {
+    method public float scrollBy(float pixels);
+  }
+
+  public final class ScrollableDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.gestures.FlingBehavior flingBehavior();
+    field public static final androidx.compose.foundation.gestures.ScrollableDefaults INSTANCE;
+  }
+
+  public final class ScrollableKt {
+    method public static androidx.compose.ui.Modifier scrollable(androidx.compose.ui.Modifier, androidx.compose.foundation.gestures.ScrollableState state, androidx.compose.foundation.gestures.Orientation orientation, optional boolean enabled, optional boolean reverseDirection, optional androidx.compose.foundation.gestures.FlingBehavior? flingBehavior, optional androidx.compose.foundation.interaction.MutableInteractionSource? interactionSource);
+  }
+
+  public interface ScrollableState {
+    method public float dispatchRawDelta(float delta);
+    method public boolean isScrollInProgress();
+    method public suspend Object? scroll(optional androidx.compose.foundation.MutatePriority scrollPriority, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.gestures.ScrollScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    property public abstract boolean isScrollInProgress;
+  }
+
+  public final class ScrollableStateKt {
+    method public static androidx.compose.foundation.gestures.ScrollableState ScrollableState(kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> consumeScrollDelta);
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.gestures.ScrollableState rememberScrollableState(kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> consumeScrollDelta);
+  }
+
+  public final class TapGestureDetectorKt {
+    method public static suspend Object? awaitFirstDown(androidx.compose.ui.input.pointer.AwaitPointerEventScope, optional boolean requireUnconsumed, optional kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
+    method public static suspend Object? detectTapGestures(androidx.compose.ui.input.pointer.PointerInputScope, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit>? onDoubleTap, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit>? onLongPress, optional kotlin.jvm.functions.Function3<? super androidx.compose.foundation.gestures.PressGestureScope,? super androidx.compose.ui.geometry.Offset,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> onPress, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.geometry.Offset,kotlin.Unit>? onTap, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? waitForUpOrCancellation(androidx.compose.ui.input.pointer.AwaitPointerEventScope, kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerInputChange> p);
+  }
+
+  public final class TransformGestureDetectorKt {
+    method public static long calculateCentroid(androidx.compose.ui.input.pointer.PointerEvent, optional boolean useCurrent);
+    method public static float calculateCentroidSize(androidx.compose.ui.input.pointer.PointerEvent, optional boolean useCurrent);
+    method public static long calculatePan(androidx.compose.ui.input.pointer.PointerEvent);
+    method public static float calculateRotation(androidx.compose.ui.input.pointer.PointerEvent);
+    method public static float calculateZoom(androidx.compose.ui.input.pointer.PointerEvent);
+    method public static suspend Object? detectTransformGestures(androidx.compose.ui.input.pointer.PointerInputScope, optional boolean panZoomLock, kotlin.jvm.functions.Function4<? super androidx.compose.ui.geometry.Offset,? super androidx.compose.ui.geometry.Offset,? super java.lang.Float,? super java.lang.Float,kotlin.Unit> onGesture, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+  }
+
+  public interface TransformScope {
+    method public void transformBy(optional float zoomChange, optional long panChange, optional float rotationChange);
+  }
+
+  public final class TransformableKt {
+    method public static androidx.compose.ui.Modifier transformable(androidx.compose.ui.Modifier, androidx.compose.foundation.gestures.TransformableState state, optional boolean lockRotationOnZoomPan, optional boolean enabled);
+  }
+
+  public interface TransformableState {
+    method public boolean isTransformInProgress();
+    method public suspend Object? transform(optional androidx.compose.foundation.MutatePriority transformPriority, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.gestures.TransformScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    property public abstract boolean isTransformInProgress;
+  }
+
+  public final class TransformableStateKt {
+    method public static androidx.compose.foundation.gestures.TransformableState TransformableState(kotlin.jvm.functions.Function3<? super java.lang.Float,? super androidx.compose.ui.geometry.Offset,? super java.lang.Float,kotlin.Unit> onTransformation);
+    method public static suspend Object? animatePanBy(androidx.compose.foundation.gestures.TransformableState, long offset, optional androidx.compose.animation.core.AnimationSpec<androidx.compose.ui.geometry.Offset> animationSpec, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? animateRotateBy(androidx.compose.foundation.gestures.TransformableState, float degrees, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? animateZoomBy(androidx.compose.foundation.gestures.TransformableState, float zoomFactor, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? panBy(androidx.compose.foundation.gestures.TransformableState, long offset, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.gestures.TransformableState rememberTransformableState(kotlin.jvm.functions.Function3<? super java.lang.Float,? super androidx.compose.ui.geometry.Offset,? super java.lang.Float,kotlin.Unit> onTransformation);
+    method public static suspend Object? rotateBy(androidx.compose.foundation.gestures.TransformableState, float degrees, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? stopTransformation(androidx.compose.foundation.gestures.TransformableState, optional androidx.compose.foundation.MutatePriority terminationPriority, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public static suspend Object? zoomBy(androidx.compose.foundation.gestures.TransformableState, float zoomFactor, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+  }
+
+}
+
+package androidx.compose.foundation.interaction {
+
+  public interface DragInteraction extends androidx.compose.foundation.interaction.Interaction {
+  }
+
+  public static final class DragInteraction.Cancel implements androidx.compose.foundation.interaction.DragInteraction {
+    ctor public DragInteraction.Cancel(androidx.compose.foundation.interaction.DragInteraction.Start start);
+    method public androidx.compose.foundation.interaction.DragInteraction.Start getStart();
+    property public final androidx.compose.foundation.interaction.DragInteraction.Start start;
+  }
+
+  public static final class DragInteraction.Start implements androidx.compose.foundation.interaction.DragInteraction {
+    ctor public DragInteraction.Start();
+  }
+
+  public static final class DragInteraction.Stop implements androidx.compose.foundation.interaction.DragInteraction {
+    ctor public DragInteraction.Stop(androidx.compose.foundation.interaction.DragInteraction.Start start);
+    method public androidx.compose.foundation.interaction.DragInteraction.Start getStart();
+    property public final androidx.compose.foundation.interaction.DragInteraction.Start start;
+  }
+
+  public final class DragInteractionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> collectIsDraggedAsState(androidx.compose.foundation.interaction.InteractionSource);
+  }
+
+  public interface FocusInteraction extends androidx.compose.foundation.interaction.Interaction {
+  }
+
+  public static final class FocusInteraction.Focus implements androidx.compose.foundation.interaction.FocusInteraction {
+    ctor public FocusInteraction.Focus();
+  }
+
+  public static final class FocusInteraction.Unfocus implements androidx.compose.foundation.interaction.FocusInteraction {
+    ctor public FocusInteraction.Unfocus(androidx.compose.foundation.interaction.FocusInteraction.Focus focus);
+    method public androidx.compose.foundation.interaction.FocusInteraction.Focus getFocus();
+    property public final androidx.compose.foundation.interaction.FocusInteraction.Focus focus;
+  }
+
+  public final class FocusInteractionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> collectIsFocusedAsState(androidx.compose.foundation.interaction.InteractionSource);
+  }
+
+  public interface HoverInteraction extends androidx.compose.foundation.interaction.Interaction {
+  }
+
+  public static final class HoverInteraction.Enter implements androidx.compose.foundation.interaction.HoverInteraction {
+    ctor public HoverInteraction.Enter();
+  }
+
+  public static final class HoverInteraction.Exit implements androidx.compose.foundation.interaction.HoverInteraction {
+    ctor public HoverInteraction.Exit(androidx.compose.foundation.interaction.HoverInteraction.Enter enter);
+    method public androidx.compose.foundation.interaction.HoverInteraction.Enter getEnter();
+    property public final androidx.compose.foundation.interaction.HoverInteraction.Enter enter;
+  }
+
+  public final class HoverInteractionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> collectIsHoveredAsState(androidx.compose.foundation.interaction.InteractionSource);
+  }
+
+  public interface Interaction {
+  }
+
+  @androidx.compose.runtime.Stable public interface InteractionSource {
+    method public kotlinx.coroutines.flow.Flow<androidx.compose.foundation.interaction.Interaction> getInteractions();
+    property public abstract kotlinx.coroutines.flow.Flow<androidx.compose.foundation.interaction.Interaction> interactions;
+  }
+
+  public final class InteractionSourceKt {
+    method public static androidx.compose.foundation.interaction.MutableInteractionSource MutableInteractionSource();
+  }
+
+  @androidx.compose.runtime.Stable public interface MutableInteractionSource extends androidx.compose.foundation.interaction.InteractionSource {
+    method public suspend Object? emit(androidx.compose.foundation.interaction.Interaction interaction, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public boolean tryEmit(androidx.compose.foundation.interaction.Interaction interaction);
+  }
+
+  public interface PressInteraction extends androidx.compose.foundation.interaction.Interaction {
+  }
+
+  public static final class PressInteraction.Cancel implements androidx.compose.foundation.interaction.PressInteraction {
+    ctor public PressInteraction.Cancel(androidx.compose.foundation.interaction.PressInteraction.Press press);
+    method public androidx.compose.foundation.interaction.PressInteraction.Press getPress();
+    property public final androidx.compose.foundation.interaction.PressInteraction.Press press;
+  }
+
+  public static final class PressInteraction.Press implements androidx.compose.foundation.interaction.PressInteraction {
+    ctor public PressInteraction.Press(long pressPosition);
+    method public long getPressPosition();
+    property public final long pressPosition;
+  }
+
+  public static final class PressInteraction.Release implements androidx.compose.foundation.interaction.PressInteraction {
+    ctor public PressInteraction.Release(androidx.compose.foundation.interaction.PressInteraction.Press press);
+    method public androidx.compose.foundation.interaction.PressInteraction.Press getPress();
+    property public final androidx.compose.foundation.interaction.PressInteraction.Press press;
+  }
+
+  public final class PressInteractionKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> collectIsPressedAsState(androidx.compose.foundation.interaction.InteractionSource);
+  }
+
+}
+
+package androidx.compose.foundation.lazy {
+
+  public final class IntervalListKt {
+  }
+
+  public final class LazyDslKt {
+    method @androidx.compose.runtime.Composable public static void LazyColumn(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.LazyListState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Vertical verticalArrangement, optional androidx.compose.ui.Alignment.Horizontal horizontalAlignment, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void LazyRow(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.lazy.LazyListState state, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional boolean reverseLayout, optional androidx.compose.foundation.layout.Arrangement.Horizontal horizontalArrangement, optional androidx.compose.ui.Alignment.Vertical verticalAlignment, optional androidx.compose.foundation.gestures.FlingBehavior flingBehavior, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyListScope,kotlin.Unit> content);
+    method public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function1<? super T,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+    method public static inline <T> void items(androidx.compose.foundation.lazy.LazyListScope, T![] items, optional kotlin.jvm.functions.Function1<? super T,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
+    method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+    method public static inline <T> void itemsIndexed(androidx.compose.foundation.lazy.LazyListScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,?>? key, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+  }
+
+  public final class LazyGridKt {
+  }
+
+  @androidx.compose.foundation.lazy.LazyScopeMarker @androidx.compose.runtime.Stable public interface LazyItemScope {
+    method public androidx.compose.ui.Modifier fillParentMaxHeight(androidx.compose.ui.Modifier, optional float fraction);
+    method public androidx.compose.ui.Modifier fillParentMaxSize(androidx.compose.ui.Modifier, optional float fraction);
+    method public androidx.compose.ui.Modifier fillParentMaxWidth(androidx.compose.ui.Modifier, optional float fraction);
+  }
+
+  public final class LazyListHeadersKt {
+  }
+
+  public interface LazyListItemInfo {
+    method public int getIndex();
+    method public Object getKey();
+    method public int getOffset();
+    method public int getSize();
+    property public abstract int index;
+    property public abstract Object key;
+    property public abstract int offset;
+    property public abstract int size;
+  }
+
+  public final class LazyListItemsProviderImplKt {
+  }
+
+  public final class LazyListKt {
+  }
+
+  public interface LazyListLayoutInfo {
+    method public int getTotalItemsCount();
+    method public int getViewportEndOffset();
+    method public int getViewportStartOffset();
+    method public java.util.List<androidx.compose.foundation.lazy.LazyListItemInfo> getVisibleItemsInfo();
+    property public abstract int totalItemsCount;
+    property public abstract int viewportEndOffset;
+    property public abstract int viewportStartOffset;
+    property public abstract java.util.List<androidx.compose.foundation.lazy.LazyListItemInfo> visibleItemsInfo;
+  }
+
+  public final class LazyListMeasureKt {
+  }
+
+  @androidx.compose.foundation.lazy.LazyScopeMarker public interface LazyListScope {
+    method public void item(optional Object? key, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
+    method public void items(int count, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,?>? key, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,kotlin.Unit> itemContent);
+  }
+
+  public final class LazyListScrollingKt {
+  }
+
+  @androidx.compose.runtime.Stable public final class LazyListState implements androidx.compose.foundation.gestures.ScrollableState {
+    ctor public LazyListState(optional int firstVisibleItemIndex, optional int firstVisibleItemScrollOffset);
+    method public suspend Object? animateScrollToItem(int index, optional int scrollOffset, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public float dispatchRawDelta(float delta);
+    method public int getFirstVisibleItemIndex();
+    method public int getFirstVisibleItemScrollOffset();
+    method public androidx.compose.foundation.interaction.InteractionSource getInteractionSource();
+    method public androidx.compose.foundation.lazy.LazyListLayoutInfo getLayoutInfo();
+    method public boolean isScrollInProgress();
+    method public suspend Object? scroll(androidx.compose.foundation.MutatePriority scrollPriority, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.gestures.ScrollScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public suspend Object? scrollToItem(int index, optional int scrollOffset, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    property public final int firstVisibleItemIndex;
+    property public final int firstVisibleItemScrollOffset;
+    property public final androidx.compose.foundation.interaction.InteractionSource interactionSource;
+    property public boolean isScrollInProgress;
+    property public final androidx.compose.foundation.lazy.LazyListLayoutInfo layoutInfo;
+    field public static final androidx.compose.foundation.lazy.LazyListState.Companion Companion;
+  }
+
+  public static final class LazyListState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.lazy.LazyListState,?> getSaver();
+    property public final androidx.compose.runtime.saveable.Saver<androidx.compose.foundation.lazy.LazyListState,?> Saver;
+  }
+
+  public final class LazyListStateKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.lazy.LazyListState rememberLazyListState(optional int initialFirstVisibleItemIndex, optional int initialFirstVisibleItemScrollOffset);
+  }
+
+  @kotlin.DslMarker public @interface LazyScopeMarker {
+  }
+
+  public final class LazySemanticsKt {
+  }
+
+  public final class Lazy_androidKt {
+  }
+
+}
+
+package androidx.compose.foundation.lazy.layout {
+
+  public final class LazyLayoutItemContentFactoryKt {
+  }
+
+  public final class LazyLayoutKt {
+  }
+
+  public final class LazyLayoutPrefetchPolicyKt {
+  }
+
+  public final class LazyLayoutPrefetcher_androidKt {
+  }
+
+  public final class LazyLayoutStateKt {
+  }
+
+}
+
+package androidx.compose.foundation.relocation {
+
+  public final class BringIntoViewRequesterKt {
+  }
+
+  public final class BringRectangleOnScreen_androidKt {
+  }
+
+}
+
+package androidx.compose.foundation.selection {
+
+  public final class SelectableGroupKt {
+    method public static androidx.compose.ui.Modifier selectableGroup(androidx.compose.ui.Modifier);
+  }
+
+  public final class SelectableKt {
+    method public static androidx.compose.ui.Modifier selectable(androidx.compose.ui.Modifier, boolean selected, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static androidx.compose.ui.Modifier selectable(androidx.compose.ui.Modifier, boolean selected, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+  }
+
+  public final class ToggleableKt {
+    method public static androidx.compose.ui.Modifier toggleable(androidx.compose.ui.Modifier, boolean value, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange);
+    method public static androidx.compose.ui.Modifier toggleable(androidx.compose.ui.Modifier, boolean value, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onValueChange);
+    method public static androidx.compose.ui.Modifier triStateToggleable(androidx.compose.ui.Modifier, androidx.compose.ui.state.ToggleableState state, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+    method public static androidx.compose.ui.Modifier triStateToggleable(androidx.compose.ui.Modifier, androidx.compose.ui.state.ToggleableState state, androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, androidx.compose.foundation.Indication? indication, optional boolean enabled, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+  }
+
+}
+
+package androidx.compose.foundation.shape {
+
+  public final class AbsoluteCutCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public AbsoluteCutCornerShape(androidx.compose.foundation.shape.CornerSize topLeft, androidx.compose.foundation.shape.CornerSize topRight, androidx.compose.foundation.shape.CornerSize bottomRight, androidx.compose.foundation.shape.CornerSize bottomLeft);
+    method public androidx.compose.foundation.shape.AbsoluteCutCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class AbsoluteCutCornerShapeKt {
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteCutCornerShape AbsoluteCutCornerShape(optional int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+  }
+
+  public final class AbsoluteRoundedCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public AbsoluteRoundedCornerShape(androidx.compose.foundation.shape.CornerSize topLeft, androidx.compose.foundation.shape.CornerSize topRight, androidx.compose.foundation.shape.CornerSize bottomRight, androidx.compose.foundation.shape.CornerSize bottomLeft);
+    method public androidx.compose.foundation.shape.AbsoluteRoundedCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class AbsoluteRoundedCornerShapeKt {
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(optional float topLeft, optional float topRight, optional float bottomRight, optional float bottomLeft);
+    method public static androidx.compose.foundation.shape.AbsoluteRoundedCornerShape AbsoluteRoundedCornerShape(optional int topLeftPercent, optional int topRightPercent, optional int bottomRightPercent, optional int bottomLeftPercent);
+  }
+
+  public abstract class CornerBasedShape implements androidx.compose.ui.graphics.Shape {
+    ctor public CornerBasedShape(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public abstract androidx.compose.foundation.shape.CornerBasedShape copy(optional androidx.compose.foundation.shape.CornerSize topStart, optional androidx.compose.foundation.shape.CornerSize topEnd, optional androidx.compose.foundation.shape.CornerSize bottomEnd, optional androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public final androidx.compose.foundation.shape.CornerBasedShape copy(androidx.compose.foundation.shape.CornerSize all);
+    method public final androidx.compose.ui.graphics.Outline createOutline(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+    method public abstract androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public final androidx.compose.foundation.shape.CornerSize getBottomEnd();
+    method public final androidx.compose.foundation.shape.CornerSize getBottomStart();
+    method public final androidx.compose.foundation.shape.CornerSize getTopEnd();
+    method public final androidx.compose.foundation.shape.CornerSize getTopStart();
+    property public final androidx.compose.foundation.shape.CornerSize bottomEnd;
+    property public final androidx.compose.foundation.shape.CornerSize bottomStart;
+    property public final androidx.compose.foundation.shape.CornerSize topEnd;
+    property public final androidx.compose.foundation.shape.CornerSize topStart;
+  }
+
+  @androidx.compose.runtime.Immutable public interface CornerSize {
+    method public float toPx(long shapeSize, androidx.compose.ui.unit.Density density);
+  }
+
+  public final class CornerSizeKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(float size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(int percent);
+    method public static androidx.compose.foundation.shape.CornerSize getZeroCornerSize();
+    property public static final androidx.compose.foundation.shape.CornerSize ZeroCornerSize;
+  }
+
+  public final class CutCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public CutCornerShape(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.foundation.shape.CutCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class CutCornerShapeKt {
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(float size);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.CutCornerShape CutCornerShape(optional int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+  }
+
+  public final class GenericShape implements androidx.compose.ui.graphics.Shape {
+    ctor public GenericShape(kotlin.jvm.functions.Function3<? super androidx.compose.ui.graphics.Path,? super androidx.compose.ui.geometry.Size,? super androidx.compose.ui.unit.LayoutDirection,kotlin.Unit> builder);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+  }
+
+  public final class RoundedCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
+    ctor public RoundedCornerShape(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.foundation.shape.RoundedCornerShape copy(androidx.compose.foundation.shape.CornerSize topStart, androidx.compose.foundation.shape.CornerSize topEnd, androidx.compose.foundation.shape.CornerSize bottomEnd, androidx.compose.foundation.shape.CornerSize bottomStart);
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, float topStart, float topEnd, float bottomEnd, float bottomStart, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  public final class RoundedCornerShapeKt {
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(androidx.compose.foundation.shape.CornerSize corner);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(float size);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(int percent);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
+    method public static androidx.compose.foundation.shape.RoundedCornerShape getCircleShape();
+    property public static final androidx.compose.foundation.shape.RoundedCornerShape CircleShape;
+  }
+
+}
+
+package androidx.compose.foundation.text {
+
+  public final class AndroidCursorHandle_androidKt {
+  }
+
+  public final class BasicTextFieldKt {
+    method @androidx.compose.runtime.Composable public static void BasicTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Brush cursorBrush, optional kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> decorationBox);
+    method @androidx.compose.runtime.Composable public static void BasicTextField(androidx.compose.ui.text.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.TextFieldValue,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Brush cursorBrush, optional kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> decorationBox);
+  }
+
+  public final class BasicTextKt {
+    method @androidx.compose.runtime.Composable public static void BasicText(String text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional int overflow, optional boolean softWrap, optional int maxLines);
+    method @androidx.compose.runtime.Composable public static void BasicText(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, optional int overflow, optional boolean softWrap, optional int maxLines, optional java.util.Map<java.lang.String,androidx.compose.foundation.text.InlineTextContent> inlineContent);
+  }
+
+  public final class ClickableTextKt {
+    method @androidx.compose.runtime.Composable public static void ClickableText(androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.text.TextStyle style, optional boolean softWrap, optional int overflow, optional int maxLines, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
+  }
+
+  public final class CoreTextFieldKt {
+  }
+
+  public final class CoreTextKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class InlineTextContent {
+    ctor public InlineTextContent(androidx.compose.ui.text.Placeholder placeholder, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> children);
+    method public kotlin.jvm.functions.Function1<java.lang.String,kotlin.Unit> getChildren();
+    method public androidx.compose.ui.text.Placeholder getPlaceholder();
+    property public final kotlin.jvm.functions.Function1<java.lang.String,kotlin.Unit> children;
+    property public final androidx.compose.ui.text.Placeholder placeholder;
+  }
+
+  public final class InlineTextContentKt {
+    method public static void appendInlineContent(androidx.compose.ui.text.AnnotatedString.Builder, String id, optional String alternateText);
+  }
+
+  public final class KeyEventHelpers_androidKt {
+  }
+
+  public final class KeyMappingKt {
+  }
+
+  public final class KeyMapping_androidKt {
+  }
+
+  public interface KeyboardActionScope {
+    method public void defaultKeyboardAction(int imeAction);
+  }
+
+  public final class KeyboardActions {
+    ctor public KeyboardActions(optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onDone, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onGo, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onNext, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onPrevious, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSearch, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSend);
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnDone();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnGo();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnNext();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnPrevious();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnSearch();
+    method public kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? getOnSend();
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onDone;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onGo;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onNext;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onPrevious;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSearch;
+    property public final kotlin.jvm.functions.Function1<androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit>? onSend;
+    field public static final androidx.compose.foundation.text.KeyboardActions.Companion Companion;
+  }
+
+  public static final class KeyboardActions.Companion {
+    method public androidx.compose.foundation.text.KeyboardActions getDefault();
+    property public final androidx.compose.foundation.text.KeyboardActions Default;
+  }
+
+  public final class KeyboardActionsKt {
+    method public static androidx.compose.foundation.text.KeyboardActions KeyboardActions(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.text.KeyboardActionScope,kotlin.Unit> onAny);
+  }
+
+  @androidx.compose.runtime.Immutable public final class KeyboardOptions {
+    ctor public KeyboardOptions(optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public androidx.compose.foundation.text.KeyboardOptions copy(optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public boolean getAutoCorrect();
+    method public int getCapitalization();
+    method public int getImeAction();
+    method public int getKeyboardType();
+    property public final boolean autoCorrect;
+    property public final int capitalization;
+    property public final int imeAction;
+    property public final int keyboardType;
+    field public static final androidx.compose.foundation.text.KeyboardOptions.Companion Companion;
+  }
+
+  public static final class KeyboardOptions.Companion {
+    method public androidx.compose.foundation.text.KeyboardOptions getDefault();
+    property public final androidx.compose.foundation.text.KeyboardOptions Default;
+  }
+
+  public final class LongPressTextDragObserverKt {
+  }
+
+  public final class MaxLinesHeightModifierKt {
+  }
+
+  public final class StringHelpersKt {
+  }
+
+  public final class StringHelpers_androidKt {
+  }
+
+  public final class StringHelpers_jvmKt {
+  }
+
+  public final class TextFieldCursorKt {
+  }
+
+  public final class TextFieldDelegateKt {
+  }
+
+  public final class TextFieldGestureModifiersKt {
+  }
+
+  public final class TextFieldKeyInputKt {
+  }
+
+  public final class TextFieldKeyInput_androidKt {
+  }
+
+  public final class TextFieldPressGestureFilterKt {
+  }
+
+  public final class TextFieldScrollKt {
+  }
+
+  public final class TextFieldSizeKt {
+  }
+
+  public final class TextLayoutHelperKt {
+  }
+
+  public final class TextLayoutResultProxyKt {
+  }
+
+  public final class TextPointerIcon_androidKt {
+  }
+
+  public final class TouchMode_androidKt {
+  }
+
+  public final class UndoManagerKt {
+  }
+
+  public final class UndoManager_jvmKt {
+  }
+
+}
+
+package androidx.compose.foundation.text.selection {
+
+  public final class AndroidSelectionHandles_androidKt {
+  }
+
+  public final class MultiWidgetSelectionDelegateKt {
+  }
+
+  public final class SelectionAdjustmentKt {
+  }
+
+  public final class SelectionContainerKt {
+    method @androidx.compose.runtime.Composable public static void DisableSelection(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void SelectionContainer(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class SelectionHandlesKt {
+  }
+
+  public final class SelectionManagerKt {
+  }
+
+  public final class SelectionManager_androidKt {
+  }
+
+  public final class SelectionRegistrarKt {
+  }
+
+  public final class SimpleLayoutKt {
+  }
+
+  public final class TextFieldSelectionDelegateKt {
+  }
+
+  public final class TextFieldSelectionManagerKt {
+  }
+
+  public final class TextFieldSelectionManager_androidKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextSelectionColors {
+    ctor public TextSelectionColors(long handleColor, long backgroundColor);
+    method public long getBackgroundColor();
+    method public long getHandleColor();
+    property public final long backgroundColor;
+    property public final long handleColor;
+  }
+
+  public final class TextSelectionColorsKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> getLocalTextSelectionColors();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> LocalTextSelectionColors;
+  }
+
+  public final class TextSelectionDelegateKt {
+  }
+
+  public final class TextSelectionMouseDetectorKt {
+  }
+
+}
+
diff --git a/compose/foundation/foundation/api/restricted_current.ignore b/compose/foundation/foundation/api/restricted_current.ignore
index 110a916..a3cabae 100644
--- a/compose/foundation/foundation/api/restricted_current.ignore
+++ b/compose/foundation/foundation/api/restricted_current.ignore
@@ -1,11 +1,11 @@
 // Baseline format: 1.0
+InvalidNullConversion: androidx.compose.foundation.ImageKt#Image(androidx.compose.ui.graphics.ImageBitmap, String, androidx.compose.ui.Modifier, androidx.compose.ui.Alignment, androidx.compose.ui.layout.ContentScale, float, androidx.compose.ui.graphics.ColorFilter) parameter #1:
+    Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter contentDescription in androidx.compose.foundation.ImageKt.Image(androidx.compose.ui.graphics.ImageBitmap bitmap, String contentDescription, androidx.compose.ui.Modifier modifier, androidx.compose.ui.Alignment alignment, androidx.compose.ui.layout.ContentScale contentScale, float alpha, androidx.compose.ui.graphics.ColorFilter colorFilter)
+
+
 RemovedClass: androidx.compose.foundation.gestures.RelativeVelocityTrackerKt:
     Removed class androidx.compose.foundation.gestures.RelativeVelocityTrackerKt
 RemovedClass: androidx.compose.foundation.lazy.LazyListItemContentFactoryKt:
     Removed class androidx.compose.foundation.lazy.LazyListItemContentFactoryKt
 RemovedClass: androidx.compose.foundation.lazy.LazyListPrefetcher_androidKt:
     Removed class androidx.compose.foundation.lazy.LazyListPrefetcher_androidKt
-
-
-RemovedMethod: androidx.compose.foundation.ImageKt#Image(androidx.compose.ui.graphics.ImageBitmap, String, androidx.compose.ui.Modifier, androidx.compose.ui.Alignment, androidx.compose.ui.layout.ContentScale, float, androidx.compose.ui.graphics.ColorFilter):
-    Removed method androidx.compose.foundation.ImageKt.Image(androidx.compose.ui.graphics.ImageBitmap,String,androidx.compose.ui.Modifier,androidx.compose.ui.Alignment,androidx.compose.ui.layout.ContentScale,float,androidx.compose.ui.graphics.ColorFilter)
diff --git a/compose/foundation/foundation/api/restricted_current.txt b/compose/foundation/foundation/api/restricted_current.txt
index 26fd022..e06e978 100644
--- a/compose/foundation/foundation/api/restricted_current.txt
+++ b/compose/foundation/foundation/api/restricted_current.txt
@@ -59,6 +59,7 @@
     method @androidx.compose.runtime.Composable public static void Image(androidx.compose.ui.graphics.ImageBitmap bitmap, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int filterQuality);
     method @androidx.compose.runtime.Composable public static void Image(androidx.compose.ui.graphics.vector.ImageVector imageVector, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
     method @androidx.compose.runtime.Composable public static void Image(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method @Deprecated @androidx.compose.runtime.Composable public static void Image(androidx.compose.ui.graphics.ImageBitmap bitmap, String contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
   }
 
   @androidx.compose.runtime.Stable public interface Indication {
@@ -72,6 +73,7 @@
   public final class IndicationKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.Indication> getLocalIndication();
     method public static androidx.compose.ui.Modifier indication(androidx.compose.ui.Modifier, androidx.compose.foundation.interaction.InteractionSource interactionSource, androidx.compose.foundation.Indication? indication);
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.Indication> LocalIndication;
   }
 
   public enum MutatePriority {
@@ -488,6 +490,16 @@
 
 }
 
+package androidx.compose.foundation.relocation {
+
+  public final class BringIntoViewRequesterKt {
+  }
+
+  public final class BringRectangleOnScreen_androidKt {
+  }
+
+}
+
 package androidx.compose.foundation.selection {
 
   public final class SelectableGroupKt {
@@ -567,6 +579,7 @@
     method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(float size);
     method @androidx.compose.runtime.Stable public static androidx.compose.foundation.shape.CornerSize CornerSize(int percent);
     method public static androidx.compose.foundation.shape.CornerSize getZeroCornerSize();
+    property public static final androidx.compose.foundation.shape.CornerSize ZeroCornerSize;
   }
 
   public final class CutCornerShape extends androidx.compose.foundation.shape.CornerBasedShape {
@@ -605,6 +618,7 @@
     method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional float topStart, optional float topEnd, optional float bottomEnd, optional float bottomStart);
     method public static androidx.compose.foundation.shape.RoundedCornerShape RoundedCornerShape(optional int topStartPercent, optional int topEndPercent, optional int bottomEndPercent, optional int bottomStartPercent);
     method public static androidx.compose.foundation.shape.RoundedCornerShape getCircleShape();
+    property public static final androidx.compose.foundation.shape.RoundedCornerShape CircleShape;
   }
 
 }
@@ -749,6 +763,9 @@
   public final class TextLayoutResultProxyKt {
   }
 
+  public final class TextPointerIcon_androidKt {
+  }
+
   public final class TouchMode_androidKt {
   }
 
@@ -810,6 +827,7 @@
 
   public final class TextSelectionColorsKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> getLocalTextSelectionColors();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.foundation.text.selection.TextSelectionColors> LocalTextSelectionColors;
   }
 
   public final class TextSelectionDelegateKt {
diff --git a/compose/foundation/foundation/benchmark/build.gradle b/compose/foundation/foundation/benchmark/build.gradle
index b987b0f..a8d0f64 100644
--- a/compose/foundation/foundation/benchmark/build.gradle
+++ b/compose/foundation/foundation/benchmark/build.gradle
@@ -26,7 +26,6 @@
     kotlinPlugin project(":compose:compiler:compiler")
 
     androidTestImplementation project(":benchmark:benchmark-junit4")
-    androidTestImplementation project(":benchmark:benchmark-macro-junit4")
     androidTestImplementation project(":compose:runtime:runtime")
     androidTestImplementation project(":compose:ui:ui-text:ui-text-benchmark")
     androidTestImplementation project(":compose:foundation:foundation-layout")
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/FoundationDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/FoundationDemos.kt
index 90a8a00..f13caa3 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/FoundationDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/FoundationDemos.kt
@@ -16,6 +16,9 @@
 
 package androidx.compose.foundation.demos
 
+import androidx.compose.foundation.demos.relocation.BringIntoViewDemo
+import androidx.compose.foundation.demos.relocation.BringRectangleIntoViewDemo
+import androidx.compose.foundation.demos.relocation.RequestRectangleOnScreenDemo
 import androidx.compose.foundation.samples.ControlledScrollableRowSample
 import androidx.compose.foundation.samples.InteractionSourceFlowSample
 import androidx.compose.foundation.samples.SimpleInteractionSourceSample
@@ -23,6 +26,12 @@
 import androidx.compose.integration.demos.common.ComposableDemo
 import androidx.compose.integration.demos.common.DemoCategory
 
+private val RelocationDemos = listOf(
+    ComposableDemo("Bring Into View") { BringIntoViewDemo() },
+    ComposableDemo("Bring Rectangle Into View") { BringRectangleIntoViewDemo() },
+    ComposableDemo("Request Rectangle On Screen") { RequestRectangleOnScreenDemo() }
+)
+
 val FoundationDemos = DemoCategory(
     "Foundation",
     listOf(
@@ -35,5 +44,6 @@
         ComposableDemo("Flow InteractionSource") { InteractionSourceFlowSample() },
         DemoCategory("Suspending Gesture Detectors", CoroutineGestureDemos),
         ComposableDemo("NestedScroll") { NestedScrollDemo() },
+        DemoCategory("Relocation Demos", RelocationDemos),
     )
 )
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/scroll/BringIntoViewDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/relocation/BringIntoViewDemo.kt
similarity index 84%
rename from compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/scroll/BringIntoViewDemo.kt
rename to compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/relocation/BringIntoViewDemo.kt
index 58a1bef..0e4ee64 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/scroll/BringIntoViewDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/relocation/BringIntoViewDemo.kt
@@ -14,8 +14,9 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.demos.scroll
+package androidx.compose.foundation.demos.relocation
 
+import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.background
 import androidx.compose.foundation.horizontalScroll
 import androidx.compose.foundation.layout.Box
@@ -24,6 +25,8 @@
 import androidx.compose.foundation.layout.requiredHeight
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.relocation.BringIntoViewRequester
+import androidx.compose.foundation.relocation.bringIntoViewRequester
 import androidx.compose.foundation.rememberScrollState
 import androidx.compose.foundation.verticalScroll
 import androidx.compose.material.Button
@@ -31,7 +34,6 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberCoroutineScope
-import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color.Companion.Black
 import androidx.compose.ui.graphics.Color.Companion.Blue
@@ -44,22 +46,20 @@
 import androidx.compose.ui.graphics.Color.Companion.Red
 import androidx.compose.ui.graphics.Color.Companion.White
 import androidx.compose.ui.graphics.Color.Companion.Yellow
-import androidx.compose.ui.layout.RelocationRequester
-import androidx.compose.ui.layout.relocationRequester
 import androidx.compose.ui.unit.dp
 import kotlinx.coroutines.launch
 
-@OptIn(ExperimentalComposeUiApi::class)
+@OptIn(ExperimentalFoundationApi::class)
 @Composable
 fun BringIntoViewDemo() {
-    val greenRequester = remember { RelocationRequester() }
-    val redRequester = remember { RelocationRequester() }
+    val greenRequester = remember { BringIntoViewRequester() }
+    val redRequester = remember { BringIntoViewRequester() }
     val coroutineScope = rememberCoroutineScope()
     Column {
         Column(Modifier.requiredHeight(100.dp).verticalScroll(rememberScrollState())) {
             Row(Modifier.width(300.dp).horizontalScroll(rememberScrollState())) {
                 Box(Modifier.background(Blue).size(100.dp))
-                Box(Modifier.background(Green).size(100.dp).relocationRequester(greenRequester))
+                Box(Modifier.background(Green).size(100.dp).bringIntoViewRequester(greenRequester))
                 Box(Modifier.background(Yellow).size(100.dp))
                 Box(Modifier.background(Magenta).size(100.dp))
                 Box(Modifier.background(Gray).size(100.dp))
@@ -70,7 +70,7 @@
                 Box(Modifier.background(Cyan).size(100.dp))
                 Box(Modifier.background(DarkGray).size(100.dp))
                 Box(Modifier.background(White).size(100.dp))
-                Box(Modifier.background(Red).size(100.dp).relocationRequester(redRequester))
+                Box(Modifier.background(Red).size(100.dp).bringIntoViewRequester(redRequester))
                 Box(Modifier.background(LightGray).size(100.dp))
             }
         }
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/scroll/BringRectangleIntoViewDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/relocation/BringRectangleIntoViewDemo.kt
similarity index 82%
rename from compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/scroll/BringRectangleIntoViewDemo.kt
rename to compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/relocation/BringRectangleIntoViewDemo.kt
index 0623c60..423969e 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/scroll/BringRectangleIntoViewDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/relocation/BringRectangleIntoViewDemo.kt
@@ -14,37 +14,37 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.demos.scroll
+package androidx.compose.foundation.demos.relocation
 
 import androidx.compose.foundation.Canvas
+import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.border
 import androidx.compose.foundation.horizontalScroll
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.relocation.BringIntoViewRequester
+import androidx.compose.foundation.relocation.bringIntoViewRequester
 import androidx.compose.foundation.rememberScrollState
 import androidx.compose.material.Button
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberCoroutineScope
-import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Color.Companion.Red
-import androidx.compose.ui.layout.RelocationRequester
-import androidx.compose.ui.layout.relocationRequester
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.dp
 import kotlinx.coroutines.launch
 
-@OptIn(ExperimentalComposeUiApi::class)
+@OptIn(ExperimentalFoundationApi::class)
 @Composable
 fun BringRectangleIntoViewDemo() {
     with(LocalDensity.current) {
-        val relocationRequester = remember { RelocationRequester() }
+        val bringIntoViewRequester = remember { BringIntoViewRequester() }
         val coroutineScope = rememberCoroutineScope()
         Column {
             Text(
@@ -60,7 +60,7 @@
                 Canvas(
                     Modifier
                         .size(1500f.toDp(), 500f.toDp())
-                        .relocationRequester(relocationRequester)
+                        .bringIntoViewRequester(bringIntoViewRequester)
                 ) {
                     drawCircle(color = Red, radius = 250f, center = Offset(750f, 250f))
                 }
@@ -69,7 +69,7 @@
                 onClick = {
                     val circleCoordinates = Rect(500f, 0f, 1000f, 500f)
                     coroutineScope.launch {
-                        relocationRequester.bringIntoView(circleCoordinates)
+                        bringIntoViewRequester.bringIntoView(circleCoordinates)
                     }
                 }
             ) {
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/scroll/RequestRectangleOnScreeenDemo.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/relocation/RequestRectangleOnScreeenDemo.kt
similarity index 76%
rename from compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/scroll/RequestRectangleOnScreeenDemo.kt
rename to compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/relocation/RequestRectangleOnScreeenDemo.kt
index ba1a940..38f93d2 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/scroll/RequestRectangleOnScreeenDemo.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/relocation/RequestRectangleOnScreeenDemo.kt
@@ -14,35 +14,35 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.demos.scroll
+package androidx.compose.foundation.demos.relocation
 
+import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.relocation.BringIntoViewRequester
+import androidx.compose.foundation.relocation.bringIntoViewRequester
 import androidx.compose.material.Button
 import androidx.compose.material.Text
 import androidx.compose.material.TextField
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberCoroutineScope
-import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.layout.RelocationRequester
-import androidx.compose.ui.layout.relocationRequester
 import androidx.compose.ui.unit.dp
 import kotlinx.coroutines.launch
 
-@OptIn(ExperimentalComposeUiApi::class)
+@OptIn(ExperimentalFoundationApi::class)
 @Composable
 fun RequestRectangleOnScreenDemo() {
-    val relocationRequester = remember { RelocationRequester() }
+    val bringIntoViewRequester = remember { BringIntoViewRequester() }
     val coroutineScope = rememberCoroutineScope()
     Column {
         TextField(value = "Click here to bring up the soft keyboard", onValueChange = {})
-        Button(onClick = { coroutineScope.launch { relocationRequester.bringIntoView() } }) {
+        Button(onClick = { coroutineScope.launch { bringIntoViewRequester.bringIntoView() } }) {
             Text("Bring blue rectangle into view")
         }
         Spacer(Modifier.weight(weight = 1f, fill = true))
@@ -50,7 +50,7 @@
             Modifier
                 .size(50.dp)
                 .background(Color.Blue)
-                .relocationRequester(relocationRequester)
+                .bringIntoViewRequester(bringIntoViewRequester)
         )
     }
 }
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/RelocationSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/BringIntoViewSamples.kt
similarity index 82%
rename from compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/RelocationSamples.kt
rename to compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/BringIntoViewSamples.kt
index 8bee919..49f37aa 100644
--- a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/RelocationSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/BringIntoViewSamples.kt
@@ -14,54 +14,54 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.samples
+package androidx.compose.foundation.samples
 
 import androidx.annotation.Sampled
 import androidx.compose.foundation.Canvas
+import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.border
 import androidx.compose.foundation.horizontalScroll
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.relocation.BringIntoViewRequester
+import androidx.compose.foundation.relocation.bringIntoViewRequester
 import androidx.compose.foundation.rememberScrollState
 import androidx.compose.material.Button
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberCoroutineScope
-import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.focusTarget
 import androidx.compose.ui.focus.onFocusChanged
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.layout.RelocationRequester
-import androidx.compose.ui.layout.relocationRequester
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.unit.dp
 import kotlinx.coroutines.launch
 
-@ExperimentalComposeUiApi
+@OptIn(ExperimentalFoundationApi::class)
 @Sampled
 @Composable
 fun BringIntoViewSample() {
     Row(Modifier.horizontalScroll(rememberScrollState())) {
         repeat(100) {
-            val relocationRequester = remember { RelocationRequester() }
+            val bringIntoViewRequester = remember { BringIntoViewRequester() }
             val coroutineScope = rememberCoroutineScope()
             Box(
                 Modifier
                     // This associates the RelocationRequester with a Composable that wants to be
                     // brought into view.
-                    .relocationRequester(relocationRequester)
+                    .bringIntoViewRequester(bringIntoViewRequester)
                     .onFocusChanged {
                         if (it.isFocused) {
                             coroutineScope.launch {
                                 // This sends a request to all parents that asks them to scroll so
                                 // that this item is brought into view.
-                                relocationRequester.bringIntoView()
+                                bringIntoViewRequester.bringIntoView()
                             }
                         }
                     }
@@ -71,12 +71,12 @@
     }
 }
 
-@ExperimentalComposeUiApi
+@OptIn(ExperimentalFoundationApi::class)
 @Sampled
 @Composable
 fun BringPartOfComposableIntoViewSample() {
     with(LocalDensity.current) {
-        val relocationRequester = remember { RelocationRequester() }
+        val bringIntoViewRequester = remember { BringIntoViewRequester() }
         val coroutineScope = rememberCoroutineScope()
         Column {
             Box(
@@ -90,7 +90,7 @@
                         .size(1500f.toDp(), 500f.toDp())
                         // This associates the RelocationRequester with a Composable that wants
                         // to be brought into view.
-                        .relocationRequester(relocationRequester)
+                        .bringIntoViewRequester(bringIntoViewRequester)
                 ) {
                     drawCircle(color = Color.Red, radius = 250f, center = Offset(750f, 250f))
                 }
@@ -101,7 +101,7 @@
                     coroutineScope.launch {
                         // This sends a request to all parents that asks them to scroll so that
                         // the circle is brought into view.
-                        relocationRequester.bringIntoView(circleCoordinates)
+                        bringIntoViewRequester.bringIntoView(circleCoordinates)
                     }
                 }
             ) {
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ClickableInScrollableViewGroupTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ClickableInScrollableViewGroupTest.kt
new file mode 100644
index 0000000..eb18a04
--- /dev/null
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ClickableInScrollableViewGroupTest.kt
@@ -0,0 +1,272 @@
+/*
+ * 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.foundation
+
+import android.content.Context
+import android.view.ViewGroup
+import android.widget.FrameLayout
+import androidx.activity.ComponentActivity
+import androidx.compose.foundation.interaction.Interaction
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.interaction.PressInteraction
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.text.BasicText
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.ComposeView
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.junit4.createAndroidComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.performTouchInput
+import androidx.compose.ui.viewinterop.AndroidView
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.flow.collect
+import kotlinx.coroutines.launch
+import org.junit.Ignore
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Test for [clickable] [PressInteraction] behavior in scrollable [ViewGroup]s.
+ */
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+@OptIn(ExperimentalFoundationApi::class)
+class ClickableInScrollableViewGroupTest {
+    @get:Rule
+    val rule = createAndroidComposeRule<ComponentActivity>()
+
+    @Test
+    fun clickable_scrollableViewGroup() {
+        val interactionSource = MutableInteractionSource()
+
+        lateinit var scope: CoroutineScope
+
+        rule.mainClock.autoAdvance = false
+
+        class ScrollingViewGroup(context: Context) : FrameLayout(context) {
+            override fun shouldDelayChildPressedState() = true
+        }
+
+        rule.activityRule.scenario.onActivity { activity ->
+            ComposeView(activity).apply {
+                activity.setContentView(ScrollingViewGroup(activity).also { it.addView(this) })
+                setContent {
+                    scope = rememberCoroutineScope()
+                    Box {
+                        BasicText(
+                            "ClickableText",
+                            modifier = Modifier
+                                .testTag("myClickable")
+                                .combinedClickable(
+                                    interactionSource = interactionSource,
+                                    indication = null
+                                ) {}
+                        )
+                    }
+                }
+            }
+        }
+
+        val interactions = mutableListOf<Interaction>()
+
+        scope.launch {
+            interactionSource.interactions.collect { interactions.add(it) }
+        }
+
+        rule.runOnIdle {
+            assertThat(interactions).isEmpty()
+        }
+
+        rule.onNodeWithTag("myClickable")
+            .performTouchInput { down(center) }
+
+        val halfTapIndicationDelay = TapIndicationDelay / 2
+
+        rule.mainClock.advanceTimeBy(halfTapIndicationDelay)
+
+        // Haven't reached the tap delay yet, so we shouldn't have started a press
+        rule.runOnIdle {
+            assertThat(interactions).isEmpty()
+        }
+
+        // Advance past the tap delay
+        rule.mainClock.advanceTimeBy(halfTapIndicationDelay)
+
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(1)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+        }
+
+        rule.onNodeWithTag("myClickable")
+            .performTouchInput { up() }
+
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(2)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+            assertThat(interactions[1]).isInstanceOf(PressInteraction.Release::class.java)
+            assertThat((interactions[1] as PressInteraction.Release).press)
+                .isEqualTo(interactions[0])
+        }
+    }
+
+    /**
+     * Test case for a [clickable] inside an [AndroidView] inside a scrollable Compose container
+     */
+    @Test
+    fun clickable_androidViewInScrollableContainer() {
+        val interactionSource = MutableInteractionSource()
+
+        lateinit var scope: CoroutineScope
+
+        rule.mainClock.autoAdvance = false
+
+        rule.setContent {
+            scope = rememberCoroutineScope()
+            Box(Modifier.verticalScroll(rememberScrollState())) {
+                AndroidView({ context -> ComposeView(context).apply {
+                    setContent {
+                        Box {
+                            BasicText(
+                                "ClickableText",
+                                modifier = Modifier
+                                    .testTag("myClickable")
+                                    .combinedClickable(
+                                        interactionSource = interactionSource,
+                                        indication = null
+                                    ) {}
+                            )
+                        }
+                    }
+                } })
+            }
+        }
+
+        val interactions = mutableListOf<Interaction>()
+
+        scope.launch {
+            interactionSource.interactions.collect { interactions.add(it) }
+        }
+
+        rule.runOnIdle {
+            assertThat(interactions).isEmpty()
+        }
+
+        rule.onNodeWithTag("myClickable")
+            .performTouchInput { down(center) }
+
+        val halfTapIndicationDelay = TapIndicationDelay / 2
+
+        rule.mainClock.advanceTimeBy(halfTapIndicationDelay)
+
+        // Haven't reached the tap delay yet, so we shouldn't have started a press
+        rule.runOnIdle {
+            assertThat(interactions).isEmpty()
+        }
+
+        // Advance past the tap delay
+        rule.mainClock.advanceTimeBy(halfTapIndicationDelay)
+
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(1)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+        }
+
+        rule.onNodeWithTag("myClickable")
+            .performTouchInput { up() }
+
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(2)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+            assertThat(interactions[1]).isInstanceOf(PressInteraction.Release::class.java)
+            assertThat((interactions[1] as PressInteraction.Release).press)
+                .isEqualTo(interactions[0])
+        }
+    }
+
+    /**
+     * Test case for a [clickable] inside an [AndroidView] inside a non-scrollable Compose container
+     */
+    @Ignore(
+        "b/203141462 - currently this is not implemented so AndroidView()s will always " +
+            "appear scrollable"
+    )
+    @Test
+    fun clickable_androidViewInNotScrollableContainer() {
+        val interactionSource = MutableInteractionSource()
+
+        lateinit var scope: CoroutineScope
+
+        rule.mainClock.autoAdvance = false
+
+        rule.setContent {
+            scope = rememberCoroutineScope()
+            Box {
+                AndroidView({ context -> ComposeView(context).apply {
+                    setContent {
+                        Box {
+                            BasicText(
+                                "ClickableText",
+                                modifier = Modifier
+                                    .testTag("myClickable")
+                                    .combinedClickable(
+                                        interactionSource = interactionSource,
+                                        indication = null
+                                    ) {}
+                            )
+                        }
+                    }
+                } })
+            }
+        }
+
+        val interactions = mutableListOf<Interaction>()
+
+        scope.launch {
+            interactionSource.interactions.collect { interactions.add(it) }
+        }
+
+        rule.runOnIdle {
+            assertThat(interactions).isEmpty()
+        }
+
+        rule.onNodeWithTag("myClickable")
+            .performTouchInput { down(center) }
+
+        // No scrollable container, so there should be no delay and we should instantly appear
+        // pressed
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(1)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+        }
+
+        rule.onNodeWithTag("myClickable")
+            .performTouchInput { up() }
+
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(2)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+            assertThat(interactions[1]).isInstanceOf(PressInteraction.Release::class.java)
+            assertThat((interactions[1] as PressInteraction.Release).press)
+                .isEqualTo(interactions[0])
+        }
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ClickableTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ClickableTest.kt
index 745c482..b3ca612 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ClickableTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ClickableTest.kt
@@ -16,6 +16,12 @@
 
 package androidx.compose.foundation
 
+import android.view.KeyEvent.ACTION_DOWN
+import android.view.KeyEvent.ACTION_UP
+import android.view.KeyEvent.KEYCODE_DPAD_CENTER
+import android.view.KeyEvent.KEYCODE_ENTER
+import android.view.KeyEvent.KEYCODE_NUMPAD_ENTER
+import android.view.KeyEvent as AndroidKeyEvent
 import androidx.compose.foundation.gestures.Orientation
 import androidx.compose.foundation.gestures.detectTapGestures
 import androidx.compose.foundation.gestures.draggable
@@ -30,25 +36,21 @@
 import androidx.compose.foundation.layout.requiredWidth
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.text.BasicText
-import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.runtime.setValue
-import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.clipToBounds
 import androidx.compose.ui.focus.FocusManager
 import androidx.compose.ui.focus.FocusRequester
 import androidx.compose.ui.focus.focusRequester
 import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.input.InputMode
-import androidx.compose.ui.input.InputModeManager
+import androidx.compose.ui.input.key.KeyEvent
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.platform.InspectableValue
 import androidx.compose.ui.platform.LocalFocusManager
-import androidx.compose.ui.platform.LocalInputModeManager
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.semantics.SemanticsActions
@@ -70,6 +72,7 @@
 import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.test.onNodeWithText
 import androidx.compose.ui.test.performClick
+import androidx.compose.ui.test.performKeyPress
 import androidx.compose.ui.test.performMouseInput
 import androidx.compose.ui.test.performSemanticsAction
 import androidx.compose.ui.test.performTouchInput
@@ -77,6 +80,7 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import androidx.test.filters.MediumTest
+import androidx.test.platform.app.InstrumentationRegistry
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.flow.collect
@@ -203,6 +207,90 @@
     }
 
     @Test
+    fun clickableTest_clickWithEnterKey() {
+        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
+        var counter = 0
+        val focusRequester = FocusRequester()
+        rule.setContent {
+            BasicText(
+                    "ClickableText",
+                    modifier = Modifier
+                        .testTag("myClickable")
+                        .focusRequester(focusRequester)
+                        .clickable { counter++ }
+            )
+        }
+
+        rule.runOnIdle { focusRequester.requestFocus() }
+
+        rule.onNodeWithTag("myClickable")
+            .performKeyPress(KeyEvent(AndroidKeyEvent(ACTION_DOWN, KEYCODE_ENTER)))
+
+        rule.runOnIdle { assertThat(counter).isEqualTo(0) }
+
+        rule.onNodeWithTag("myClickable")
+            .performKeyPress(KeyEvent(AndroidKeyEvent(ACTION_UP, KEYCODE_ENTER)))
+
+        rule.runOnIdle { assertThat(counter).isEqualTo(1) }
+    }
+
+    @Test
+    fun clickableTest_clickWithNumPadEnterKey() {
+        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
+        var counter = 0
+        val focusRequester = FocusRequester()
+        rule.setContent {
+            BasicText(
+                "ClickableText",
+                modifier = Modifier
+                    .testTag("myClickable")
+                    .focusRequester(focusRequester)
+                    .clickable { counter++ }
+            )
+        }
+
+        rule.runOnIdle { focusRequester.requestFocus() }
+
+        rule.onNodeWithTag("myClickable")
+            .performKeyPress(KeyEvent(AndroidKeyEvent(ACTION_DOWN, KEYCODE_NUMPAD_ENTER)))
+
+        rule.runOnIdle { assertThat(counter).isEqualTo(0) }
+
+        rule.onNodeWithTag("myClickable")
+            .performKeyPress(KeyEvent(AndroidKeyEvent(ACTION_UP, KEYCODE_NUMPAD_ENTER)))
+
+        rule.runOnIdle { assertThat(counter).isEqualTo(1) }
+    }
+
+    @Test
+    fun clickableTest_clickWithDPadCenter() {
+        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
+        var counter = 0
+        val focusRequester = FocusRequester()
+        rule.setContent {
+            BasicText(
+                "ClickableText",
+                modifier = Modifier
+                    .testTag("myClickable")
+                    .focusRequester(focusRequester)
+                    .clickable { counter++ }
+            )
+        }
+
+        rule.runOnIdle { focusRequester.requestFocus() }
+
+        rule.onNodeWithTag("myClickable")
+            .performKeyPress(KeyEvent(AndroidKeyEvent(ACTION_DOWN, KEYCODE_DPAD_CENTER)))
+
+        rule.runOnIdle { assertThat(counter).isEqualTo(0) }
+
+        rule.onNodeWithTag("myClickable")
+            .performKeyPress(KeyEvent(AndroidKeyEvent(ACTION_UP, KEYCODE_DPAD_CENTER)))
+
+        rule.runOnIdle { assertThat(counter).isEqualTo(1) }
+    }
+
+    @Test
     fun clickableTest_clickOnChildBasicText() {
         var counter = 0
         val onClick: () -> Unit = { ++counter }
@@ -441,7 +529,7 @@
     }
 
     @Test
-    fun clickableTest_interactionSource() {
+    fun clickableTest_interactionSource_noScrollableContainer() {
         val interactionSource = MutableInteractionSource()
 
         lateinit var scope: CoroutineScope
@@ -476,6 +564,212 @@
         rule.onNodeWithTag("myClickable")
             .performTouchInput { down(center) }
 
+        // No scrollable container, so there should be no delay and we should instantly appear
+        // pressed
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(1)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+        }
+
+        rule.onNodeWithTag("myClickable")
+            .performTouchInput { up() }
+
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(2)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+            assertThat(interactions[1]).isInstanceOf(PressInteraction.Release::class.java)
+            assertThat((interactions[1] as PressInteraction.Release).press)
+                .isEqualTo(interactions[0])
+        }
+    }
+
+    @Test
+    fun clickableTest_interactionSource_immediateRelease_noScrollableContainer() {
+        val interactionSource = MutableInteractionSource()
+
+        lateinit var scope: CoroutineScope
+
+        rule.mainClock.autoAdvance = false
+
+        rule.setContent {
+            scope = rememberCoroutineScope()
+            Box {
+                BasicText(
+                    "ClickableText",
+                    modifier = Modifier
+                        .testTag("myClickable")
+                        .combinedClickable(
+                            interactionSource = interactionSource,
+                            indication = null
+                        ) {}
+                )
+            }
+        }
+
+        val interactions = mutableListOf<Interaction>()
+
+        scope.launch {
+            interactionSource.interactions.collect { interactions.add(it) }
+        }
+
+        rule.runOnIdle {
+            assertThat(interactions).isEmpty()
+        }
+
+        rule.onNodeWithTag("myClickable")
+            .performTouchInput {
+                down(center)
+                up()
+            }
+
+        // Press finished so we should see both press and release
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(2)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+            assertThat(interactions[1]).isInstanceOf(PressInteraction.Release::class.java)
+            assertThat((interactions[1] as PressInteraction.Release).press)
+                .isEqualTo(interactions[0])
+        }
+    }
+
+    @Test
+    fun clickableTest_interactionSource_immediateCancel_noScrollableContainer() {
+        val interactionSource = MutableInteractionSource()
+
+        lateinit var scope: CoroutineScope
+
+        rule.mainClock.autoAdvance = false
+
+        rule.setContent {
+            scope = rememberCoroutineScope()
+            Box {
+                BasicText(
+                    "ClickableText",
+                    modifier = Modifier
+                        .testTag("myClickable")
+                        .combinedClickable(
+                            interactionSource = interactionSource,
+                            indication = null
+                        ) {}
+                )
+            }
+        }
+
+        val interactions = mutableListOf<Interaction>()
+
+        scope.launch {
+            interactionSource.interactions.collect { interactions.add(it) }
+        }
+
+        rule.runOnIdle {
+            assertThat(interactions).isEmpty()
+        }
+
+        rule.onNodeWithTag("myClickable")
+            .performTouchInput {
+                down(center)
+                cancel()
+            }
+
+        // We are not in a scrollable container, so we should see a press and immediate cancel
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(2)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+            assertThat(interactions[1]).isInstanceOf(PressInteraction.Cancel::class.java)
+            assertThat((interactions[1] as PressInteraction.Cancel).press)
+                .isEqualTo(interactions[0])
+        }
+    }
+
+    @Test
+    fun clickableTest_interactionSource_immediateDrag_noScrollableContainer() {
+        val interactionSource = MutableInteractionSource()
+
+        lateinit var scope: CoroutineScope
+
+        rule.mainClock.autoAdvance = false
+
+        rule.setContent {
+            scope = rememberCoroutineScope()
+            Box {
+                BasicText(
+                    "ClickableText",
+                    modifier = Modifier
+                        .testTag("myClickable")
+                        .draggable(
+                            state = rememberDraggableState {},
+                            orientation = Orientation.Horizontal
+                        )
+                        .combinedClickable(
+                            interactionSource = interactionSource,
+                            indication = null
+                        ) {}
+                )
+            }
+        }
+
+        val interactions = mutableListOf<Interaction>()
+
+        scope.launch {
+            interactionSource.interactions.collect { interactions.add(it) }
+        }
+
+        rule.runOnIdle {
+            assertThat(interactions).isEmpty()
+        }
+
+        rule.onNodeWithTag("myClickable")
+            .performTouchInput {
+                down(centerLeft)
+                moveTo(centerRight)
+            }
+
+        // The press should fire, and then the drag should instantly cancel it
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(2)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+            assertThat(interactions[1]).isInstanceOf(PressInteraction.Cancel::class.java)
+            assertThat((interactions[1] as PressInteraction.Cancel).press)
+                .isEqualTo(interactions[0])
+        }
+    }
+
+    @Test
+    fun clickableTest_interactionSource_scrollableContainer() {
+        val interactionSource = MutableInteractionSource()
+
+        lateinit var scope: CoroutineScope
+
+        rule.mainClock.autoAdvance = false
+
+        rule.setContent {
+            scope = rememberCoroutineScope()
+            Box(Modifier.verticalScroll(rememberScrollState())) {
+                BasicText(
+                    "ClickableText",
+                    modifier = Modifier
+                        .testTag("myClickable")
+                        .combinedClickable(
+                            interactionSource = interactionSource,
+                            indication = null
+                        ) {}
+                )
+            }
+        }
+
+        val interactions = mutableListOf<Interaction>()
+
+        scope.launch {
+            interactionSource.interactions.collect { interactions.add(it) }
+        }
+
+        rule.runOnIdle {
+            assertThat(interactions).isEmpty()
+        }
+
+        rule.onNodeWithTag("myClickable")
+            .performTouchInput { down(center) }
+
         val halfTapIndicationDelay = TapIndicationDelay / 2
 
         rule.mainClock.advanceTimeBy(halfTapIndicationDelay)
@@ -506,7 +800,7 @@
     }
 
     @Test
-    fun clickableTest_interactionSource_immediateRelease() {
+    fun clickableTest_interactionSource_immediateRelease_scrollableContainer() {
         val interactionSource = MutableInteractionSource()
 
         lateinit var scope: CoroutineScope
@@ -515,7 +809,7 @@
 
         rule.setContent {
             scope = rememberCoroutineScope()
-            Box {
+            Box(Modifier.verticalScroll(rememberScrollState())) {
                 BasicText(
                     "ClickableText",
                     modifier = Modifier
@@ -556,7 +850,7 @@
     }
 
     @Test
-    fun clickableTest_interactionSource_immediateCancel() {
+    fun clickableTest_interactionSource_immediateCancel_scrollableContainer() {
         val interactionSource = MutableInteractionSource()
 
         lateinit var scope: CoroutineScope
@@ -565,7 +859,7 @@
 
         rule.setContent {
             scope = rememberCoroutineScope()
-            Box {
+            Box(Modifier.verticalScroll(rememberScrollState())) {
                 BasicText(
                     "ClickableText",
                     modifier = Modifier
@@ -602,7 +896,7 @@
     }
 
     @Test
-    fun clickableTest_interactionSource_immediateDrag() {
+    fun clickableTest_interactionSource_immediateDrag_scrollableContainer() {
         val interactionSource = MutableInteractionSource()
 
         lateinit var scope: CoroutineScope
@@ -611,7 +905,7 @@
 
         rule.setContent {
             scope = rememberCoroutineScope()
-            Box {
+            Box(Modifier.verticalScroll(rememberScrollState())) {
                 BasicText(
                     "ClickableText",
                     modifier = Modifier
@@ -653,7 +947,7 @@
     }
 
     @Test
-    fun clickableTest_interactionSource_dragAfterTimeout() {
+    fun clickableTest_interactionSource_dragAfterTimeout_scrollableContainer() {
         val interactionSource = MutableInteractionSource()
 
         lateinit var scope: CoroutineScope
@@ -662,7 +956,7 @@
 
         rule.setContent {
             scope = rememberCoroutineScope()
-            Box {
+            Box(Modifier.verticalScroll(rememberScrollState())) {
                 BasicText(
                     "ClickableText",
                     modifier = Modifier
@@ -717,7 +1011,7 @@
     }
 
     @Test
-    fun clickableTest_interactionSource_cancelledGesture() {
+    fun clickableTest_interactionSource_cancelledGesture_scrollableContainer() {
         val interactionSource = MutableInteractionSource()
 
         lateinit var scope: CoroutineScope
@@ -726,7 +1020,7 @@
 
         rule.setContent {
             scope = rememberCoroutineScope()
-            Box {
+            Box(Modifier.verticalScroll(rememberScrollState())) {
                 BasicText(
                     "ClickableText",
                     modifier = Modifier
@@ -940,10 +1234,9 @@
 
     @Test
     fun clickableTest_interactionSource_focus_inTouchMode() {
+        InstrumentationRegistry.getInstrumentation().setInTouchMode(true)
         val interactionSource = MutableInteractionSource()
-
         lateinit var scope: CoroutineScope
-
         val focusRequester = FocusRequester()
 
         rule.setContent {
@@ -984,25 +1277,15 @@
 
     @Test
     fun clickableTest_interactionSource_focus_inKeyboardMode() {
+        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
-
         lateinit var scope: CoroutineScope
-
         val focusRequester = FocusRequester()
-
         lateinit var focusManager: FocusManager
 
-        val keyboardInputModeManager = object : InputModeManager {
-            override val inputMode = InputMode.Keyboard
-
-            @OptIn(ExperimentalComposeUiApi::class)
-            override fun requestInputMode(inputMode: InputMode) = true
-        }
-
         rule.setContent {
             scope = rememberCoroutineScope()
             focusManager = LocalFocusManager.current
-            CompositionLocalProvider(LocalInputModeManager provides keyboardInputModeManager) {
                 Box {
                     BasicText(
                         "ClickableText",
@@ -1015,7 +1298,6 @@
                             ) {}
                     )
                 }
-            }
         }
 
         val interactions = mutableListOf<Interaction>()
@@ -1639,4 +1921,4 @@
             assertThat(clicked).isTrue()
         }
     }
-}
\ No newline at end of file
+}
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/IndicationTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/IndicationTest.kt
index 13a2b5b..64ba70c 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/IndicationTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/IndicationTest.kt
@@ -95,8 +95,6 @@
 
         var scope: CoroutineScope? = null
 
-        rule.mainClock.autoAdvance = false
-
         rule.setContent {
             scope = rememberCoroutineScope()
             Box(
@@ -121,9 +119,6 @@
                 down(center)
             }
 
-        // Advance past the tap timeout
-        rule.mainClock.advanceTimeBy(TapIndicationDelay)
-
         rule.runOnIdle {
             assertThat(countDownLatch.count).isEqualTo(1)
         }
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollableTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollableTest.kt
index f944a6a..b7322de 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollableTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollableTest.kt
@@ -18,6 +18,7 @@
 
 import androidx.compose.animation.core.keyframes
 import androidx.compose.foundation.gestures.FlingBehavior
+import androidx.compose.foundation.gestures.ModifierLocalScrollableContainer
 import androidx.compose.foundation.gestures.Orientation
 import androidx.compose.foundation.gestures.ScrollScope
 import androidx.compose.foundation.gestures.ScrollableState
@@ -41,6 +42,8 @@
 import androidx.compose.ui.input.nestedscroll.NestedScrollDispatcher
 import androidx.compose.ui.input.nestedscroll.NestedScrollSource
 import androidx.compose.ui.input.nestedscroll.nestedScroll
+import androidx.compose.ui.modifier.ModifierLocalConsumer
+import androidx.compose.ui.modifier.ModifierLocalReadScope
 import androidx.compose.ui.platform.InspectableValue
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.platform.testTag
@@ -1353,6 +1356,56 @@
     }
 
     @Test
+    fun scrollable_setsModifierLocalScrollableContainer() {
+        val controller = ScrollableState { it }
+
+        var isOuterInScrollableContainer: Boolean? = null
+        var isInnerInScrollableContainer: Boolean? = null
+        rule.setContent {
+            Box {
+                Box(
+                    modifier = Modifier
+                        .testTag(scrollableBoxTag)
+                        .size(100.dp)
+                        .then(
+                            object : ModifierLocalConsumer {
+                                override fun onModifierLocalsUpdated(
+                                    scope: ModifierLocalReadScope
+                                ) {
+                                    with(scope) {
+                                        isOuterInScrollableContainer =
+                                            ModifierLocalScrollableContainer.current
+                                    }
+                                }
+                            }
+                        )
+                        .scrollable(
+                            state = controller,
+                            orientation = Orientation.Horizontal
+                        )
+                        .then(
+                            object : ModifierLocalConsumer {
+                                override fun onModifierLocalsUpdated(
+                                    scope: ModifierLocalReadScope
+                                ) {
+                                    with(scope) {
+                                        isInnerInScrollableContainer =
+                                            ModifierLocalScrollableContainer.current
+                                    }
+                                }
+                            }
+                        )
+                )
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(isOuterInScrollableContainer).isFalse()
+            assertThat(isInnerInScrollableContainer).isTrue()
+        }
+    }
+
+    @Test
     fun scrollable_scrollByWorksWithRepeatableAnimations() {
         rule.mainClock.autoAdvance = false
 
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SelectableTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SelectableTest.kt
index cf783e1..a5447a8 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SelectableTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SelectableTest.kt
@@ -24,24 +24,19 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.selection.selectable
 import androidx.compose.foundation.text.BasicText
-import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.runtime.setValue
 import androidx.compose.testutils.first
-import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusManager
 import androidx.compose.ui.focus.FocusRequester
 import androidx.compose.ui.focus.focusRequester
 import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.input.InputMode
-import androidx.compose.ui.input.InputModeManager
 import androidx.compose.ui.platform.InspectableValue
 import androidx.compose.ui.platform.LocalFocusManager
-import androidx.compose.ui.platform.LocalInputModeManager
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.semantics.SemanticsProperties
@@ -61,6 +56,7 @@
 import androidx.compose.ui.test.performTouchInput
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
+import androidx.test.platform.app.InstrumentationRegistry
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.flow.collect
@@ -187,7 +183,7 @@
     }
 
     @Test
-    fun selectableTest_interactionSource() {
+    fun selectableTest_interactionSource_noScrollableContainer() {
         val interactionSource = MutableInteractionSource()
 
         lateinit var scope: CoroutineScope
@@ -223,6 +219,121 @@
         rule.onNodeWithText("SelectableText")
             .performTouchInput { down(center) }
 
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(1)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+        }
+
+        rule.onNodeWithText("SelectableText")
+            .performTouchInput { up() }
+
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(2)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+            assertThat(interactions[1]).isInstanceOf(PressInteraction.Release::class.java)
+            assertThat((interactions[1] as PressInteraction.Release).press)
+                .isEqualTo(interactions[0])
+        }
+    }
+
+    @Test
+    fun selectableTest_interactionSource_resetWhenDisposed_noScrollableContainer() {
+        val interactionSource = MutableInteractionSource()
+        var emitSelectableText by mutableStateOf(true)
+
+        lateinit var scope: CoroutineScope
+
+        rule.mainClock.autoAdvance = false
+
+        rule.setContent {
+            scope = rememberCoroutineScope()
+            Box {
+                if (emitSelectableText) {
+                    Box(
+                        Modifier.selectable(
+                            selected = true,
+                            interactionSource = interactionSource,
+                            indication = null,
+                            onClick = {}
+                        )
+                    ) {
+                        BasicText("SelectableText")
+                    }
+                }
+            }
+        }
+
+        val interactions = mutableListOf<Interaction>()
+
+        scope.launch {
+            interactionSource.interactions.collect { interactions.add(it) }
+        }
+
+        rule.runOnIdle {
+            assertThat(interactions).isEmpty()
+        }
+
+        rule.onNodeWithText("SelectableText")
+            .performTouchInput { down(center) }
+
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(1)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+        }
+
+        // Dispose selectable
+        rule.runOnIdle {
+            emitSelectableText = false
+        }
+
+        rule.mainClock.advanceTimeByFrame()
+
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(2)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+            assertThat(interactions[1]).isInstanceOf(PressInteraction.Cancel::class.java)
+            assertThat((interactions[1] as PressInteraction.Cancel).press)
+                .isEqualTo(interactions[0])
+        }
+    }
+
+    @Test
+    fun selectableTest_interactionSource_scrollableContainer() {
+        val interactionSource = MutableInteractionSource()
+
+        lateinit var scope: CoroutineScope
+
+        rule.mainClock.autoAdvance = false
+
+        rule.setContent {
+            scope = rememberCoroutineScope()
+            Box(Modifier.verticalScroll(rememberScrollState())) {
+                Box(
+                    Modifier.selectable(
+                        selected = true,
+                        interactionSource = interactionSource,
+                        indication = null,
+                        onClick = {}
+                    )
+                ) {
+                    BasicText("SelectableText")
+                }
+            }
+        }
+
+        val interactions = mutableListOf<Interaction>()
+
+        scope.launch {
+            interactionSource.interactions.collect { interactions.add(it) }
+        }
+
+        rule.runOnIdle {
+            assertThat(interactions).isEmpty()
+        }
+
+        rule.onNodeWithText("SelectableText")
+            .performTouchInput { down(center) }
+
         // Advance past the tap timeout
         rule.mainClock.advanceTimeBy(TapIndicationDelay)
 
@@ -244,7 +355,7 @@
     }
 
     @Test
-    fun selectableTest_interactionSource_resetWhenDisposed() {
+    fun selectableTest_interactionSource_resetWhenDisposed_scrollableContainer() {
         val interactionSource = MutableInteractionSource()
         var emitSelectableText by mutableStateOf(true)
 
@@ -254,7 +365,7 @@
 
         rule.setContent {
             scope = rememberCoroutineScope()
-            Box {
+            Box(Modifier.verticalScroll(rememberScrollState())) {
                 if (emitSelectableText) {
                     Box(
                         Modifier.selectable(
@@ -363,10 +474,9 @@
 
     @Test
     fun selectableTest_interactionSource_focus_inTouchMode() {
+        InstrumentationRegistry.getInstrumentation().setInTouchMode(true)
         val interactionSource = MutableInteractionSource()
-
         lateinit var scope: CoroutineScope
-
         val focusRequester = FocusRequester()
 
         rule.setContent {
@@ -409,25 +519,15 @@
 
     @Test
     fun selectableTest_interactionSource_focus_inKeyboardMode() {
+        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
-
         lateinit var scope: CoroutineScope
-
         val focusRequester = FocusRequester()
-
         lateinit var focusManager: FocusManager
 
-        val keyboardInputModeManager = object : InputModeManager {
-            override val inputMode = InputMode.Keyboard
-
-            @OptIn(ExperimentalComposeUiApi::class)
-            override fun requestInputMode(inputMode: InputMode) = true
-        }
-
         rule.setContent {
             scope = rememberCoroutineScope()
             focusManager = LocalFocusManager.current
-            CompositionLocalProvider(LocalInputModeManager provides keyboardInputModeManager) {
                 Box {
                     Box(
                         Modifier
@@ -442,7 +542,6 @@
                         BasicText("SelectableText")
                     }
                 }
-            }
         }
 
         val interactions = mutableListOf<Interaction>()
@@ -517,4 +616,4 @@
             )
         }
     }
-}
\ No newline at end of file
+}
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ToggleableTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ToggleableTest.kt
index a01e6a7..b5b2090 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ToggleableTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ToggleableTest.kt
@@ -28,24 +28,19 @@
 import androidx.compose.foundation.selection.toggleable
 import androidx.compose.foundation.selection.triStateToggleable
 import androidx.compose.foundation.text.BasicText
-import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.runtime.setValue
 import androidx.compose.testutils.first
-import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusManager
 import androidx.compose.ui.focus.FocusRequester
 import androidx.compose.ui.focus.focusRequester
 import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.input.InputMode
-import androidx.compose.ui.input.InputModeManager
 import androidx.compose.ui.platform.InspectableValue
 import androidx.compose.ui.platform.LocalFocusManager
-import androidx.compose.ui.platform.LocalInputModeManager
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.semantics.SemanticsProperties
@@ -73,6 +68,7 @@
 import androidx.compose.ui.unit.dp
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
+import androidx.test.platform.app.InstrumentationRegistry
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.flow.collect
@@ -282,7 +278,7 @@
     }
 
     @Test
-    fun toggleableTest_interactionSource() {
+    fun toggleableTest_interactionSource_noScrollableContainer() {
         val interactionSource = MutableInteractionSource()
 
         lateinit var scope: CoroutineScope
@@ -318,6 +314,121 @@
         rule.onNodeWithText("ToggleableText")
             .performTouchInput { down(center) }
 
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(1)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+        }
+
+        rule.onNodeWithText("ToggleableText")
+            .performTouchInput { up() }
+
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(2)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+            assertThat(interactions[1]).isInstanceOf(PressInteraction.Release::class.java)
+            assertThat((interactions[1] as PressInteraction.Release).press)
+                .isEqualTo(interactions[0])
+        }
+    }
+
+    @Test
+    fun toggleableTest_interactionSource_resetWhenDisposed_noScrollableContainer() {
+        val interactionSource = MutableInteractionSource()
+        var emitToggleableText by mutableStateOf(true)
+
+        lateinit var scope: CoroutineScope
+
+        rule.mainClock.autoAdvance = false
+
+        rule.setContent {
+            scope = rememberCoroutineScope()
+            Box {
+                if (emitToggleableText) {
+                    Box(
+                        Modifier.toggleable(
+                            value = true,
+                            interactionSource = interactionSource,
+                            indication = null,
+                            onValueChange = {}
+                        )
+                    ) {
+                        BasicText("ToggleableText")
+                    }
+                }
+            }
+        }
+
+        val interactions = mutableListOf<Interaction>()
+
+        scope.launch {
+            interactionSource.interactions.collect { interactions.add(it) }
+        }
+
+        rule.runOnIdle {
+            assertThat(interactions).isEmpty()
+        }
+
+        rule.onNodeWithText("ToggleableText")
+            .performTouchInput { down(center) }
+
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(1)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+        }
+
+        // Dispose toggleable
+        rule.runOnIdle {
+            emitToggleableText = false
+        }
+
+        rule.mainClock.advanceTimeByFrame()
+
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(2)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+            assertThat(interactions[1]).isInstanceOf(PressInteraction.Cancel::class.java)
+            assertThat((interactions[1] as PressInteraction.Cancel).press)
+                .isEqualTo(interactions[0])
+        }
+    }
+
+    @Test
+    fun toggleableTest_interactionSource_scrollableContainer() {
+        val interactionSource = MutableInteractionSource()
+
+        lateinit var scope: CoroutineScope
+
+        rule.mainClock.autoAdvance = false
+
+        rule.setContent {
+            scope = rememberCoroutineScope()
+            Box(Modifier.verticalScroll(rememberScrollState())) {
+                Box(
+                    Modifier.toggleable(
+                        value = true,
+                        interactionSource = interactionSource,
+                        indication = null,
+                        onValueChange = {}
+                    )
+                ) {
+                    BasicText("ToggleableText")
+                }
+            }
+        }
+
+        val interactions = mutableListOf<Interaction>()
+
+        scope.launch {
+            interactionSource.interactions.collect { interactions.add(it) }
+        }
+
+        rule.runOnIdle {
+            assertThat(interactions).isEmpty()
+        }
+
+        rule.onNodeWithText("ToggleableText")
+            .performTouchInput { down(center) }
+
         // Advance past the tap timeout
         rule.mainClock.advanceTimeBy(TapIndicationDelay)
 
@@ -339,7 +450,7 @@
     }
 
     @Test
-    fun toggleableTest_interactionSource_resetWhenDisposed() {
+    fun toggleableTest_interactionSource_resetWhenDisposed_scrollableContainer() {
         val interactionSource = MutableInteractionSource()
         var emitToggleableText by mutableStateOf(true)
 
@@ -349,7 +460,7 @@
 
         rule.setContent {
             scope = rememberCoroutineScope()
-            Box {
+            Box(Modifier.verticalScroll(rememberScrollState())) {
                 if (emitToggleableText) {
                     Box(
                         Modifier.toggleable(
@@ -458,10 +569,9 @@
 
     @Test
     fun toggleableTest_interactionSource_focus_inTouchMode() {
+        InstrumentationRegistry.getInstrumentation().setInTouchMode(true)
         val interactionSource = MutableInteractionSource()
-
         lateinit var scope: CoroutineScope
-
         val focusRequester = FocusRequester()
 
         rule.setContent {
@@ -504,26 +614,16 @@
 
     @Test
     fun toggleableTest_interactionSource_focus_inKeyboardMode() {
+        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
         val interactionSource = MutableInteractionSource()
-
         lateinit var scope: CoroutineScope
-
         val focusRequester = FocusRequester()
-
         lateinit var focusManager: FocusManager
 
-        val keyboardInputModeManager = object : InputModeManager {
-            override val inputMode = InputMode.Keyboard
-
-            @OptIn(ExperimentalComposeUiApi::class)
-            override fun requestInputMode(inputMode: InputMode) = true
-        }
-
         rule.setContent {
             scope = rememberCoroutineScope()
             focusManager = LocalFocusManager.current
-            CompositionLocalProvider(LocalInputModeManager provides keyboardInputModeManager) {
-                Box {
+            Box {
                     Box(
                         Modifier
                             .focusRequester(focusRequester)
@@ -537,7 +637,6 @@
                         BasicText("ToggleableText")
                     }
                 }
-            }
         }
 
         val interactions = mutableListOf<Interaction>()
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 eb7ad6ed..70674ad 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
@@ -73,11 +73,11 @@
 
         rule.onNodeWithTag(OverscrollBox).performTouchInput {
             down(center)
-            moveBy(Offset(200f, 0f))
+            moveBy(Offset(-(200f + (viewConfiguration?.touchSlop ?: 0f)), 0f))
             // 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(-200f + (viewConfiguration?.touchSlop ?: 0f), 0f))
+            moveBy(Offset(200f, 0f))
             up()
         }
 
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/RelocationRequesterModifierTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/relocation/BringIntoViewRequesterModifierTest.kt
similarity index 87%
rename from compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/RelocationRequesterModifierTest.kt
rename to compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/relocation/BringIntoViewRequesterModifierTest.kt
index 472d9f6..61a6f1c 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/RelocationRequesterModifierTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/relocation/BringIntoViewRequesterModifierTest.kt
@@ -14,11 +14,12 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.layout
+package androidx.compose.foundation.relocation
 
 import android.os.Build.VERSION_CODES.O
 import androidx.annotation.RequiresApi
 import androidx.compose.foundation.Canvas
+import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.ScrollState
 import androidx.compose.foundation.gestures.Orientation
 import androidx.compose.foundation.gestures.Orientation.Horizontal
@@ -33,10 +34,9 @@
 import androidx.compose.foundation.verticalScroll
 import androidx.compose.runtime.Composable
 import androidx.compose.testutils.assertAgainstGolden
-import androidx.compose.ui.ExperimentalComposeUiApi
-import androidx.compose.ui.GOLDEN_UI
+import androidx.compose.foundation.GOLDEN_UI
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.background
+import androidx.compose.foundation.background
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.geometry.Size
@@ -64,11 +64,11 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
-@OptIn(ExperimentalCoroutinesApi::class, ExperimentalComposeUiApi::class)
+@OptIn(ExperimentalCoroutinesApi::class, ExperimentalFoundationApi::class)
 @MediumTest
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = O)
-class RelocationRequesterModifierTest(private val orientation: Orientation) {
+class BringIntoViewRequesterModifierTest(private val orientation: Orientation) {
     @get:Rule
     val rule = createComposeRule()
 
@@ -86,7 +86,7 @@
     @Test
     fun noScrollableParent_noChange() {
         // Arrange.
-        val relocationRequester = RelocationRequester()
+        val bringIntoViewRequester = BringIntoViewRequester()
         rule.setContent {
             Box(
                 Modifier
@@ -103,13 +103,13 @@
                     Modifier
                         .size(50.dp)
                         .background(Blue)
-                        .relocationRequester(relocationRequester)
+                        .bringIntoViewRequester(bringIntoViewRequester)
                 )
             }
         }
 
         // Act.
-        runBlockingAndAwaitIdle { relocationRequester.bringIntoView() }
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
 
         // Assert.
         assertScreenshot(if (horizontal) "blueBoxLeft" else "blueBoxTop")
@@ -118,7 +118,7 @@
     @Test
     fun noScrollableParent_itemNotVisible_noChange() {
         // Arrange.
-        val relocationRequester = RelocationRequester()
+        val bringIntoViewRequester = BringIntoViewRequester()
         rule.setContent {
             Box(
                 Modifier
@@ -141,13 +141,13 @@
                         )
                         .size(50.dp)
                         .background(Blue)
-                        .relocationRequester(relocationRequester)
+                        .bringIntoViewRequester(bringIntoViewRequester)
                 )
             }
         }
 
         // Act.
-        runBlockingAndAwaitIdle { relocationRequester.bringIntoView() }
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
 
         // Assert.
         assertScreenshot(if (horizontal) "grayRectangleHorizontal" else "grayRectangleVertical")
@@ -156,7 +156,7 @@
     @Test
     fun itemAtLeadingEdge_alreadyVisible_noChange() {
         // Arrange.
-        val relocationRequester = RelocationRequester()
+        val bringIntoViewRequester = BringIntoViewRequester()
         rule.setContent {
             Box(
                 Modifier
@@ -179,13 +179,13 @@
                     Modifier
                         .size(50.dp)
                         .background(Blue)
-                        .relocationRequester(relocationRequester)
+                        .bringIntoViewRequester(bringIntoViewRequester)
                 )
             }
         }
 
         // Act.
-        runBlockingAndAwaitIdle { relocationRequester.bringIntoView() }
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
 
         // Assert.
         assertScreenshot(if (horizontal) "blueBoxLeft" else "blueBoxTop")
@@ -194,7 +194,7 @@
     @Test
     fun itemAtTrailingEdge_alreadyVisible_noChange() {
         // Arrange.
-        val relocationRequester = RelocationRequester()
+        val bringIntoViewRequester = BringIntoViewRequester()
         rule.setContent {
             Box(
                 Modifier
@@ -223,13 +223,13 @@
                         )
                         .size(50.dp)
                         .background(Blue)
-                        .relocationRequester(relocationRequester)
+                        .bringIntoViewRequester(bringIntoViewRequester)
                 )
             }
         }
 
         // Act.
-        runBlockingAndAwaitIdle { relocationRequester.bringIntoView() }
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
 
         // Assert.
         assertScreenshot(if (horizontal) "blueBoxRight" else "blueBoxBottom")
@@ -238,7 +238,7 @@
     @Test
     fun itemAtCenter_alreadyVisible_noChange() {
         // Arrange.
-        val relocationRequester = RelocationRequester()
+        val bringIntoViewRequester = BringIntoViewRequester()
         rule.setContent {
             Box(
                 Modifier
@@ -267,13 +267,13 @@
                         )
                         .size(50.dp)
                         .background(Blue)
-                        .relocationRequester(relocationRequester)
+                        .bringIntoViewRequester(bringIntoViewRequester)
                 )
             }
         }
 
         // Act.
-        runBlockingAndAwaitIdle { relocationRequester.bringIntoView() }
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
 
         // Assert.
         assertScreenshot(if (horizontal) "blueBoxCenterHorizontal" else "blueBoxCenterVertical")
@@ -282,7 +282,7 @@
     @Test
     fun itemBiggerThanParentAtLeadingEdge_alreadyVisible_noChange() {
         // Arrange.
-        val relocationRequester = RelocationRequester()
+        val bringIntoViewRequester = BringIntoViewRequester()
         rule.setContent {
             Box(
                 Modifier
@@ -298,7 +298,7 @@
             ) {
                 // Using a multi-colored item to make sure we can assert that the right part of
                 // the item is visible.
-                RowOrColumn(Modifier.relocationRequester(relocationRequester)) {
+                RowOrColumn(Modifier.bringIntoViewRequester(bringIntoViewRequester)) {
                     Box(Modifier.size(50.dp).background(Blue))
                     Box(Modifier.size(50.dp).background(Green))
                     Box(Modifier.size(50.dp).background(Red))
@@ -307,7 +307,7 @@
         }
 
         // Act.
-        runBlockingAndAwaitIdle { relocationRequester.bringIntoView() }
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
 
         // Assert.
         assertScreenshot("blueBox")
@@ -316,7 +316,7 @@
     @Test
     fun itemBiggerThanParentAtTrailingEdge_alreadyVisible_noChange() {
         // Arrange.
-        val relocationRequester = RelocationRequester()
+        val bringIntoViewRequester = BringIntoViewRequester()
         lateinit var scrollState: ScrollState
         rule.setContent {
             scrollState = rememberScrollState()
@@ -334,7 +334,7 @@
             ) {
                 // Using a multi-colored item to make sure we can assert that the right part of
                 // the item is visible.
-                RowOrColumn(Modifier.relocationRequester(relocationRequester)) {
+                RowOrColumn(Modifier.bringIntoViewRequester(bringIntoViewRequester)) {
                     Box(Modifier.size(50.dp).background(Red))
                     Box(Modifier.size(50.dp).background(Green))
                     Box(Modifier.size(50.dp).background(Blue))
@@ -344,7 +344,7 @@
         runBlockingAndAwaitIdle { scrollState.scrollTo(scrollState.maxValue) }
 
         // Act.
-        runBlockingAndAwaitIdle { relocationRequester.bringIntoView() }
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
 
         // Assert.
         assertScreenshot("blueBox")
@@ -353,7 +353,7 @@
     @Test
     fun itemBiggerThanParentAtCenter_alreadyVisible_noChange() {
         // Arrange.
-        val relocationRequester = RelocationRequester()
+        val bringIntoViewRequester = BringIntoViewRequester()
         lateinit var scrollState: ScrollState
         rule.setContent {
             scrollState = rememberScrollState()
@@ -371,7 +371,7 @@
             ) {
                 // Using a multi-colored item to make sure we can assert that the right part of
                 // the item is visible.
-                RowOrColumn(Modifier.relocationRequester(relocationRequester)) {
+                RowOrColumn(Modifier.bringIntoViewRequester(bringIntoViewRequester)) {
                     Box(Modifier.size(50.dp).background(Green))
                     Box(Modifier.size(50.dp).background(Blue))
                     Box(Modifier.size(50.dp).background(Red))
@@ -381,7 +381,7 @@
         runBlockingAndAwaitIdle { scrollState.scrollTo(scrollState.maxValue / 2) }
 
         // Act.
-        runBlockingAndAwaitIdle { relocationRequester.bringIntoView() }
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
 
         // Assert.
         assertScreenshot("blueBox")
@@ -390,7 +390,7 @@
     @Test
     fun childBeforeVisibleBounds_parentIsScrolledSoThatLeadingEdgeOfChildIsVisible() {
         // Arrange.
-        val relocationRequester = RelocationRequester()
+        val bringIntoViewRequester = BringIntoViewRequester()
         lateinit var scrollState: ScrollState
         rule.setContent {
             scrollState = rememberScrollState()
@@ -427,7 +427,7 @@
                             )
                             .size(50.dp)
                             .background(Blue)
-                            .relocationRequester(relocationRequester)
+                            .bringIntoViewRequester(bringIntoViewRequester)
                     )
                 }
             }
@@ -435,7 +435,7 @@
         runBlockingAndAwaitIdle { scrollState.scrollTo(scrollState.maxValue) }
 
         // Act.
-        runBlockingAndAwaitIdle { relocationRequester.bringIntoView() }
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
 
         // Assert.
         assertScreenshot(if (horizontal) "blueBoxLeft" else "blueBoxTop")
@@ -444,7 +444,7 @@
     @Test
     fun childAfterVisibleBounds_parentIsScrolledSoThatTrailingEdgeOfChildIsVisible() {
         // Arrange.
-        val relocationRequester = RelocationRequester()
+        val bringIntoViewRequester = BringIntoViewRequester()
         lateinit var scrollState: ScrollState
         rule.setContent {
             scrollState = rememberScrollState()
@@ -481,7 +481,7 @@
                             )
                             .size(50.dp)
                             .background(Blue)
-                            .relocationRequester(relocationRequester)
+                            .bringIntoViewRequester(bringIntoViewRequester)
                     )
                 }
             }
@@ -489,7 +489,7 @@
         runBlockingAndAwaitIdle { scrollState.scrollTo(scrollState.maxValue) }
 
         // Act.
-        runBlockingAndAwaitIdle { relocationRequester.bringIntoView() }
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
 
         // Assert.
         assertScreenshot(if (horizontal) "blueBoxRight" else "blueBoxBottom")
@@ -498,7 +498,7 @@
     @Test
     fun childPartiallyVisible_parentIsScrolledSoThatLeadingEdgeOfChildIsVisible() {
         // Arrange.
-        val relocationRequester = RelocationRequester()
+        val bringIntoViewRequester = BringIntoViewRequester()
         lateinit var scrollState: ScrollState
         rule.setContent {
             scrollState = rememberScrollState()
@@ -530,7 +530,7 @@
                             )
                             .size(50.dp)
                             .background(Blue)
-                            .relocationRequester(relocationRequester)
+                            .bringIntoViewRequester(bringIntoViewRequester)
                     )
                 }
             }
@@ -538,7 +538,7 @@
         runBlockingAndAwaitIdle { scrollState.scrollTo(scrollState.maxValue / 2) }
 
         // Act.
-        runBlockingAndAwaitIdle { relocationRequester.bringIntoView() }
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
 
         // Assert.
         assertScreenshot(if (horizontal) "blueBoxLeft" else "blueBoxTop")
@@ -547,7 +547,7 @@
     @Test
     fun childPartiallyVisible_parentIsScrolledSoThatTrailingEdgeOfChildIsVisible() {
         // Arrange.
-        val relocationRequester = RelocationRequester()
+        val bringIntoViewRequester = BringIntoViewRequester()
         lateinit var scrollState: ScrollState
         rule.setContent {
             scrollState = rememberScrollState()
@@ -584,7 +584,7 @@
                             )
                             .size(50.dp)
                             .background(Blue)
-                            .relocationRequester(relocationRequester)
+                            .bringIntoViewRequester(bringIntoViewRequester)
                     )
                 }
             }
@@ -592,7 +592,7 @@
         runBlockingAndAwaitIdle { scrollState.scrollTo(scrollState.maxValue) }
 
         // Act.
-        runBlockingAndAwaitIdle { relocationRequester.bringIntoView() }
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
 
         // Assert.
         assertScreenshot(if (horizontal) "blueBoxRight" else "blueBoxBottom")
@@ -601,7 +601,7 @@
     @Test
     fun multipleParentsAreScrolledSoThatChildIsVisible() {
         // Arrange.
-        val relocationRequester = RelocationRequester()
+        val bringIntoViewRequester = BringIntoViewRequester()
         lateinit var parentScrollState: ScrollState
         lateinit var grandParentScrollState: ScrollState
         rule.setContent {
@@ -656,7 +656,7 @@
                                 )
                                 .size(50.dp)
                                 .background(Blue)
-                                .relocationRequester(relocationRequester)
+                                .bringIntoViewRequester(bringIntoViewRequester)
                         )
                     }
                 }
@@ -666,7 +666,7 @@
         runBlockingAndAwaitIdle { grandParentScrollState.scrollTo(grandParentScrollState.maxValue) }
 
         // Act.
-        runBlockingAndAwaitIdle { relocationRequester.bringIntoView() }
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
 
         // Assert.
         assertScreenshot(if (horizontal) "blueBoxLeft" else "blueBoxTop")
@@ -675,7 +675,7 @@
     @Test
     fun multipleParentsAreScrolledInDifferentDirectionsSoThatChildIsVisible() {
         // Arrange.
-        val relocationRequester = RelocationRequester()
+        val bringIntoViewRequester = BringIntoViewRequester()
         lateinit var parentScrollState: ScrollState
         lateinit var grandParentScrollState: ScrollState
         rule.setContent {
@@ -715,7 +715,7 @@
                                 .offset(x = 25.dp, y = 25.dp)
                                 .size(50.dp)
                                 .background(Blue)
-                                .relocationRequester(relocationRequester)
+                                .bringIntoViewRequester(bringIntoViewRequester)
                         )
                     }
                 }
@@ -725,7 +725,7 @@
         runBlockingAndAwaitIdle { grandParentScrollState.scrollTo(grandParentScrollState.maxValue) }
 
         // Act.
-        runBlockingAndAwaitIdle { relocationRequester.bringIntoView() }
+        runBlockingAndAwaitIdle { bringIntoViewRequester.bringIntoView() }
 
         // Assert.
         assertScreenshot(if (horizontal) "blueBoxLeft" else "blueBoxTop")
@@ -734,7 +734,7 @@
     @Test
     fun specifiedPartOfComponentBroughtOnScreen() {
         // Arrange.
-        val relocationRequester = RelocationRequester()
+        val bringIntoViewRequester = BringIntoViewRequester()
         lateinit var density: Density
         rule.setContent {
             density = LocalDensity.current
@@ -754,7 +754,7 @@
                     when (orientation) {
                         Horizontal -> Modifier.size(150.dp, 50.dp)
                         Vertical -> Modifier.size(50.dp, 150.dp)
-                    }.relocationRequester(relocationRequester)
+                    }.bringIntoViewRequester(bringIntoViewRequester)
                 ) {
                     with(density) {
                         drawRect(
@@ -778,7 +778,7 @@
                     Vertical -> Rect(0.dp.toPx(), 50.dp.toPx(), 50.dp.toPx(), 100.dp.toPx())
                 }
             }
-            relocationRequester.bringIntoView(rect)
+            bringIntoViewRequester.bringIntoView(rect)
         }
 
         // Assert.
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/relocation/BringIntoViewResponderTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/relocation/BringIntoViewResponderTest.kt
new file mode 100644
index 0000000..59fd60c
--- /dev/null
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/relocation/BringIntoViewResponderTest.kt
@@ -0,0 +1,179 @@
+/*
+ * 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.foundation.relocation
+
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.relocation.BringIntoViewResponder.Companion.ModifierLocalBringIntoViewResponder
+import androidx.compose.foundation.relocation.LayoutCoordinateSubject.Companion.assertThat
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.layout.LayoutCoordinates
+import androidx.compose.ui.layout.boundsInParent
+import androidx.compose.ui.layout.onGloballyPositioned
+import androidx.compose.ui.layout.positionInParent
+import androidx.compose.ui.modifier.modifierLocalProvider
+import androidx.compose.foundation.TestActivity
+import androidx.compose.foundation.relocation.ScrollableResponder.Companion.LocalRect
+import androidx.compose.ui.test.junit4.createAndroidComposeRule
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.Dp
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Fact.simpleFact
+import com.google.common.truth.FailureMetadata
+import com.google.common.truth.Subject
+import com.google.common.truth.Subject.Factory
+import com.google.common.truth.Truth
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.runBlocking
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class BringIntoViewResponderTest {
+
+    @get:Rule
+    val rule = createAndroidComposeRule<TestActivity>()
+
+    lateinit var density: Density
+
+    @Before
+    fun setup() {
+        density = Density(rule.activity)
+    }
+
+    fun Float.toDp(): Dp = with(density) { this@toDp.toDp() }
+
+    @OptIn(ExperimentalFoundationApi::class, ExperimentalComposeUiApi::class)
+    @Test
+    fun zeroSizedItem_zeroSizedParent_bringIntoView() {
+        // Arrange.
+        lateinit var layoutCoordinates: LayoutCoordinates
+        val bringIntoViewRequester = BringIntoViewRequester()
+        val scrollableParent = ScrollableResponder()
+        rule.setContent {
+            Box(
+                Modifier
+                    .modifierLocalProvider(ModifierLocalBringIntoViewResponder) { scrollableParent }
+                    .bringIntoViewRequester(bringIntoViewRequester)
+                    .onGloballyPositioned { layoutCoordinates = it }
+            )
+        }
+
+        // Act.
+        runBlocking { bringIntoViewRequester.bringIntoView() }
+
+        // Assert.
+        assertThat(scrollableParent.callersLayoutCoordinates).isEqualTo(layoutCoordinates)
+        assertThat(scrollableParent.nonLocalRect).isEqualTo(Rect.Zero)
+        assertThat(scrollableParent.requestedRect).isEqualTo(LocalRect)
+    }
+
+    @OptIn(ExperimentalComposeUiApi::class,
+        androidx.compose.foundation.ExperimentalFoundationApi::class
+    )
+    @Test
+    fun bringIntoView_itemWithSize() {
+        // Arrange.
+        lateinit var layoutCoordinates: LayoutCoordinates
+        val bringIntoViewRequester = BringIntoViewRequester()
+        val scrollableParent = ScrollableResponder()
+        rule.setContent {
+            Box(
+                Modifier
+                    .size(20f.toDp(), 10f.toDp())
+                    .modifierLocalProvider(ModifierLocalBringIntoViewResponder) { scrollableParent }
+                    .bringIntoViewRequester(bringIntoViewRequester)
+                    .onGloballyPositioned { layoutCoordinates = it }
+            )
+        }
+
+        // Act.
+        runBlocking { bringIntoViewRequester.bringIntoView() }
+
+        // Assert.
+        // Assert.
+        assertThat(scrollableParent.callersLayoutCoordinates).isEqualTo(layoutCoordinates)
+        assertThat(scrollableParent.nonLocalRect).isEqualTo(Rect(0f, 0f, 20f, 10f))
+        assertThat(scrollableParent.requestedRect).isEqualTo(LocalRect)
+    }
+}
+
+private class LayoutCoordinateSubject(metadata: FailureMetadata?, val actual: LayoutCoordinates?) :
+    Subject(metadata, actual) {
+
+    fun isEqualTo(expected: LayoutCoordinates?) {
+        if (expected == null) {
+            assertThat(actual).isNull()
+            return
+        }
+        if (actual == null) {
+            failWithActual(simpleFact("Expected non-null layout coordinates."))
+            return
+        }
+        if (expected.size != actual.size) {
+            failWithoutActual(
+                simpleFact("Expected size be ${expected.size}"),
+                simpleFact("But was ${actual.size}")
+            )
+        }
+        if (expected.positionInParent() != actual.positionInParent()) {
+            failWithoutActual(
+                simpleFact("Expected bounds in parent to be ${expected.boundsInParent()}"),
+                simpleFact("But was ${actual.boundsInParent()}")
+            )
+        }
+    }
+
+    companion object {
+        fun assertThat(layoutCoordinates: LayoutCoordinates?): LayoutCoordinateSubject {
+            return Truth.assertAbout(subjectFactory).that(layoutCoordinates)
+        }
+
+        private val subjectFactory =
+            Factory<LayoutCoordinateSubject, LayoutCoordinates?> { metadata, actual ->
+                LayoutCoordinateSubject(metadata, actual)
+            }
+    }
+}
+
+@OptIn(ExperimentalFoundationApi::class)
+private class ScrollableResponder : BringIntoViewResponder {
+    lateinit var requestedRect: Rect
+    lateinit var nonLocalRect: Rect
+    lateinit var callersLayoutCoordinates: LayoutCoordinates
+
+    override suspend fun bringIntoView(rect: Rect) {
+        requestedRect = rect
+    }
+
+    override fun toLocalRect(rect: Rect, layoutCoordinates: LayoutCoordinates): Rect {
+        nonLocalRect = rect
+        callersLayoutCoordinates = layoutCoordinates
+        return LocalRect
+    }
+
+    companion object {
+        val LocalRect = Rect(10f, 10f, 10f, 10f)
+    }
+}
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/Clickable.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/Clickable.android.kt
index 8a0a070..03252aa 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/Clickable.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/Clickable.android.kt
@@ -16,6 +16,50 @@
 
 package androidx.compose.foundation
 
+import android.view.KeyEvent.KEYCODE_DPAD_CENTER
+import android.view.KeyEvent.KEYCODE_ENTER
+import android.view.KeyEvent.KEYCODE_NUMPAD_ENTER
+import android.view.View
 import android.view.ViewConfiguration
+import android.view.ViewGroup
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.input.key.KeyEvent
+import androidx.compose.ui.input.key.KeyEventType.Companion.KeyUp
+import androidx.compose.ui.input.key.key
+import androidx.compose.ui.input.key.nativeKeyCode
+import androidx.compose.ui.input.key.type
+import androidx.compose.ui.platform.LocalView
 
-internal actual val TapIndicationDelay: Long = ViewConfiguration.getTapTimeout().toLong()
\ No newline at end of file
+@Composable
+internal actual fun isComposeRootInScrollableContainer(): () -> Boolean {
+    val view = LocalView.current
+    return {
+        view.isInScrollableViewGroup()
+    }
+}
+
+// Copied from View#isInScrollingContainer() which is @hide
+private fun View.isInScrollableViewGroup(): Boolean {
+    var p = parent
+    while (p != null && p is ViewGroup) {
+        if (p.shouldDelayChildPressedState()) {
+            return true
+        }
+        p = p.parent
+    }
+    return false
+}
+
+internal actual val TapIndicationDelay: Long = ViewConfiguration.getTapTimeout().toLong()
+
+/**
+ * Whether the specified [KeyEvent] represents a user intent to perform a click.
+ * (eg. When you press Enter on a focused button, it should perform a click).
+ */
+internal actual val KeyEvent.isClick: Boolean
+    get() = type == KeyUp && when (key.nativeKeyCode) {
+            KEYCODE_DPAD_CENTER,
+            KEYCODE_ENTER,
+            KEYCODE_NUMPAD_ENTER -> true
+            else -> false
+    }
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/relocation/BringRectangleOnScreen.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/relocation/BringRectangleOnScreen.android.kt
new file mode 100644
index 0000000..88c516a
--- /dev/null
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/relocation/BringRectangleOnScreen.android.kt
@@ -0,0 +1,61 @@
+/*
+ * 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.foundation.relocation
+
+import android.view.View
+import androidx.compose.ui.Modifier
+import android.graphics.Rect
+import androidx.compose.runtime.DisposableEffect
+import androidx.compose.ui.composed
+import androidx.compose.ui.platform.LocalView
+import androidx.compose.ui.platform.debugInspectorInfo
+import androidx.compose.ui.geometry.Rect as ComposeRect
+
+/**
+ * Platform specific internal API to bring a rectangle into view.
+ */
+internal actual class BringRectangleOnScreenRequester {
+    internal var view: View? = null
+    actual fun bringRectangleOnScreen(rect: ComposeRect) {
+        view?.requestRectangleOnScreen(rect.toRect(), false)
+    }
+}
+
+/**
+ * Companion Modifier to [BringRectangleOnScreenRequester].
+ */
+internal actual fun Modifier.bringRectangleOnScreenRequester(
+    bringRectangleOnScreenRequester: BringRectangleOnScreenRequester
+): Modifier = composed(
+    debugInspectorInfo {
+        name = "bringRectangleOnScreenRequester"
+        properties["bringRectangleOnScreenRequester"] = bringRectangleOnScreenRequester
+    }
+) {
+    val view = LocalView.current
+    DisposableEffect(view) {
+        bringRectangleOnScreenRequester.view = view
+        onDispose {
+            bringRectangleOnScreenRequester.view = null
+        }
+    }
+    Modifier
+}
+
+private fun ComposeRect.toRect(): Rect {
+    return Rect(left.toInt(), top.toInt(), right.toInt(), bottom.toInt())
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/TextPointerIcon.android.kt
similarity index 67%
copy from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt
copy to compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/TextPointerIcon.android.kt
index e5bb607..90314ef 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/text/TextPointerIcon.android.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 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,13 +14,9 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.platform
+package androidx.compose.foundation.text
 
-import java.awt.Desktop
-import java.net.URI
+import androidx.compose.ui.input.pointer.PointerIcon
 
-internal class DesktopUriHandler : UriHandler {
-    override fun openUri(uri: String) {
-        Desktop.getDesktop().browse(URI(uri))
-    }
-}
\ No newline at end of file
+internal actual val textPointerIcon: PointerIcon =
+    PointerIcon(android.view.PointerIcon.TYPE_TEXT)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Clickable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Clickable.kt
index 83b26bf..b358b54 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Clickable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Clickable.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.foundation
 
+import androidx.compose.foundation.gestures.ModifierLocalScrollableContainer
 import androidx.compose.foundation.gestures.PressGestureScope
 import androidx.compose.foundation.gestures.detectTapAndPress
 import androidx.compose.foundation.gestures.detectTapGestures
@@ -24,13 +25,18 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.MutableState
+import androidx.compose.runtime.State
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberUpdatedState
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.composed
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.input.key.KeyEvent
+import androidx.compose.ui.input.key.onKeyEvent
 import androidx.compose.ui.input.pointer.pointerInput
+import androidx.compose.ui.modifier.ModifierLocalConsumer
+import androidx.compose.ui.modifier.ModifierLocalReadScope
 import androidx.compose.ui.platform.debugInspectorInfo
 import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.semantics.disabled
@@ -127,17 +133,39 @@
         if (enabled) {
             PressedInteractionSourceDisposableEffect(interactionSource, pressedInteraction)
         }
+        val isRootInScrollableContainer = isComposeRootInScrollableContainer()
+        val isClickableInScrollableContainer = remember { mutableStateOf(true) }
+        val delayPressInteraction = rememberUpdatedState {
+            isClickableInScrollableContainer.value || isRootInScrollableContainer()
+        }
         val gesture = Modifier.pointerInput(interactionSource, enabled) {
             detectTapAndPress(
                 onPress = { offset ->
                     if (enabled) {
-                        handlePressInteraction(offset, interactionSource, pressedInteraction)
+                        handlePressInteraction(
+                            offset,
+                            interactionSource,
+                            pressedInteraction,
+                            delayPressInteraction
+                        )
                     }
                 },
                 onTap = { if (enabled) onClickState.value.invoke() }
             )
         }
         Modifier
+            .then(
+                remember {
+                    object : ModifierLocalConsumer {
+                        override fun onModifierLocalsUpdated(scope: ModifierLocalReadScope) {
+                            with(scope) {
+                                isClickableInScrollableContainer.value =
+                                    ModifierLocalScrollableContainer.current
+                            }
+                        }
+                    }
+                }
+            )
             .genericClickableWithoutGesture(
                 gestureModifiers = gesture,
                 interactionSource = interactionSource,
@@ -280,6 +308,11 @@
             }
             PressedInteractionSourceDisposableEffect(interactionSource, pressedInteraction)
         }
+        val isRootInScrollableContainer = isComposeRootInScrollableContainer()
+        val isClickableInScrollableContainer = remember { mutableStateOf(true) }
+        val delayPressInteraction = rememberUpdatedState {
+            isClickableInScrollableContainer.value || isRootInScrollableContainer()
+        }
         val gesture =
             Modifier.pointerInput(interactionSource, hasLongClick, hasDoubleClick, enabled) {
                 detectTapGestures(
@@ -295,13 +328,30 @@
                     },
                     onPress = { offset ->
                         if (enabled) {
-                            handlePressInteraction(offset, interactionSource, pressedInteraction)
+                            handlePressInteraction(
+                                offset,
+                                interactionSource,
+                                pressedInteraction,
+                                delayPressInteraction
+                            )
                         }
                     },
                     onTap = { if (enabled) onClickState.value.invoke() }
                 )
             }
         Modifier
+            .then(
+                remember {
+                    object : ModifierLocalConsumer {
+                        override fun onModifierLocalsUpdated(scope: ModifierLocalReadScope) {
+                            with(scope) {
+                                isClickableInScrollableContainer.value =
+                                    ModifierLocalScrollableContainer.current
+                            }
+                        }
+                    }
+                }
+            )
             .genericClickableWithoutGesture(
                 gestureModifiers = gesture,
                 interactionSource = interactionSource,
@@ -347,11 +397,14 @@
 internal suspend fun PressGestureScope.handlePressInteraction(
     pressPoint: Offset,
     interactionSource: MutableInteractionSource,
-    pressedInteraction: MutableState<PressInteraction.Press?>
+    pressedInteraction: MutableState<PressInteraction.Press?>,
+    delayPressInteraction: State<() -> Boolean>
 ) {
     coroutineScope {
         val delayJob = launch {
-            delay(TapIndicationDelay)
+            if (delayPressInteraction.value()) {
+                delay(TapIndicationDelay)
+            }
             val pressInteraction = PressInteraction.Press(pressPoint)
             interactionSource.emit(pressInteraction)
             pressedInteraction.value = pressInteraction
@@ -385,15 +438,29 @@
 /**
  * How long to wait before appearing 'pressed' (emitting [PressInteraction.Press]) - if a touch
  * down will quickly become a drag / scroll, this timeout means that we don't show a press effect.
- *
- * TODO: b/168524931 currently this delay is always used since we will require API changes to
- * allow clickable to know whether it 'is in a scrollable container' - ideally this delay should
- * only be used if there is the possibility of a scroll / drag. We should also expose this /
- * [handlePressInteraction] in some similar form, to make it easy for developers to also use this
- * delay when handling presses.
  */
 internal expect val TapIndicationDelay: Long
 
+/**
+ * Returns a lambda that calculates whether the root Compose layout node is hosted in a scrollable
+ * container outside of Compose. On Android this will be whether the root View is in a scrollable
+ * ViewGroup, as even if nothing in the Compose part of the hierarchy is scrollable, if the View
+ * itself is in a scrollable container, we still want to delay presses in case presses in Compose
+ * convert to a scroll outside of Compose.
+ *
+ * Combine this with [ModifierLocalScrollableContainer], which returns whether a [Modifier] is
+ * within a scrollable Compose layout, to calculate whether this modifier is within some form of
+ * scrollable container, and hence should delay presses.
+ */
+@Composable
+internal expect fun isComposeRootInScrollableContainer(): () -> Boolean
+
+/**
+ * Whether the specified [KeyEvent] represents a user intent to perform a click.
+ * (eg. When you press Enter on a focused button, it should perform a click).
+ */
+internal expect val KeyEvent.isClick: Boolean
+
 internal fun Modifier.genericClickableWithoutGesture(
     gestureModifiers: Modifier,
     interactionSource: MutableInteractionSource,
@@ -405,7 +472,7 @@
     onLongClick: (() -> Unit)? = null,
     onClick: () -> Unit
 ): Modifier {
-    val semanticModifier = Modifier.semantics(mergeDescendants = true) {
+    fun Modifier.clickSemantics() = this.semantics(mergeDescendants = true) {
         if (role != null) {
             this.role = role
         }
@@ -421,8 +488,17 @@
             disabled()
         }
     }
+    fun Modifier.detectClickFromKey() = this.onKeyEvent {
+        if (enabled && it.isClick) {
+            onClick()
+            true
+        } else {
+            false
+        }
+    }
     return this
-        .then(semanticModifier)
+        .clickSemantics()
+        .detectClickFromKey()
         .indication(interactionSource, indication)
         .hoverable(enabled = enabled, interactionSource = interactionSource)
         .focusableInNonTouchMode(enabled = enabled, interactionSource = interactionSource)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Focusable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Focusable.kt
index 582e52c..67e42d6 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Focusable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Focusable.kt
@@ -18,21 +18,20 @@
 
 import androidx.compose.foundation.interaction.FocusInteraction
 import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.relocation.BringIntoViewRequester
+import androidx.compose.foundation.relocation.bringIntoViewRequester
 import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.runtime.setValue
-import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.composed
 import androidx.compose.ui.focus.focusProperties
 import androidx.compose.ui.focus.focusTarget
 import androidx.compose.ui.focus.onFocusChanged
 import androidx.compose.ui.input.InputMode
-import androidx.compose.ui.layout.RelocationRequester
-import androidx.compose.ui.layout.relocationRequester
 import androidx.compose.ui.platform.LocalInputModeManager
 import androidx.compose.ui.platform.debugInspectorInfo
 import androidx.compose.ui.semantics.focused
@@ -63,9 +62,8 @@
     val scope = rememberCoroutineScope()
     val focusedInteraction = remember { mutableStateOf<FocusInteraction.Focus?>(null) }
     var isFocused by remember { mutableStateOf(false) }
-    // TODO(b/195353459): Remove this annotation before 1.1 goes stable.
-    @OptIn(ExperimentalComposeUiApi::class)
-    val relocationRequester = remember { RelocationRequester() }
+    @OptIn(ExperimentalFoundationApi::class)
+    val bringIntoViewRequester = remember { BringIntoViewRequester() }
     DisposableEffect(interactionSource) {
         onDispose {
             focusedInteraction.value?.let { oldValue ->
@@ -88,14 +86,13 @@
         onDispose { }
     }
 
-    // TODO(b/195353459): Remove this annotation before 1.1 goes stable.
-    @OptIn(ExperimentalComposeUiApi::class)
+    @OptIn(ExperimentalFoundationApi::class)
     if (enabled) {
         Modifier
             .semantics {
                 this.focused = isFocused
             }
-            .relocationRequester(relocationRequester)
+            .bringIntoViewRequester(bringIntoViewRequester)
             .onFocusChanged {
                 isFocused = it.isFocused
                 if (isFocused) {
@@ -108,7 +105,7 @@
                         val interaction = FocusInteraction.Focus()
                         interactionSource?.emit(interaction)
                         focusedInteraction.value = interaction
-                        relocationRequester.bringIntoView()
+                        bringIntoViewRequester.bringIntoView()
                     }
                 } else {
                     scope.launch {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ProgressSemantics.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ProgressSemantics.kt
index e6ad938..c4bc989 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ProgressSemantics.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ProgressSemantics.kt
@@ -44,7 +44,10 @@
     /*@IntRange(from = 0)*/
     steps: Int = 0
 ): Modifier {
-    return semantics {
+    // Older versions of Talkback will ignore nodes with range info which aren't focusable or
+    // screen reader focusable. Setting this semantics as merging descendants will mark it as
+    // screen reader focusable.
+    return semantics(mergeDescendants = true) {
         progressBarRangeInfo =
             ProgressBarRangeInfo(value.coerceIn(valueRange), valueRange, steps)
     }
@@ -62,7 +65,10 @@
  */
 @Stable
 fun Modifier.progressSemantics(): Modifier {
-    return semantics {
+    // Older versions of Talkback will ignore nodes with range info which aren't focusable or
+    // screen reader focusable. Setting this semantics as merging descendants will mark it as
+    // screen reader focusable.
+    return semantics(mergeDescendants = true) {
         progressBarRangeInfo = ProgressBarRangeInfo.Indeterminate
     }
 }
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Scrollable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Scrollable.kt
index 3bc3518..f910927 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Scrollable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Scrollable.kt
@@ -20,19 +20,22 @@
 import androidx.compose.animation.core.DecayAnimationSpec
 import androidx.compose.animation.core.animateDecay
 import androidx.compose.animation.rememberSplineBasedDecay
+import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.MutatePriority
 import androidx.compose.foundation.gestures.Orientation.Horizontal
 import androidx.compose.foundation.gestures.Orientation.Vertical
 import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.relocation.BringIntoViewResponder
+import androidx.compose.foundation.relocation.BringIntoViewResponder.Companion.ModifierLocalBringIntoViewResponder
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.State
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberUpdatedState
-import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.composed
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
 import androidx.compose.ui.input.nestedscroll.NestedScrollDispatcher
 import androidx.compose.ui.input.nestedscroll.NestedScrollSource
@@ -40,10 +43,16 @@
 import androidx.compose.ui.input.nestedscroll.NestedScrollSource.Companion.Fling
 import androidx.compose.ui.input.nestedscroll.nestedScroll
 import androidx.compose.ui.input.pointer.PointerType
-import androidx.compose.ui.layout.onRelocationRequest
+import androidx.compose.ui.layout.LayoutCoordinates
+import androidx.compose.ui.layout.OnGloballyPositionedModifier
+import androidx.compose.ui.modifier.ModifierLocalConsumer
+import androidx.compose.ui.modifier.ModifierLocalProvider
+import androidx.compose.ui.modifier.ModifierLocalReadScope
+import androidx.compose.ui.modifier.modifierLocalOf
 import androidx.compose.ui.platform.debugInspectorInfo
 import androidx.compose.ui.unit.Velocity
 import androidx.compose.ui.unit.toSize
+import kotlinx.coroutines.coroutineScope
 import kotlinx.coroutines.launch
 import kotlin.math.abs
 
@@ -107,15 +116,21 @@
         properties["interactionSource"] = interactionSource
     },
     factory = {
-        val overscrollModifier =
-            if (overScrollController != null) {
-                Modifier.overScroll(overScrollController)
-            } else {
-                Modifier
-            }
+        val overscrollModifier = overScrollController?.let { Modifier.overScroll(it) } ?: Modifier
+        val bringIntoViewModifier = remember(orientation, state, reverseDirection) {
+            BringIntoViewResponder(orientation, state, reverseDirection)
+        }
 
         fun Float.reverseIfNeeded(): Float = if (reverseDirection) this * -1 else this
-        relocationScrollable(state, orientation, reverseDirection)
+
+        val scrollableContainerProvider = if (enabled) {
+            ModifierLocalScrollableContainerProvider
+        } else {
+            Modifier
+        }
+
+        Modifier
+            .then(bringIntoViewModifier)
             .then(overscrollModifier)
             .touchScrollable(
                 interactionSource,
@@ -129,6 +144,7 @@
             .mouseScrollable(orientation) {
                 state.dispatchRawDelta(it.reverseIfNeeded())
             }
+            .then(scrollableContainerProvider)
     }
 )
 
@@ -397,31 +413,91 @@
     }
 }
 
-@OptIn(ExperimentalComposeUiApi::class)
-private fun Modifier.relocationScrollable(
-    scrollableState: ScrollableState,
-    orientation: Orientation,
-    reverseDirection: Boolean = false
-): Modifier {
-    fun Float.reverseIfNeeded(): Float = if (reverseDirection) this * -1 else this
-    return this.onRelocationRequest(
-        onProvideDestination = { rect, layoutCoordinates ->
-            val size = layoutCoordinates.size.toSize()
-            when (orientation) {
-                Vertical ->
-                    rect.translate(0f, relocationDistance(rect.top, rect.bottom, size.height))
-                Horizontal ->
-                    rect.translate(relocationDistance(rect.left, rect.right, size.width), 0f)
+@OptIn(ExperimentalFoundationApi::class)
+private class BringIntoViewResponder(
+    private val orientation: Orientation,
+    private val scrollableState: ScrollableState,
+    private val reverseDirection: Boolean,
+) : ModifierLocalConsumer,
+    ModifierLocalProvider<BringIntoViewResponder>,
+    BringIntoViewResponder,
+    OnGloballyPositionedModifier {
+
+    private fun Float.reverseIfNeeded(): Float = if (reverseDirection) this * -1 else this
+
+    // Read the modifier local and save a reference to the parent.
+    private lateinit var parent: BringIntoViewResponder
+    override fun onModifierLocalsUpdated(scope: ModifierLocalReadScope) {
+        parent = scope.run { ModifierLocalBringIntoViewResponder.current }
+    }
+
+    // Populate the modifier local with this object.
+    override val key = ModifierLocalBringIntoViewResponder
+    override val value = this
+
+    // LayoutCoordinates of this item.
+    private lateinit var layoutCoordinates: LayoutCoordinates
+    override fun onGloballyPositioned(coordinates: LayoutCoordinates) {
+        layoutCoordinates = coordinates
+    }
+
+    override suspend fun bringIntoView(rect: Rect) {
+
+        val destRect = computeDestination(rect)
+
+        // For the item to be visible, if needs to be in the viewport of all its ancestors.
+        // Note: For now we run both of these in parallel, but in the future we could make this
+        // configurable. (The child relocation could be executed before the parent, or parent
+        // before the child).
+        coroutineScope {
+            // Bring the requested Child into this parent's view.
+            launch {
+                performBringIntoView(rect, destRect)
             }
-        },
-        onPerformRelocation = { source, destination ->
-            val offset = when (orientation) {
-                Vertical -> source.top - destination.top
-                Horizontal -> source.left - destination.left
+
+            // If the parent is another BringIntoViewResponder, call bringIntoView.
+            launch {
+                parent.bringIntoView(
+                    parent.toLocalRect(destRect, this@BringIntoViewResponder.layoutCoordinates)
+                )
             }
-            scrollableState.animateScrollBy(offset.reverseIfNeeded())
         }
-    )
+    }
+
+    override fun toLocalRect(rect: Rect, layoutCoordinates: LayoutCoordinates): Rect {
+        // Translate the supplied layout coordinates into the coordinate system of this parent.
+        val parentBoundingBox = this.layoutCoordinates.localBoundingBoxOf(layoutCoordinates, false)
+
+        // Translate the rect to this parent's local coordinates.
+        return rect.translate(parentBoundingBox.topLeft)
+    }
+
+    /**
+     * Compute the destination given the source rectangle and current bounds.
+     *
+     * @param source The bounding box of the item that sent the request to be brought into view.
+     * @return the destination rectangle.
+     */
+    fun computeDestination(source: Rect): Rect {
+        val size = layoutCoordinates.size.toSize()
+        return when (orientation) {
+            Vertical ->
+                source.translate(0f, relocationDistance(source.top, source.bottom, size.height))
+            Horizontal ->
+                source.translate(relocationDistance(source.left, source.right, size.width), 0f)
+        }
+    }
+
+    /**
+     * Using the source and destination bounds, perform an animated scroll.
+     */
+    suspend fun performBringIntoView(source: Rect, destination: Rect) {
+        val offset = when (orientation) {
+            Vertical -> source.top - destination.top
+            Horizontal -> source.left - destination.left
+        }
+        scrollableState.animateScrollBy(offset.reverseIfNeeded())
+    }
 }
 
 // Calculate the offset needed to bring one of the edges into view. The leadingEdge is the side
@@ -439,3 +515,15 @@
     abs(leadingEdge) < abs(trailingEdge - parentSize) -> leadingEdge
     else -> trailingEdge - parentSize
 }
+
+// TODO: b/203141462 - make this public and move it to ui
+/**
+ * Whether this modifier is inside a scrollable container, provided by [Modifier.scrollable].
+ * Defaults to false.
+ */
+internal val ModifierLocalScrollableContainer = modifierLocalOf { false }
+
+private object ModifierLocalScrollableContainerProvider : ModifierLocalProvider<Boolean> {
+    override val key = ModifierLocalScrollableContainer
+    override val value = true
+}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/relocation/BringIntoViewRequester.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/relocation/BringIntoViewRequester.kt
new file mode 100644
index 0000000..5dad84e
--- /dev/null
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/relocation/BringIntoViewRequester.kt
@@ -0,0 +1,161 @@
+/*
+ * 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.foundation.relocation
+
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.relocation.BringIntoViewResponder.Companion.RootBringIntoViewResponder
+import androidx.compose.foundation.relocation.BringIntoViewResponder.Companion.ModifierLocalBringIntoViewResponder
+import androidx.compose.runtime.DisposableEffect
+import androidx.compose.runtime.collection.MutableVector
+import androidx.compose.runtime.collection.mutableVectorOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.composed
+import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.geometry.toRect
+import androidx.compose.ui.layout.LayoutCoordinates
+import androidx.compose.ui.layout.onGloballyPositioned
+import androidx.compose.ui.modifier.ModifierLocalConsumer
+import androidx.compose.ui.modifier.ModifierLocalReadScope
+import androidx.compose.ui.platform.debugInspectorInfo
+import androidx.compose.ui.unit.toSize
+
+/**
+ * Can be used to send [bringIntoView] requests. Pass it as a parameter to
+ * [Modifier.bringIntoView()][bringIntoView].
+ *
+ * For instance, you can call [BringIntoViewRequester.bringIntoView][bringIntoView] to
+ * make all the scrollable parents scroll so that the specified item is brought into parent
+ * bounds. This sample demonstrates this use case:
+ *
+ * Here is a sample where a composable is brought into view:
+ * @sample androidx.compose.foundation.samples.BringIntoViewSample
+ *
+ * Here is a sample where a part of a composable is brought into view:
+ * @sample androidx.compose.foundation.samples.BringPartOfComposableIntoViewSample
+ */
+@ExperimentalFoundationApi
+sealed interface BringIntoViewRequester {
+    /**
+     * Bring this item into bounds by making all the scrollable parents scroll appropriately.
+     *
+     * @param rect The rectangle (In local coordinates) that should be brought into view. If you
+     * don't specify the coordinates, the coordinates of the
+     * [Modifier.bringIntoViewRequester()][bringIntoViewRequester] associated with this
+     * [BringIntoViewRequester] will be used.
+     *
+     * Here is a sample where a composable is brought into view:
+     * @sample androidx.compose.foundation.samples.BringIntoViewSample
+     *
+     * Here is a sample where a part of a composable is brought into view:
+     * @sample androidx.compose.foundation.samples.BringPartOfComposableIntoViewSample
+     */
+    suspend fun bringIntoView(rect: Rect? = null)
+}
+
+/**
+ * Create an instance of [BringIntoViewRequester] that can be used with
+ * [Modifier.bringIntoViewRequester][bringIntoViewRequester]. A child can then call
+ * [BringIntoViewRequester.bringIntoView] to send a request any scrollable parents so that they
+ * scroll to bring this item into view.
+ *
+ * Here is a sample where a composable is brought into view:
+ * @sample androidx.compose.foundation.samples.BringIntoViewSample
+ *
+ * Here is a sample where a part of a composable is brought into view:
+ * @sample androidx.compose.foundation.samples.BringPartOfComposableIntoViewSample
+ */
+@ExperimentalFoundationApi
+fun BringIntoViewRequester(): BringIntoViewRequester {
+    return BringIntoViewRequesterImpl()
+}
+
+/**
+ * This is a modifier that can be used to send bringIntoView requests.
+ *
+ * Here is an example where the a [bringIntoViewRequester] can be used to bring an item into parent
+ * bounds. It demonstrates how a composable can ask its parents to scroll so that the component
+ * using this modifier is brought into the bounds of all its parents.
+ * @sample androidx.compose.foundation.samples.BringIntoViewSample
+ *
+ * @param bringIntoViewRequester an instance of [BringIntoViewRequester]. This hoisted object can be
+ * used to send bringIntoView requests to parents of the current composable.
+ */
+@ExperimentalFoundationApi
+fun Modifier.bringIntoViewRequester(
+    bringIntoViewRequester: BringIntoViewRequester
+): Modifier = composed(
+    inspectorInfo = debugInspectorInfo {
+        name = "bringIntoViewRequester"
+        properties["bringIntoViewRequester"] = bringIntoViewRequester
+    }
+) {
+    val bringIntoViewData = remember { BringIntoViewData(BringRectangleOnScreenRequester()) }
+    if (bringIntoViewRequester is BringIntoViewRequesterImpl) {
+        DisposableEffect(bringIntoViewRequester) {
+            bringIntoViewRequester.bringIntoViewUsages += bringIntoViewData
+            onDispose { bringIntoViewRequester.bringIntoViewUsages -= bringIntoViewData }
+        }
+    }
+
+    Modifier
+        .bringRectangleOnScreenRequester(bringIntoViewData.bringRectangleOnScreenRequester)
+        .onGloballyPositioned { bringIntoViewData.layoutCoordinates = it }
+        .then(
+            remember {
+                object : ModifierLocalConsumer {
+                    override fun onModifierLocalsUpdated(scope: ModifierLocalReadScope) {
+                        bringIntoViewData.parent = scope.run {
+                            ModifierLocalBringIntoViewResponder.current
+                        }
+                    }
+                }
+            }
+        )
+}
+
+@ExperimentalFoundationApi
+private class BringIntoViewRequesterImpl : BringIntoViewRequester {
+    val bringIntoViewUsages: MutableVector<BringIntoViewData> = mutableVectorOf()
+
+    override suspend fun bringIntoView(rect: Rect?) {
+        bringIntoViewUsages.forEach {
+            val layoutCoordinates = it.layoutCoordinates
+            if (layoutCoordinates == null || !layoutCoordinates.isAttached) return@forEach
+
+            // If the rect is not specified, use a rectangle representing the entire composable.
+            val sourceRect = rect ?: layoutCoordinates.size.toSize().toRect()
+
+            // Convert the rect into parent coordinates.
+            val rectInParentCoordinates = it.parent.toLocalRect(sourceRect, layoutCoordinates)
+
+            if (it.parent == RootBringIntoViewResponder) {
+                // Use the platform specific API to bring the rectangle on screen.
+                it.bringRectangleOnScreenRequester.bringRectangleOnScreen(rectInParentCoordinates)
+            } else {
+                it.parent.bringIntoView(rectInParentCoordinates)
+            }
+        }
+    }
+}
+
+@ExperimentalFoundationApi
+private data class BringIntoViewData(
+    val bringRectangleOnScreenRequester: BringRectangleOnScreenRequester,
+    var parent: BringIntoViewResponder = RootBringIntoViewResponder,
+    var layoutCoordinates: LayoutCoordinates? = null
+)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/relocation/BringIntoViewResponder.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/relocation/BringIntoViewResponder.kt
new file mode 100644
index 0000000..0809710
--- /dev/null
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/relocation/BringIntoViewResponder.kt
@@ -0,0 +1,80 @@
+/*
+ * 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.foundation.relocation
+
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.layout.LayoutCoordinates
+import androidx.compose.ui.modifier.ProvidableModifierLocal
+import androidx.compose.ui.modifier.modifierLocalOf
+
+/**
+ * A parent that can respond to [bringIntoView] requests from its children, and scroll so that the
+ * item is visible on screen.
+ *
+ * When a component calls [BringIntoViewRequester.bringIntoView], the
+ * [BringIntoView ModifierLocal][ModifierLocalBringIntoViewResponder] is read to gain access to the
+ * [BringIntoViewResponder], which is responsible for performing a scroll to bring the requesting
+ * component into view and then send a [bringIntoView] request to its parent.
+ *
+ * @sample androidx.compose.foundation.samples.BringIntoViewSample
+ *
+ * @see BringIntoViewRequester
+ */
+@ExperimentalFoundationApi
+interface BringIntoViewResponder {
+    /**
+     * Bring this specified rectangle into bounds by making all the scrollable parents scroll
+     * appropriately.
+     *
+     * @param rect The rectangle that should be brought into view. If you
+     * don't specify the coordinates, the entire component is brought into view.
+     *
+     *
+     * Here is a sample where a composable is brought into view:
+     * @sample androidx.compose.foundation.samples.BringIntoViewSample
+     *
+     * Here is a sample where a part of a composable is brought into view:
+     * @sample androidx.compose.foundation.samples.BringPartOfComposableIntoViewSample
+     */
+    suspend fun bringIntoView(rect: Rect)
+
+    /**
+     * Convert a Rect into the layoutCoordinates of this [BringIntoViewResponder].
+     */
+    fun toLocalRect(rect: Rect, layoutCoordinates: LayoutCoordinates): Rect
+
+    @ExperimentalFoundationApi
+    companion object {
+        /**
+         * The Key for the ModifierLocal that can be used to access the [BringIntoViewResponder].
+         */
+        val ModifierLocalBringIntoViewResponder: ProvidableModifierLocal<BringIntoViewResponder> =
+            modifierLocalOf { RootBringIntoViewResponder }
+
+        /**
+         * The Root [BringIntoViewResponder]. If you read this value for the
+         * [ModifierLocalBringIntoViewResponder], it means that this is the topmost
+         * [BringIntoViewResponder] in this hierarchy.
+         */
+        val RootBringIntoViewResponder = object : BringIntoViewResponder {
+            override suspend fun bringIntoView(rect: Rect) {}
+            override fun toLocalRect(rect: Rect, layoutCoordinates: LayoutCoordinates) =
+                Rect(layoutCoordinates.localToRoot(rect.topLeft), rect.size)
+        }
+    }
+}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/relocation/BringRectangleOnScreen.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/relocation/BringRectangleOnScreen.kt
new file mode 100644
index 0000000..f80d946
--- /dev/null
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/relocation/BringRectangleOnScreen.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.compose.foundation.relocation
+
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Rect
+
+/**
+ * Platform specific internal API to bring a rectangle into view.
+ */
+internal expect class BringRectangleOnScreenRequester() {
+    fun bringRectangleOnScreen(rect: Rect)
+}
+
+/**
+ * Companion Modifier to [BringRectangleOnScreenRequester].
+ */
+internal expect fun Modifier.bringRectangleOnScreenRequester(
+    bringRectangleOnScreenRequester: BringRectangleOnScreenRequester
+): Modifier
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/Toggleable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/Toggleable.kt
index d954661..9e399f2 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/Toggleable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/Toggleable.kt
@@ -20,18 +20,22 @@
 import androidx.compose.foundation.PressedInteractionSourceDisposableEffect
 import androidx.compose.foundation.LocalIndication
 import androidx.compose.foundation.focusableInNonTouchMode
+import androidx.compose.foundation.gestures.ModifierLocalScrollableContainer
 import androidx.compose.foundation.gestures.detectTapAndPress
 import androidx.compose.foundation.handlePressInteraction
 import androidx.compose.foundation.hoverable
 import androidx.compose.foundation.indication
 import androidx.compose.foundation.interaction.MutableInteractionSource
 import androidx.compose.foundation.interaction.PressInteraction
+import androidx.compose.foundation.isComposeRootInScrollableContainer
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberUpdatedState
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.composed
 import androidx.compose.ui.input.pointer.pointerInput
+import androidx.compose.ui.modifier.ModifierLocalConsumer
+import androidx.compose.ui.modifier.ModifierLocalReadScope
 import androidx.compose.ui.platform.debugInspectorInfo
 import androidx.compose.ui.platform.inspectable
 import androidx.compose.ui.semantics.Role
@@ -257,17 +261,39 @@
     if (enabled) {
         PressedInteractionSourceDisposableEffect(interactionSource, pressedInteraction)
     }
+    val isRootInScrollableContainer = isComposeRootInScrollableContainer()
+    val isToggleableInScrollableContainer = remember { mutableStateOf(true) }
+    val delayPressInteraction = rememberUpdatedState {
+        isToggleableInScrollableContainer.value || isRootInScrollableContainer()
+    }
     val gestures = Modifier.pointerInput(interactionSource, enabled) {
         detectTapAndPress(
             onPress = { offset ->
                 if (enabled) {
-                    handlePressInteraction(offset, interactionSource, pressedInteraction)
+                    handlePressInteraction(
+                        offset,
+                        interactionSource,
+                        pressedInteraction,
+                        delayPressInteraction
+                    )
                 }
             },
             onTap = { if (enabled) onClickState.value.invoke() }
         )
     }
     this
+        .then(
+            remember {
+                object : ModifierLocalConsumer {
+                    override fun onModifierLocalsUpdated(scope: ModifierLocalReadScope) {
+                        with(scope) {
+                            isToggleableInScrollableContainer.value =
+                                ModifierLocalScrollableContainer.current
+                        }
+                    }
+                }
+            }
+        )
         .then(semantics)
         .indication(interactionSource, indication)
         .hoverable(enabled = enabled, interactionSource = interactionSource)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreText.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreText.kt
index 0a46940..634d704 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreText.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreText.kt
@@ -34,6 +34,7 @@
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.drawscope.drawIntoCanvas
 import androidx.compose.ui.graphics.graphicsLayer
+import androidx.compose.ui.input.pointer.pointerHoverIcon
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.layout.FirstBaseline
 import androidx.compose.ui.layout.IntrinsicMeasurable
@@ -267,7 +268,7 @@
                 }
                 Modifier.pointerInput(mouseSelectionObserver) {
                     mouseSelectionDetector(mouseSelectionObserver)
-                }
+                }.pointerHoverIcon(textPointerIcon)
             }
         } else {
             Modifier
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt
index ada1bce..8585f46 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt
@@ -44,6 +44,7 @@
 import androidx.compose.ui.graphics.SolidColor
 import androidx.compose.ui.graphics.drawscope.drawIntoCanvas
 import androidx.compose.ui.input.key.onPreviewKeyEvent
+import androidx.compose.ui.input.pointer.pointerHoverIcon
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.layout.FirstBaseline
 import androidx.compose.ui.layout.IntrinsicMeasurable
@@ -316,7 +317,7 @@
         Modifier.mouseDragGestureDetector(
             observer = manager.mouseSelectionObserver,
             enabled = enabled
-        )
+        ).pointerHoverIcon(textPointerIcon)
     }
 
     val drawModifier = Modifier.drawBehind {
@@ -853,4 +854,4 @@
     handlePosition: Offset,
     modifier: Modifier,
     content: @Composable (() -> Unit)?
-)
+)
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextPointerIcon.kt
similarity index 67%
copy from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt
copy to compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextPointerIcon.kt
index e5bb607..7072692 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextPointerIcon.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 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,13 +14,8 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.platform
+package androidx.compose.foundation.text
 
-import java.awt.Desktop
-import java.net.URI
+import androidx.compose.ui.input.pointer.PointerIcon
 
-internal class DesktopUriHandler : UriHandler {
-    override fun openUri(uri: String) {
-        Desktop.getDesktop().browse(URI(uri))
-    }
-}
\ No newline at end of file
+internal expect val textPointerIcon: PointerIcon
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Clickable.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Clickable.desktop.kt
index 1ba0aab..0660f5d 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Clickable.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Clickable.desktop.kt
@@ -18,11 +18,17 @@
 
 import androidx.compose.foundation.gestures.forEachGesture
 import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Immutable
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberUpdatedState
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.composed
+import androidx.compose.ui.input.key.KeyEvent
+import androidx.compose.ui.input.key.KeyEventType.Companion.KeyUp
+import androidx.compose.ui.input.key.key
+import androidx.compose.ui.input.key.nativeKeyCode
+import androidx.compose.ui.input.key.type
 import androidx.compose.ui.input.pointer.AwaitPointerEventScope
 import androidx.compose.ui.input.pointer.PointerButtons
 import androidx.compose.ui.input.pointer.PointerEvent
@@ -36,11 +42,25 @@
 import androidx.compose.ui.platform.debugInspectorInfo
 import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.util.fastAll
+import java.awt.event.KeyEvent.VK_ENTER
 import kotlinx.coroutines.coroutineScope
 
+@Composable
+internal actual fun isComposeRootInScrollableContainer(): () -> Boolean = { false }
+
 // TODO: b/168524931 - should this depend on the input device?
 internal actual val TapIndicationDelay: Long = 0L
 
+/**
+ * Whether the specified [KeyEvent] represents a user intent to perform a click.
+ * (eg. When you press Enter on a focused button, it should perform a click).
+ */
+internal actual val KeyEvent.isClick: Boolean
+    get() = type == KeyUp && when (key.nativeKeyCode) {
+        VK_ENTER -> true
+        else -> false
+    }
+
 @Immutable @ExperimentalFoundationApi
 class MouseClickScope constructor(
     val buttons: PointerButtons,
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/relocation/BringRectangleOnScreen.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/relocation/BringRectangleOnScreen.desktop.kt
new file mode 100644
index 0000000..93e1cdd
--- /dev/null
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/relocation/BringRectangleOnScreen.desktop.kt
@@ -0,0 +1,39 @@
+/*
+ * 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.foundation.relocation
+
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Rect as ComposeRect
+
+/**
+ * Platform specific internal API to bring a rectangle into view.
+ */
+internal actual class BringRectangleOnScreenRequester {
+    @Suppress("UNUSED_PARAMETER")
+    actual fun bringRectangleOnScreen(rect: ComposeRect) {
+        // TODO(b/203204124): Implement this if desktop has a
+        //  concept similar to Android's View.requestRectangleOnScreen.
+    }
+}
+
+/**
+ * Companion Modifier to [BringRectangleOnScreenRequester].
+ */
+@Suppress("UNUSED_PARAMETER")
+internal actual fun Modifier.bringRectangleOnScreenRequester(
+    bringRectangleOnScreenRequester: BringRectangleOnScreenRequester
+): Modifier = this
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/TextPointerIcon.desktop.kt
similarity index 67%
copy from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt
copy to compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/TextPointerIcon.desktop.kt
index e5bb607..42fc945 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/TextPointerIcon.desktop.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 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,13 +14,10 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.platform
+package androidx.compose.foundation.text
 
-import java.awt.Desktop
-import java.net.URI
+import androidx.compose.ui.input.pointer.PointerIcon
+import java.awt.Cursor
 
-internal class DesktopUriHandler : UriHandler {
-    override fun openUri(uri: String) {
-        Desktop.getDesktop().browse(URI(uri))
-    }
-}
\ No newline at end of file
+internal actual val textPointerIcon: PointerIcon =
+    PointerIcon(Cursor(Cursor.TEXT_CURSOR))
\ No newline at end of file
diff --git a/compose/integration-tests/docs-snippets/build.gradle b/compose/integration-tests/docs-snippets/build.gradle
index 28dec6e..d41ce68 100644
--- a/compose/integration-tests/docs-snippets/build.gradle
+++ b/compose/integration-tests/docs-snippets/build.gradle
@@ -33,6 +33,7 @@
     implementation(project(":compose:animation:animation-graphics"))
     implementation(project(":compose:foundation:foundation-layout"))
     implementation(project(":compose:material:material"))
+    implementation(project(":compose:material3:material3"))
     implementation(project(":compose:material:material-icons-extended"))
     implementation(project(":compose:runtime:runtime"))
     implementation(project(":compose:runtime:runtime-livedata"))
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 ba25b0c..ed14cf8 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
@@ -814,6 +814,7 @@
         rule.mainClock.advanceTimeBy(50L)
 
         // Compare the result with the image showing the expected result.
+        // `assertAgainGolden` needs to be implemented in your code.
         rule.onRoot().captureToImage().assertAgainstGolden()
     }
 }
diff --git a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/interoperability/InteropArchitecture.kt b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/interoperability/InteropArchitecture.kt
index 67043c8..e660af9 100644
--- a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/interoperability/InteropArchitecture.kt
+++ b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/interoperability/InteropArchitecture.kt
@@ -29,8 +29,6 @@
 import android.util.AttributeSet
 import android.widget.LinearLayout
 import android.widget.TextView
-import androidx.activity.OnBackPressedCallback
-import androidx.activity.OnBackPressedDispatcher
 import androidx.activity.compose.setContent
 import androidx.appcompat.app.AppCompatActivity
 import androidx.compose.foundation.layout.Column
@@ -38,13 +36,11 @@
 import androidx.compose.material.Text
 import androidx.compose.material.TextField
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.SideEffect
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.livedata.observeAsState
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
-import androidx.compose.runtime.rememberUpdatedState
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.platform.ComposeView
 import androidx.lifecycle.LiveData
@@ -126,41 +122,20 @@
 
 private object InteropArchitectureSnippet3 {
     @Composable
-    fun BackHandler(
-        enabled: Boolean,
-        backDispatcher: OnBackPressedDispatcher,
-        onBack: () -> Unit
-    ) {
-
-        // Safely update the current `onBack` lambda when a new one is provided
-        val currentOnBack by rememberUpdatedState(onBack)
-
-        // Remember in Composition a back callback that calls the `onBack` lambda
-        val backCallback = remember {
-            // Always intercept back events. See the SideEffect for a more complete version
-            object : OnBackPressedCallback(true) {
-                override fun handleOnBackPressed() {
-                    currentOnBack()
-                }
-            }
+    fun rememberAnalytics(user: User): FirebaseAnalytics {
+        val analytics: FirebaseAnalytics = remember {
+            // START - DO NOT COPY IN CODE SNIPPET
+            FirebaseAnalytics()
+            // END - DO NOT COPY IN CODE SNIPPET, just use /* ... */
         }
 
-        // On every successful composition, update the callback with the `enabled` value
-        // to tell `backCallback` whether back events should be intercepted or not
+        // On every successful composition, update FirebaseAnalytics with
+        // the userType from the current User, ensuring that future analytics
+        // events have this metadata attached
         SideEffect {
-            backCallback.isEnabled = enabled
+            analytics.setUserProperty("userType", user.userType)
         }
-
-        // If `backDispatcher` changes, dispose and reset the effect
-        DisposableEffect(backDispatcher) {
-            // Add callback to the backDispatcher
-            backDispatcher.addCallback(backCallback)
-
-            // When the effect leaves the Composition, remove the callback
-            onDispose {
-                backCallback.remove()
-            }
-        }
+        return analytics
     }
 }
 
@@ -215,3 +190,8 @@
         return GreetingViewModel(userId) as T
     }
 }
+
+private class User(val userType: String = "user")
+private class FirebaseAnalytics {
+    fun setUserProperty(name: String, value: String) {}
+}
diff --git a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/navigation/NavigationAdaptive.kt b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/navigation/NavigationAdaptive.kt
new file mode 100644
index 0000000..f67d457
--- /dev/null
+++ b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/navigation/NavigationAdaptive.kt
@@ -0,0 +1,291 @@
+/*
+ * 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.
+ */
+
+// Ignore lint warnings in documentation snippets
+@file:Suppress("unused", "UNUSED_PARAMETER", "UNUSED_VARIABLE", "UnnecessaryLambdaCreation")
+
+package androidx.compose.integration.docs.navigation
+
+import androidx.activity.compose.BackHandler
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.saveable.Saver
+import androidx.compose.runtime.saveable.rememberSaveable
+import androidx.navigation.NavHostController
+import androidx.navigation.compose.NavHost
+import androidx.navigation.compose.composable
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.update
+
+/**
+ * This file lets DevRel track changes to snippets present in
+ * https://developer.android.com/jetpack/compose/nav-adaptive
+ *
+ * No action required if it's modified.
+ */
+
+private object NavigationAdaptiveSnippet1 {
+
+    enum class WindowSizeClass { Compact, Medium, Expanded }
+
+    @Composable
+    fun MyApp(windowSizeClass: WindowSizeClass) {
+        // Perform logic on the size class to decide whether to show
+        // the nav rail
+        val showNavRail = windowSizeClass != WindowSizeClass.Compact
+        MyScreen(
+            showNavRail = showNavRail,
+            /* ... */
+        )
+    }
+}
+
+private object NavigationAdaptiveSnippet2 {
+
+    @Composable
+    fun JetnewsNavGraph(
+        navController: NavHostController,
+        isExpandedScreen: Boolean,
+        // ...
+    ) {
+        // ...
+        NavHost(
+            navController = navController,
+            startDestination = JetnewsDestinations.HomeRoute
+        ) {
+            composable(JetnewsDestinations.HomeRoute) {
+                // ...
+                HomeRoute(
+                    isExpandedScreen = isExpandedScreen,
+                    // ...
+                )
+            }
+            // ...
+        }
+    }
+}
+
+private object NavigationAdaptiveSnippet3 {
+
+    @Composable
+    fun HomeRoute(
+        // if the window size class is expanded
+        isExpandedScreen: Boolean,
+        // if the user is focused on the selected article
+        isArticleOpen: Boolean,
+        // ...
+    ) {
+        // ...
+        if (isExpandedScreen) {
+            HomeListWithArticleDetailsScreen(/* ... */)
+        } else {
+            // if we don't have room for both the list and article details,
+            // show one of them based on the user's focus
+            if (isArticleOpen) {
+                ArticleScreen(/* ... */)
+            } else {
+                HomeListScreen(/* ... */)
+            }
+        }
+    }
+}
+
+private object NavigationAdaptiveSnippet4 {
+
+    class HomeViewModel(/* ... */) {
+        fun selectArticle(articleId: String) {
+            viewModelState.update {
+                it.copy(
+                    isArticleOpen = true,
+                    selectedArticleId = articleId
+                )
+            }
+        }
+    }
+
+    @Composable
+    fun HomeRoute(
+        isExpandedScreen: Boolean,
+        isArticleOpen: Boolean,
+        selectedArticleId: String,
+        onSelectArticle: (String) -> Unit,
+        // ...
+    ) {
+        // ...
+        if (isExpandedScreen) {
+            HomeListWithArticleDetailsScreen(
+                selectedArticleId = selectedArticleId,
+                onSelectArticle = onSelectArticle,
+                // ...
+            )
+        } else {
+            // if we don't have room for both the list and article details,
+            // show one of them based on the user's focus
+            if (isArticleOpen) {
+                ArticleScreen(
+                    selectedArticleId = selectedArticleId,
+                    // ...
+                )
+            } else {
+                HomeListScreen(
+                    onSelectArticle = onSelectArticle,
+                    // ...
+                )
+            }
+        }
+    }
+}
+
+private object NavigationAdaptiveSnippet5 {
+
+    class HomeViewModel(/* ... */) {
+        fun onArticleBackPress() {
+            viewModelState.update {
+                it.copy(isArticleOpen = false)
+            }
+        }
+    }
+
+    @Composable
+    fun HomeRoute(
+        isExpandedScreen: Boolean,
+        isArticleOpen: Boolean,
+        selectedArticleId: String,
+        onSelectArticle: (String) -> Unit,
+        onArticleBackPress: () -> Unit,
+        // ...
+    ) {
+        // ...
+        if (isExpandedScreen) {
+            HomeListWithArticleDetailsScreen(/* ... */)
+        } else {
+            // if we don't have room for both the list and article details,
+            // show one of them based on the user's focus
+            if (isArticleOpen) {
+                ArticleScreen(
+                    selectedArticleId = selectedArticleId,
+                    onUpPressed = onArticleBackPress,
+                    // ...
+                )
+                BackHandler {
+                    onArticleBackPress()
+                }
+            } else {
+                HomeListScreen(/* ... */)
+            }
+        }
+    }
+}
+
+private object NavigationAdaptiveSnippet6 {
+
+    @Composable
+    fun HomeRoute(
+        // if the window size class is expanded
+        isExpandedScreen: Boolean,
+        // if the user is focused on the selected article
+        isArticleOpen: Boolean,
+        selectedArticleId: String,
+        // ...
+    ) {
+        val homeListState = rememberHomeListState()
+        val articleState = rememberSaveable(
+            selectedArticleId,
+            saver = ArticleState.Saver
+        ) {
+            ArticleState()
+        }
+
+        if (isExpandedScreen) {
+            HomeListWithArticleDetailsScreen(
+                homeListState = homeListState,
+                articleState = articleState,
+                // ...
+            )
+        } else {
+            // if we don't have room for both the list and article details,
+            // show one of them based on the user's focus
+            if (isArticleOpen) {
+                ArticleScreen(
+                    articleState = articleState,
+                    // ...
+                )
+            } else {
+                HomeListScreen(
+                    homeListState = homeListState,
+                    // ...
+                )
+            }
+        }
+    }
+}
+
+/*
+Fakes needed for snippets to build:
+ */
+
+@Composable
+private fun MyScreen(
+    showNavRail: Boolean
+) = Unit
+
+private object JetnewsDestinations {
+    const val HomeRoute = "home"
+    const val InterestsRoute = "interests"
+}
+
+@Composable
+private fun HomeRoute(
+    isExpandedScreen: Boolean
+) = Unit
+
+@Composable
+private fun HomeListWithArticleDetailsScreen(
+    selectedArticleId: String = TODO(),
+    onSelectArticle: (String) -> Unit = TODO(),
+    homeListState: HomeListState = TODO(),
+    articleState: ArticleState = TODO()
+) = Unit
+
+@Composable
+private fun ArticleScreen(
+    selectedArticleId: String = TODO(),
+    onUpPressed: () -> Unit = TODO(),
+    articleState: ArticleState = TODO()
+) = Unit
+
+@Composable
+private fun HomeListScreen(
+    onSelectArticle: (String) -> Unit = TODO(),
+    homeListState: HomeListState = TODO()
+) = Unit
+
+@Composable
+private fun rememberHomeListState(): HomeListState = TODO()
+
+private class HomeListState
+
+private class ArticleState {
+    companion object {
+        val Saver: Saver<ArticleState, *> = TODO()
+    }
+}
+
+data class HomeViewModelState(
+    val selectedArticleId: String,
+    val isArticleOpen: Boolean,
+)
+
+val viewModelState: MutableStateFlow<HomeViewModelState> = TODO()
diff --git a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/phases/Phases.kt b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/phases/Phases.kt
new file mode 100644
index 0000000..15a76cb
--- /dev/null
+++ b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/phases/Phases.kt
@@ -0,0 +1,187 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("CanBeVal", "ClassName", "UNUSED_PARAMETER", "unused")
+
+package androidx.compose.integration.docs.phases
+
+import androidx.compose.foundation.Canvas
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.offset
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.lazy.LazyListState
+import androidx.compose.foundation.lazy.rememberLazyListState
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.MutableState
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.layout.onSizeChanged
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.IntOffset
+import androidx.compose.ui.unit.dp
+
+/*
+ * This file lets DevRel track changes to snippets present in
+ * https://developer.android.com/jetpack/compose/phases
+ *
+ * No action required if it's modified.
+ */
+
+@Composable
+private fun StateWithoutPropertyDelegate() {
+    // State read without property delegate.
+    val paddingState: MutableState<Dp> = remember { mutableStateOf(8.dp) }
+    Text(
+        text = "Hello",
+        modifier = Modifier.padding(paddingState.value)
+    )
+}
+
+@Composable
+private fun StateWithPropertyDelegate() {
+    // State read with property delegate.
+    var padding: Dp by remember { mutableStateOf(8.dp) }
+    Text(
+        text = "Hello",
+        modifier = Modifier.padding(padding)
+    )
+}
+
+@Composable
+private fun StateReadInComposition() {
+    var padding by remember { mutableStateOf(8.dp) }
+    Text(
+        text = "Hello",
+        // The `padding` state is read in the composition phase
+        // when the modifier is constructed.
+        // Changes in `padding` will invoke recomposition.
+        modifier = Modifier.padding(padding)
+    )
+}
+
+@Composable
+private fun StateReadInLayout() {
+    var offsetX by remember { mutableStateOf(8.dp) }
+    Text(
+        text = "Hello",
+        modifier = Modifier.offset {
+            // The `offsetX` state is read in the placement step
+            // of the layout phase when the offset is calculated.
+            // Changes in `offsetX` restart the layout.
+            IntOffset(offsetX.roundToPx(), 0)
+        }
+    )
+}
+
+@Composable
+private fun StateReadInDrawing(
+    modifier: Modifier = Modifier
+) {
+    var color by remember { mutableStateOf(Color.Red) }
+    Canvas(modifier = modifier) {
+        // The `color` state is read in the drawing phase
+        // when the canvas is rendered.
+        // Changes in `color` restart the drawing.
+        drawRect(color)
+    }
+}
+
+@Composable
+private fun OptimizingStateReadsComposition() {
+    Box {
+        val listState = rememberLazyListState()
+
+        Image(
+            // Non-optimal implementation!
+            Modifier.offset(
+                with(LocalDensity.current) {
+                    // State read of firstVisibleItemScrollOffset in composition
+                    (listState.firstVisibleItemScrollOffset / 2).toDp()
+                }
+            )
+        )
+
+        LazyColumn(state = listState)
+    }
+}
+
+@Composable
+private fun OptimizingStateReadsLayout() {
+    Box {
+        val listState = rememberLazyListState()
+
+        Image(
+            Modifier.offset {
+                // State read of firstVisibleItemScrollOffset in Layout
+                IntOffset(x = 0, y = listState.firstVisibleItemScrollOffset / 2)
+            }
+        )
+
+        LazyColumn(state = listState)
+    }
+}
+
+@Composable
+private fun ImmediateRecomposition() {
+    Box {
+        var imageHeightPx by remember { mutableStateOf(0) }
+
+        Image(
+            painter = painterResource(R.drawable.rectangle),
+            contentDescription = "I'm above the text",
+            modifier = Modifier
+                .fillMaxWidth()
+                .onSizeChanged { size ->
+                    // Don't do this
+                    imageHeightPx = size.height
+                }
+        )
+
+        Text(
+            text = "I'm below the image",
+            modifier = Modifier.padding(
+                top = with(LocalDensity.current) { imageHeightPx.toDp() }
+            )
+        )
+    }
+}
+
+/*
+ * Fakes needed for snippets to build:
+ */
+
+@Composable
+private fun Image(modifier: Modifier = Modifier) {
+}
+
+@Composable
+private fun LazyColumn(state: LazyListState) {
+}
+
+private object R {
+    object drawable {
+        const val rectangle = 0
+    }
+}
diff --git a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/sideeffects/SideEffects.kt b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/sideeffects/SideEffects.kt
index 98c63c6..d5a5c46 100644
--- a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/sideeffects/SideEffects.kt
+++ b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/sideeffects/SideEffects.kt
@@ -21,8 +21,6 @@
 
 package androidx.compose.integration.docs.sideeffects
 
-import androidx.activity.OnBackPressedCallback
-import androidx.activity.OnBackPressedDispatcher
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxSize
@@ -49,12 +47,23 @@
 import androidx.compose.runtime.rememberUpdatedState
 import androidx.compose.runtime.snapshotFlow
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalLifecycleOwner
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.LifecycleEventObserver
+import androidx.lifecycle.LifecycleOwner
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.flow.collect
 import kotlinx.coroutines.flow.distinctUntilChanged
 import kotlinx.coroutines.flow.filter
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.launch
+import kotlin.Boolean
+import kotlin.Exception
+import kotlin.Long
+import kotlin.Nothing
+import kotlin.String
+import kotlin.Suppress
+import kotlin.Unit
 import kotlin.random.Random
 
 /**
@@ -142,61 +151,56 @@
 
 private object SideEffectsSnippet4 {
     @Composable
-    fun BackHandler(backDispatcher: OnBackPressedDispatcher, onBack: () -> Unit) {
+    fun HomeScreen(
+        lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current,
+        onStart: () -> Unit, // Send the 'started' analytics event
+        onStop: () -> Unit // Send the 'stopped' analytics event
+    ) {
+        // Safely update the current lambdas when a new one is provided
+        val currentOnStart by rememberUpdatedState(onStart)
+        val currentOnStop by rememberUpdatedState(onStop)
 
-        // Safely update the current `onBack` lambda when a new one is provided
-        val currentOnBack by rememberUpdatedState(onBack)
-
-        // Remember in Composition a back callback that calls the `onBack` lambda
-        val backCallback = remember {
-            // Always intercept back events. See the SideEffect for a more complete version
-            object : OnBackPressedCallback(true) {
-                override fun handleOnBackPressed() {
-                    currentOnBack()
+        // If `lifecycleOwner` changes, dispose and reset the effect
+        DisposableEffect(lifecycleOwner) {
+            // Create an observer that triggers our remembered callbacks
+            // for sending analytics events
+            val observer = LifecycleEventObserver { _, event ->
+                if (event == Lifecycle.Event.ON_START) {
+                    currentOnStart()
+                } else if (event == Lifecycle.Event.ON_STOP) {
+                    currentOnStop()
                 }
             }
-        }
 
-        // If `backDispatcher` changes, dispose and reset the effect
-        DisposableEffect(backDispatcher) {
-            // Add callback to the backDispatcher
-            backDispatcher.addCallback(backCallback)
+            // Add the observer to the lifecycle
+            lifecycleOwner.lifecycle.addObserver(observer)
 
-            // When the effect leaves the Composition, remove the callback
+            // When the effect leaves the Composition, remove the observer
             onDispose {
-                backCallback.remove()
+                lifecycleOwner.lifecycle.removeObserver(observer)
             }
         }
+
+        /* Home screen content */
     }
 }
 
 private object SideEffectsSnippet5 {
     @Composable
-    fun BackHandler(
-        backDispatcher: OnBackPressedDispatcher,
-        enabled: Boolean = true, // Whether back events should be intercepted or not
-        onBack: () -> Unit
-    ) {
-        // START - DO NOT COPY IN CODE SNIPPET
-        val currentOnBack by rememberUpdatedState(onBack)
-
-        val backCallback = remember {
-            // Always intercept back events. See the SideEffect for a more complete version
-            object : OnBackPressedCallback(true) {
-                override fun handleOnBackPressed() {
-                    currentOnBack()
-                }
-            }
+    fun rememberAnalytics(user: User): FirebaseAnalytics {
+        val analytics: FirebaseAnalytics = remember {
+            // START - DO NOT COPY IN CODE SNIPPET
+            FirebaseAnalytics()
+            // END - DO NOT COPY IN CODE SNIPPET, just use /* ... */
         }
-        // END - DO NOT COPY IN CODE SNIPPET, just use /* ... */
 
-        // On every successful composition, update the callback with the `enabled` value
-        // to tell `backCallback` whether back events should be intercepted or not
+        // On every successful composition, update FirebaseAnalytics with
+        // the userType from the current User, ensuring that future analytics
+        // events have this metadata attached
         SideEffect {
-            backCallback.isEnabled = enabled
+            analytics.setUserProperty("userType", user.userType)
         }
-
-        /* Rest of the code */
+        return analytics
     }
 }
 
@@ -269,24 +273,29 @@
 
 private object SideEffectsSnippet9 {
     @Composable
-    fun BackHandler(backDispatcher: OnBackPressedDispatcher, onBack: () -> Unit) {
-        // START - DO NOT COPY IN CODE SNIPPET
-        val currentOnBack by rememberUpdatedState(onBack)
+    fun HomeScreen(
+        lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current,
+        onStart: () -> Unit, // Send the 'started' analytics event
+        onStop: () -> Unit // Send the 'stopped' analytics event
+    ) {
+        // These values never change in Composition
+        val currentOnStart by rememberUpdatedState(onStart)
+        val currentOnStop by rememberUpdatedState(onStop)
 
-        val backCallback = remember {
-            // Always intercept back events. See the SideEffect for a more complete version
-            object : OnBackPressedCallback(true) {
-                override fun handleOnBackPressed() {
-                    currentOnBack()
+        DisposableEffect(lifecycleOwner) {
+            val observer = LifecycleEventObserver { _, event ->
+                // START - DO NOT COPY IN CODE SNIPPET
+                if (event == Lifecycle.Event.ON_START) {
+                    currentOnStart()
+                } else if (event == Lifecycle.Event.ON_STOP) {
+                    currentOnStop()
                 }
+                // END - DO NOT COPY IN CODE SNIPPET, just use /* ... */
             }
-        }
-        // END - DO NOT COPY IN CODE SNIPPET, just use /* ... */
 
-        DisposableEffect(backDispatcher) {
-            backDispatcher.addCallback(backCallback)
+            lifecycleOwner.lifecycle.addObserver(observer)
             onDispose {
-                backCallback.remove()
+                lifecycleOwner.lifecycle.removeObserver(observer)
             }
         }
     }
@@ -315,13 +324,17 @@
     fun load(url: String): Image? = if (Random.nextInt() == 0) Image() else null // Avoid warnings
 }
 
+private class FirebaseAnalytics {
+    fun setUserProperty(name: String, value: String) {}
+}
+
 private sealed class Result<out R> {
     data class Success<out T>(val data: T) : Result<T>()
     object Loading : Result<Nothing>()
     object Error : Result<Nothing>()
 }
 
-private class User
+private class User(val userType: String = "user")
 private class Weather
 private class Greeting(val name: String)
 private fun prepareGreeting(user: User, weather: Weather) = Greeting("haha")
diff --git a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/theming/Material.kt b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/theming/Material.kt
index 551f343..8885249 100644
--- a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/theming/Material.kt
+++ b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/theming/Material.kt
@@ -431,7 +431,7 @@
 @Composable private fun BlueTheme(content: @Composable () -> Unit) {}
 
 @Suppress("ClassName")
-private object R {
+internal object R {
     object drawable {
         const val ic_sun_24dp = 1
         const val ic_moon_24dp = 1
@@ -440,6 +440,8 @@
         const val rubik_regular = 1
         const val rubik_medium = 1
         const val rubik_bold = 1
+        const val karla_regular = 1
+        const val karla_bold = 1
     }
 }
 
diff --git a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/theming/Material3.kt b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/theming/Material3.kt
new file mode 100644
index 0000000..d10cdb2
--- /dev/null
+++ b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/theming/Material3.kt
@@ -0,0 +1,193 @@
+// ktlint-disable indent https://github.com/pinterest/ktlint/issues/967
+/*
+ * 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.
+ */
+
+// Ignore lint warnings in documentation snippets
+@file:Suppress(
+    "unused", "UNUSED_PARAMETER", "UNUSED_VARIABLE", "RemoveEmptyParenthesesFromLambdaCall"
+)
+
+package androidx.compose.integration.docs.theming
+
+import android.annotation.SuppressLint
+import android.os.Build
+import androidx.compose.foundation.isSystemInDarkTheme
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Surface
+import androidx.compose.material3.Text
+import androidx.compose.material3.Typography
+import androidx.compose.material3.darkColorScheme
+import androidx.compose.material3.dynamicDarkColorScheme
+import androidx.compose.material3.dynamicLightColorScheme
+import androidx.compose.material3.lightColorScheme
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.font.Font
+import androidx.compose.ui.text.font.FontFamily
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+
+/**
+ * This file lets DevRel track changes to snippets present in
+ * https://developer.android.com/jetpack/compose/themes/material#material3
+ *
+ * No action required if it's modified.
+ */
+
+private object Material3Snippet1 {
+    /* Can't be compiled. See snippet below for changes.
+      MaterialTheme(
+        colorScheme = …,
+        typography = …
+        // Updates to shapes coming soon
+      ) {
+        // M3 app content
+      }
+    */
+    @Composable
+    fun MaterialTheming() {
+        MaterialTheme(
+            colorScheme = MaterialTheme.colorScheme,
+            typography = MaterialTheme.typography
+        ) { }
+    }
+}
+
+private object Material3Snippet2 {
+    private val Blue40 = Color(0xff1e40ff)
+    private val DarkBlue40 = Color(0xff3e41f4)
+    private val Yellow40 = Color(0xff7d5700)
+    // Remaining colors from tonal palettes
+
+    private val LightColorScheme = lightColorScheme(
+        primary = Blue40,
+        secondary = DarkBlue40,
+        tertiary = Yellow40,
+        // error, primaryContainer, onSecondary, etc.
+    )
+    private val DarkColorScheme = darkColorScheme(
+        primary = Blue80,
+        secondary = DarkBlue80,
+        tertiary = Yellow80,
+        // error, primaryContainer, onSecondary, etc.
+    )
+}
+
+private object Material3Snippet3 {
+    @Composable
+    fun Material3Theming() {
+        val darkTheme = isSystemInDarkTheme()
+        MaterialTheme(
+            colorScheme = if (darkTheme) DarkColorScheme else LightColorScheme
+        ) {
+            // M3 app content
+        }
+    }
+}
+
+private object Material3Snippet4 {
+    @SuppressLint("NewApi")
+    @Composable
+    fun Material3Theming() {
+        // Dynamic color is available on Android 12+
+        val dynamicColor = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S
+        val colorScheme = when {
+            dynamicColor && darkTheme -> dynamicDarkColorScheme(LocalContext.current)
+            dynamicColor && !darkTheme -> dynamicLightColorScheme(LocalContext.current)
+            darkTheme -> DarkColorScheme
+            else -> LightColorScheme
+        }
+    }
+}
+
+private object Material3Snippet5 {
+    @Composable
+    fun Material3Theming() {
+        Text(
+            text = "Hello M3 theming",
+            color = MaterialTheme.colorScheme.tertiary
+        )
+    }
+}
+
+private object Material3Snippet6 {
+    val KarlaFontFamily = FontFamily(
+        Font(R.font.karla_regular),
+        Font(R.font.karla_bold, FontWeight.Bold)
+    )
+
+    val AppTypography = Typography(
+        bodyLarge = TextStyle(
+            fontFamily = KarlaFontFamily,
+            fontWeight = FontWeight.Normal,
+            fontSize = 16.sp,
+            lineHeight = 24.sp,
+            letterSpacing = 0.15.sp
+        ),
+        // titleMedium, labelSmall, etc.
+    )
+}
+
+private object Material3Snippet7 {
+    @Composable
+    fun Material3Theming() {
+        MaterialTheme(
+            typography = AppTypography
+        ) {
+            // M3 app content
+        }
+    }
+}
+
+private object Material3Snippet8 {
+    @Composable
+    fun Material3Theming() {
+        Text(
+            text = "Hello M3 theming",
+            style = MaterialTheme.typography.bodyLarge
+        )
+    }
+}
+
+private object Material3Snippet9 {
+    @Composable
+    fun Material3Theming() {
+        Surface(
+            tonalElevation = 16.dp,
+            shadowElevation = 16.dp
+        ) {
+            // Surface content
+        }
+    }
+}
+
+/*
+Fakes needed for snippets to build:
+ */
+
+private val Blue80 = Color(0xff1e40ff)
+private val DarkBlue80 = Color(0xff3e41f4)
+private val Yellow80 = Color(0xff7d5700)
+
+private val DarkColorScheme = darkColorScheme()
+private val LightColorScheme = lightColorScheme()
+
+private const val darkTheme = true
+
+private val AppTypography = Typography()
diff --git a/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/IoSettingsStartupBenchmark.kt b/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/IoSettingsStartupBenchmark.kt
index f4a21bb..13ba40b 100644
--- a/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/IoSettingsStartupBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/IoSettingsStartupBenchmark.kt
@@ -20,7 +20,6 @@
 import androidx.benchmark.macro.StartupMode
 import androidx.benchmark.macro.junit4.MacrobenchmarkRule
 import androidx.test.filters.LargeTest
-import androidx.test.filters.SdkSuppress
 import androidx.testutils.createStartupCompilationParams
 import androidx.testutils.measureStartup
 import org.junit.Rule
@@ -29,7 +28,6 @@
 import org.junit.runners.Parameterized
 
 @LargeTest
-@SdkSuppress(minSdkVersion = 29)
 @RunWith(Parameterized::class)
 class IoSettingsStartupBenchmark(
     private val startupMode: StartupMode,
diff --git a/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/NestedListsScrollBenchmark.kt b/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/NestedListsScrollBenchmark.kt
index a90953a..4b3fe6b 100644
--- a/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/NestedListsScrollBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/NestedListsScrollBenchmark.kt
@@ -23,7 +23,6 @@
 import androidx.benchmark.macro.FrameTimingMetric
 import androidx.benchmark.macro.junit4.MacrobenchmarkRule
 import androidx.test.filters.LargeTest
-import androidx.test.filters.SdkSuppress
 import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.uiautomator.By
 import androidx.test.uiautomator.UiDevice
@@ -36,7 +35,6 @@
 import org.junit.runners.Parameterized
 
 @LargeTest
-@SdkSuppress(minSdkVersion = 29)
 @RunWith(Parameterized::class)
 class NestedListsScrollBenchmark(
     private val compilationMode: CompilationMode
diff --git a/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/SmallListStartupBenchmark.kt b/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/SmallListStartupBenchmark.kt
index 4e55ceb..3100c8e 100644
--- a/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/SmallListStartupBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/SmallListStartupBenchmark.kt
@@ -20,7 +20,6 @@
 import androidx.benchmark.macro.StartupMode
 import androidx.benchmark.macro.junit4.MacrobenchmarkRule
 import androidx.test.filters.LargeTest
-import androidx.test.filters.SdkSuppress
 import androidx.testutils.createStartupCompilationParams
 import androidx.testutils.measureStartup
 import org.junit.Rule
@@ -29,7 +28,6 @@
 import org.junit.runners.Parameterized
 
 @LargeTest
-@SdkSuppress(minSdkVersion = 29)
 @RunWith(Parameterized::class)
 class SmallListStartupBenchmark(
     private val startupMode: StartupMode,
diff --git a/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/TrivialStartupBenchmark.kt b/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/TrivialStartupBenchmark.kt
index ed5efcc..94f358c 100644
--- a/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/TrivialStartupBenchmark.kt
+++ b/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/compose/integration/macrobenchmark/TrivialStartupBenchmark.kt
@@ -20,7 +20,6 @@
 import androidx.benchmark.macro.StartupMode
 import androidx.benchmark.macro.junit4.MacrobenchmarkRule
 import androidx.test.filters.LargeTest
-import androidx.test.filters.SdkSuppress
 import androidx.testutils.createStartupCompilationParams
 import androidx.testutils.measureStartup
 import org.junit.Rule
@@ -29,7 +28,6 @@
 import org.junit.runners.Parameterized
 
 @LargeTest
-@SdkSuppress(minSdkVersion = 29)
 @RunWith(Parameterized::class)
 class TrivialStartupBenchmark(
     private val startupMode: StartupMode,
diff --git a/compose/material/material-icons-core/api/1.1.0-beta02.txt b/compose/material/material-icons-core/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..b95d770
--- /dev/null
+++ b/compose/material/material-icons-core/api/1.1.0-beta02.txt
@@ -0,0 +1,1036 @@
+// Signature format: 4.0
+package androidx.compose.material.icons {
+
+  public final class Icons {
+    method public androidx.compose.material.icons.Icons.Filled getDefault();
+    property public final androidx.compose.material.icons.Icons.Filled Default;
+    field public static final androidx.compose.material.icons.Icons INSTANCE;
+  }
+
+  public static final class Icons.Filled {
+    field public static final androidx.compose.material.icons.Icons.Filled INSTANCE;
+  }
+
+  public static final class Icons.Outlined {
+    field public static final androidx.compose.material.icons.Icons.Outlined INSTANCE;
+  }
+
+  public static final class Icons.Rounded {
+    field public static final androidx.compose.material.icons.Icons.Rounded INSTANCE;
+  }
+
+  public static final class Icons.Sharp {
+    field public static final androidx.compose.material.icons.Icons.Sharp INSTANCE;
+  }
+
+  public static final class Icons.TwoTone {
+    field public static final androidx.compose.material.icons.Icons.TwoTone INSTANCE;
+  }
+
+  public final class IconsKt {
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector materialIcon(String name, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,androidx.compose.ui.graphics.vector.ImageVector.Builder> block);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder materialPath(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional float fillAlpha, optional float strokeAlpha, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+  }
+
+}
+
+package androidx.compose.material.icons.filled {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Filled);
+  }
+
+}
+
+package androidx.compose.material.icons.outlined {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+}
+
+package androidx.compose.material.icons.rounded {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+}
+
+package androidx.compose.material.icons.sharp {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+}
+
+package androidx.compose.material.icons.twotone {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+}
+
diff --git a/compose/material/material-icons-core/api/public_plus_experimental_1.1.0-beta02.txt b/compose/material/material-icons-core/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..b95d770
--- /dev/null
+++ b/compose/material/material-icons-core/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,1036 @@
+// Signature format: 4.0
+package androidx.compose.material.icons {
+
+  public final class Icons {
+    method public androidx.compose.material.icons.Icons.Filled getDefault();
+    property public final androidx.compose.material.icons.Icons.Filled Default;
+    field public static final androidx.compose.material.icons.Icons INSTANCE;
+  }
+
+  public static final class Icons.Filled {
+    field public static final androidx.compose.material.icons.Icons.Filled INSTANCE;
+  }
+
+  public static final class Icons.Outlined {
+    field public static final androidx.compose.material.icons.Icons.Outlined INSTANCE;
+  }
+
+  public static final class Icons.Rounded {
+    field public static final androidx.compose.material.icons.Icons.Rounded INSTANCE;
+  }
+
+  public static final class Icons.Sharp {
+    field public static final androidx.compose.material.icons.Icons.Sharp INSTANCE;
+  }
+
+  public static final class Icons.TwoTone {
+    field public static final androidx.compose.material.icons.Icons.TwoTone INSTANCE;
+  }
+
+  public final class IconsKt {
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector materialIcon(String name, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,androidx.compose.ui.graphics.vector.ImageVector.Builder> block);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder materialPath(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional float fillAlpha, optional float strokeAlpha, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+  }
+
+}
+
+package androidx.compose.material.icons.filled {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Filled);
+  }
+
+}
+
+package androidx.compose.material.icons.outlined {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+}
+
+package androidx.compose.material.icons.rounded {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+}
+
+package androidx.compose.material.icons.sharp {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+}
+
+package androidx.compose.material.icons.twotone {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/material/material-icons-core/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to compose/material/material-icons-core/api/res-1.1.0-beta02.txt
diff --git a/compose/material/material-icons-core/api/restricted_1.1.0-beta02.txt b/compose/material/material-icons-core/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..619d449
--- /dev/null
+++ b/compose/material/material-icons-core/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,1037 @@
+// Signature format: 4.0
+package androidx.compose.material.icons {
+
+  public final class Icons {
+    method public androidx.compose.material.icons.Icons.Filled getDefault();
+    property public final androidx.compose.material.icons.Icons.Filled Default;
+    field public static final androidx.compose.material.icons.Icons INSTANCE;
+  }
+
+  public static final class Icons.Filled {
+    field public static final androidx.compose.material.icons.Icons.Filled INSTANCE;
+  }
+
+  public static final class Icons.Outlined {
+    field public static final androidx.compose.material.icons.Icons.Outlined INSTANCE;
+  }
+
+  public static final class Icons.Rounded {
+    field public static final androidx.compose.material.icons.Icons.Rounded INSTANCE;
+  }
+
+  public static final class Icons.Sharp {
+    field public static final androidx.compose.material.icons.Icons.Sharp INSTANCE;
+  }
+
+  public static final class Icons.TwoTone {
+    field public static final androidx.compose.material.icons.Icons.TwoTone INSTANCE;
+  }
+
+  public final class IconsKt {
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector materialIcon(String name, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,androidx.compose.ui.graphics.vector.ImageVector.Builder> block);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder materialPath(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional float fillAlpha, optional float strokeAlpha, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+    field @kotlin.PublishedApi internal static final float MaterialIconDimension = 24.0f;
+  }
+
+}
+
+package androidx.compose.material.icons.filled {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Filled);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Filled);
+  }
+
+}
+
+package androidx.compose.material.icons.outlined {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Outlined);
+  }
+
+}
+
+package androidx.compose.material.icons.rounded {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Rounded);
+  }
+
+}
+
+package androidx.compose.material.icons.sharp {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.Sharp);
+  }
+
+}
+
+package androidx.compose.material.icons.twotone {
+
+  public final class AccountBoxKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountBox(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AccountCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAccountCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AddCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAddCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class AddKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getAdd(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowBackKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowBack(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowDropDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowDropDown(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ArrowForwardKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getArrowForward(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class BuildKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getBuild(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CallKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCall(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CheckCircleKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheckCircle(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CheckKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCheck(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ClearKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClear(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CloseKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getClose(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class CreateKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getCreate(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DateRangeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDateRange(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DeleteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDelete(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class DoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getDone(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class EditKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEdit(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class EmailKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getEmail(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ExitToAppKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getExitToApp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFace(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FavoriteBorderKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavoriteBorder(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class FavoriteKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getFavorite(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class HomeKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getHome(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class InfoKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getInfo(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowDownKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowDown(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowLeftKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowLeft(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowRightKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowRight(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class KeyboardArrowUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getKeyboardArrowUp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ListKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getList(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class LocationOnKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLocationOn(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class LockKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getLock(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MailOutlineKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMailOutline(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MenuKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMenu(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class MoreVertKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getMoreVert(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class NotificationsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getNotifications(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PersonKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPerson(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PhoneKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPhone(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PlaceKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlace(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class PlayArrowKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getPlayArrow(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class RefreshKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getRefresh(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SearchKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSearch(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SendKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSend(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class SettingsKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getSettings(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ShareKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShare(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ShoppingCartKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getShoppingCart(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class StarKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getStar(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class ThumbUpKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getThumbUp(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+  public final class WarningKt {
+    method public static androidx.compose.ui.graphics.vector.ImageVector getWarning(androidx.compose.material.icons.Icons.TwoTone);
+  }
+
+}
+
diff --git a/compose/material/material-ripple/api/1.1.0-beta02.txt b/compose/material/material-ripple/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..32f4093
--- /dev/null
+++ b/compose/material/material-ripple/api/1.1.0-beta02.txt
@@ -0,0 +1,40 @@
+// Signature format: 4.0
+package androidx.compose.material.ripple {
+
+  @androidx.compose.runtime.Immutable public final class RippleAlpha {
+    ctor public RippleAlpha(float draggedAlpha, float focusedAlpha, float hoveredAlpha, float pressedAlpha);
+    method public float getDraggedAlpha();
+    method public float getFocusedAlpha();
+    method public float getHoveredAlpha();
+    method public float getPressedAlpha();
+    property public final float draggedAlpha;
+    property public final float focusedAlpha;
+    property public final float hoveredAlpha;
+    property public final float pressedAlpha;
+  }
+
+  public final class RippleAnimationKt {
+  }
+
+  public final class RippleKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.Indication rememberRipple(optional boolean bounded, optional float radius, optional long color);
+  }
+
+  public interface RippleTheme {
+    method @androidx.compose.runtime.Composable public long defaultColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ripple.RippleAlpha rippleAlpha();
+    field public static final androidx.compose.material.ripple.RippleTheme.Companion Companion;
+  }
+
+  public static final class RippleTheme.Companion {
+    method public androidx.compose.material.ripple.RippleAlpha defaultRippleAlpha(long contentColor, boolean lightTheme);
+    method public long defaultRippleColor(long contentColor, boolean lightTheme);
+  }
+
+  public final class RippleThemeKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> LocalRippleTheme;
+  }
+
+}
+
diff --git a/compose/material/material-ripple/api/current.txt b/compose/material/material-ripple/api/current.txt
index 7f874e1..32f4093 100644
--- a/compose/material/material-ripple/api/current.txt
+++ b/compose/material/material-ripple/api/current.txt
@@ -33,6 +33,7 @@
 
   public final class RippleThemeKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> LocalRippleTheme;
   }
 
 }
diff --git a/compose/material/material-ripple/api/public_plus_experimental_1.1.0-beta02.txt b/compose/material/material-ripple/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..32f4093
--- /dev/null
+++ b/compose/material/material-ripple/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,40 @@
+// Signature format: 4.0
+package androidx.compose.material.ripple {
+
+  @androidx.compose.runtime.Immutable public final class RippleAlpha {
+    ctor public RippleAlpha(float draggedAlpha, float focusedAlpha, float hoveredAlpha, float pressedAlpha);
+    method public float getDraggedAlpha();
+    method public float getFocusedAlpha();
+    method public float getHoveredAlpha();
+    method public float getPressedAlpha();
+    property public final float draggedAlpha;
+    property public final float focusedAlpha;
+    property public final float hoveredAlpha;
+    property public final float pressedAlpha;
+  }
+
+  public final class RippleAnimationKt {
+  }
+
+  public final class RippleKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.Indication rememberRipple(optional boolean bounded, optional float radius, optional long color);
+  }
+
+  public interface RippleTheme {
+    method @androidx.compose.runtime.Composable public long defaultColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ripple.RippleAlpha rippleAlpha();
+    field public static final androidx.compose.material.ripple.RippleTheme.Companion Companion;
+  }
+
+  public static final class RippleTheme.Companion {
+    method public androidx.compose.material.ripple.RippleAlpha defaultRippleAlpha(long contentColor, boolean lightTheme);
+    method public long defaultRippleColor(long contentColor, boolean lightTheme);
+  }
+
+  public final class RippleThemeKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> LocalRippleTheme;
+  }
+
+}
+
diff --git a/compose/material/material-ripple/api/public_plus_experimental_current.txt b/compose/material/material-ripple/api/public_plus_experimental_current.txt
index 7f874e1..32f4093 100644
--- a/compose/material/material-ripple/api/public_plus_experimental_current.txt
+++ b/compose/material/material-ripple/api/public_plus_experimental_current.txt
@@ -33,6 +33,7 @@
 
   public final class RippleThemeKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> LocalRippleTheme;
   }
 
 }
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/material/material-ripple/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to compose/material/material-ripple/api/res-1.1.0-beta02.txt
diff --git a/compose/material/material-ripple/api/restricted_1.1.0-beta02.txt b/compose/material/material-ripple/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..32f4093
--- /dev/null
+++ b/compose/material/material-ripple/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,40 @@
+// Signature format: 4.0
+package androidx.compose.material.ripple {
+
+  @androidx.compose.runtime.Immutable public final class RippleAlpha {
+    ctor public RippleAlpha(float draggedAlpha, float focusedAlpha, float hoveredAlpha, float pressedAlpha);
+    method public float getDraggedAlpha();
+    method public float getFocusedAlpha();
+    method public float getHoveredAlpha();
+    method public float getPressedAlpha();
+    property public final float draggedAlpha;
+    property public final float focusedAlpha;
+    property public final float hoveredAlpha;
+    property public final float pressedAlpha;
+  }
+
+  public final class RippleAnimationKt {
+  }
+
+  public final class RippleKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.foundation.Indication rememberRipple(optional boolean bounded, optional float radius, optional long color);
+  }
+
+  public interface RippleTheme {
+    method @androidx.compose.runtime.Composable public long defaultColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ripple.RippleAlpha rippleAlpha();
+    field public static final androidx.compose.material.ripple.RippleTheme.Companion Companion;
+  }
+
+  public static final class RippleTheme.Companion {
+    method public androidx.compose.material.ripple.RippleAlpha defaultRippleAlpha(long contentColor, boolean lightTheme);
+    method public long defaultRippleColor(long contentColor, boolean lightTheme);
+  }
+
+  public final class RippleThemeKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> LocalRippleTheme;
+  }
+
+}
+
diff --git a/compose/material/material-ripple/api/restricted_current.txt b/compose/material/material-ripple/api/restricted_current.txt
index 7f874e1..32f4093 100644
--- a/compose/material/material-ripple/api/restricted_current.txt
+++ b/compose/material/material-ripple/api/restricted_current.txt
@@ -33,6 +33,7 @@
 
   public final class RippleThemeKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> getLocalRippleTheme();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ripple.RippleTheme> LocalRippleTheme;
   }
 
 }
diff --git a/compose/material/material/api/1.1.0-beta02.txt b/compose/material/material/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..320de09
--- /dev/null
+++ b/compose/material/material/api/1.1.0-beta02.txt
@@ -0,0 +1,656 @@
+// Signature format: 4.0
+package androidx.compose.material {
+
+  public final class AlertDialogKt {
+  }
+
+  public final class AndroidAlertDialog_androidKt {
+    method @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> confirmButton, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? dismissButton, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.window.DialogProperties properties);
+    method @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> buttons, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.window.DialogProperties properties);
+  }
+
+  public final class AndroidMenu_androidKt {
+    method @androidx.compose.runtime.Composable public static void DropdownMenu(boolean expanded, kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.Modifier modifier, optional long offset, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void DropdownMenuItem(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  public final class AppBarDefaults {
+    method public float getBottomAppBarElevation();
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getTopAppBarElevation();
+    property public final float BottomAppBarElevation;
+    property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
+    property public final float TopAppBarElevation;
+    field public static final androidx.compose.material.AppBarDefaults INSTANCE;
+  }
+
+  public final class AppBarKt {
+    method @androidx.compose.runtime.Composable public static void BottomAppBar(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.graphics.Shape? cutoutShape, optional float elevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional long backgroundColor, optional long contentColor, optional float elevation);
+    method @androidx.compose.runtime.Composable public static void TopAppBar(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float elevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  public final class BackdropScaffoldDefaults {
+    method public float getFrontLayerElevation();
+    method @androidx.compose.runtime.Composable public long getFrontLayerScrimColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getFrontLayerShape();
+    method public float getHeaderHeight();
+    method public float getPeekHeight();
+    property public final float FrontLayerElevation;
+    property public final float HeaderHeight;
+    property public final float PeekHeight;
+    property @androidx.compose.runtime.Composable public final long frontLayerScrimColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape frontLayerShape;
+    field public static final androidx.compose.material.BackdropScaffoldDefaults INSTANCE;
+  }
+
+  public final class BackdropScaffoldKt {
+  }
+
+  public final class BadgeKt {
+    method @androidx.compose.runtime.Composable public static void Badge(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? content);
+    method @androidx.compose.runtime.Composable public static void BadgedBox(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> badge, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+  }
+
+  public final class BottomNavigationDefaults {
+    method public float getElevation();
+    property public final float Elevation;
+    field public static final androidx.compose.material.BottomNavigationDefaults INSTANCE;
+  }
+
+  public final class BottomNavigationKt {
+    method @androidx.compose.runtime.Composable public static void BottomNavigation(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float elevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void BottomNavigationItem(androidx.compose.foundation.layout.RowScope, boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+  }
+
+  public final class BottomSheetScaffoldDefaults {
+    method public float getSheetElevation();
+    method public float getSheetPeekHeight();
+    property public final float SheetElevation;
+    property public final float SheetPeekHeight;
+    field public static final androidx.compose.material.BottomSheetScaffoldDefaults INSTANCE;
+  }
+
+  public final class BottomSheetScaffoldKt {
+  }
+
+  @androidx.compose.runtime.Stable public interface ButtonColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> backgroundColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled);
+  }
+
+  public final class ButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors buttonColors(optional long backgroundColor, optional long contentColor, optional long disabledBackgroundColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation, optional float hoveredElevation, optional float focusedElevation);
+    method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation! elevation(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation);
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getIconSize();
+    method public float getIconSpacing();
+    method public float getMinHeight();
+    method public float getMinWidth();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke getOutlinedBorder();
+    method public float getOutlinedBorderSize();
+    method public androidx.compose.foundation.layout.PaddingValues getTextButtonContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors outlinedButtonColors(optional long backgroundColor, optional long contentColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors textButtonColors(optional long backgroundColor, optional long contentColor, optional long disabledContentColor);
+    property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
+    property public final float IconSize;
+    property public final float IconSpacing;
+    property public final float MinHeight;
+    property public final float MinWidth;
+    property public final float OutlinedBorderSize;
+    property public final androidx.compose.foundation.layout.PaddingValues TextButtonContentPadding;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.BorderStroke outlinedBorder;
+    field public static final androidx.compose.material.ButtonDefaults INSTANCE;
+    field public static final float OutlinedBorderOpacity = 0.12f;
+  }
+
+  @androidx.compose.runtime.Stable public interface ButtonElevation {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> elevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
+  public final class ButtonKt {
+    method @androidx.compose.runtime.Composable public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void OutlinedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void TextButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  public final class CardKt {
+    method @androidx.compose.runtime.Composable public static void Card(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.foundation.BorderStroke? border, optional float elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Stable public interface CheckboxColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> borderColor(boolean enabled, androidx.compose.ui.state.ToggleableState state);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> boxColor(boolean enabled, androidx.compose.ui.state.ToggleableState state);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> checkmarkColor(androidx.compose.ui.state.ToggleableState state);
+  }
+
+  public final class CheckboxDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.CheckboxColors colors(optional long checkedColor, optional long uncheckedColor, optional long checkmarkColor, optional long disabledColor, optional long disabledIndeterminateColor);
+    field public static final androidx.compose.material.CheckboxDefaults INSTANCE;
+  }
+
+  public final class CheckboxKt {
+    method @androidx.compose.runtime.Composable public static void Checkbox(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.CheckboxColors colors);
+    method @androidx.compose.runtime.Composable public static void TriStateCheckbox(androidx.compose.ui.state.ToggleableState state, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.CheckboxColors colors);
+  }
+
+  @androidx.compose.runtime.Stable public final class Colors {
+    ctor public Colors(long primary, long primaryVariant, long secondary, long secondaryVariant, long background, long surface, long error, long onPrimary, long onSecondary, long onBackground, long onSurface, long onError, boolean isLight);
+    method public androidx.compose.material.Colors copy(optional long primary, optional long primaryVariant, optional long secondary, optional long secondaryVariant, optional long background, optional long surface, optional long error, optional long onPrimary, optional long onSecondary, optional long onBackground, optional long onSurface, optional long onError, optional boolean isLight);
+    method public long getBackground();
+    method public long getError();
+    method public long getOnBackground();
+    method public long getOnError();
+    method public long getOnPrimary();
+    method public long getOnSecondary();
+    method public long getOnSurface();
+    method public long getPrimary();
+    method public long getPrimaryVariant();
+    method public long getSecondary();
+    method public long getSecondaryVariant();
+    method public long getSurface();
+    method public boolean isLight();
+    property public final long background;
+    property public final long error;
+    property public final boolean isLight;
+    property public final long onBackground;
+    property public final long onError;
+    property public final long onPrimary;
+    property public final long onSecondary;
+    property public final long onSurface;
+    property public final long primary;
+    property public final long primaryVariant;
+    property public final long secondary;
+    property public final long secondaryVariant;
+    property public final long surface;
+  }
+
+  public final class ColorsKt {
+    method public static long contentColorFor(androidx.compose.material.Colors, long backgroundColor);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static long contentColorFor(long backgroundColor);
+    method public static androidx.compose.material.Colors darkColors(optional long primary, optional long primaryVariant, optional long secondary, optional long secondaryVariant, optional long background, optional long surface, optional long error, optional long onPrimary, optional long onSecondary, optional long onBackground, optional long onSurface, optional long onError);
+    method public static long getPrimarySurface(androidx.compose.material.Colors);
+    method public static androidx.compose.material.Colors lightColors(optional long primary, optional long primaryVariant, optional long secondary, optional long secondaryVariant, optional long background, optional long surface, optional long error, optional long onPrimary, optional long onSecondary, optional long onBackground, optional long onSurface, optional long onError);
+  }
+
+  public final class ContentAlpha {
+    method @androidx.compose.runtime.Composable public float getDisabled();
+    method @androidx.compose.runtime.Composable public float getHigh();
+    method @androidx.compose.runtime.Composable public float getMedium();
+    property @androidx.compose.runtime.Composable public final float disabled;
+    property @androidx.compose.runtime.Composable public final float high;
+    property @androidx.compose.runtime.Composable public final float medium;
+    field public static final androidx.compose.material.ContentAlpha INSTANCE;
+  }
+
+  public final class ContentAlphaKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float> getLocalContentAlpha();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float> LocalContentAlpha;
+  }
+
+  public final class ContentColorKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> LocalContentColor;
+  }
+
+  public enum DismissDirection {
+    enum_constant public static final androidx.compose.material.DismissDirection EndToStart;
+    enum_constant public static final androidx.compose.material.DismissDirection StartToEnd;
+  }
+
+  public enum DismissValue {
+    enum_constant public static final androidx.compose.material.DismissValue Default;
+    enum_constant public static final androidx.compose.material.DismissValue DismissedToEnd;
+    enum_constant public static final androidx.compose.material.DismissValue DismissedToStart;
+  }
+
+  public final class DividerKt {
+    method @androidx.compose.runtime.Composable public static void Divider(optional androidx.compose.ui.Modifier modifier, optional long color, optional float thickness, optional float startIndent);
+  }
+
+  public final class DragGestureDetectorCopyKt {
+  }
+
+  public final class DrawerDefaults {
+    method public float getElevation();
+    method @androidx.compose.runtime.Composable public long getScrimColor();
+    property public final float Elevation;
+    property @androidx.compose.runtime.Composable public final long scrimColor;
+    field public static final androidx.compose.material.DrawerDefaults INSTANCE;
+    field public static final float ScrimOpacity = 0.32f;
+  }
+
+  public final class DrawerKt {
+    method @androidx.compose.runtime.Composable public static void ModalDrawer(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> drawerContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.DrawerState drawerState, optional boolean gesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long scrimColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static androidx.compose.material.DrawerState rememberDrawerState(androidx.compose.material.DrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.DrawerValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  @androidx.compose.runtime.Stable public final class DrawerState {
+    ctor public DrawerState(androidx.compose.material.DrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.DrawerValue,java.lang.Boolean> confirmStateChange);
+    method public suspend Object? close(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public androidx.compose.material.DrawerValue getCurrentValue();
+    method public boolean isAnimationRunning();
+    method public boolean isClosed();
+    method public boolean isOpen();
+    method public suspend Object? open(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    property public final androidx.compose.material.DrawerValue currentValue;
+    property public final boolean isAnimationRunning;
+    property public final boolean isClosed;
+    property public final boolean isOpen;
+    field public static final androidx.compose.material.DrawerState.Companion Companion;
+  }
+
+  public static final class DrawerState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.material.DrawerState,androidx.compose.material.DrawerValue> Saver(kotlin.jvm.functions.Function1<? super androidx.compose.material.DrawerValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  public enum DrawerValue {
+    enum_constant public static final androidx.compose.material.DrawerValue Closed;
+    enum_constant public static final androidx.compose.material.DrawerValue Open;
+  }
+
+  public final class ElevationKt {
+  }
+
+  public interface ElevationOverlay {
+    method @androidx.compose.runtime.Composable public long apply(long color, float elevation);
+  }
+
+  public final class ElevationOverlayKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteElevation();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> getLocalElevationOverlay();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> LocalAbsoluteElevation;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> LocalElevationOverlay;
+  }
+
+  public final class ExposedDropdownMenuKt {
+  }
+
+  public final inline class FabPosition {
+    ctor public FabPosition();
+  }
+
+  public static final class FabPosition.Companion {
+    method public int getCenter();
+    method public int getEnd();
+    property public final int Center;
+    property public final int End;
+  }
+
+  public final class FloatingActionButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.FloatingActionButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float hoveredElevation, optional float focusedElevation);
+    method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material.FloatingActionButtonElevation! elevation(optional float defaultElevation, optional float pressedElevation);
+    field public static final androidx.compose.material.FloatingActionButtonDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public interface FloatingActionButtonElevation {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> elevation(androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
+  public final class FloatingActionButtonKt {
+    method @androidx.compose.runtime.Composable public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.material.FloatingActionButtonElevation elevation);
+    method @androidx.compose.runtime.Composable public static void FloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.material.FloatingActionButtonElevation elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class IconButtonKt {
+    method @androidx.compose.runtime.Composable public static void IconButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void IconToggleButton(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class IconKt {
+    method @androidx.compose.runtime.Composable public static void Icon(androidx.compose.ui.graphics.vector.ImageVector imageVector, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+    method @androidx.compose.runtime.Composable public static void Icon(androidx.compose.ui.graphics.ImageBitmap bitmap, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+    method @androidx.compose.runtime.Composable public static void Icon(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+  }
+
+  public final class ListItemKt {
+  }
+
+  public final class MaterialTextSelectionColorsKt {
+  }
+
+  public final class MaterialTheme {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material.Colors getColors();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material.Shapes getShapes();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material.Typography getTypography();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material.Colors colors;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material.Shapes shapes;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material.Typography typography;
+    field public static final androidx.compose.material.MaterialTheme INSTANCE;
+  }
+
+  public final class MaterialThemeKt {
+    method @androidx.compose.runtime.Composable public static void MaterialTheme(optional androidx.compose.material.Colors colors, optional androidx.compose.material.Typography typography, optional androidx.compose.material.Shapes shapes, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class MaterialTheme_androidKt {
+  }
+
+  public final class MenuDefaults {
+    method public androidx.compose.foundation.layout.PaddingValues getDropdownMenuItemContentPadding();
+    property public final androidx.compose.foundation.layout.PaddingValues DropdownMenuItemContentPadding;
+    field public static final androidx.compose.material.MenuDefaults INSTANCE;
+  }
+
+  public final class MenuKt {
+  }
+
+  public final class ModalBottomSheetDefaults {
+    method public float getElevation();
+    method @androidx.compose.runtime.Composable public long getScrimColor();
+    property public final float Elevation;
+    property @androidx.compose.runtime.Composable public final long scrimColor;
+    field public static final androidx.compose.material.ModalBottomSheetDefaults INSTANCE;
+  }
+
+  public final class ModalBottomSheetKt {
+  }
+
+  public final class NavigationRailDefaults {
+    method public float getElevation();
+    property public final float Elevation;
+    field public static final androidx.compose.material.NavigationRailDefaults INSTANCE;
+  }
+
+  public final class NavigationRailKt {
+    method @androidx.compose.runtime.Composable public static void NavigationRail(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float elevation, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? header, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void NavigationRailItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+  }
+
+  public final class OutlinedTextFieldKt {
+    method @androidx.compose.runtime.Composable public static void OutlinedTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+    method @androidx.compose.runtime.Composable public static void OutlinedTextField(androidx.compose.ui.text.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.TextFieldValue,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+  }
+
+  public final class ProgressIndicatorDefaults {
+    method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getProgressAnimationSpec();
+    method public float getStrokeWidth();
+    property public final androidx.compose.animation.core.SpringSpec<java.lang.Float> ProgressAnimationSpec;
+    property public final float StrokeWidth;
+    field public static final androidx.compose.material.ProgressIndicatorDefaults INSTANCE;
+    field public static final float IndicatorBackgroundOpacity = 0.24f;
+  }
+
+  public final class ProgressIndicatorKt {
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor);
+  }
+
+  @androidx.compose.runtime.Stable public interface RadioButtonColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> radioColor(boolean enabled, boolean selected);
+  }
+
+  public final class RadioButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.RadioButtonColors colors(optional long selectedColor, optional long unselectedColor, optional long disabledColor);
+    field public static final androidx.compose.material.RadioButtonDefaults INSTANCE;
+  }
+
+  public final class RadioButtonKt {
+    method @androidx.compose.runtime.Composable public static void RadioButton(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.RadioButtonColors colors);
+  }
+
+  @androidx.compose.runtime.Immutable public final class ResistanceConfig {
+    ctor public ResistanceConfig(float basis, optional float factorAtMin, optional float factorAtMax);
+    method public float computeResistance(float overflow);
+    method public float getBasis();
+    method public float getFactorAtMax();
+    method public float getFactorAtMin();
+    property public final float basis;
+    property public final float factorAtMax;
+    property public final float factorAtMin;
+  }
+
+  public final class ScaffoldKt {
+    method @androidx.compose.runtime.Composable public static void Scaffold(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.ScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional boolean isFloatingActionButtonDocked, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static androidx.compose.material.ScaffoldState rememberScaffoldState(optional androidx.compose.material.DrawerState drawerState, optional androidx.compose.material.SnackbarHostState snackbarHostState);
+  }
+
+  @androidx.compose.runtime.Stable public final class ScaffoldState {
+    ctor public ScaffoldState(androidx.compose.material.DrawerState drawerState, androidx.compose.material.SnackbarHostState snackbarHostState);
+    method public androidx.compose.material.DrawerState getDrawerState();
+    method public androidx.compose.material.SnackbarHostState getSnackbarHostState();
+    property public final androidx.compose.material.DrawerState drawerState;
+    property public final androidx.compose.material.SnackbarHostState snackbarHostState;
+  }
+
+  @androidx.compose.runtime.Immutable public final class Shapes {
+    ctor public Shapes(optional androidx.compose.foundation.shape.CornerBasedShape small, optional androidx.compose.foundation.shape.CornerBasedShape medium, optional androidx.compose.foundation.shape.CornerBasedShape large);
+    method public androidx.compose.material.Shapes copy(optional androidx.compose.foundation.shape.CornerBasedShape small, optional androidx.compose.foundation.shape.CornerBasedShape medium, optional androidx.compose.foundation.shape.CornerBasedShape large);
+    method public androidx.compose.foundation.shape.CornerBasedShape getLarge();
+    method public androidx.compose.foundation.shape.CornerBasedShape getMedium();
+    method public androidx.compose.foundation.shape.CornerBasedShape getSmall();
+    property public final androidx.compose.foundation.shape.CornerBasedShape large;
+    property public final androidx.compose.foundation.shape.CornerBasedShape medium;
+    property public final androidx.compose.foundation.shape.CornerBasedShape small;
+  }
+
+  public final class ShapesKt {
+  }
+
+  @androidx.compose.runtime.Stable public interface SliderColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> thumbColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> tickColor(boolean enabled, boolean active);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trackColor(boolean enabled, boolean active);
+  }
+
+  public final class SliderDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.SliderColors colors(optional long thumbColor, optional long disabledThumbColor, optional long activeTrackColor, optional long inactiveTrackColor, optional long disabledActiveTrackColor, optional long disabledInactiveTrackColor, optional long activeTickColor, optional long inactiveTickColor, optional long disabledActiveTickColor, optional long disabledInactiveTickColor);
+    field public static final float DisabledActiveTrackAlpha = 0.32f;
+    field public static final float DisabledInactiveTrackAlpha = 0.12f;
+    field public static final float DisabledTickAlpha = 0.12f;
+    field public static final androidx.compose.material.SliderDefaults INSTANCE;
+    field public static final float InactiveTrackAlpha = 0.24f;
+    field public static final float TickAlpha = 0.54f;
+  }
+
+  public final class SliderKt {
+    method @androidx.compose.runtime.Composable public static void Slider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional int steps, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onValueChangeFinished, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.SliderColors colors);
+  }
+
+  public interface SnackbarData {
+    method public void dismiss();
+    method public String? getActionLabel();
+    method public androidx.compose.material.SnackbarDuration getDuration();
+    method public String getMessage();
+    method public void performAction();
+    property public abstract String? actionLabel;
+    property public abstract androidx.compose.material.SnackbarDuration duration;
+    property public abstract String message;
+  }
+
+  public final class SnackbarDefaults {
+    method @androidx.compose.runtime.Composable public long getBackgroundColor();
+    method @androidx.compose.runtime.Composable public long getPrimaryActionColor();
+    property @androidx.compose.runtime.Composable public final long backgroundColor;
+    property @androidx.compose.runtime.Composable public final long primaryActionColor;
+    field public static final androidx.compose.material.SnackbarDefaults INSTANCE;
+  }
+
+  public enum SnackbarDuration {
+    enum_constant public static final androidx.compose.material.SnackbarDuration Indefinite;
+    enum_constant public static final androidx.compose.material.SnackbarDuration Long;
+    enum_constant public static final androidx.compose.material.SnackbarDuration Short;
+  }
+
+  public final class SnackbarHostKt {
+    method @androidx.compose.runtime.Composable public static void SnackbarHost(androidx.compose.material.SnackbarHostState hostState, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarData,kotlin.Unit> snackbar);
+  }
+
+  @androidx.compose.runtime.Stable public final class SnackbarHostState {
+    ctor public SnackbarHostState();
+    method public androidx.compose.material.SnackbarData? getCurrentSnackbarData();
+    method public suspend Object? showSnackbar(String message, optional String? actionLabel, optional androidx.compose.material.SnackbarDuration duration, optional kotlin.coroutines.Continuation<? super androidx.compose.material.SnackbarResult> p);
+    property public final androidx.compose.material.SnackbarData? currentSnackbarData;
+  }
+
+  public final class SnackbarKt {
+    method @androidx.compose.runtime.Composable public static void Snackbar(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? action, optional boolean actionOnNewLine, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional float elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Snackbar(androidx.compose.material.SnackbarData snackbarData, optional androidx.compose.ui.Modifier modifier, optional boolean actionOnNewLine, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional long actionColor, optional float elevation);
+  }
+
+  public enum SnackbarResult {
+    enum_constant public static final androidx.compose.material.SnackbarResult ActionPerformed;
+    enum_constant public static final androidx.compose.material.SnackbarResult Dismissed;
+  }
+
+  public final class Strings_androidKt {
+  }
+
+  public final class SurfaceKt {
+    method @androidx.compose.runtime.Composable public static void Surface(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional androidx.compose.foundation.BorderStroke? border, optional float elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class SwipeToDismissKt {
+  }
+
+  public final class SwipeableDefaults {
+    method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getAnimationSpec();
+    method public float getVelocityThreshold();
+    method public androidx.compose.material.ResistanceConfig? resistanceConfig(java.util.Set<java.lang.Float> anchors, optional float factorAtMin, optional float factorAtMax);
+    property public final androidx.compose.animation.core.SpringSpec<java.lang.Float> AnimationSpec;
+    property public final float VelocityThreshold;
+    field public static final androidx.compose.material.SwipeableDefaults INSTANCE;
+    field public static final float StandardResistanceFactor = 10.0f;
+    field public static final float StiffResistanceFactor = 20.0f;
+  }
+
+  public final class SwipeableKt {
+  }
+
+  @androidx.compose.runtime.Stable public interface SwitchColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> thumbColor(boolean enabled, boolean checked);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trackColor(boolean enabled, boolean checked);
+  }
+
+  public final class SwitchDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.SwitchColors colors(optional long checkedThumbColor, optional long checkedTrackColor, optional float checkedTrackAlpha, optional long uncheckedThumbColor, optional long uncheckedTrackColor, optional float uncheckedTrackAlpha, optional long disabledCheckedThumbColor, optional long disabledCheckedTrackColor, optional long disabledUncheckedThumbColor, optional long disabledUncheckedTrackColor);
+    field public static final androidx.compose.material.SwitchDefaults INSTANCE;
+  }
+
+  public final class SwitchKt {
+    method @androidx.compose.runtime.Composable public static void Switch(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.SwitchColors colors);
+  }
+
+  public final class TabKt {
+    method @androidx.compose.runtime.Composable public static void LeadingIconTab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TabPosition {
+    method public float getLeft();
+    method public float getRight();
+    method public float getWidth();
+    property public final float left;
+    property public final float right;
+    property public final float width;
+  }
+
+  public final class TabRowDefaults {
+    method @androidx.compose.runtime.Composable public void Divider(optional androidx.compose.ui.Modifier modifier, optional float thickness, optional long color);
+    method @androidx.compose.runtime.Composable public void Indicator(optional androidx.compose.ui.Modifier modifier, optional float height, optional long color);
+    method public float getDividerThickness();
+    method public float getIndicatorHeight();
+    method public float getScrollableTabRowPadding();
+    method public androidx.compose.ui.Modifier tabIndicatorOffset(androidx.compose.ui.Modifier, androidx.compose.material.TabPosition currentTabPosition);
+    property public final float DividerThickness;
+    property public final float IndicatorHeight;
+    property public final float ScrollableTabRowPadding;
+    field public static final float DividerOpacity = 0.12f;
+    field public static final androidx.compose.material.TabRowDefaults INSTANCE;
+  }
+
+  public final class TabRowKt {
+    method @androidx.compose.runtime.Composable public static void ScrollableTabRow(int selectedTabIndex, optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float edgePadding, optional kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.material.TabPosition>,kotlin.Unit> indicator, optional kotlin.jvm.functions.Function0<kotlin.Unit> divider, kotlin.jvm.functions.Function0<kotlin.Unit> tabs);
+    method @androidx.compose.runtime.Composable public static void TabRow(int selectedTabIndex, optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.material.TabPosition>,kotlin.Unit> indicator, optional kotlin.jvm.functions.Function0<kotlin.Unit> divider, kotlin.jvm.functions.Function0<kotlin.Unit> tabs);
+  }
+
+  @androidx.compose.runtime.Stable public interface TextFieldColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> backgroundColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> cursorColor(boolean isError);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> indicatorColor(boolean enabled, boolean isError, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> labelColor(boolean enabled, boolean error, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> leadingIconColor(boolean enabled, boolean isError);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> placeholderColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> textColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trailingIconColor(boolean enabled, boolean isError);
+  }
+
+  public final class TextFieldDefaults {
+    method public float getMinHeight();
+    method public float getMinWidth();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.TextFieldColors outlinedTextFieldColors(optional long textColor, optional long disabledTextColor, optional long backgroundColor, optional long cursorColor, optional long errorCursorColor, optional long focusedBorderColor, optional long unfocusedBorderColor, optional long disabledBorderColor, optional long errorBorderColor, optional long leadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long trailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.TextFieldColors textFieldColors(optional long textColor, optional long disabledTextColor, optional long backgroundColor, optional long cursorColor, optional long errorCursorColor, optional long focusedIndicatorColor, optional long unfocusedIndicatorColor, optional long disabledIndicatorColor, optional long errorIndicatorColor, optional long leadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long trailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor);
+    property public final float MinHeight;
+    property public final float MinWidth;
+    field public static final float BackgroundOpacity = 0.12f;
+    field public static final androidx.compose.material.TextFieldDefaults INSTANCE;
+    field public static final float IconOpacity = 0.54f;
+    field public static final float UnfocusedIndicatorLineOpacity = 0.42f;
+  }
+
+  public final class TextFieldImplKt {
+  }
+
+  public final class TextFieldKt {
+    method @androidx.compose.runtime.Composable public static void TextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+    method @androidx.compose.runtime.Composable public static void TextField(androidx.compose.ui.text.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.TextFieldValue,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+  }
+
+  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();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> LocalTextStyle;
+  }
+
+  public final class TouchTargetKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class Typography {
+    ctor public Typography(optional androidx.compose.ui.text.font.FontFamily defaultFontFamily, optional androidx.compose.ui.text.TextStyle h1, optional androidx.compose.ui.text.TextStyle h2, optional androidx.compose.ui.text.TextStyle h3, optional androidx.compose.ui.text.TextStyle h4, optional androidx.compose.ui.text.TextStyle h5, optional androidx.compose.ui.text.TextStyle h6, optional androidx.compose.ui.text.TextStyle subtitle1, optional androidx.compose.ui.text.TextStyle subtitle2, optional androidx.compose.ui.text.TextStyle body1, optional androidx.compose.ui.text.TextStyle body2, optional androidx.compose.ui.text.TextStyle button, optional androidx.compose.ui.text.TextStyle caption, optional androidx.compose.ui.text.TextStyle overline);
+    method public androidx.compose.material.Typography copy(optional androidx.compose.ui.text.TextStyle h1, optional androidx.compose.ui.text.TextStyle h2, optional androidx.compose.ui.text.TextStyle h3, optional androidx.compose.ui.text.TextStyle h4, optional androidx.compose.ui.text.TextStyle h5, optional androidx.compose.ui.text.TextStyle h6, optional androidx.compose.ui.text.TextStyle subtitle1, optional androidx.compose.ui.text.TextStyle subtitle2, optional androidx.compose.ui.text.TextStyle body1, optional androidx.compose.ui.text.TextStyle body2, optional androidx.compose.ui.text.TextStyle button, optional androidx.compose.ui.text.TextStyle caption, optional androidx.compose.ui.text.TextStyle overline);
+    method public androidx.compose.ui.text.TextStyle getBody1();
+    method public androidx.compose.ui.text.TextStyle getBody2();
+    method public androidx.compose.ui.text.TextStyle getButton();
+    method public androidx.compose.ui.text.TextStyle getCaption();
+    method public androidx.compose.ui.text.TextStyle getH1();
+    method public androidx.compose.ui.text.TextStyle getH2();
+    method public androidx.compose.ui.text.TextStyle getH3();
+    method public androidx.compose.ui.text.TextStyle getH4();
+    method public androidx.compose.ui.text.TextStyle getH5();
+    method public androidx.compose.ui.text.TextStyle getH6();
+    method public androidx.compose.ui.text.TextStyle getOverline();
+    method public androidx.compose.ui.text.TextStyle getSubtitle1();
+    method public androidx.compose.ui.text.TextStyle getSubtitle2();
+    property public final androidx.compose.ui.text.TextStyle body1;
+    property public final androidx.compose.ui.text.TextStyle body2;
+    property public final androidx.compose.ui.text.TextStyle button;
+    property public final androidx.compose.ui.text.TextStyle caption;
+    property public final androidx.compose.ui.text.TextStyle h1;
+    property public final androidx.compose.ui.text.TextStyle h2;
+    property public final androidx.compose.ui.text.TextStyle h3;
+    property public final androidx.compose.ui.text.TextStyle h4;
+    property public final androidx.compose.ui.text.TextStyle h5;
+    property public final androidx.compose.ui.text.TextStyle h6;
+    property public final androidx.compose.ui.text.TextStyle overline;
+    property public final androidx.compose.ui.text.TextStyle subtitle1;
+    property public final androidx.compose.ui.text.TextStyle subtitle2;
+  }
+
+  public final class TypographyKt {
+  }
+
+}
+
+package androidx.compose.material.internal {
+
+  public final class ExposedDropdownMenuPopupKt {
+  }
+
+}
+
diff --git a/compose/material/material/api/current.ignore b/compose/material/material/api/current.ignore
index 557e57e..4aae248 100644
--- a/compose/material/material/api/current.ignore
+++ b/compose/material/material/api/current.ignore
@@ -1,5 +1,5 @@
 // Baseline format: 1.0
-RemovedMethod: androidx.compose.material.ButtonDefaults#elevation(float, float, float):
-    Removed method androidx.compose.material.ButtonDefaults.elevation(float,float,float)
-RemovedMethod: androidx.compose.material.FloatingActionButtonDefaults#elevation(float, float):
-    Removed method androidx.compose.material.FloatingActionButtonDefaults.elevation(float,float)
+InvalidNullConversion: androidx.compose.material.ButtonDefaults#elevation(float, float, float):
+    Attempted to remove @NonNull annotation from method androidx.compose.material.ButtonDefaults.elevation(float,float,float)
+InvalidNullConversion: androidx.compose.material.FloatingActionButtonDefaults#elevation(float, float):
+    Attempted to remove @NonNull annotation from method androidx.compose.material.FloatingActionButtonDefaults.elevation(float,float)
diff --git a/compose/material/material/api/current.txt b/compose/material/material/api/current.txt
index 0ca2bd3..320de09 100644
--- a/compose/material/material/api/current.txt
+++ b/compose/material/material/api/current.txt
@@ -82,6 +82,7 @@
   public final class ButtonDefaults {
     method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors buttonColors(optional long backgroundColor, optional long contentColor, optional long disabledBackgroundColor, optional long disabledContentColor);
     method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation, optional float hoveredElevation, optional float focusedElevation);
+    method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation! elevation(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation);
     method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
     method public float getIconSize();
     method public float getIconSpacing();
@@ -185,10 +186,12 @@
 
   public final class ContentAlphaKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float> getLocalContentAlpha();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float> LocalContentAlpha;
   }
 
   public final class ContentColorKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> LocalContentColor;
   }
 
   public enum DismissDirection {
@@ -257,6 +260,8 @@
   public final class ElevationOverlayKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteElevation();
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> getLocalElevationOverlay();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> LocalAbsoluteElevation;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> LocalElevationOverlay;
   }
 
   public final class ExposedDropdownMenuKt {
@@ -275,6 +280,7 @@
 
   public final class FloatingActionButtonDefaults {
     method @androidx.compose.runtime.Composable public androidx.compose.material.FloatingActionButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float hoveredElevation, optional float focusedElevation);
+    method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material.FloatingActionButtonElevation! elevation(optional float defaultElevation, optional float pressedElevation);
     field public static final androidx.compose.material.FloatingActionButtonDefaults INSTANCE;
   }
 
@@ -599,6 +605,7 @@
     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();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> LocalTextStyle;
   }
 
   public final class TouchTargetKt {
diff --git a/compose/material/material/api/public_plus_experimental_1.1.0-beta02.txt b/compose/material/material/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..fb9cc2d
--- /dev/null
+++ b/compose/material/material/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,864 @@
+// Signature format: 4.0
+package androidx.compose.material {
+
+  public final class AlertDialogKt {
+  }
+
+  public final class AndroidAlertDialog_androidKt {
+    method @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> confirmButton, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? dismissButton, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.window.DialogProperties properties);
+    method @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> buttons, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.window.DialogProperties properties);
+  }
+
+  public final class AndroidMenu_androidKt {
+    method @androidx.compose.runtime.Composable public static void DropdownMenu(boolean expanded, kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.Modifier modifier, optional long offset, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void DropdownMenuItem(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  public final class AppBarDefaults {
+    method public float getBottomAppBarElevation();
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getTopAppBarElevation();
+    property public final float BottomAppBarElevation;
+    property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
+    property public final float TopAppBarElevation;
+    field public static final androidx.compose.material.AppBarDefaults INSTANCE;
+  }
+
+  public final class AppBarKt {
+    method @androidx.compose.runtime.Composable public static void BottomAppBar(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.graphics.Shape? cutoutShape, optional float elevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional long backgroundColor, optional long contentColor, optional float elevation);
+    method @androidx.compose.runtime.Composable public static void TopAppBar(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float elevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  public final class BackdropScaffoldDefaults {
+    method public float getFrontLayerElevation();
+    method @androidx.compose.runtime.Composable public long getFrontLayerScrimColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getFrontLayerShape();
+    method public float getHeaderHeight();
+    method public float getPeekHeight();
+    property public final float FrontLayerElevation;
+    property public final float HeaderHeight;
+    property public final float PeekHeight;
+    property @androidx.compose.runtime.Composable public final long frontLayerScrimColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape frontLayerShape;
+    field public static final androidx.compose.material.BackdropScaffoldDefaults INSTANCE;
+  }
+
+  public final class BackdropScaffoldKt {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void BackdropScaffold(kotlin.jvm.functions.Function0<kotlin.Unit> appBar, kotlin.jvm.functions.Function0<kotlin.Unit> backLayerContent, kotlin.jvm.functions.Function0<kotlin.Unit> frontLayerContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.BackdropScaffoldState scaffoldState, optional boolean gesturesEnabled, optional float peekHeight, optional float headerHeight, optional boolean persistentAppBar, optional boolean stickyFrontLayer, optional long backLayerBackgroundColor, optional long backLayerContentColor, optional androidx.compose.ui.graphics.Shape frontLayerShape, optional float frontLayerElevation, optional long frontLayerBackgroundColor, optional long frontLayerContentColor, optional long frontLayerScrimColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost);
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static androidx.compose.material.BackdropScaffoldState rememberBackdropScaffoldState(androidx.compose.material.BackdropValue initialValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.BackdropValue,java.lang.Boolean> confirmStateChange, optional androidx.compose.material.SnackbarHostState snackbarHostState);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Stable public final class BackdropScaffoldState extends androidx.compose.material.SwipeableState<androidx.compose.material.BackdropValue> {
+    ctor public BackdropScaffoldState(androidx.compose.material.BackdropValue initialValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.BackdropValue,java.lang.Boolean> confirmStateChange, optional androidx.compose.material.SnackbarHostState snackbarHostState);
+    method public suspend Object? conceal(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public androidx.compose.material.SnackbarHostState getSnackbarHostState();
+    method public boolean isConcealed();
+    method public boolean isRevealed();
+    method public suspend Object? reveal(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    property public final boolean isConcealed;
+    property public final boolean isRevealed;
+    property public final androidx.compose.material.SnackbarHostState snackbarHostState;
+    field public static final androidx.compose.material.BackdropScaffoldState.Companion Companion;
+  }
+
+  public static final class BackdropScaffoldState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.material.BackdropScaffoldState,?> Saver(androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, kotlin.jvm.functions.Function1<? super androidx.compose.material.BackdropValue,java.lang.Boolean> confirmStateChange, androidx.compose.material.SnackbarHostState snackbarHostState);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi public enum BackdropValue {
+    enum_constant public static final androidx.compose.material.BackdropValue Concealed;
+    enum_constant public static final androidx.compose.material.BackdropValue Revealed;
+  }
+
+  public final class BadgeKt {
+    method @androidx.compose.runtime.Composable public static void Badge(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? content);
+    method @androidx.compose.runtime.Composable public static void BadgedBox(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> badge, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi public final class BottomDrawerState extends androidx.compose.material.SwipeableState<androidx.compose.material.BottomDrawerValue> {
+    ctor public BottomDrawerState(androidx.compose.material.BottomDrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.BottomDrawerValue,java.lang.Boolean> confirmStateChange);
+    method public suspend Object? close(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public suspend Object? expand(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public boolean isClosed();
+    method public boolean isExpanded();
+    method public boolean isOpen();
+    method public suspend Object? open(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    property public final boolean isClosed;
+    property public final boolean isExpanded;
+    property public final boolean isOpen;
+    field public static final androidx.compose.material.BottomDrawerState.Companion Companion;
+  }
+
+  public static final class BottomDrawerState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.material.BottomDrawerState,androidx.compose.material.BottomDrawerValue> Saver(kotlin.jvm.functions.Function1<? super androidx.compose.material.BottomDrawerValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi public enum BottomDrawerValue {
+    enum_constant public static final androidx.compose.material.BottomDrawerValue Closed;
+    enum_constant public static final androidx.compose.material.BottomDrawerValue Expanded;
+    enum_constant public static final androidx.compose.material.BottomDrawerValue Open;
+  }
+
+  public final class BottomNavigationDefaults {
+    method public float getElevation();
+    property public final float Elevation;
+    field public static final androidx.compose.material.BottomNavigationDefaults INSTANCE;
+  }
+
+  public final class BottomNavigationKt {
+    method @androidx.compose.runtime.Composable public static void BottomNavigation(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float elevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void BottomNavigationItem(androidx.compose.foundation.layout.RowScope, boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+  }
+
+  public final class BottomSheetScaffoldDefaults {
+    method public float getSheetElevation();
+    method public float getSheetPeekHeight();
+    property public final float SheetElevation;
+    property public final float SheetPeekHeight;
+    field public static final androidx.compose.material.BottomSheetScaffoldDefaults INSTANCE;
+  }
+
+  public final class BottomSheetScaffoldKt {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void BottomSheetScaffold(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> sheetContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.BottomSheetScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit>? topBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit>? floatingActionButton, optional int floatingActionButtonPosition, optional boolean sheetGesturesEnabled, optional androidx.compose.ui.graphics.Shape sheetShape, optional float sheetElevation, optional long sheetBackgroundColor, optional long sheetContentColor, optional float sheetPeekHeight, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static androidx.compose.material.BottomSheetScaffoldState rememberBottomSheetScaffoldState(optional androidx.compose.material.DrawerState drawerState, optional androidx.compose.material.BottomSheetState bottomSheetState, optional androidx.compose.material.SnackbarHostState snackbarHostState);
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static androidx.compose.material.BottomSheetState rememberBottomSheetState(androidx.compose.material.BottomSheetValue initialValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.BottomSheetValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Stable public final class BottomSheetScaffoldState {
+    ctor public BottomSheetScaffoldState(androidx.compose.material.DrawerState drawerState, androidx.compose.material.BottomSheetState bottomSheetState, androidx.compose.material.SnackbarHostState snackbarHostState);
+    method public androidx.compose.material.BottomSheetState getBottomSheetState();
+    method public androidx.compose.material.DrawerState getDrawerState();
+    method public androidx.compose.material.SnackbarHostState getSnackbarHostState();
+    property public final androidx.compose.material.BottomSheetState bottomSheetState;
+    property public final androidx.compose.material.DrawerState drawerState;
+    property public final androidx.compose.material.SnackbarHostState snackbarHostState;
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Stable public final class BottomSheetState extends androidx.compose.material.SwipeableState<androidx.compose.material.BottomSheetValue> {
+    ctor public BottomSheetState(androidx.compose.material.BottomSheetValue initialValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.BottomSheetValue,java.lang.Boolean> confirmStateChange);
+    method public suspend Object? collapse(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public suspend Object? expand(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public boolean isCollapsed();
+    method public boolean isExpanded();
+    property public final boolean isCollapsed;
+    property public final boolean isExpanded;
+    field public static final androidx.compose.material.BottomSheetState.Companion Companion;
+  }
+
+  public static final class BottomSheetState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.material.BottomSheetState,?> Saver(androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, kotlin.jvm.functions.Function1<? super androidx.compose.material.BottomSheetValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi public enum BottomSheetValue {
+    enum_constant public static final androidx.compose.material.BottomSheetValue Collapsed;
+    enum_constant public static final androidx.compose.material.BottomSheetValue Expanded;
+  }
+
+  @androidx.compose.runtime.Stable public interface ButtonColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> backgroundColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled);
+  }
+
+  public final class ButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors buttonColors(optional long backgroundColor, optional long contentColor, optional long disabledBackgroundColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation, optional float hoveredElevation, optional float focusedElevation);
+    method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation! elevation(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation);
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getIconSize();
+    method public float getIconSpacing();
+    method public float getMinHeight();
+    method public float getMinWidth();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke getOutlinedBorder();
+    method public float getOutlinedBorderSize();
+    method public androidx.compose.foundation.layout.PaddingValues getTextButtonContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors outlinedButtonColors(optional long backgroundColor, optional long contentColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors textButtonColors(optional long backgroundColor, optional long contentColor, optional long disabledContentColor);
+    property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
+    property public final float IconSize;
+    property public final float IconSpacing;
+    property public final float MinHeight;
+    property public final float MinWidth;
+    property public final float OutlinedBorderSize;
+    property public final androidx.compose.foundation.layout.PaddingValues TextButtonContentPadding;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.BorderStroke outlinedBorder;
+    field public static final androidx.compose.material.ButtonDefaults INSTANCE;
+    field public static final float OutlinedBorderOpacity = 0.12f;
+  }
+
+  @androidx.compose.runtime.Stable public interface ButtonElevation {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> elevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
+  public final class ButtonKt {
+    method @androidx.compose.runtime.Composable public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void OutlinedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void TextButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  public final class CardKt {
+    method @androidx.compose.runtime.Composable public static void Card(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.foundation.BorderStroke? border, optional float elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void Card(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.foundation.BorderStroke? border, optional float elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Stable public interface CheckboxColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> borderColor(boolean enabled, androidx.compose.ui.state.ToggleableState state);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> boxColor(boolean enabled, androidx.compose.ui.state.ToggleableState state);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> checkmarkColor(androidx.compose.ui.state.ToggleableState state);
+  }
+
+  public final class CheckboxDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.CheckboxColors colors(optional long checkedColor, optional long uncheckedColor, optional long checkmarkColor, optional long disabledColor, optional long disabledIndeterminateColor);
+    field public static final androidx.compose.material.CheckboxDefaults INSTANCE;
+  }
+
+  public final class CheckboxKt {
+    method @androidx.compose.runtime.Composable public static void Checkbox(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.CheckboxColors colors);
+    method @androidx.compose.runtime.Composable public static void TriStateCheckbox(androidx.compose.ui.state.ToggleableState state, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.CheckboxColors colors);
+  }
+
+  @androidx.compose.runtime.Stable public final class Colors {
+    ctor public Colors(long primary, long primaryVariant, long secondary, long secondaryVariant, long background, long surface, long error, long onPrimary, long onSecondary, long onBackground, long onSurface, long onError, boolean isLight);
+    method public androidx.compose.material.Colors copy(optional long primary, optional long primaryVariant, optional long secondary, optional long secondaryVariant, optional long background, optional long surface, optional long error, optional long onPrimary, optional long onSecondary, optional long onBackground, optional long onSurface, optional long onError, optional boolean isLight);
+    method public long getBackground();
+    method public long getError();
+    method public long getOnBackground();
+    method public long getOnError();
+    method public long getOnPrimary();
+    method public long getOnSecondary();
+    method public long getOnSurface();
+    method public long getPrimary();
+    method public long getPrimaryVariant();
+    method public long getSecondary();
+    method public long getSecondaryVariant();
+    method public long getSurface();
+    method public boolean isLight();
+    property public final long background;
+    property public final long error;
+    property public final boolean isLight;
+    property public final long onBackground;
+    property public final long onError;
+    property public final long onPrimary;
+    property public final long onSecondary;
+    property public final long onSurface;
+    property public final long primary;
+    property public final long primaryVariant;
+    property public final long secondary;
+    property public final long secondaryVariant;
+    property public final long surface;
+  }
+
+  public final class ColorsKt {
+    method public static long contentColorFor(androidx.compose.material.Colors, long backgroundColor);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static long contentColorFor(long backgroundColor);
+    method public static androidx.compose.material.Colors darkColors(optional long primary, optional long primaryVariant, optional long secondary, optional long secondaryVariant, optional long background, optional long surface, optional long error, optional long onPrimary, optional long onSecondary, optional long onBackground, optional long onSurface, optional long onError);
+    method public static long getPrimarySurface(androidx.compose.material.Colors);
+    method public static androidx.compose.material.Colors lightColors(optional long primary, optional long primaryVariant, optional long secondary, optional long secondaryVariant, optional long background, optional long surface, optional long error, optional long onPrimary, optional long onSecondary, optional long onBackground, optional long onSurface, optional long onError);
+  }
+
+  public final class ContentAlpha {
+    method @androidx.compose.runtime.Composable public float getDisabled();
+    method @androidx.compose.runtime.Composable public float getHigh();
+    method @androidx.compose.runtime.Composable public float getMedium();
+    property @androidx.compose.runtime.Composable public final float disabled;
+    property @androidx.compose.runtime.Composable public final float high;
+    property @androidx.compose.runtime.Composable public final float medium;
+    field public static final androidx.compose.material.ContentAlpha INSTANCE;
+  }
+
+  public final class ContentAlphaKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float> getLocalContentAlpha();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float> LocalContentAlpha;
+  }
+
+  public final class ContentColorKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> LocalContentColor;
+  }
+
+  public enum DismissDirection {
+    enum_constant public static final androidx.compose.material.DismissDirection EndToStart;
+    enum_constant public static final androidx.compose.material.DismissDirection StartToEnd;
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi public final class DismissState extends androidx.compose.material.SwipeableState<androidx.compose.material.DismissValue> {
+    ctor public DismissState(androidx.compose.material.DismissValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.DismissValue,java.lang.Boolean> confirmStateChange);
+    method public suspend Object? dismiss(androidx.compose.material.DismissDirection direction, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public androidx.compose.material.DismissDirection? getDismissDirection();
+    method public boolean isDismissed(androidx.compose.material.DismissDirection direction);
+    method public suspend Object? reset(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    property public final androidx.compose.material.DismissDirection? dismissDirection;
+    field public static final androidx.compose.material.DismissState.Companion Companion;
+  }
+
+  public static final class DismissState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.material.DismissState,androidx.compose.material.DismissValue> Saver(kotlin.jvm.functions.Function1<? super androidx.compose.material.DismissValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  public enum DismissValue {
+    enum_constant public static final androidx.compose.material.DismissValue Default;
+    enum_constant public static final androidx.compose.material.DismissValue DismissedToEnd;
+    enum_constant public static final androidx.compose.material.DismissValue DismissedToStart;
+  }
+
+  public final class DividerKt {
+    method @androidx.compose.runtime.Composable public static void Divider(optional androidx.compose.ui.Modifier modifier, optional long color, optional float thickness, optional float startIndent);
+  }
+
+  public final class DragGestureDetectorCopyKt {
+  }
+
+  public final class DrawerDefaults {
+    method public float getElevation();
+    method @androidx.compose.runtime.Composable public long getScrimColor();
+    property public final float Elevation;
+    property @androidx.compose.runtime.Composable public final long scrimColor;
+    field public static final androidx.compose.material.DrawerDefaults INSTANCE;
+    field public static final float ScrimOpacity = 0.32f;
+  }
+
+  public final class DrawerKt {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void BottomDrawer(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> drawerContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.BottomDrawerState drawerState, optional boolean gesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long scrimColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void ModalDrawer(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> drawerContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.DrawerState drawerState, optional boolean gesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long scrimColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static androidx.compose.material.BottomDrawerState rememberBottomDrawerState(androidx.compose.material.BottomDrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.BottomDrawerValue,java.lang.Boolean> confirmStateChange);
+    method @androidx.compose.runtime.Composable public static androidx.compose.material.DrawerState rememberDrawerState(androidx.compose.material.DrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.DrawerValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  @androidx.compose.runtime.Stable public final class DrawerState {
+    ctor public DrawerState(androidx.compose.material.DrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.DrawerValue,java.lang.Boolean> confirmStateChange);
+    method @androidx.compose.material.ExperimentalMaterialApi public suspend Object? animateTo(androidx.compose.material.DrawerValue targetValue, androidx.compose.animation.core.AnimationSpec<java.lang.Float> anim, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public suspend Object? close(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public androidx.compose.material.DrawerValue getCurrentValue();
+    method @androidx.compose.material.ExperimentalMaterialApi public androidx.compose.runtime.State<java.lang.Float> getOffset();
+    method @androidx.compose.material.ExperimentalMaterialApi public androidx.compose.material.DrawerValue getTargetValue();
+    method public boolean isAnimationRunning();
+    method public boolean isClosed();
+    method public boolean isOpen();
+    method public suspend Object? open(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method @androidx.compose.material.ExperimentalMaterialApi public suspend Object? snapTo(androidx.compose.material.DrawerValue targetValue, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    property public final androidx.compose.material.DrawerValue currentValue;
+    property public final boolean isAnimationRunning;
+    property public final boolean isClosed;
+    property public final boolean isOpen;
+    property @androidx.compose.material.ExperimentalMaterialApi public final androidx.compose.runtime.State<java.lang.Float> offset;
+    property @androidx.compose.material.ExperimentalMaterialApi public final androidx.compose.material.DrawerValue targetValue;
+    field public static final androidx.compose.material.DrawerState.Companion Companion;
+  }
+
+  public static final class DrawerState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.material.DrawerState,androidx.compose.material.DrawerValue> Saver(kotlin.jvm.functions.Function1<? super androidx.compose.material.DrawerValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  public enum DrawerValue {
+    enum_constant public static final androidx.compose.material.DrawerValue Closed;
+    enum_constant public static final androidx.compose.material.DrawerValue Open;
+  }
+
+  public final class ElevationKt {
+  }
+
+  public interface ElevationOverlay {
+    method @androidx.compose.runtime.Composable public long apply(long color, float elevation);
+  }
+
+  public final class ElevationOverlayKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteElevation();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> getLocalElevationOverlay();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> LocalAbsoluteElevation;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> LocalElevationOverlay;
+  }
+
+  @kotlin.RequiresOptIn(message="This material API is experimental and is likely to change or to be removed in" + " the future.") public @interface ExperimentalMaterialApi {
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi public interface ExposedDropdownMenuBoxScope {
+    method @androidx.compose.runtime.Composable public default void ExposedDropdownMenu(boolean expanded, kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method public androidx.compose.ui.Modifier exposedDropdownSize(androidx.compose.ui.Modifier, optional boolean matchTextFieldWidth);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi public final class ExposedDropdownMenuDefaults {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public void TrailingIcon(boolean expanded, optional kotlin.jvm.functions.Function0<kotlin.Unit> onIconClick);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.TextFieldColors outlinedTextFieldColors(optional long textColor, optional long disabledTextColor, optional long backgroundColor, optional long cursorColor, optional long errorCursorColor, optional long focusedBorderColor, optional long unfocusedBorderColor, optional long disabledBorderColor, optional long errorBorderColor, optional long leadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long trailingIconColor, optional long focusedTrailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.TextFieldColors textFieldColors(optional long textColor, optional long disabledTextColor, optional long backgroundColor, optional long cursorColor, optional long errorCursorColor, optional long focusedIndicatorColor, optional long unfocusedIndicatorColor, optional long disabledIndicatorColor, optional long errorIndicatorColor, optional long leadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long trailingIconColor, optional long focusedTrailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor);
+    field public static final androidx.compose.material.ExposedDropdownMenuDefaults INSTANCE;
+  }
+
+  public final class ExposedDropdownMenuKt {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void ExposedDropdownMenuBox(boolean expanded, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onExpandedChange, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.material.ExposedDropdownMenuBoxScope,kotlin.Unit> content);
+  }
+
+  public final inline class FabPosition {
+    ctor public FabPosition();
+  }
+
+  public static final class FabPosition.Companion {
+    method public int getCenter();
+    method public int getEnd();
+    property public final int Center;
+    property public final int End;
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Immutable public final class FixedThreshold implements androidx.compose.material.ThresholdConfig {
+    ctor public FixedThreshold(float offset);
+    method public float computeThreshold(androidx.compose.ui.unit.Density, float fromValue, float toValue);
+    method public androidx.compose.material.FixedThreshold copy-0680j_4(float offset);
+  }
+
+  public final class FloatingActionButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.FloatingActionButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float hoveredElevation, optional float focusedElevation);
+    method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material.FloatingActionButtonElevation! elevation(optional float defaultElevation, optional float pressedElevation);
+    field public static final androidx.compose.material.FloatingActionButtonDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public interface FloatingActionButtonElevation {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> elevation(androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
+  public final class FloatingActionButtonKt {
+    method @androidx.compose.runtime.Composable public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.material.FloatingActionButtonElevation elevation);
+    method @androidx.compose.runtime.Composable public static void FloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.material.FloatingActionButtonElevation elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Immutable public final class FractionalThreshold implements androidx.compose.material.ThresholdConfig {
+    ctor public FractionalThreshold(float fraction);
+    method public float computeThreshold(androidx.compose.ui.unit.Density, float fromValue, float toValue);
+    method public androidx.compose.material.FractionalThreshold copy(float fraction);
+  }
+
+  public final class IconButtonKt {
+    method @androidx.compose.runtime.Composable public static void IconButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void IconToggleButton(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class IconKt {
+    method @androidx.compose.runtime.Composable public static void Icon(androidx.compose.ui.graphics.vector.ImageVector imageVector, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+    method @androidx.compose.runtime.Composable public static void Icon(androidx.compose.ui.graphics.ImageBitmap bitmap, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+    method @androidx.compose.runtime.Composable public static void Icon(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+  }
+
+  public final class ListItemKt {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void ListItem(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? secondaryText, optional boolean singleLineSecondaryText, optional kotlin.jvm.functions.Function0<kotlin.Unit>? overlineText, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailing, kotlin.jvm.functions.Function0<kotlin.Unit> text);
+  }
+
+  public final class MaterialTextSelectionColorsKt {
+  }
+
+  public final class MaterialTheme {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material.Colors getColors();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material.Shapes getShapes();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material.Typography getTypography();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material.Colors colors;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material.Shapes shapes;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material.Typography typography;
+    field public static final androidx.compose.material.MaterialTheme INSTANCE;
+  }
+
+  public final class MaterialThemeKt {
+    method @androidx.compose.runtime.Composable public static void MaterialTheme(optional androidx.compose.material.Colors colors, optional androidx.compose.material.Typography typography, optional androidx.compose.material.Shapes shapes, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class MaterialTheme_androidKt {
+  }
+
+  public final class MenuDefaults {
+    method public androidx.compose.foundation.layout.PaddingValues getDropdownMenuItemContentPadding();
+    property public final androidx.compose.foundation.layout.PaddingValues DropdownMenuItemContentPadding;
+    field public static final androidx.compose.material.MenuDefaults INSTANCE;
+  }
+
+  public final class MenuKt {
+  }
+
+  public final class ModalBottomSheetDefaults {
+    method public float getElevation();
+    method @androidx.compose.runtime.Composable public long getScrimColor();
+    property public final float Elevation;
+    property @androidx.compose.runtime.Composable public final long scrimColor;
+    field public static final androidx.compose.material.ModalBottomSheetDefaults INSTANCE;
+  }
+
+  public final class ModalBottomSheetKt {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void ModalBottomSheetLayout(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> sheetContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.ModalBottomSheetState sheetState, optional androidx.compose.ui.graphics.Shape sheetShape, optional float sheetElevation, optional long sheetBackgroundColor, optional long sheetContentColor, optional long scrimColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static androidx.compose.material.ModalBottomSheetState rememberModalBottomSheetState(androidx.compose.material.ModalBottomSheetValue initialValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.ModalBottomSheetValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi public final class ModalBottomSheetState extends androidx.compose.material.SwipeableState<androidx.compose.material.ModalBottomSheetValue> {
+    ctor public ModalBottomSheetState(androidx.compose.material.ModalBottomSheetValue initialValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.ModalBottomSheetValue,java.lang.Boolean> confirmStateChange);
+    method public suspend Object? hide(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public boolean isVisible();
+    method public suspend Object? show(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    property public final boolean isVisible;
+    field public static final androidx.compose.material.ModalBottomSheetState.Companion Companion;
+  }
+
+  public static final class ModalBottomSheetState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.material.ModalBottomSheetState,?> Saver(androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, kotlin.jvm.functions.Function1<? super androidx.compose.material.ModalBottomSheetValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi public enum ModalBottomSheetValue {
+    enum_constant public static final androidx.compose.material.ModalBottomSheetValue Expanded;
+    enum_constant public static final androidx.compose.material.ModalBottomSheetValue HalfExpanded;
+    enum_constant public static final androidx.compose.material.ModalBottomSheetValue Hidden;
+  }
+
+  public final class NavigationRailDefaults {
+    method public float getElevation();
+    property public final float Elevation;
+    field public static final androidx.compose.material.NavigationRailDefaults INSTANCE;
+  }
+
+  public final class NavigationRailKt {
+    method @androidx.compose.runtime.Composable public static void NavigationRail(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float elevation, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? header, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void NavigationRailItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+  }
+
+  public final class OutlinedTextFieldKt {
+    method @androidx.compose.runtime.Composable public static void OutlinedTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+    method @androidx.compose.runtime.Composable public static void OutlinedTextField(androidx.compose.ui.text.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.TextFieldValue,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+  }
+
+  public final class ProgressIndicatorDefaults {
+    method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getProgressAnimationSpec();
+    method public float getStrokeWidth();
+    property public final androidx.compose.animation.core.SpringSpec<java.lang.Float> ProgressAnimationSpec;
+    property public final float StrokeWidth;
+    field public static final androidx.compose.material.ProgressIndicatorDefaults INSTANCE;
+    field public static final float IndicatorBackgroundOpacity = 0.24f;
+  }
+
+  public final class ProgressIndicatorKt {
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor);
+  }
+
+  @androidx.compose.runtime.Stable public interface RadioButtonColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> radioColor(boolean enabled, boolean selected);
+  }
+
+  public final class RadioButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.RadioButtonColors colors(optional long selectedColor, optional long unselectedColor, optional long disabledColor);
+    field public static final androidx.compose.material.RadioButtonDefaults INSTANCE;
+  }
+
+  public final class RadioButtonKt {
+    method @androidx.compose.runtime.Composable public static void RadioButton(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.RadioButtonColors colors);
+  }
+
+  @androidx.compose.runtime.Immutable public final class ResistanceConfig {
+    ctor public ResistanceConfig(float basis, optional float factorAtMin, optional float factorAtMax);
+    method public float computeResistance(float overflow);
+    method public float getBasis();
+    method public float getFactorAtMax();
+    method public float getFactorAtMin();
+    property public final float basis;
+    property public final float factorAtMax;
+    property public final float factorAtMin;
+  }
+
+  public final class ScaffoldKt {
+    method @androidx.compose.runtime.Composable public static void Scaffold(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.ScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional boolean isFloatingActionButtonDocked, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static androidx.compose.material.ScaffoldState rememberScaffoldState(optional androidx.compose.material.DrawerState drawerState, optional androidx.compose.material.SnackbarHostState snackbarHostState);
+  }
+
+  @androidx.compose.runtime.Stable public final class ScaffoldState {
+    ctor public ScaffoldState(androidx.compose.material.DrawerState drawerState, androidx.compose.material.SnackbarHostState snackbarHostState);
+    method public androidx.compose.material.DrawerState getDrawerState();
+    method public androidx.compose.material.SnackbarHostState getSnackbarHostState();
+    property public final androidx.compose.material.DrawerState drawerState;
+    property public final androidx.compose.material.SnackbarHostState snackbarHostState;
+  }
+
+  @androidx.compose.runtime.Immutable public final class Shapes {
+    ctor public Shapes(optional androidx.compose.foundation.shape.CornerBasedShape small, optional androidx.compose.foundation.shape.CornerBasedShape medium, optional androidx.compose.foundation.shape.CornerBasedShape large);
+    method public androidx.compose.material.Shapes copy(optional androidx.compose.foundation.shape.CornerBasedShape small, optional androidx.compose.foundation.shape.CornerBasedShape medium, optional androidx.compose.foundation.shape.CornerBasedShape large);
+    method public androidx.compose.foundation.shape.CornerBasedShape getLarge();
+    method public androidx.compose.foundation.shape.CornerBasedShape getMedium();
+    method public androidx.compose.foundation.shape.CornerBasedShape getSmall();
+    property public final androidx.compose.foundation.shape.CornerBasedShape large;
+    property public final androidx.compose.foundation.shape.CornerBasedShape medium;
+    property public final androidx.compose.foundation.shape.CornerBasedShape small;
+  }
+
+  public final class ShapesKt {
+  }
+
+  @androidx.compose.runtime.Stable public interface SliderColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> thumbColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> tickColor(boolean enabled, boolean active);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trackColor(boolean enabled, boolean active);
+  }
+
+  public final class SliderDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.SliderColors colors(optional long thumbColor, optional long disabledThumbColor, optional long activeTrackColor, optional long inactiveTrackColor, optional long disabledActiveTrackColor, optional long disabledInactiveTrackColor, optional long activeTickColor, optional long inactiveTickColor, optional long disabledActiveTickColor, optional long disabledInactiveTickColor);
+    field public static final float DisabledActiveTrackAlpha = 0.32f;
+    field public static final float DisabledInactiveTrackAlpha = 0.12f;
+    field public static final float DisabledTickAlpha = 0.12f;
+    field public static final androidx.compose.material.SliderDefaults INSTANCE;
+    field public static final float InactiveTrackAlpha = 0.24f;
+    field public static final float TickAlpha = 0.54f;
+  }
+
+  public final class SliderKt {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void RangeSlider(kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> values, kotlin.jvm.functions.Function1<? super kotlin.ranges.ClosedFloatingPointRange<java.lang.Float>,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional int steps, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onValueChangeFinished, optional androidx.compose.material.SliderColors colors);
+    method @androidx.compose.runtime.Composable public static void Slider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional int steps, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onValueChangeFinished, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.SliderColors colors);
+  }
+
+  public interface SnackbarData {
+    method public void dismiss();
+    method public String? getActionLabel();
+    method public androidx.compose.material.SnackbarDuration getDuration();
+    method public String getMessage();
+    method public void performAction();
+    property public abstract String? actionLabel;
+    property public abstract androidx.compose.material.SnackbarDuration duration;
+    property public abstract String message;
+  }
+
+  public final class SnackbarDefaults {
+    method @androidx.compose.runtime.Composable public long getBackgroundColor();
+    method @androidx.compose.runtime.Composable public long getPrimaryActionColor();
+    property @androidx.compose.runtime.Composable public final long backgroundColor;
+    property @androidx.compose.runtime.Composable public final long primaryActionColor;
+    field public static final androidx.compose.material.SnackbarDefaults INSTANCE;
+  }
+
+  public enum SnackbarDuration {
+    enum_constant public static final androidx.compose.material.SnackbarDuration Indefinite;
+    enum_constant public static final androidx.compose.material.SnackbarDuration Long;
+    enum_constant public static final androidx.compose.material.SnackbarDuration Short;
+  }
+
+  public final class SnackbarHostKt {
+    method @androidx.compose.runtime.Composable public static void SnackbarHost(androidx.compose.material.SnackbarHostState hostState, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarData,kotlin.Unit> snackbar);
+  }
+
+  @androidx.compose.runtime.Stable public final class SnackbarHostState {
+    ctor public SnackbarHostState();
+    method public androidx.compose.material.SnackbarData? getCurrentSnackbarData();
+    method public suspend Object? showSnackbar(String message, optional String? actionLabel, optional androidx.compose.material.SnackbarDuration duration, optional kotlin.coroutines.Continuation<? super androidx.compose.material.SnackbarResult> p);
+    property public final androidx.compose.material.SnackbarData? currentSnackbarData;
+  }
+
+  public final class SnackbarKt {
+    method @androidx.compose.runtime.Composable public static void Snackbar(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? action, optional boolean actionOnNewLine, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional float elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Snackbar(androidx.compose.material.SnackbarData snackbarData, optional androidx.compose.ui.Modifier modifier, optional boolean actionOnNewLine, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional long actionColor, optional float elevation);
+  }
+
+  public enum SnackbarResult {
+    enum_constant public static final androidx.compose.material.SnackbarResult ActionPerformed;
+    enum_constant public static final androidx.compose.material.SnackbarResult Dismissed;
+  }
+
+  public final class Strings_androidKt {
+  }
+
+  public final class SurfaceKt {
+    method @androidx.compose.runtime.Composable public static void Surface(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional androidx.compose.foundation.BorderStroke? border, optional float elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void Surface(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional androidx.compose.foundation.BorderStroke? border, optional float elevation, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Immutable public final class SwipeProgress<T> {
+    ctor public SwipeProgress(T? from, T? to, float fraction);
+    method public float getFraction();
+    method public T! getFrom();
+    method public T! getTo();
+    property public final float fraction;
+    property public final T! from;
+    property public final T! to;
+  }
+
+  public final class SwipeToDismissKt {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void SwipeToDismiss(androidx.compose.material.DismissState state, optional androidx.compose.ui.Modifier modifier, optional java.util.Set<? extends androidx.compose.material.DismissDirection> directions, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.DismissDirection,? extends androidx.compose.material.ThresholdConfig> dismissThresholds, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> background, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> dismissContent);
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static androidx.compose.material.DismissState rememberDismissState(optional androidx.compose.material.DismissValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.DismissValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  public final class SwipeableDefaults {
+    method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getAnimationSpec();
+    method public float getVelocityThreshold();
+    method public androidx.compose.material.ResistanceConfig? resistanceConfig(java.util.Set<java.lang.Float> anchors, optional float factorAtMin, optional float factorAtMax);
+    property public final androidx.compose.animation.core.SpringSpec<java.lang.Float> AnimationSpec;
+    property public final float VelocityThreshold;
+    field public static final androidx.compose.material.SwipeableDefaults INSTANCE;
+    field public static final float StandardResistanceFactor = 10.0f;
+    field public static final float StiffResistanceFactor = 20.0f;
+  }
+
+  public final class SwipeableKt {
+    method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static <T> androidx.compose.material.SwipeableState<T> rememberSwipeableState(T initialValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> confirmStateChange);
+    method @androidx.compose.material.ExperimentalMaterialApi public static <T> androidx.compose.ui.Modifier swipeable(androidx.compose.ui.Modifier, androidx.compose.material.SwipeableState<T> state, java.util.Map<java.lang.Float,? extends T> anchors, androidx.compose.foundation.gestures.Orientation orientation, optional boolean enabled, optional boolean reverseDirection, optional androidx.compose.foundation.interaction.MutableInteractionSource? interactionSource, optional kotlin.jvm.functions.Function2<? super T,? super T,? extends androidx.compose.material.ThresholdConfig> thresholds, optional androidx.compose.material.ResistanceConfig? resistance, optional float velocityThreshold);
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Stable public class SwipeableState<T> {
+    ctor public SwipeableState(T? initialValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, optional kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> confirmStateChange);
+    method @androidx.compose.material.ExperimentalMaterialApi public final suspend Object? animateTo(T? targetValue, optional androidx.compose.animation.core.AnimationSpec<java.lang.Float> anim, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public final T! getCurrentValue();
+    method public final float getDirection();
+    method public final androidx.compose.runtime.State<java.lang.Float> getOffset();
+    method public final androidx.compose.runtime.State<java.lang.Float> getOverflow();
+    method public final androidx.compose.material.SwipeProgress<T> getProgress();
+    method public final T! getTargetValue();
+    method public final boolean isAnimationRunning();
+    method public final float performDrag(float delta);
+    method public final suspend Object? performFling(float velocity, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method @androidx.compose.material.ExperimentalMaterialApi public final suspend Object? snapTo(T? targetValue, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    property public final T! currentValue;
+    property public final float direction;
+    property public final boolean isAnimationRunning;
+    property public final androidx.compose.runtime.State<java.lang.Float> offset;
+    property public final androidx.compose.runtime.State<java.lang.Float> overflow;
+    property public final androidx.compose.material.SwipeProgress<T> progress;
+    property public final T! targetValue;
+    field public static final androidx.compose.material.SwipeableState.Companion Companion;
+  }
+
+  public static final class SwipeableState.Companion {
+    method public <T> androidx.compose.runtime.saveable.Saver<androidx.compose.material.SwipeableState<T>,T> Saver(androidx.compose.animation.core.AnimationSpec<java.lang.Float> animationSpec, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> confirmStateChange);
+  }
+
+  @androidx.compose.runtime.Stable public interface SwitchColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> thumbColor(boolean enabled, boolean checked);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trackColor(boolean enabled, boolean checked);
+  }
+
+  public final class SwitchDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.SwitchColors colors(optional long checkedThumbColor, optional long checkedTrackColor, optional float checkedTrackAlpha, optional long uncheckedThumbColor, optional long uncheckedTrackColor, optional float uncheckedTrackAlpha, optional long disabledCheckedThumbColor, optional long disabledCheckedTrackColor, optional long disabledUncheckedThumbColor, optional long disabledUncheckedTrackColor);
+    field public static final androidx.compose.material.SwitchDefaults INSTANCE;
+  }
+
+  public final class SwitchKt {
+    method @androidx.compose.runtime.Composable public static void Switch(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.SwitchColors colors);
+  }
+
+  public final class TabKt {
+    method @androidx.compose.runtime.Composable public static void LeadingIconTab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TabPosition {
+    method public float getLeft();
+    method public float getRight();
+    method public float getWidth();
+    property public final float left;
+    property public final float right;
+    property public final float width;
+  }
+
+  public final class TabRowDefaults {
+    method @androidx.compose.runtime.Composable public void Divider(optional androidx.compose.ui.Modifier modifier, optional float thickness, optional long color);
+    method @androidx.compose.runtime.Composable public void Indicator(optional androidx.compose.ui.Modifier modifier, optional float height, optional long color);
+    method public float getDividerThickness();
+    method public float getIndicatorHeight();
+    method public float getScrollableTabRowPadding();
+    method public androidx.compose.ui.Modifier tabIndicatorOffset(androidx.compose.ui.Modifier, androidx.compose.material.TabPosition currentTabPosition);
+    property public final float DividerThickness;
+    property public final float IndicatorHeight;
+    property public final float ScrollableTabRowPadding;
+    field public static final float DividerOpacity = 0.12f;
+    field public static final androidx.compose.material.TabRowDefaults INSTANCE;
+  }
+
+  public final class TabRowKt {
+    method @androidx.compose.runtime.Composable public static void ScrollableTabRow(int selectedTabIndex, optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float edgePadding, optional kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.material.TabPosition>,kotlin.Unit> indicator, optional kotlin.jvm.functions.Function0<kotlin.Unit> divider, kotlin.jvm.functions.Function0<kotlin.Unit> tabs);
+    method @androidx.compose.runtime.Composable public static void TabRow(int selectedTabIndex, optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.material.TabPosition>,kotlin.Unit> indicator, optional kotlin.jvm.functions.Function0<kotlin.Unit> divider, kotlin.jvm.functions.Function0<kotlin.Unit> tabs);
+  }
+
+  @androidx.compose.runtime.Stable public interface TextFieldColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> backgroundColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> cursorColor(boolean isError);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> indicatorColor(boolean enabled, boolean isError, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> labelColor(boolean enabled, boolean error, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> leadingIconColor(boolean enabled, boolean isError);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> placeholderColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> textColor(boolean enabled);
+    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();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.TextFieldColors outlinedTextFieldColors(optional long textColor, optional long disabledTextColor, optional long backgroundColor, optional long cursorColor, optional long errorCursorColor, optional long focusedBorderColor, optional long unfocusedBorderColor, optional long disabledBorderColor, optional long errorBorderColor, optional long leadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long trailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.TextFieldColors textFieldColors(optional long textColor, optional long disabledTextColor, optional long backgroundColor, optional long cursorColor, optional long errorCursorColor, optional long focusedIndicatorColor, optional long unfocusedIndicatorColor, optional long disabledIndicatorColor, optional long errorIndicatorColor, optional long leadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long trailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor);
+    property public final float MinHeight;
+    property public final float MinWidth;
+    field public static final float BackgroundOpacity = 0.12f;
+    field public static final androidx.compose.material.TextFieldDefaults INSTANCE;
+    field public static final float IconOpacity = 0.54f;
+    field public static final float UnfocusedIndicatorLineOpacity = 0.42f;
+  }
+
+  public final class TextFieldImplKt {
+  }
+
+  public final class TextFieldKt {
+    method @androidx.compose.runtime.Composable public static void TextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+    method @androidx.compose.runtime.Composable public static void TextField(androidx.compose.ui.text.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.TextFieldValue,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+  }
+
+  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();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> LocalTextStyle;
+  }
+
+  @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Stable public interface ThresholdConfig {
+    method public float computeThreshold(androidx.compose.ui.unit.Density, float fromValue, float toValue);
+  }
+
+  public final class TouchTargetKt {
+    method @androidx.compose.material.ExperimentalMaterialApi public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalMinimumTouchTargetEnforcement();
+    property @androidx.compose.material.ExperimentalMaterialApi public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> LocalMinimumTouchTargetEnforcement;
+  }
+
+  @androidx.compose.runtime.Immutable public final class Typography {
+    ctor public Typography(optional androidx.compose.ui.text.font.FontFamily defaultFontFamily, optional androidx.compose.ui.text.TextStyle h1, optional androidx.compose.ui.text.TextStyle h2, optional androidx.compose.ui.text.TextStyle h3, optional androidx.compose.ui.text.TextStyle h4, optional androidx.compose.ui.text.TextStyle h5, optional androidx.compose.ui.text.TextStyle h6, optional androidx.compose.ui.text.TextStyle subtitle1, optional androidx.compose.ui.text.TextStyle subtitle2, optional androidx.compose.ui.text.TextStyle body1, optional androidx.compose.ui.text.TextStyle body2, optional androidx.compose.ui.text.TextStyle button, optional androidx.compose.ui.text.TextStyle caption, optional androidx.compose.ui.text.TextStyle overline);
+    method public androidx.compose.material.Typography copy(optional androidx.compose.ui.text.TextStyle h1, optional androidx.compose.ui.text.TextStyle h2, optional androidx.compose.ui.text.TextStyle h3, optional androidx.compose.ui.text.TextStyle h4, optional androidx.compose.ui.text.TextStyle h5, optional androidx.compose.ui.text.TextStyle h6, optional androidx.compose.ui.text.TextStyle subtitle1, optional androidx.compose.ui.text.TextStyle subtitle2, optional androidx.compose.ui.text.TextStyle body1, optional androidx.compose.ui.text.TextStyle body2, optional androidx.compose.ui.text.TextStyle button, optional androidx.compose.ui.text.TextStyle caption, optional androidx.compose.ui.text.TextStyle overline);
+    method public androidx.compose.ui.text.TextStyle getBody1();
+    method public androidx.compose.ui.text.TextStyle getBody2();
+    method public androidx.compose.ui.text.TextStyle getButton();
+    method public androidx.compose.ui.text.TextStyle getCaption();
+    method public androidx.compose.ui.text.TextStyle getH1();
+    method public androidx.compose.ui.text.TextStyle getH2();
+    method public androidx.compose.ui.text.TextStyle getH3();
+    method public androidx.compose.ui.text.TextStyle getH4();
+    method public androidx.compose.ui.text.TextStyle getH5();
+    method public androidx.compose.ui.text.TextStyle getH6();
+    method public androidx.compose.ui.text.TextStyle getOverline();
+    method public androidx.compose.ui.text.TextStyle getSubtitle1();
+    method public androidx.compose.ui.text.TextStyle getSubtitle2();
+    property public final androidx.compose.ui.text.TextStyle body1;
+    property public final androidx.compose.ui.text.TextStyle body2;
+    property public final androidx.compose.ui.text.TextStyle button;
+    property public final androidx.compose.ui.text.TextStyle caption;
+    property public final androidx.compose.ui.text.TextStyle h1;
+    property public final androidx.compose.ui.text.TextStyle h2;
+    property public final androidx.compose.ui.text.TextStyle h3;
+    property public final androidx.compose.ui.text.TextStyle h4;
+    property public final androidx.compose.ui.text.TextStyle h5;
+    property public final androidx.compose.ui.text.TextStyle h6;
+    property public final androidx.compose.ui.text.TextStyle overline;
+    property public final androidx.compose.ui.text.TextStyle subtitle1;
+    property public final androidx.compose.ui.text.TextStyle subtitle2;
+  }
+
+  public final class TypographyKt {
+  }
+
+}
+
+package androidx.compose.material.internal {
+
+  public final class ExposedDropdownMenuPopupKt {
+  }
+
+}
+
diff --git a/compose/material/material/api/public_plus_experimental_current.txt b/compose/material/material/api/public_plus_experimental_current.txt
index ee7b665..fb9cc2d 100644
--- a/compose/material/material/api/public_plus_experimental_current.txt
+++ b/compose/material/material/api/public_plus_experimental_current.txt
@@ -163,6 +163,7 @@
   public final class ButtonDefaults {
     method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors buttonColors(optional long backgroundColor, optional long contentColor, optional long disabledBackgroundColor, optional long disabledContentColor);
     method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation, optional float hoveredElevation, optional float focusedElevation);
+    method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation! elevation(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation);
     method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
     method public float getIconSize();
     method public float getIconSpacing();
@@ -267,10 +268,12 @@
 
   public final class ContentAlphaKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float> getLocalContentAlpha();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float> LocalContentAlpha;
   }
 
   public final class ContentColorKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> LocalContentColor;
   }
 
   public enum DismissDirection {
@@ -361,6 +364,8 @@
   public final class ElevationOverlayKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteElevation();
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> getLocalElevationOverlay();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> LocalAbsoluteElevation;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> LocalElevationOverlay;
   }
 
   @kotlin.RequiresOptIn(message="This material API is experimental and is likely to change or to be removed in" + " the future.") public @interface ExperimentalMaterialApi {
@@ -401,6 +406,7 @@
 
   public final class FloatingActionButtonDefaults {
     method @androidx.compose.runtime.Composable public androidx.compose.material.FloatingActionButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float hoveredElevation, optional float focusedElevation);
+    method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material.FloatingActionButtonElevation! elevation(optional float defaultElevation, optional float pressedElevation);
     field public static final androidx.compose.material.FloatingActionButtonDefaults INSTANCE;
   }
 
@@ -801,6 +807,7 @@
     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();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> LocalTextStyle;
   }
 
   @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Stable public interface ThresholdConfig {
@@ -809,6 +816,7 @@
 
   public final class TouchTargetKt {
     method @androidx.compose.material.ExperimentalMaterialApi public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalMinimumTouchTargetEnforcement();
+    property @androidx.compose.material.ExperimentalMaterialApi public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> LocalMinimumTouchTargetEnforcement;
   }
 
   @androidx.compose.runtime.Immutable public final class Typography {
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/material/material/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to compose/material/material/api/res-1.1.0-beta02.txt
diff --git a/compose/material/material/api/restricted_1.1.0-beta02.txt b/compose/material/material/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..320de09
--- /dev/null
+++ b/compose/material/material/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,656 @@
+// Signature format: 4.0
+package androidx.compose.material {
+
+  public final class AlertDialogKt {
+  }
+
+  public final class AndroidAlertDialog_androidKt {
+    method @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> confirmButton, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? dismissButton, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.window.DialogProperties properties);
+    method @androidx.compose.runtime.Composable public static void AlertDialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, kotlin.jvm.functions.Function0<kotlin.Unit> buttons, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? title, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.window.DialogProperties properties);
+  }
+
+  public final class AndroidMenu_androidKt {
+    method @androidx.compose.runtime.Composable public static void DropdownMenu(boolean expanded, kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.Modifier modifier, optional long offset, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void DropdownMenuItem(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  public final class AppBarDefaults {
+    method public float getBottomAppBarElevation();
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getTopAppBarElevation();
+    property public final float BottomAppBarElevation;
+    property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
+    property public final float TopAppBarElevation;
+    field public static final androidx.compose.material.AppBarDefaults INSTANCE;
+  }
+
+  public final class AppBarKt {
+    method @androidx.compose.runtime.Composable public static void BottomAppBar(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional androidx.compose.ui.graphics.Shape? cutoutShape, optional float elevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional long backgroundColor, optional long contentColor, optional float elevation);
+    method @androidx.compose.runtime.Composable public static void TopAppBar(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float elevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  public final class BackdropScaffoldDefaults {
+    method public float getFrontLayerElevation();
+    method @androidx.compose.runtime.Composable public long getFrontLayerScrimColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.graphics.Shape getFrontLayerShape();
+    method public float getHeaderHeight();
+    method public float getPeekHeight();
+    property public final float FrontLayerElevation;
+    property public final float HeaderHeight;
+    property public final float PeekHeight;
+    property @androidx.compose.runtime.Composable public final long frontLayerScrimColor;
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.graphics.Shape frontLayerShape;
+    field public static final androidx.compose.material.BackdropScaffoldDefaults INSTANCE;
+  }
+
+  public final class BackdropScaffoldKt {
+  }
+
+  public final class BadgeKt {
+    method @androidx.compose.runtime.Composable public static void Badge(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? content);
+    method @androidx.compose.runtime.Composable public static void BadgedBox(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> badge, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+  }
+
+  public final class BottomNavigationDefaults {
+    method public float getElevation();
+    property public final float Elevation;
+    field public static final androidx.compose.material.BottomNavigationDefaults INSTANCE;
+  }
+
+  public final class BottomNavigationKt {
+    method @androidx.compose.runtime.Composable public static void BottomNavigation(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float elevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void BottomNavigationItem(androidx.compose.foundation.layout.RowScope, boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+  }
+
+  public final class BottomSheetScaffoldDefaults {
+    method public float getSheetElevation();
+    method public float getSheetPeekHeight();
+    property public final float SheetElevation;
+    property public final float SheetPeekHeight;
+    field public static final androidx.compose.material.BottomSheetScaffoldDefaults INSTANCE;
+  }
+
+  public final class BottomSheetScaffoldKt {
+  }
+
+  @androidx.compose.runtime.Stable public interface ButtonColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> backgroundColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled);
+  }
+
+  public final class ButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors buttonColors(optional long backgroundColor, optional long contentColor, optional long disabledBackgroundColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation, optional float hoveredElevation, optional float focusedElevation);
+    method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation! elevation(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation);
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getIconSize();
+    method public float getIconSpacing();
+    method public float getMinHeight();
+    method public float getMinWidth();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke getOutlinedBorder();
+    method public float getOutlinedBorderSize();
+    method public androidx.compose.foundation.layout.PaddingValues getTextButtonContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors outlinedButtonColors(optional long backgroundColor, optional long contentColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors textButtonColors(optional long backgroundColor, optional long contentColor, optional long disabledContentColor);
+    property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
+    property public final float IconSize;
+    property public final float IconSpacing;
+    property public final float MinHeight;
+    property public final float MinWidth;
+    property public final float OutlinedBorderSize;
+    property public final androidx.compose.foundation.layout.PaddingValues TextButtonContentPadding;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.BorderStroke outlinedBorder;
+    field public static final androidx.compose.material.ButtonDefaults INSTANCE;
+    field public static final float OutlinedBorderOpacity = 0.12f;
+  }
+
+  @androidx.compose.runtime.Stable public interface ButtonElevation {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> elevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
+  public final class ButtonKt {
+    method @androidx.compose.runtime.Composable public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void OutlinedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void TextButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
+  public final class CardKt {
+    method @androidx.compose.runtime.Composable public static void Card(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.foundation.BorderStroke? border, optional float elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Stable public interface CheckboxColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> borderColor(boolean enabled, androidx.compose.ui.state.ToggleableState state);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> boxColor(boolean enabled, androidx.compose.ui.state.ToggleableState state);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> checkmarkColor(androidx.compose.ui.state.ToggleableState state);
+  }
+
+  public final class CheckboxDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.CheckboxColors colors(optional long checkedColor, optional long uncheckedColor, optional long checkmarkColor, optional long disabledColor, optional long disabledIndeterminateColor);
+    field public static final androidx.compose.material.CheckboxDefaults INSTANCE;
+  }
+
+  public final class CheckboxKt {
+    method @androidx.compose.runtime.Composable public static void Checkbox(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.CheckboxColors colors);
+    method @androidx.compose.runtime.Composable public static void TriStateCheckbox(androidx.compose.ui.state.ToggleableState state, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.CheckboxColors colors);
+  }
+
+  @androidx.compose.runtime.Stable public final class Colors {
+    ctor public Colors(long primary, long primaryVariant, long secondary, long secondaryVariant, long background, long surface, long error, long onPrimary, long onSecondary, long onBackground, long onSurface, long onError, boolean isLight);
+    method public androidx.compose.material.Colors copy(optional long primary, optional long primaryVariant, optional long secondary, optional long secondaryVariant, optional long background, optional long surface, optional long error, optional long onPrimary, optional long onSecondary, optional long onBackground, optional long onSurface, optional long onError, optional boolean isLight);
+    method public long getBackground();
+    method public long getError();
+    method public long getOnBackground();
+    method public long getOnError();
+    method public long getOnPrimary();
+    method public long getOnSecondary();
+    method public long getOnSurface();
+    method public long getPrimary();
+    method public long getPrimaryVariant();
+    method public long getSecondary();
+    method public long getSecondaryVariant();
+    method public long getSurface();
+    method public boolean isLight();
+    property public final long background;
+    property public final long error;
+    property public final boolean isLight;
+    property public final long onBackground;
+    property public final long onError;
+    property public final long onPrimary;
+    property public final long onSecondary;
+    property public final long onSurface;
+    property public final long primary;
+    property public final long primaryVariant;
+    property public final long secondary;
+    property public final long secondaryVariant;
+    property public final long surface;
+  }
+
+  public final class ColorsKt {
+    method public static long contentColorFor(androidx.compose.material.Colors, long backgroundColor);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static long contentColorFor(long backgroundColor);
+    method public static androidx.compose.material.Colors darkColors(optional long primary, optional long primaryVariant, optional long secondary, optional long secondaryVariant, optional long background, optional long surface, optional long error, optional long onPrimary, optional long onSecondary, optional long onBackground, optional long onSurface, optional long onError);
+    method public static long getPrimarySurface(androidx.compose.material.Colors);
+    method public static androidx.compose.material.Colors lightColors(optional long primary, optional long primaryVariant, optional long secondary, optional long secondaryVariant, optional long background, optional long surface, optional long error, optional long onPrimary, optional long onSecondary, optional long onBackground, optional long onSurface, optional long onError);
+  }
+
+  public final class ContentAlpha {
+    method @androidx.compose.runtime.Composable public float getDisabled();
+    method @androidx.compose.runtime.Composable public float getHigh();
+    method @androidx.compose.runtime.Composable public float getMedium();
+    property @androidx.compose.runtime.Composable public final float disabled;
+    property @androidx.compose.runtime.Composable public final float high;
+    property @androidx.compose.runtime.Composable public final float medium;
+    field public static final androidx.compose.material.ContentAlpha INSTANCE;
+  }
+
+  public final class ContentAlphaKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float> getLocalContentAlpha();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float> LocalContentAlpha;
+  }
+
+  public final class ContentColorKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> LocalContentColor;
+  }
+
+  public enum DismissDirection {
+    enum_constant public static final androidx.compose.material.DismissDirection EndToStart;
+    enum_constant public static final androidx.compose.material.DismissDirection StartToEnd;
+  }
+
+  public enum DismissValue {
+    enum_constant public static final androidx.compose.material.DismissValue Default;
+    enum_constant public static final androidx.compose.material.DismissValue DismissedToEnd;
+    enum_constant public static final androidx.compose.material.DismissValue DismissedToStart;
+  }
+
+  public final class DividerKt {
+    method @androidx.compose.runtime.Composable public static void Divider(optional androidx.compose.ui.Modifier modifier, optional long color, optional float thickness, optional float startIndent);
+  }
+
+  public final class DragGestureDetectorCopyKt {
+  }
+
+  public final class DrawerDefaults {
+    method public float getElevation();
+    method @androidx.compose.runtime.Composable public long getScrimColor();
+    property public final float Elevation;
+    property @androidx.compose.runtime.Composable public final long scrimColor;
+    field public static final androidx.compose.material.DrawerDefaults INSTANCE;
+    field public static final float ScrimOpacity = 0.32f;
+  }
+
+  public final class DrawerKt {
+    method @androidx.compose.runtime.Composable public static void ModalDrawer(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> drawerContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.DrawerState drawerState, optional boolean gesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long scrimColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static androidx.compose.material.DrawerState rememberDrawerState(androidx.compose.material.DrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.DrawerValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  @androidx.compose.runtime.Stable public final class DrawerState {
+    ctor public DrawerState(androidx.compose.material.DrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.DrawerValue,java.lang.Boolean> confirmStateChange);
+    method public suspend Object? close(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public androidx.compose.material.DrawerValue getCurrentValue();
+    method public boolean isAnimationRunning();
+    method public boolean isClosed();
+    method public boolean isOpen();
+    method public suspend Object? open(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    property public final androidx.compose.material.DrawerValue currentValue;
+    property public final boolean isAnimationRunning;
+    property public final boolean isClosed;
+    property public final boolean isOpen;
+    field public static final androidx.compose.material.DrawerState.Companion Companion;
+  }
+
+  public static final class DrawerState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.material.DrawerState,androidx.compose.material.DrawerValue> Saver(kotlin.jvm.functions.Function1<? super androidx.compose.material.DrawerValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  public enum DrawerValue {
+    enum_constant public static final androidx.compose.material.DrawerValue Closed;
+    enum_constant public static final androidx.compose.material.DrawerValue Open;
+  }
+
+  public final class ElevationKt {
+  }
+
+  public interface ElevationOverlay {
+    method @androidx.compose.runtime.Composable public long apply(long color, float elevation);
+  }
+
+  public final class ElevationOverlayKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteElevation();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> getLocalElevationOverlay();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> LocalAbsoluteElevation;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> LocalElevationOverlay;
+  }
+
+  public final class ExposedDropdownMenuKt {
+  }
+
+  public final inline class FabPosition {
+    ctor public FabPosition();
+  }
+
+  public static final class FabPosition.Companion {
+    method public int getCenter();
+    method public int getEnd();
+    property public final int Center;
+    property public final int End;
+  }
+
+  public final class FloatingActionButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.FloatingActionButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float hoveredElevation, optional float focusedElevation);
+    method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material.FloatingActionButtonElevation! elevation(optional float defaultElevation, optional float pressedElevation);
+    field public static final androidx.compose.material.FloatingActionButtonDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public interface FloatingActionButtonElevation {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> elevation(androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
+  public final class FloatingActionButtonKt {
+    method @androidx.compose.runtime.Composable public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.material.FloatingActionButtonElevation elevation);
+    method @androidx.compose.runtime.Composable public static void FloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional androidx.compose.material.FloatingActionButtonElevation elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class IconButtonKt {
+    method @androidx.compose.runtime.Composable public static void IconButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void IconToggleButton(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class IconKt {
+    method @androidx.compose.runtime.Composable public static void Icon(androidx.compose.ui.graphics.vector.ImageVector imageVector, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+    method @androidx.compose.runtime.Composable public static void Icon(androidx.compose.ui.graphics.ImageBitmap bitmap, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+    method @androidx.compose.runtime.Composable public static void Icon(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
+  }
+
+  public final class ListItemKt {
+  }
+
+  public final class MaterialTextSelectionColorsKt {
+  }
+
+  public final class MaterialTheme {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material.Colors getColors();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material.Shapes getShapes();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material.Typography getTypography();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material.Colors colors;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material.Shapes shapes;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material.Typography typography;
+    field public static final androidx.compose.material.MaterialTheme INSTANCE;
+  }
+
+  public final class MaterialThemeKt {
+    method @androidx.compose.runtime.Composable public static void MaterialTheme(optional androidx.compose.material.Colors colors, optional androidx.compose.material.Typography typography, optional androidx.compose.material.Shapes shapes, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class MaterialTheme_androidKt {
+  }
+
+  public final class MenuDefaults {
+    method public androidx.compose.foundation.layout.PaddingValues getDropdownMenuItemContentPadding();
+    property public final androidx.compose.foundation.layout.PaddingValues DropdownMenuItemContentPadding;
+    field public static final androidx.compose.material.MenuDefaults INSTANCE;
+  }
+
+  public final class MenuKt {
+  }
+
+  public final class ModalBottomSheetDefaults {
+    method public float getElevation();
+    method @androidx.compose.runtime.Composable public long getScrimColor();
+    property public final float Elevation;
+    property @androidx.compose.runtime.Composable public final long scrimColor;
+    field public static final androidx.compose.material.ModalBottomSheetDefaults INSTANCE;
+  }
+
+  public final class ModalBottomSheetKt {
+  }
+
+  public final class NavigationRailDefaults {
+    method public float getElevation();
+    property public final float Elevation;
+    field public static final androidx.compose.material.NavigationRailDefaults INSTANCE;
+  }
+
+  public final class NavigationRailKt {
+    method @androidx.compose.runtime.Composable public static void NavigationRail(optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float elevation, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? header, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void NavigationRailItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+  }
+
+  public final class OutlinedTextFieldKt {
+    method @androidx.compose.runtime.Composable public static void OutlinedTextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+    method @androidx.compose.runtime.Composable public static void OutlinedTextField(androidx.compose.ui.text.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.TextFieldValue,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+  }
+
+  public final class ProgressIndicatorDefaults {
+    method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getProgressAnimationSpec();
+    method public float getStrokeWidth();
+    property public final androidx.compose.animation.core.SpringSpec<java.lang.Float> ProgressAnimationSpec;
+    property public final float StrokeWidth;
+    field public static final androidx.compose.material.ProgressIndicatorDefaults INSTANCE;
+    field public static final float IndicatorBackgroundOpacity = 0.24f;
+  }
+
+  public final class ProgressIndicatorKt {
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void CircularProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional float strokeWidth);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(float progress, optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor);
+    method @androidx.compose.runtime.Composable public static void LinearProgressIndicator(optional androidx.compose.ui.Modifier modifier, optional long color, optional long backgroundColor);
+  }
+
+  @androidx.compose.runtime.Stable public interface RadioButtonColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> radioColor(boolean enabled, boolean selected);
+  }
+
+  public final class RadioButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.RadioButtonColors colors(optional long selectedColor, optional long unselectedColor, optional long disabledColor);
+    field public static final androidx.compose.material.RadioButtonDefaults INSTANCE;
+  }
+
+  public final class RadioButtonKt {
+    method @androidx.compose.runtime.Composable public static void RadioButton(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit>? onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.RadioButtonColors colors);
+  }
+
+  @androidx.compose.runtime.Immutable public final class ResistanceConfig {
+    ctor public ResistanceConfig(float basis, optional float factorAtMin, optional float factorAtMax);
+    method public float computeResistance(float overflow);
+    method public float getBasis();
+    method public float getFactorAtMax();
+    method public float getFactorAtMin();
+    property public final float basis;
+    property public final float factorAtMax;
+    property public final float factorAtMin;
+  }
+
+  public final class ScaffoldKt {
+    method @androidx.compose.runtime.Composable public static void Scaffold(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material.ScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarHostState,kotlin.Unit> snackbarHost, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional boolean isFloatingActionButtonDocked, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerElevation, optional long drawerBackgroundColor, optional long drawerContentColor, optional long drawerScrimColor, optional long backgroundColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static androidx.compose.material.ScaffoldState rememberScaffoldState(optional androidx.compose.material.DrawerState drawerState, optional androidx.compose.material.SnackbarHostState snackbarHostState);
+  }
+
+  @androidx.compose.runtime.Stable public final class ScaffoldState {
+    ctor public ScaffoldState(androidx.compose.material.DrawerState drawerState, androidx.compose.material.SnackbarHostState snackbarHostState);
+    method public androidx.compose.material.DrawerState getDrawerState();
+    method public androidx.compose.material.SnackbarHostState getSnackbarHostState();
+    property public final androidx.compose.material.DrawerState drawerState;
+    property public final androidx.compose.material.SnackbarHostState snackbarHostState;
+  }
+
+  @androidx.compose.runtime.Immutable public final class Shapes {
+    ctor public Shapes(optional androidx.compose.foundation.shape.CornerBasedShape small, optional androidx.compose.foundation.shape.CornerBasedShape medium, optional androidx.compose.foundation.shape.CornerBasedShape large);
+    method public androidx.compose.material.Shapes copy(optional androidx.compose.foundation.shape.CornerBasedShape small, optional androidx.compose.foundation.shape.CornerBasedShape medium, optional androidx.compose.foundation.shape.CornerBasedShape large);
+    method public androidx.compose.foundation.shape.CornerBasedShape getLarge();
+    method public androidx.compose.foundation.shape.CornerBasedShape getMedium();
+    method public androidx.compose.foundation.shape.CornerBasedShape getSmall();
+    property public final androidx.compose.foundation.shape.CornerBasedShape large;
+    property public final androidx.compose.foundation.shape.CornerBasedShape medium;
+    property public final androidx.compose.foundation.shape.CornerBasedShape small;
+  }
+
+  public final class ShapesKt {
+  }
+
+  @androidx.compose.runtime.Stable public interface SliderColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> thumbColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> tickColor(boolean enabled, boolean active);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trackColor(boolean enabled, boolean active);
+  }
+
+  public final class SliderDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.SliderColors colors(optional long thumbColor, optional long disabledThumbColor, optional long activeTrackColor, optional long inactiveTrackColor, optional long disabledActiveTrackColor, optional long disabledInactiveTrackColor, optional long activeTickColor, optional long inactiveTickColor, optional long disabledActiveTickColor, optional long disabledInactiveTickColor);
+    field public static final float DisabledActiveTrackAlpha = 0.32f;
+    field public static final float DisabledInactiveTrackAlpha = 0.12f;
+    field public static final float DisabledTickAlpha = 0.12f;
+    field public static final androidx.compose.material.SliderDefaults INSTANCE;
+    field public static final float InactiveTrackAlpha = 0.24f;
+    field public static final float TickAlpha = 0.54f;
+  }
+
+  public final class SliderKt {
+    method @androidx.compose.runtime.Composable public static void Slider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional int steps, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onValueChangeFinished, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.SliderColors colors);
+  }
+
+  public interface SnackbarData {
+    method public void dismiss();
+    method public String? getActionLabel();
+    method public androidx.compose.material.SnackbarDuration getDuration();
+    method public String getMessage();
+    method public void performAction();
+    property public abstract String? actionLabel;
+    property public abstract androidx.compose.material.SnackbarDuration duration;
+    property public abstract String message;
+  }
+
+  public final class SnackbarDefaults {
+    method @androidx.compose.runtime.Composable public long getBackgroundColor();
+    method @androidx.compose.runtime.Composable public long getPrimaryActionColor();
+    property @androidx.compose.runtime.Composable public final long backgroundColor;
+    property @androidx.compose.runtime.Composable public final long primaryActionColor;
+    field public static final androidx.compose.material.SnackbarDefaults INSTANCE;
+  }
+
+  public enum SnackbarDuration {
+    enum_constant public static final androidx.compose.material.SnackbarDuration Indefinite;
+    enum_constant public static final androidx.compose.material.SnackbarDuration Long;
+    enum_constant public static final androidx.compose.material.SnackbarDuration Short;
+  }
+
+  public final class SnackbarHostKt {
+    method @androidx.compose.runtime.Composable public static void SnackbarHost(androidx.compose.material.SnackbarHostState hostState, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.material.SnackbarData,kotlin.Unit> snackbar);
+  }
+
+  @androidx.compose.runtime.Stable public final class SnackbarHostState {
+    ctor public SnackbarHostState();
+    method public androidx.compose.material.SnackbarData? getCurrentSnackbarData();
+    method public suspend Object? showSnackbar(String message, optional String? actionLabel, optional androidx.compose.material.SnackbarDuration duration, optional kotlin.coroutines.Continuation<? super androidx.compose.material.SnackbarResult> p);
+    property public final androidx.compose.material.SnackbarData? currentSnackbarData;
+  }
+
+  public final class SnackbarKt {
+    method @androidx.compose.runtime.Composable public static void Snackbar(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? action, optional boolean actionOnNewLine, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional float elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Snackbar(androidx.compose.material.SnackbarData snackbarData, optional androidx.compose.ui.Modifier modifier, optional boolean actionOnNewLine, optional androidx.compose.ui.graphics.Shape shape, optional long backgroundColor, optional long contentColor, optional long actionColor, optional float elevation);
+  }
+
+  public enum SnackbarResult {
+    enum_constant public static final androidx.compose.material.SnackbarResult ActionPerformed;
+    enum_constant public static final androidx.compose.material.SnackbarResult Dismissed;
+  }
+
+  public final class Strings_androidKt {
+  }
+
+  public final class SurfaceKt {
+    method @androidx.compose.runtime.Composable public static void Surface(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional androidx.compose.foundation.BorderStroke? border, optional float elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class SwipeToDismissKt {
+  }
+
+  public final class SwipeableDefaults {
+    method public androidx.compose.animation.core.SpringSpec<java.lang.Float> getAnimationSpec();
+    method public float getVelocityThreshold();
+    method public androidx.compose.material.ResistanceConfig? resistanceConfig(java.util.Set<java.lang.Float> anchors, optional float factorAtMin, optional float factorAtMax);
+    property public final androidx.compose.animation.core.SpringSpec<java.lang.Float> AnimationSpec;
+    property public final float VelocityThreshold;
+    field public static final androidx.compose.material.SwipeableDefaults INSTANCE;
+    field public static final float StandardResistanceFactor = 10.0f;
+    field public static final float StiffResistanceFactor = 20.0f;
+  }
+
+  public final class SwipeableKt {
+  }
+
+  @androidx.compose.runtime.Stable public interface SwitchColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> thumbColor(boolean enabled, boolean checked);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trackColor(boolean enabled, boolean checked);
+  }
+
+  public final class SwitchDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material.SwitchColors colors(optional long checkedThumbColor, optional long checkedTrackColor, optional float checkedTrackAlpha, optional long uncheckedThumbColor, optional long uncheckedTrackColor, optional float uncheckedTrackAlpha, optional long disabledCheckedThumbColor, optional long disabledCheckedTrackColor, optional long disabledUncheckedThumbColor, optional long disabledUncheckedTrackColor);
+    field public static final androidx.compose.material.SwitchDefaults INSTANCE;
+  }
+
+  public final class SwitchKt {
+    method @androidx.compose.runtime.Composable public static void Switch(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit>? onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material.SwitchColors colors);
+  }
+
+  public final class TabKt {
+    method @androidx.compose.runtime.Composable public static void LeadingIconTab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
+    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TabPosition {
+    method public float getLeft();
+    method public float getRight();
+    method public float getWidth();
+    property public final float left;
+    property public final float right;
+    property public final float width;
+  }
+
+  public final class TabRowDefaults {
+    method @androidx.compose.runtime.Composable public void Divider(optional androidx.compose.ui.Modifier modifier, optional float thickness, optional long color);
+    method @androidx.compose.runtime.Composable public void Indicator(optional androidx.compose.ui.Modifier modifier, optional float height, optional long color);
+    method public float getDividerThickness();
+    method public float getIndicatorHeight();
+    method public float getScrollableTabRowPadding();
+    method public androidx.compose.ui.Modifier tabIndicatorOffset(androidx.compose.ui.Modifier, androidx.compose.material.TabPosition currentTabPosition);
+    property public final float DividerThickness;
+    property public final float IndicatorHeight;
+    property public final float ScrollableTabRowPadding;
+    field public static final float DividerOpacity = 0.12f;
+    field public static final androidx.compose.material.TabRowDefaults INSTANCE;
+  }
+
+  public final class TabRowKt {
+    method @androidx.compose.runtime.Composable public static void ScrollableTabRow(int selectedTabIndex, optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional float edgePadding, optional kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.material.TabPosition>,kotlin.Unit> indicator, optional kotlin.jvm.functions.Function0<kotlin.Unit> divider, kotlin.jvm.functions.Function0<kotlin.Unit> tabs);
+    method @androidx.compose.runtime.Composable public static void TabRow(int selectedTabIndex, optional androidx.compose.ui.Modifier modifier, optional long backgroundColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.material.TabPosition>,kotlin.Unit> indicator, optional kotlin.jvm.functions.Function0<kotlin.Unit> divider, kotlin.jvm.functions.Function0<kotlin.Unit> tabs);
+  }
+
+  @androidx.compose.runtime.Stable public interface TextFieldColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> backgroundColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> cursorColor(boolean isError);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> indicatorColor(boolean enabled, boolean isError, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> labelColor(boolean enabled, boolean error, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> leadingIconColor(boolean enabled, boolean isError);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> placeholderColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> textColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> trailingIconColor(boolean enabled, boolean isError);
+  }
+
+  public final class TextFieldDefaults {
+    method public float getMinHeight();
+    method public float getMinWidth();
+    method @androidx.compose.runtime.Composable public androidx.compose.material.TextFieldColors outlinedTextFieldColors(optional long textColor, optional long disabledTextColor, optional long backgroundColor, optional long cursorColor, optional long errorCursorColor, optional long focusedBorderColor, optional long unfocusedBorderColor, optional long disabledBorderColor, optional long errorBorderColor, optional long leadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long trailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material.TextFieldColors textFieldColors(optional long textColor, optional long disabledTextColor, optional long backgroundColor, optional long cursorColor, optional long errorCursorColor, optional long focusedIndicatorColor, optional long unfocusedIndicatorColor, optional long disabledIndicatorColor, optional long errorIndicatorColor, optional long leadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long trailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor);
+    property public final float MinHeight;
+    property public final float MinWidth;
+    field public static final float BackgroundOpacity = 0.12f;
+    field public static final androidx.compose.material.TextFieldDefaults INSTANCE;
+    field public static final float IconOpacity = 0.54f;
+    field public static final float UnfocusedIndicatorLineOpacity = 0.42f;
+  }
+
+  public final class TextFieldImplKt {
+  }
+
+  public final class TextFieldKt {
+    method @androidx.compose.runtime.Composable public static void TextField(String value, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+    method @androidx.compose.runtime.Composable public static void TextField(androidx.compose.ui.text.input.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.TextFieldValue,kotlin.Unit> onValueChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional boolean readOnly, optional androidx.compose.ui.text.TextStyle textStyle, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional kotlin.jvm.functions.Function0<kotlin.Unit>? placeholder, optional kotlin.jvm.functions.Function0<kotlin.Unit>? leadingIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? trailingIcon, optional boolean isError, optional androidx.compose.ui.text.input.VisualTransformation visualTransformation, optional androidx.compose.foundation.text.KeyboardOptions keyboardOptions, optional androidx.compose.foundation.text.KeyboardActions keyboardActions, optional boolean singleLine, optional int maxLines, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material.TextFieldColors colors);
+  }
+
+  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();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> LocalTextStyle;
+  }
+
+  public final class TouchTargetKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class Typography {
+    ctor public Typography(optional androidx.compose.ui.text.font.FontFamily defaultFontFamily, optional androidx.compose.ui.text.TextStyle h1, optional androidx.compose.ui.text.TextStyle h2, optional androidx.compose.ui.text.TextStyle h3, optional androidx.compose.ui.text.TextStyle h4, optional androidx.compose.ui.text.TextStyle h5, optional androidx.compose.ui.text.TextStyle h6, optional androidx.compose.ui.text.TextStyle subtitle1, optional androidx.compose.ui.text.TextStyle subtitle2, optional androidx.compose.ui.text.TextStyle body1, optional androidx.compose.ui.text.TextStyle body2, optional androidx.compose.ui.text.TextStyle button, optional androidx.compose.ui.text.TextStyle caption, optional androidx.compose.ui.text.TextStyle overline);
+    method public androidx.compose.material.Typography copy(optional androidx.compose.ui.text.TextStyle h1, optional androidx.compose.ui.text.TextStyle h2, optional androidx.compose.ui.text.TextStyle h3, optional androidx.compose.ui.text.TextStyle h4, optional androidx.compose.ui.text.TextStyle h5, optional androidx.compose.ui.text.TextStyle h6, optional androidx.compose.ui.text.TextStyle subtitle1, optional androidx.compose.ui.text.TextStyle subtitle2, optional androidx.compose.ui.text.TextStyle body1, optional androidx.compose.ui.text.TextStyle body2, optional androidx.compose.ui.text.TextStyle button, optional androidx.compose.ui.text.TextStyle caption, optional androidx.compose.ui.text.TextStyle overline);
+    method public androidx.compose.ui.text.TextStyle getBody1();
+    method public androidx.compose.ui.text.TextStyle getBody2();
+    method public androidx.compose.ui.text.TextStyle getButton();
+    method public androidx.compose.ui.text.TextStyle getCaption();
+    method public androidx.compose.ui.text.TextStyle getH1();
+    method public androidx.compose.ui.text.TextStyle getH2();
+    method public androidx.compose.ui.text.TextStyle getH3();
+    method public androidx.compose.ui.text.TextStyle getH4();
+    method public androidx.compose.ui.text.TextStyle getH5();
+    method public androidx.compose.ui.text.TextStyle getH6();
+    method public androidx.compose.ui.text.TextStyle getOverline();
+    method public androidx.compose.ui.text.TextStyle getSubtitle1();
+    method public androidx.compose.ui.text.TextStyle getSubtitle2();
+    property public final androidx.compose.ui.text.TextStyle body1;
+    property public final androidx.compose.ui.text.TextStyle body2;
+    property public final androidx.compose.ui.text.TextStyle button;
+    property public final androidx.compose.ui.text.TextStyle caption;
+    property public final androidx.compose.ui.text.TextStyle h1;
+    property public final androidx.compose.ui.text.TextStyle h2;
+    property public final androidx.compose.ui.text.TextStyle h3;
+    property public final androidx.compose.ui.text.TextStyle h4;
+    property public final androidx.compose.ui.text.TextStyle h5;
+    property public final androidx.compose.ui.text.TextStyle h6;
+    property public final androidx.compose.ui.text.TextStyle overline;
+    property public final androidx.compose.ui.text.TextStyle subtitle1;
+    property public final androidx.compose.ui.text.TextStyle subtitle2;
+  }
+
+  public final class TypographyKt {
+  }
+
+}
+
+package androidx.compose.material.internal {
+
+  public final class ExposedDropdownMenuPopupKt {
+  }
+
+}
+
diff --git a/compose/material/material/api/restricted_current.ignore b/compose/material/material/api/restricted_current.ignore
index 557e57e..4aae248 100644
--- a/compose/material/material/api/restricted_current.ignore
+++ b/compose/material/material/api/restricted_current.ignore
@@ -1,5 +1,5 @@
 // Baseline format: 1.0
-RemovedMethod: androidx.compose.material.ButtonDefaults#elevation(float, float, float):
-    Removed method androidx.compose.material.ButtonDefaults.elevation(float,float,float)
-RemovedMethod: androidx.compose.material.FloatingActionButtonDefaults#elevation(float, float):
-    Removed method androidx.compose.material.FloatingActionButtonDefaults.elevation(float,float)
+InvalidNullConversion: androidx.compose.material.ButtonDefaults#elevation(float, float, float):
+    Attempted to remove @NonNull annotation from method androidx.compose.material.ButtonDefaults.elevation(float,float,float)
+InvalidNullConversion: androidx.compose.material.FloatingActionButtonDefaults#elevation(float, float):
+    Attempted to remove @NonNull annotation from method androidx.compose.material.FloatingActionButtonDefaults.elevation(float,float)
diff --git a/compose/material/material/api/restricted_current.txt b/compose/material/material/api/restricted_current.txt
index 0ca2bd3..320de09 100644
--- a/compose/material/material/api/restricted_current.txt
+++ b/compose/material/material/api/restricted_current.txt
@@ -82,6 +82,7 @@
   public final class ButtonDefaults {
     method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonColors buttonColors(optional long backgroundColor, optional long contentColor, optional long disabledBackgroundColor, optional long disabledContentColor);
     method @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation, optional float hoveredElevation, optional float focusedElevation);
+    method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material.ButtonElevation! elevation(optional float defaultElevation, optional float pressedElevation, optional float disabledElevation);
     method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
     method public float getIconSize();
     method public float getIconSpacing();
@@ -185,10 +186,12 @@
 
   public final class ContentAlphaKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float> getLocalContentAlpha();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float> LocalContentAlpha;
   }
 
   public final class ContentColorKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> LocalContentColor;
   }
 
   public enum DismissDirection {
@@ -257,6 +260,8 @@
   public final class ElevationOverlayKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteElevation();
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> getLocalElevationOverlay();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> LocalAbsoluteElevation;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> LocalElevationOverlay;
   }
 
   public final class ExposedDropdownMenuKt {
@@ -275,6 +280,7 @@
 
   public final class FloatingActionButtonDefaults {
     method @androidx.compose.runtime.Composable public androidx.compose.material.FloatingActionButtonElevation elevation(optional float defaultElevation, optional float pressedElevation, optional float hoveredElevation, optional float focusedElevation);
+    method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material.FloatingActionButtonElevation! elevation(optional float defaultElevation, optional float pressedElevation);
     field public static final androidx.compose.material.FloatingActionButtonDefaults INSTANCE;
   }
 
@@ -599,6 +605,7 @@
     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();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> LocalTextStyle;
   }
 
   public final class TouchTargetKt {
diff --git a/compose/material/material/benchmark/build.gradle b/compose/material/material/benchmark/build.gradle
index d629502..d4ecbd0 100644
--- a/compose/material/material/benchmark/build.gradle
+++ b/compose/material/material/benchmark/build.gradle
@@ -26,7 +26,6 @@
     kotlinPlugin project(":compose:compiler:compiler")
 
     androidTestImplementation project(":benchmark:benchmark-junit4")
-    androidTestImplementation project(":benchmark:benchmark-macro-junit4")
     androidTestImplementation project(":compose:runtime:runtime")
     androidTestImplementation project(":compose:ui:ui-text:ui-text-benchmark")
     androidTestImplementation project(":compose:foundation:foundation")
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonScreenshotTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonScreenshotTest.kt
index c3f82d1..a6b23b8 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonScreenshotTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonScreenshotTest.kt
@@ -81,8 +81,6 @@
 
     @Test
     fun ripple() {
-        rule.mainClock.autoAdvance = false
-
         rule.setMaterialContent {
             Box(Modifier.requiredSize(200.dp, 100.dp).wrapContentSize()) {
                 Button(onClick = { }) { }
@@ -93,9 +91,6 @@
         rule.onNode(hasClickAction())
             .performTouchInput { down(center) }
 
-        // Advance past the tap timeout
-        rule.mainClock.advanceTimeBy(100)
-
         rule.waitForIdle()
         // Ripples are drawn on the RenderThread, not the main (UI) thread, so we can't
         // properly wait for synchronization. Instead just wait until after the ripples are
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/CardTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/CardTest.kt
index c3bb4bf..84babea 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/CardTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/CardTest.kt
@@ -185,8 +185,6 @@
 
         var scope: CoroutineScope? = null
 
-        rule.mainClock.autoAdvance = false
-
         rule.setContent {
             scope = rememberCoroutineScope()
             Card(
@@ -211,9 +209,6 @@
         rule.onNodeWithTag("card")
             .performTouchInput { down(center) }
 
-        // Advance past the tap timeout
-        rule.mainClock.advanceTimeBy(100)
-
         rule.runOnIdle {
             Truth.assertThat(interactions).hasSize(1)
             Truth.assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/CheckboxScreenshotTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/CheckboxScreenshotTest.kt
index b133192..7a60df7 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/CheckboxScreenshotTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/CheckboxScreenshotTest.kt
@@ -92,9 +92,6 @@
             down(center)
         }
 
-        // Advance past the tap timeout
-        rule.mainClock.advanceTimeBy(100)
-
         // Ripples are drawn on the RenderThread, not the main (UI) thread, so we can't wait for
         // synchronization. Instead just wait until after the ripples are finished animating.
         Thread.sleep(300)
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/FloatingActionButtonScreenshotTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/FloatingActionButtonScreenshotTest.kt
index f8efa44..47e9598 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/FloatingActionButtonScreenshotTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/FloatingActionButtonScreenshotTest.kt
@@ -98,8 +98,6 @@
 
     @Test
     fun ripple() {
-        rule.mainClock.autoAdvance = false
-
         rule.setMaterialContent {
             Box(Modifier.requiredSize(100.dp, 100.dp).wrapContentSize()) {
                 FloatingActionButton(onClick = { }) {
@@ -112,9 +110,6 @@
         rule.onNode(hasClickAction())
             .performTouchInput { down(center) }
 
-        // Advance past the tap timeout
-        rule.mainClock.advanceTimeBy(100)
-
         rule.waitForIdle()
         // Ripples are drawn on the RenderThread, not the main (UI) thread, so we can't
         // properly wait for synchronization. Instead just wait until after the ripples are
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/RadioButtonScreenshotTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/RadioButtonScreenshotTest.kt
index c34f5cc..927efa9 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/RadioButtonScreenshotTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/RadioButtonScreenshotTest.kt
@@ -92,9 +92,6 @@
             down(center)
         }
 
-        // Advance past the tap timeout
-        rule.mainClock.advanceTimeBy(100)
-
         // Ripples are drawn on the RenderThread, not the main (UI) thread, so we can't wait for
         // synchronization. Instead just wait until after the ripples are finished animating.
         Thread.sleep(300)
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SurfaceTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SurfaceTest.kt
index 430d8ee..73a3faf 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SurfaceTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SurfaceTest.kt
@@ -281,8 +281,6 @@
 
         var scope: CoroutineScope? = null
 
-        rule.mainClock.autoAdvance = false
-
         rule.setContent {
             scope = rememberCoroutineScope()
             Surface(
@@ -307,9 +305,6 @@
         rule.onNodeWithTag("surface")
             .performTouchInput { down(center) }
 
-        // Advance past the tap timeout
-        rule.mainClock.advanceTimeBy(100)
-
         rule.runOnIdle {
             Truth.assertThat(interactions).hasSize(1)
             Truth.assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt
index 59ce852..1727e8c 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt
@@ -139,8 +139,6 @@
 
     @Test
     fun switchTest_pressed() {
-        rule.mainClock.autoAdvance = false
-
         rule.setMaterialContent {
             Box(wrapperModifier) {
                 Switch(checked = false, enabled = true, onCheckedChange = { })
@@ -151,9 +149,6 @@
             down(center)
         }
 
-        // Advance past the tap timeout
-        rule.mainClock.advanceTimeBy(100)
-
         // Ripples are drawn on the RenderThread, not the main (UI) thread, so we can't wait for
         // synchronization. Instead just wait until after the ripples are finished animating.
         Thread.sleep(300)
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ProgressIndicator.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ProgressIndicator.kt
index 136f02e..4a38486 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ProgressIndicator.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/ProgressIndicator.kt
@@ -28,7 +28,6 @@
 import androidx.compose.animation.core.rememberInfiniteTransition
 import androidx.compose.animation.core.tween
 import androidx.compose.foundation.Canvas
-import androidx.compose.foundation.focusable
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.progressSemantics
 import androidx.compose.material.ProgressIndicatorDefaults.IndicatorBackgroundOpacity
@@ -80,7 +79,6 @@
         modifier
             .progressSemantics(progress)
             .size(LinearIndicatorWidth, LinearIndicatorHeight)
-            .focusable()
     ) {
         val strokeWidth = size.height
         drawLinearIndicatorBackground(backgroundColor, strokeWidth)
@@ -157,7 +155,6 @@
         modifier
             .progressSemantics()
             .size(LinearIndicatorWidth, LinearIndicatorHeight)
-            .focusable()
     ) {
         val strokeWidth = size.height
         drawLinearIndicatorBackground(backgroundColor, strokeWidth)
@@ -237,7 +234,6 @@
         modifier
             .progressSemantics(progress)
             .size(CircularIndicatorDiameter)
-            .focusable()
     ) {
         // Start at 12 O'clock
         val startAngle = 270f
@@ -318,7 +314,6 @@
         modifier
             .progressSemantics()
             .size(CircularIndicatorDiameter)
-            .focusable()
     ) {
 
         val currentRotationAngleOffset = (currentRotation * RotationAngleOffset) % 360f
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Slider.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Slider.kt
index bfec8ff..d7ad38c 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Slider.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Slider.kt
@@ -758,7 +758,7 @@
     steps: Int = 0
 ): Modifier {
     val coerced = value.coerceIn(valueRange.start, valueRange.endInclusive)
-    return semantics(mergeDescendants = true) {
+    return semantics {
         if (!enabled) disabled()
         setProgress(
             action = { targetValue ->
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/compose-material-documentation.md b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/compose-material-documentation.md
index 9cacef8..f8a141e 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/compose-material-documentation.md
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/compose-material-documentation.md
@@ -10,7 +10,7 @@
 
 In this page, you'll find documentation for types, properties, and functions available in the `androidx.compose.material` package.
 
-For more information, check out the <a href="https://developer.android.com/jetpack/compose/themes" class="external" target="_blank">Theming in Compose</a> guide.
+For more information, check out the <a href="https://developer.android.com/jetpack/compose/themes/material" class="external" target="_blank">Material Theming in Compose</a> guide.
 
 ## Overview
 
@@ -83,4 +83,3 @@
 | ---- | -------- | --------------- |
 | **Surfaces** | [Surface] | Material surface |
 | **Layout** | [Scaffold] | Basic Material Design visual layout structure |
-
diff --git a/compose/material3/material3/api/current.txt b/compose/material3/material3/api/current.txt
index 17ac330..765df08 100644
--- a/compose/material3/material3/api/current.txt
+++ b/compose/material3/material3/api/current.txt
@@ -9,10 +9,61 @@
   }
 
   public final class AppBarKt {
-    method @androidx.compose.runtime.Composable public static void SmallCenteredTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
+    method @androidx.compose.runtime.Composable public static void CenterAlignedTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
+    method @androidx.compose.runtime.Composable public static void LargeTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
+    method @androidx.compose.runtime.Composable public static void MediumTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
     method @androidx.compose.runtime.Composable public static void SmallTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
   }
 
+  public final class BadgeKt {
+    method @androidx.compose.runtime.Composable public static void Badge(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? content);
+    method @androidx.compose.runtime.Composable public static void BadgedBox(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> badge, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Stable public interface ButtonColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> containerColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled);
+  }
+
+  public final class ButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors buttonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonElevation buttonElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float disabledElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors elevatedButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonElevation elevatedButtonElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float disabledElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors filledTonalButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonElevation filledTonalButtonElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float disabledElevation);
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getIconSize();
+    method public float getIconSpacing();
+    method public float getMinHeight();
+    method public float getMinWidth();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke getOutlinedButtonBorder();
+    method public androidx.compose.foundation.layout.PaddingValues getTextButtonContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors outlinedButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors textButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
+    property public final float IconSize;
+    property public final float IconSpacing;
+    property public final float MinHeight;
+    property public final float MinWidth;
+    property public final androidx.compose.foundation.layout.PaddingValues TextButtonContentPadding;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.BorderStroke outlinedButtonBorder;
+    field public static final androidx.compose.material3.ButtonDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public interface ButtonElevation {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> shadowElevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> tonalElevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
+  public final class ButtonKt {
+    method @androidx.compose.runtime.Composable public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material3.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material3.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void ElevatedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material3.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material3.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void FilledTonalButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material3.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material3.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void OutlinedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material3.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material3.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void TextButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material3.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material3.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
   @androidx.compose.runtime.Stable public final class ColorScheme {
     ctor public ColorScheme(long primary, long onPrimary, long primaryContainer, long onPrimaryContainer, long inversePrimary, long secondary, long onSecondary, long secondaryContainer, long onSecondaryContainer, long tertiary, long onTertiary, long tertiaryContainer, long onTertiaryContainer, long background, long onBackground, long surface, long onSurface, long surfaceVariant, long onSurfaceVariant, long inverseSurface, long inverseOnSurface, long error, long onError, long errorContainer, long onErrorContainer, long outline);
     method public androidx.compose.material3.ColorScheme copy(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 onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long inverseSurface, optional long inverseOnSurface, optional long error, optional long onError, optional long errorContainer, optional long onErrorContainer, optional long outline);
@@ -79,6 +130,7 @@
 
   public final class ContentColorKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> LocalContentColor;
   }
 
   public final class DynamicTonalPaletteKt {
@@ -86,6 +138,29 @@
     method @RequiresApi(android.os.Build.VERSION_CODES.S) public static androidx.compose.material3.ColorScheme dynamicLightColorScheme(android.content.Context context);
   }
 
+  public final class ElevationKt {
+  }
+
+  public final class FloatingActionButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.FloatingActionButtonElevation elevation(optional float defaultElevation, optional float hoveredElevation);
+    method public float getLargeIconSize();
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.FloatingActionButtonElevation loweredElevation(optional float defaultElevation, optional float hoveredElevation);
+    property public final float LargeIconSize;
+    field public static final androidx.compose.material3.FloatingActionButtonDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public interface FloatingActionButtonElevation {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> shadowElevation(androidx.compose.foundation.interaction.InteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> tonalElevation(androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
+  public final class FloatingActionButtonKt {
+    method @androidx.compose.runtime.Composable public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation);
+    method @androidx.compose.runtime.Composable public static void FloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void LargeFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void SmallFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
   public final class IconButtonKt {
     method @androidx.compose.runtime.Composable public static void IconButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void IconToggleButton(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
@@ -109,13 +184,57 @@
     method @androidx.compose.runtime.Composable public static void MaterialTheme(optional androidx.compose.material3.ColorScheme colorScheme, optional androidx.compose.material3.Typography typography, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
+  @androidx.compose.runtime.Stable public interface NavigationBarItemColors {
+    method @androidx.compose.runtime.Composable public long getIndicatorColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> iconColor(boolean selected);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> textColor(boolean selected);
+    property @androidx.compose.runtime.Composable public abstract long indicatorColor;
+  }
+
+  public final class NavigationBarItemDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.NavigationBarItemColors colors(optional long selectedIconColor, optional long unselectedIconColor, optional long selectedTextColor, optional long unselectedTextColor, optional long indicatorColor);
+    field public static final androidx.compose.material3.NavigationBarItemDefaults INSTANCE;
+  }
+
+  public final class NavigationBarKt {
+    method @androidx.compose.runtime.Composable public static void NavigationBar(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float tonalElevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void NavigationBarItem(androidx.compose.foundation.layout.RowScope, boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material3.NavigationBarItemColors colors);
+  }
+
+  public final class NavigationDrawerKt {
+  }
+
+  @androidx.compose.runtime.Stable public interface NavigationRailItemColors {
+    method @androidx.compose.runtime.Composable public long getIndicatorColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> iconColor(boolean selected);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> textColor(boolean selected);
+    property @androidx.compose.runtime.Composable public abstract long indicatorColor;
+  }
+
+  public final class NavigationRailItemDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.NavigationRailItemColors colors(optional long selectedIconColor, optional long unselectedIconColor, optional long selectedTextColor, optional long unselectedTextColor, optional long indicatorColor);
+    field public static final androidx.compose.material3.NavigationRailItemDefaults INSTANCE;
+  }
+
+  public final class NavigationRailKt {
+    method @androidx.compose.runtime.Composable public static void NavigationRail(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? header, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void NavigationRailItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material3.NavigationRailItemColors colors);
+  }
+
   public final class ScaffoldKt {
   }
 
+  public final class Strings_androidKt {
+  }
+
   public final class SurfaceKt {
     method @androidx.compose.runtime.Composable public static void Surface(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional float tonalElevation, optional float shadowElevation, optional androidx.compose.foundation.BorderStroke? border, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void Surface(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional float tonalElevation, optional float shadowElevation, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteTonalElevation();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> LocalAbsoluteTonalElevation;
+  }
+
+  public final class SwipeableKt {
   }
 
   public final class TextKt {
@@ -123,23 +242,24 @@
     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();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> LocalTextStyle;
   }
 
   public final class TonalPaletteKt {
   }
 
   @androidx.compose.runtime.Stable public interface TopAppBarColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> actionIconColor(float scrollFraction);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> actionIconContentColor(float scrollFraction);
     method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> containerColor(float scrollFraction);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> navigationIconColor(float scrollFraction);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> titleColor(float scrollFraction);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> navigationIconContentColor(float scrollFraction);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> titleContentColor(float scrollFraction);
   }
 
   public final class TopAppBarDefaults {
-    method public androidx.compose.material3.TopAppBarScrollBehavior enterAlwaysScrollBehavior(optional kotlin.jvm.functions.Function0<java.lang.Boolean> canScroll);
-    method public androidx.compose.material3.TopAppBarScrollBehavior pinnedScrollBehavior(optional kotlin.jvm.functions.Function0<java.lang.Boolean> canScroll);
-    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors smallCenteredTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconColor, optional long titleColor, optional long actionIconsColor);
-    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors smallTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconColor, optional long titleColor, optional long actionIconsColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors centerAlignedTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors largeTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors mediumTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors smallTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
     field public static final androidx.compose.material3.TopAppBarDefaults INSTANCE;
   }
 
diff --git a/compose/material3/material3/api/public_plus_experimental_current.txt b/compose/material3/material3/api/public_plus_experimental_current.txt
index a39ea89..61014d4 100644
--- a/compose/material3/material3/api/public_plus_experimental_current.txt
+++ b/compose/material3/material3/api/public_plus_experimental_current.txt
@@ -9,10 +9,61 @@
   }
 
   public final class AppBarKt {
-    method @androidx.compose.runtime.Composable public static void SmallCenteredTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
+    method @androidx.compose.runtime.Composable public static void CenterAlignedTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
+    method @androidx.compose.runtime.Composable public static void LargeTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
+    method @androidx.compose.runtime.Composable public static void MediumTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
     method @androidx.compose.runtime.Composable public static void SmallTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
   }
 
+  public final class BadgeKt {
+    method @androidx.compose.runtime.Composable public static void Badge(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? content);
+    method @androidx.compose.runtime.Composable public static void BadgedBox(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> badge, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Stable public interface ButtonColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> containerColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled);
+  }
+
+  public final class ButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors buttonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonElevation buttonElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float disabledElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors elevatedButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonElevation elevatedButtonElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float disabledElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors filledTonalButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonElevation filledTonalButtonElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float disabledElevation);
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getIconSize();
+    method public float getIconSpacing();
+    method public float getMinHeight();
+    method public float getMinWidth();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke getOutlinedButtonBorder();
+    method public androidx.compose.foundation.layout.PaddingValues getTextButtonContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors outlinedButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors textButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
+    property public final float IconSize;
+    property public final float IconSpacing;
+    property public final float MinHeight;
+    property public final float MinWidth;
+    property public final androidx.compose.foundation.layout.PaddingValues TextButtonContentPadding;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.BorderStroke outlinedButtonBorder;
+    field public static final androidx.compose.material3.ButtonDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public interface ButtonElevation {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> shadowElevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> tonalElevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
+  public final class ButtonKt {
+    method @androidx.compose.runtime.Composable public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material3.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material3.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void ElevatedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material3.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material3.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void FilledTonalButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material3.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material3.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void OutlinedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material3.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material3.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void TextButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material3.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material3.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
   @androidx.compose.runtime.Stable public final class ColorScheme {
     ctor public ColorScheme(long primary, long onPrimary, long primaryContainer, long onPrimaryContainer, long inversePrimary, long secondary, long onSecondary, long secondaryContainer, long onSecondaryContainer, long tertiary, long onTertiary, long tertiaryContainer, long onTertiaryContainer, long background, long onBackground, long surface, long onSurface, long surfaceVariant, long onSurfaceVariant, long inverseSurface, long inverseOnSurface, long error, long onError, long errorContainer, long onErrorContainer, long outline);
     method public androidx.compose.material3.ColorScheme copy(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 onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long inverseSurface, optional long inverseOnSurface, optional long error, optional long onError, optional long errorContainer, optional long onErrorContainer, optional long outline);
@@ -79,6 +130,45 @@
 
   public final class ContentColorKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> LocalContentColor;
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api public final class DrawerDefaults {
+    method public float getElevation();
+    method @androidx.compose.runtime.Composable public long getScrimColor();
+    property public final float Elevation;
+    property @androidx.compose.runtime.Composable public final long scrimColor;
+    field public static final androidx.compose.material3.DrawerDefaults INSTANCE;
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Stable public final class DrawerState {
+    ctor public DrawerState(androidx.compose.material3.DrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material3.DrawerValue,java.lang.Boolean> confirmStateChange);
+    method @androidx.compose.material3.ExperimentalMaterial3Api public suspend Object? animateTo(androidx.compose.material3.DrawerValue targetValue, androidx.compose.animation.core.AnimationSpec<java.lang.Float> anim, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public suspend Object? close(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public androidx.compose.material3.DrawerValue getCurrentValue();
+    method @androidx.compose.material3.ExperimentalMaterial3Api public androidx.compose.runtime.State<java.lang.Float> getOffset();
+    method @androidx.compose.material3.ExperimentalMaterial3Api public androidx.compose.material3.DrawerValue getTargetValue();
+    method public boolean isAnimationRunning();
+    method public boolean isClosed();
+    method public boolean isOpen();
+    method public suspend Object? open(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method @androidx.compose.material3.ExperimentalMaterial3Api public suspend Object? snapTo(androidx.compose.material3.DrawerValue targetValue, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    property public final androidx.compose.material3.DrawerValue currentValue;
+    property public final boolean isAnimationRunning;
+    property public final boolean isClosed;
+    property public final boolean isOpen;
+    property @androidx.compose.material3.ExperimentalMaterial3Api public final androidx.compose.runtime.State<java.lang.Float> offset;
+    property @androidx.compose.material3.ExperimentalMaterial3Api public final androidx.compose.material3.DrawerValue targetValue;
+    field public static final androidx.compose.material3.DrawerState.Companion Companion;
+  }
+
+  public static final class DrawerState.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.material3.DrawerState,androidx.compose.material3.DrawerValue> Saver(kotlin.jvm.functions.Function1<? super androidx.compose.material3.DrawerValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api public enum DrawerValue {
+    enum_constant public static final androidx.compose.material3.DrawerValue Closed;
+    enum_constant public static final androidx.compose.material3.DrawerValue Open;
   }
 
   public final class DynamicTonalPaletteKt {
@@ -86,6 +176,9 @@
     method @RequiresApi(android.os.Build.VERSION_CODES.S) public static androidx.compose.material3.ColorScheme dynamicLightColorScheme(android.content.Context context);
   }
 
+  public final class ElevationKt {
+  }
+
   @kotlin.RequiresOptIn(message="This material API is experimental and is likely to change or to be removed in" + " the future.") public @interface ExperimentalMaterial3Api {
   }
 
@@ -100,6 +193,26 @@
     property public final int End;
   }
 
+  public final class FloatingActionButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.FloatingActionButtonElevation elevation(optional float defaultElevation, optional float hoveredElevation);
+    method public float getLargeIconSize();
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.FloatingActionButtonElevation loweredElevation(optional float defaultElevation, optional float hoveredElevation);
+    property public final float LargeIconSize;
+    field public static final androidx.compose.material3.FloatingActionButtonDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public interface FloatingActionButtonElevation {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> shadowElevation(androidx.compose.foundation.interaction.InteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> tonalElevation(androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
+  public final class FloatingActionButtonKt {
+    method @androidx.compose.runtime.Composable public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation);
+    method @androidx.compose.runtime.Composable public static void FloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void LargeFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void SmallFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
   public final class IconButtonKt {
     method @androidx.compose.runtime.Composable public static void IconButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void IconToggleButton(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
@@ -123,14 +236,67 @@
     method @androidx.compose.runtime.Composable public static void MaterialTheme(optional androidx.compose.material3.ColorScheme colorScheme, optional androidx.compose.material3.Typography typography, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
+  @androidx.compose.runtime.Stable public interface NavigationBarItemColors {
+    method @androidx.compose.runtime.Composable public long getIndicatorColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> iconColor(boolean selected);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> textColor(boolean selected);
+    property @androidx.compose.runtime.Composable public abstract long indicatorColor;
+  }
+
+  public final class NavigationBarItemDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.NavigationBarItemColors colors(optional long selectedIconColor, optional long unselectedIconColor, optional long selectedTextColor, optional long unselectedTextColor, optional long indicatorColor);
+    field public static final androidx.compose.material3.NavigationBarItemDefaults INSTANCE;
+  }
+
+  public final class NavigationBarKt {
+    method @androidx.compose.runtime.Composable public static void NavigationBar(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float tonalElevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void NavigationBarItem(androidx.compose.foundation.layout.RowScope, boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material3.NavigationBarItemColors colors);
+  }
+
+  public final class NavigationDrawerKt {
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void NavigationDrawer(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> drawerContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material3.DrawerState drawerState, optional boolean gesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerTonalElevation, optional long drawerContainerColor, optional long drawerContentColor, optional long scrimColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static androidx.compose.material3.DrawerState rememberDrawerState(androidx.compose.material3.DrawerValue initialValue, optional kotlin.jvm.functions.Function1<? super androidx.compose.material3.DrawerValue,java.lang.Boolean> confirmStateChange);
+  }
+
+  @androidx.compose.runtime.Stable public interface NavigationRailItemColors {
+    method @androidx.compose.runtime.Composable public long getIndicatorColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> iconColor(boolean selected);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> textColor(boolean selected);
+    property @androidx.compose.runtime.Composable public abstract long indicatorColor;
+  }
+
+  public final class NavigationRailItemDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.NavigationRailItemColors colors(optional long selectedIconColor, optional long unselectedIconColor, optional long selectedTextColor, optional long unselectedTextColor, optional long indicatorColor);
+    field public static final androidx.compose.material3.NavigationRailItemDefaults INSTANCE;
+  }
+
+  public final class NavigationRailKt {
+    method @androidx.compose.runtime.Composable public static void NavigationRail(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? header, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void NavigationRailItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material3.NavigationRailItemColors colors);
+  }
+
   public final class ScaffoldKt {
-    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void Scaffold(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional long containerColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void Scaffold(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material3.ScaffoldState scaffoldState, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? drawerContent, optional boolean drawerGesturesEnabled, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerTonalElevation, optional long drawerContainerColor, optional long drawerContentColor, optional long drawerScrimColor, optional long containerColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
+    method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static androidx.compose.material3.ScaffoldState rememberScaffoldState(optional androidx.compose.material3.DrawerState drawerState);
+  }
+
+  @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Stable public final class ScaffoldState {
+    ctor public ScaffoldState(androidx.compose.material3.DrawerState drawerState);
+    method public androidx.compose.material3.DrawerState getDrawerState();
+    property public final androidx.compose.material3.DrawerState drawerState;
+  }
+
+  public final class Strings_androidKt {
   }
 
   public final class SurfaceKt {
     method @androidx.compose.runtime.Composable public static void Surface(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional float tonalElevation, optional float shadowElevation, optional androidx.compose.foundation.BorderStroke? border, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void Surface(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional float tonalElevation, optional float shadowElevation, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteTonalElevation();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> LocalAbsoluteTonalElevation;
+  }
+
+  public final class SwipeableKt {
   }
 
   public final class TextKt {
@@ -138,23 +304,27 @@
     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();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> LocalTextStyle;
   }
 
   public final class TonalPaletteKt {
   }
 
   @androidx.compose.runtime.Stable public interface TopAppBarColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> actionIconColor(float scrollFraction);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> actionIconContentColor(float scrollFraction);
     method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> containerColor(float scrollFraction);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> navigationIconColor(float scrollFraction);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> titleColor(float scrollFraction);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> navigationIconContentColor(float scrollFraction);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> titleContentColor(float scrollFraction);
   }
 
   public final class TopAppBarDefaults {
-    method public androidx.compose.material3.TopAppBarScrollBehavior enterAlwaysScrollBehavior(optional kotlin.jvm.functions.Function0<java.lang.Boolean> canScroll);
-    method public androidx.compose.material3.TopAppBarScrollBehavior pinnedScrollBehavior(optional kotlin.jvm.functions.Function0<java.lang.Boolean> canScroll);
-    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors smallCenteredTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconColor, optional long titleColor, optional long actionIconsColor);
-    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors smallTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconColor, optional long titleColor, optional long actionIconsColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors centerAlignedTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
+    method @androidx.compose.material3.ExperimentalMaterial3Api public androidx.compose.material3.TopAppBarScrollBehavior enterAlwaysScrollBehavior(optional kotlin.jvm.functions.Function0<java.lang.Boolean> canScroll);
+    method @androidx.compose.material3.ExperimentalMaterial3Api public androidx.compose.material3.TopAppBarScrollBehavior exitUntilCollapsedScrollBehavior(androidx.compose.animation.core.DecayAnimationSpec<java.lang.Float> decayAnimationSpec, optional kotlin.jvm.functions.Function0<java.lang.Boolean> canScroll);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors largeTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors mediumTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
+    method @androidx.compose.material3.ExperimentalMaterial3Api public androidx.compose.material3.TopAppBarScrollBehavior pinnedScrollBehavior(optional kotlin.jvm.functions.Function0<java.lang.Boolean> canScroll);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors smallTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
     field public static final androidx.compose.material3.TopAppBarDefaults INSTANCE;
   }
 
@@ -176,6 +346,7 @@
 
   public final class TouchTargetKt {
     method @androidx.compose.material3.ExperimentalMaterial3Api public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalMinimumTouchTargetEnforcement();
+    property @androidx.compose.material3.ExperimentalMaterial3Api public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> LocalMinimumTouchTargetEnforcement;
   }
 
   @androidx.compose.runtime.Immutable public final class Typography {
diff --git a/compose/material3/material3/api/restricted_current.txt b/compose/material3/material3/api/restricted_current.txt
index 17ac330..765df08 100644
--- a/compose/material3/material3/api/restricted_current.txt
+++ b/compose/material3/material3/api/restricted_current.txt
@@ -9,10 +9,61 @@
   }
 
   public final class AppBarKt {
-    method @androidx.compose.runtime.Composable public static void SmallCenteredTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
+    method @androidx.compose.runtime.Composable public static void CenterAlignedTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
+    method @androidx.compose.runtime.Composable public static void LargeTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
+    method @androidx.compose.runtime.Composable public static void MediumTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
     method @androidx.compose.runtime.Composable public static void SmallTopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> actions, optional androidx.compose.material3.TopAppBarColors colors, optional androidx.compose.material3.TopAppBarScrollBehavior? scrollBehavior);
   }
 
+  public final class BadgeKt {
+    method @androidx.compose.runtime.Composable public static void Badge(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? content);
+    method @androidx.compose.runtime.Composable public static void BadgedBox(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> badge, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+  }
+
+  @androidx.compose.runtime.Stable public interface ButtonColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> containerColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled);
+  }
+
+  public final class ButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors buttonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonElevation buttonElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float disabledElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors elevatedButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonElevation elevatedButtonElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float disabledElevation);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors filledTonalButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonElevation filledTonalButtonElevation(optional float defaultElevation, optional float pressedElevation, optional float focusedElevation, optional float hoveredElevation, optional float disabledElevation);
+    method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
+    method public float getIconSize();
+    method public float getIconSpacing();
+    method public float getMinHeight();
+    method public float getMinWidth();
+    method @androidx.compose.runtime.Composable public androidx.compose.foundation.BorderStroke getOutlinedButtonBorder();
+    method public androidx.compose.foundation.layout.PaddingValues getTextButtonContentPadding();
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors outlinedButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.ButtonColors textButtonColors(optional long containerColor, optional long contentColor, optional long disabledContainerColor, optional long disabledContentColor);
+    property public final androidx.compose.foundation.layout.PaddingValues ContentPadding;
+    property public final float IconSize;
+    property public final float IconSpacing;
+    property public final float MinHeight;
+    property public final float MinWidth;
+    property public final androidx.compose.foundation.layout.PaddingValues TextButtonContentPadding;
+    property @androidx.compose.runtime.Composable public final androidx.compose.foundation.BorderStroke outlinedButtonBorder;
+    field public static final androidx.compose.material3.ButtonDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public interface ButtonElevation {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> shadowElevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> tonalElevation(boolean enabled, androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
+  public final class ButtonKt {
+    method @androidx.compose.runtime.Composable public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material3.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material3.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void ElevatedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material3.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material3.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void FilledTonalButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material3.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material3.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void OutlinedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material3.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material3.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void TextButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material3.ButtonElevation? elevation, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.material3.ButtonColors colors, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+  }
+
   @androidx.compose.runtime.Stable public final class ColorScheme {
     ctor public ColorScheme(long primary, long onPrimary, long primaryContainer, long onPrimaryContainer, long inversePrimary, long secondary, long onSecondary, long secondaryContainer, long onSecondaryContainer, long tertiary, long onTertiary, long tertiaryContainer, long onTertiaryContainer, long background, long onBackground, long surface, long onSurface, long surfaceVariant, long onSurfaceVariant, long inverseSurface, long inverseOnSurface, long error, long onError, long errorContainer, long onErrorContainer, long outline);
     method public androidx.compose.material3.ColorScheme copy(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 onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long inverseSurface, optional long inverseOnSurface, optional long error, optional long onError, optional long errorContainer, optional long onErrorContainer, optional long outline);
@@ -79,6 +130,7 @@
 
   public final class ContentColorKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> LocalContentColor;
   }
 
   public final class DynamicTonalPaletteKt {
@@ -86,6 +138,29 @@
     method @RequiresApi(android.os.Build.VERSION_CODES.S) public static androidx.compose.material3.ColorScheme dynamicLightColorScheme(android.content.Context context);
   }
 
+  public final class ElevationKt {
+  }
+
+  public final class FloatingActionButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.FloatingActionButtonElevation elevation(optional float defaultElevation, optional float hoveredElevation);
+    method public float getLargeIconSize();
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.FloatingActionButtonElevation loweredElevation(optional float defaultElevation, optional float hoveredElevation);
+    property public final float LargeIconSize;
+    field public static final androidx.compose.material3.FloatingActionButtonDefaults INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public interface FloatingActionButtonElevation {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> shadowElevation(androidx.compose.foundation.interaction.InteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.unit.Dp> tonalElevation(androidx.compose.foundation.interaction.InteractionSource interactionSource);
+  }
+
+  public final class FloatingActionButtonKt {
+    method @androidx.compose.runtime.Composable public static void ExtendedFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation);
+    method @androidx.compose.runtime.Composable public static void FloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void LargeFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void SmallFloatingActionButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional long containerColor, optional long contentColor, optional androidx.compose.material3.FloatingActionButtonElevation elevation, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
   public final class IconButtonKt {
     method @androidx.compose.runtime.Composable public static void IconButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void IconToggleButton(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
@@ -109,13 +184,57 @@
     method @androidx.compose.runtime.Composable public static void MaterialTheme(optional androidx.compose.material3.ColorScheme colorScheme, optional androidx.compose.material3.Typography typography, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
+  @androidx.compose.runtime.Stable public interface NavigationBarItemColors {
+    method @androidx.compose.runtime.Composable public long getIndicatorColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> iconColor(boolean selected);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> textColor(boolean selected);
+    property @androidx.compose.runtime.Composable public abstract long indicatorColor;
+  }
+
+  public final class NavigationBarItemDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.NavigationBarItemColors colors(optional long selectedIconColor, optional long unselectedIconColor, optional long selectedTextColor, optional long unselectedTextColor, optional long indicatorColor);
+    field public static final androidx.compose.material3.NavigationBarItemDefaults INSTANCE;
+  }
+
+  public final class NavigationBarKt {
+    method @androidx.compose.runtime.Composable public static void NavigationBar(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float tonalElevation, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void NavigationBarItem(androidx.compose.foundation.layout.RowScope, boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material3.NavigationBarItemColors colors);
+  }
+
+  public final class NavigationDrawerKt {
+  }
+
+  @androidx.compose.runtime.Stable public interface NavigationRailItemColors {
+    method @androidx.compose.runtime.Composable public long getIndicatorColor();
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> iconColor(boolean selected);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> textColor(boolean selected);
+    property @androidx.compose.runtime.Composable public abstract long indicatorColor;
+  }
+
+  public final class NavigationRailItemDefaults {
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.NavigationRailItemColors colors(optional long selectedIconColor, optional long unselectedIconColor, optional long selectedTextColor, optional long unselectedTextColor, optional long indicatorColor);
+    field public static final androidx.compose.material3.NavigationRailItemDefaults INSTANCE;
+  }
+
+  public final class NavigationRailKt {
+    method @androidx.compose.runtime.Composable public static void NavigationRail(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit>? header, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void NavigationRailItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.material3.NavigationRailItemColors colors);
+  }
+
   public final class ScaffoldKt {
   }
 
+  public final class Strings_androidKt {
+  }
+
   public final class SurfaceKt {
     method @androidx.compose.runtime.Composable public static void Surface(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional float tonalElevation, optional float shadowElevation, optional androidx.compose.foundation.BorderStroke? border, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void Surface(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional float tonalElevation, optional float shadowElevation, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteTonalElevation();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> LocalAbsoluteTonalElevation;
+  }
+
+  public final class SwipeableKt {
   }
 
   public final class TextKt {
@@ -123,23 +242,24 @@
     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();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> LocalTextStyle;
   }
 
   public final class TonalPaletteKt {
   }
 
   @androidx.compose.runtime.Stable public interface TopAppBarColors {
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> actionIconColor(float scrollFraction);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> actionIconContentColor(float scrollFraction);
     method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> containerColor(float scrollFraction);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> navigationIconColor(float scrollFraction);
-    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> titleColor(float scrollFraction);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> navigationIconContentColor(float scrollFraction);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> titleContentColor(float scrollFraction);
   }
 
   public final class TopAppBarDefaults {
-    method public androidx.compose.material3.TopAppBarScrollBehavior enterAlwaysScrollBehavior(optional kotlin.jvm.functions.Function0<java.lang.Boolean> canScroll);
-    method public androidx.compose.material3.TopAppBarScrollBehavior pinnedScrollBehavior(optional kotlin.jvm.functions.Function0<java.lang.Boolean> canScroll);
-    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors smallCenteredTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconColor, optional long titleColor, optional long actionIconsColor);
-    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors smallTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconColor, optional long titleColor, optional long actionIconsColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors centerAlignedTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors largeTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors mediumTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
+    method @androidx.compose.runtime.Composable public androidx.compose.material3.TopAppBarColors smallTopAppBarColors(optional long containerColor, optional long scrolledContainerColor, optional long navigationIconContentColor, optional long titleContentColor, optional long actionIconContentColor);
     field public static final androidx.compose.material3.TopAppBarDefaults INSTANCE;
   }
 
diff --git a/compose/material3/material3/build.gradle b/compose/material3/material3/build.gradle
index 5ce98d0..1c9d7d0 100644
--- a/compose/material3/material3/build.gradle
+++ b/compose/material3/material3/build.gradle
@@ -37,14 +37,16 @@
          * corresponding block below
          */
         implementation(libs.kotlinStdlibCommon)
-        implementation(project(":compose:foundation:foundation-layout"))
+        implementation("androidx.compose.animation:animation-core:1.1.0-beta01")
+        implementation("androidx.compose.foundation:foundation-layout:1.1.0-beta01")
+        implementation("androidx.compose.ui:ui-util:1.0.0")
 
-        api(project(":compose:foundation:foundation"))
+        api("androidx.compose.foundation:foundation:1.1.0-beta01")
         api("androidx.compose.material:material-icons-core:1.0.2")
         api("androidx.compose.material:material-ripple:1.0.0")
         api("androidx.compose.runtime:runtime:1.0.1")
         api("androidx.compose.ui:ui-graphics:1.0.1")
-        api(project(":compose:ui:ui"))
+        api("androidx.compose.ui:ui:1.1.0-beta01")
         api("androidx.compose.ui:ui-text:1.0.1")
 
         testImplementation(libs.testRules)
@@ -77,6 +79,7 @@
         sourceSets {
             commonMain.dependencies {
                 implementation(libs.kotlinStdlibCommon)
+                implementation(project(":compose:animation:animation-core"))
 
                 api(project(":compose:foundation:foundation"))
                 api(project(":compose:material:material-icons-core"))
@@ -84,6 +87,8 @@
                 api(project(":compose:runtime:runtime"))
                 api(project(":compose:ui:ui-graphics"))
                 api(project(":compose:ui:ui-text"))
+
+                implementation(project(":compose:ui:ui-util"))
             }
 
             androidMain.dependencies {
@@ -121,8 +126,6 @@
 androidx {
     name = "Compose Material3 Components"
     type = LibraryType.PUBLISHED_LIBRARY
-    // Remove this `publish = Publish.` line when ready start publishing module
-    publish = Publish.SNAPSHOT_ONLY
     mavenGroup = LibraryGroups.Compose.MATERIAL3
     inceptionYear = "2021"
     description = "Compose Material You Design Components library"
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Components.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Components.kt
index b9754bf..7e3f6be 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Components.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Components.kt
@@ -33,44 +33,110 @@
     val examples: List<Example>
 )
 
+private var nextId: Int = 1
+private fun nextId(): Int = nextId.also { nextId += 1 }
+
+// Components are ordered alphabetically by name.
+
+private val Button = Component(
+    id = nextId(),
+    name = "Button",
+    description = "Buttons allow users to take actions, and make choices, with a single tap.",
+    tintIcon = true,
+    guidelinesUrl = "", // No guidelines yet
+    docsUrl = "", // No docs yet
+    sourceUrl = "$Material3SourceUrl/Button.kt",
+    examples = ButtonsExamples,
+)
+
 private val Color = Component(
-    id = 1,
+    id = nextId(),
     name = "Color",
     description = "Material You colors",
     // No color icon
     tintIcon = true,
-    guidelinesUrl = "", // No  guidelines yet
+    guidelinesUrl = "", // No guidelines yet
     docsUrl = "", // No docs yet
     sourceUrl = "$Material3SourceUrl/ColorScheme.kt",
     examples = ColorExamples
 )
 
-private val TopAppBar = Component(
-    id = 2,
-    name = "Top app bar",
-    description = "Material You top app bar",
-    // No color icon
-    tintIcon = true,
-    guidelinesUrl = "", // No  guidelines yet
-    docsUrl = "", // No docs yet
-    sourceUrl = "$Material3SourceUrl/AppBar.kt",
-    examples = TopAppBarExamples
-)
-
 private val Dialog = Component(
-    id = 3,
+    id = nextId(),
     name = "Dialog",
     description = "Material 3 basic dialogs",
     // No dialog icon
     tintIcon = true,
-    guidelinesUrl = "", // No  guidelines yet
+    guidelinesUrl = "", // No guidelines yet
     docsUrl = "", // No docs yet
     sourceUrl = "$Material3SourceUrl/AlertDialog.kt",
     examples = DialogExamples
 )
 
+private val FloatingActionButtons = Component(
+    id = nextId(),
+    name = "Floating action button",
+    description = "A floating action button (FAB) represents the primary action of a screen.",
+    tintIcon = true,
+    guidelinesUrl = "", // No guidelines yet
+    docsUrl = "", // No docs yet
+    sourceUrl = "$Material3SourceUrl/FloatingActionButton.kt",
+    examples = FloatingActionButtonsExamples,
+)
+
+private val NavigationBar = Component(
+    id = nextId(),
+    name = "Navigation bar",
+    description = "Material You navigation bar",
+    tintIcon = true,
+    guidelinesUrl = "", // No guidelines yet
+    docsUrl = "", // No docs yet
+    sourceUrl = "$Material3SourceUrl/NavigationBar.kt",
+    examples = NavigationBarExamples
+)
+
+private val NavigationRail = Component(
+    id = nextId(),
+    name = "Navigation rail",
+    description = "Material You navigation rail",
+    tintIcon = true,
+    guidelinesUrl = "", // No guidelines yet
+    docsUrl = "", // No docs yet
+    sourceUrl = "$Material3SourceUrl/NavigationRail.kt",
+    examples = NavigationRailExamples
+)
+
+private val TopAppBar = Component(
+    id = nextId(),
+    name = "Top app bar",
+    description = "Material You top app bar",
+    // No color icon
+    tintIcon = true,
+    guidelinesUrl = "", // No guidelines yet
+    docsUrl = "", // No docs yet
+    sourceUrl = "$Material3SourceUrl/AppBar.kt",
+    examples = TopAppBarExamples
+)
+
+private val NavigationDrawer = Component(
+    id = nextId(),
+    name = "Navigation drawer",
+    description = "Navigation drawers provide access to destinations in your app.",
+    // No navigation drawer icon
+    guidelinesUrl = "", // No guidelines yet
+    docsUrl = "", // No docs yet
+    sourceUrl = "$Material3SourceUrl/NavigationDrawer.kt",
+    examples = NavigationDrawerExamples
+)
+
+/** Components for the catalog, ordered alphabetically by name. */
 val Components = listOf(
+    Button,
     Color,
     Dialog,
+    FloatingActionButtons,
+    NavigationBar,
+    NavigationRail,
+    NavigationDrawer,
     TopAppBar
 )
diff --git a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Examples.kt b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Examples.kt
index 5d12d40..959dc394 100644
--- a/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Examples.kt
+++ b/compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Examples.kt
@@ -21,11 +21,29 @@
 import androidx.compose.material3.catalog.library.util.SampleSourceUrl
 import androidx.compose.material3.samples.AlertDialogSample
 import androidx.compose.material3.samples.AlertDialogWithIconSample
+import androidx.compose.material3.samples.ButtonSample
+import androidx.compose.material3.samples.ButtonWithIconSample
 import androidx.compose.material3.samples.ColorSchemeSample
 import androidx.compose.material3.samples.EnterAlwaysSmallTopAppBar
+import androidx.compose.material3.samples.ElevatedButtonSample
+import androidx.compose.material3.samples.ExitUntilCollapsedLargeTopAppBar
+import androidx.compose.material3.samples.ExitUntilCollapsedMediumTopAppBar
+import androidx.compose.material3.samples.ExtendedFloatingActionButtonSample
+import androidx.compose.material3.samples.FilledTonalButtonSample
+import androidx.compose.material3.samples.FloatingActionButtonSample
+import androidx.compose.material3.samples.LargeFloatingActionButtonSample
+import androidx.compose.material3.samples.NavigationBarSample
+import androidx.compose.material3.samples.NavigationBarWithOnlySelectedLabelsSample
+import androidx.compose.material3.samples.NavigationRailBottomAlignSample
+import androidx.compose.material3.samples.NavigationRailSample
+import androidx.compose.material3.samples.NavigationRailWithOnlySelectedLabelsSample
+import androidx.compose.material3.samples.OutlinedButtonSample
+import androidx.compose.material3.samples.NavigationDrawerSample
 import androidx.compose.material3.samples.PinnedSmallTopAppBar
-import androidx.compose.material3.samples.SimpleCenteredTopAppBar
+import androidx.compose.material3.samples.SimpleCenterAlignedTopAppBar
 import androidx.compose.material3.samples.SimpleSmallTopAppBar
+import androidx.compose.material3.samples.SmallFloatingActionButtonSample
+import androidx.compose.material3.samples.TextButtonSample
 import androidx.compose.runtime.Composable
 
 data class Example(
@@ -35,6 +53,42 @@
     val content: @Composable () -> Unit
 )
 
+private const val ButtonsExampleDescription = "Buttons examples"
+private const val ButtonsExampleSourceUrl = "$SampleSourceUrl/ButtonSamples.kt"
+val ButtonsExamples =
+    listOf(
+        Example(
+            name = ::ButtonSample.name,
+            description = ButtonsExampleDescription,
+            sourceUrl = ButtonsExampleSourceUrl,
+        ) { ButtonSample() },
+        Example(
+            name = ::ElevatedButtonSample.name,
+            description = ButtonsExampleDescription,
+            sourceUrl = ButtonsExampleSourceUrl,
+        ) { ElevatedButtonSample() },
+        Example(
+            name = ::FilledTonalButtonSample.name,
+            description = ButtonsExampleDescription,
+            sourceUrl = ButtonsExampleSourceUrl,
+        ) { FilledTonalButtonSample() },
+        Example(
+            name = ::OutlinedButtonSample.name,
+            description = ButtonsExampleDescription,
+            sourceUrl = ButtonsExampleSourceUrl,
+        ) { OutlinedButtonSample() },
+        Example(
+            name = ::TextButtonSample.name,
+            description = ButtonsExampleDescription,
+            sourceUrl = ButtonsExampleSourceUrl,
+        ) { TextButtonSample() },
+        Example(
+            name = ::ButtonWithIconSample.name,
+            description = ButtonsExampleDescription,
+            sourceUrl = ButtonsExampleSourceUrl,
+        ) { ButtonWithIconSample() }
+    )
+
 private const val ColorExampleDescription = "Color examples"
 private const val ColorExampleSourceUrl = "$SampleSourceUrl/ColorSamples.kt"
 val ColorExamples =
@@ -72,10 +126,10 @@
             sourceUrl = TopAppBarExampleSourceUrl,
         ) { SimpleSmallTopAppBar() },
         Example(
-            name = ::SimpleCenteredTopAppBar.name,
+            name = ::SimpleCenterAlignedTopAppBar.name,
             description = TopAppBarExampleDescription,
             sourceUrl = TopAppBarExampleSourceUrl,
-        ) { SimpleCenteredTopAppBar() },
+        ) { SimpleCenterAlignedTopAppBar() },
         Example(
             name = ::PinnedSmallTopAppBar.name,
             description = TopAppBarExampleDescription,
@@ -86,4 +140,91 @@
             description = TopAppBarExampleDescription,
             sourceUrl = TopAppBarExampleSourceUrl,
         ) { EnterAlwaysSmallTopAppBar() },
+        Example(
+            name = ::ExitUntilCollapsedMediumTopAppBar.name,
+            description = TopAppBarExampleDescription,
+            sourceUrl = TopAppBarExampleSourceUrl,
+        ) { ExitUntilCollapsedMediumTopAppBar() },
+        Example(
+            name = ::ExitUntilCollapsedLargeTopAppBar.name,
+            description = TopAppBarExampleDescription,
+            sourceUrl = TopAppBarExampleSourceUrl,
+        ) { ExitUntilCollapsedLargeTopAppBar() },
     )
+
+private const val ButtonsFloatingActionButtonExampleDescription =
+    "Buttons: floating action button examples"
+private const val ButtonsFloatingActionButtonExampleSourceUrl =
+    "$SampleSourceUrl/FloatingActionButtonSamples.kt"
+val FloatingActionButtonsExamples =
+    listOf(
+        Example(
+            name = ::FloatingActionButtonSample.name,
+            description = ButtonsFloatingActionButtonExampleDescription,
+            sourceUrl = ButtonsFloatingActionButtonExampleSourceUrl,
+        ) { FloatingActionButtonSample() },
+        Example(
+            name = ::LargeFloatingActionButtonSample.name,
+            description = ButtonsFloatingActionButtonExampleDescription,
+            sourceUrl = ButtonsFloatingActionButtonExampleSourceUrl,
+        ) { LargeFloatingActionButtonSample() },
+        Example(
+            name = ::SmallFloatingActionButtonSample.name,
+            description = ButtonsFloatingActionButtonExampleDescription,
+            sourceUrl = ButtonsFloatingActionButtonExampleSourceUrl,
+        ) { SmallFloatingActionButtonSample() },
+        Example(
+            name = ::ExtendedFloatingActionButtonSample.name,
+            description = ButtonsFloatingActionButtonExampleDescription,
+            sourceUrl = ButtonsFloatingActionButtonExampleSourceUrl,
+        ) { ExtendedFloatingActionButtonSample() },
+    )
+
+private const val NavigationBarExampleDescription = "Navigation bar examples"
+private const val NavigationBarExampleSourceUrl = "$SampleSourceUrl/NavigationBarSamples.kt"
+val NavigationBarExamples =
+    listOf(
+        Example(
+            name = ::NavigationBarSample.name,
+            description = NavigationBarExampleDescription,
+            sourceUrl = NavigationBarExampleSourceUrl,
+        ) { NavigationBarSample() },
+        Example(
+            name = ::NavigationBarWithOnlySelectedLabelsSample.name,
+            description = NavigationBarExampleDescription,
+            sourceUrl = NavigationBarExampleSourceUrl,
+        ) { NavigationBarWithOnlySelectedLabelsSample() },
+    )
+
+private const val NavigationRailExampleDescription = "Navigation rail examples"
+private const val NavigationRailExampleSourceUrl = "$SampleSourceUrl/NavigationRailSamples.kt"
+val NavigationRailExamples =
+    listOf(
+        Example(
+            name = ::NavigationRailSample.name,
+            description = NavigationRailExampleDescription,
+            sourceUrl = NavigationRailExampleSourceUrl,
+        ) { NavigationRailSample() },
+        Example(
+            name = ::NavigationRailWithOnlySelectedLabelsSample.name,
+            description = NavigationRailExampleDescription,
+            sourceUrl = NavigationRailExampleSourceUrl,
+        ) { NavigationRailWithOnlySelectedLabelsSample() },
+        Example(
+            name = ::NavigationRailBottomAlignSample.name,
+            description = NavigationRailExampleDescription,
+            sourceUrl = NavigationRailExampleSourceUrl,
+        ) { NavigationRailBottomAlignSample() },
+    )
+
+private const val NavigationDrawerExampleDescription = "Navigation drawer examples"
+private const val NavigationDrawerExampleSourceUrl = "$SampleSourceUrl/DrawerSamples.kt"
+val NavigationDrawerExamples = listOf(
+    Example(
+        name = ::NavigationDrawerSample.name,
+        description = NavigationDrawerExampleDescription,
+        sourceUrl = NavigationDrawerExampleSourceUrl
+    ) {
+        NavigationDrawerSample()
+    }
+)
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/AlertDialogSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/AlertDialogSamples.kt
index 23a3208..f34d718 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/AlertDialogSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/AlertDialogSamples.kt
@@ -16,14 +16,13 @@
 
 package androidx.compose.material3.samples
 
-// TODO(b/198216553): Update to use Material 3 TextButton.
 import androidx.annotation.Sampled
-import androidx.compose.material.TextButton
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.Favorite
 import androidx.compose.material3.AlertDialog
 import androidx.compose.material3.Icon
 import androidx.compose.material3.Text
+import androidx.compose.material3.TextButton
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/AppBarSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/AppBarSamples.kt
index 17aee6d..c82ccff3 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/AppBarSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/AppBarSamples.kt
@@ -17,6 +17,7 @@
 package androidx.compose.material3.samples
 
 import androidx.annotation.Sampled
+import androidx.compose.animation.rememberSplineBasedDecay
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.padding
@@ -24,12 +25,14 @@
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.Favorite
 import androidx.compose.material.icons.filled.Menu
+import androidx.compose.material3.CenterAlignedTopAppBar
 import androidx.compose.material3.ExperimentalMaterial3Api
 import androidx.compose.material3.Icon
 import androidx.compose.material3.IconButton
+import androidx.compose.material3.LargeTopAppBar
 import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.MediumTopAppBar
 import androidx.compose.material3.Scaffold
-import androidx.compose.material3.SmallCenteredTopAppBar
 import androidx.compose.material3.SmallTopAppBar
 import androidx.compose.material3.Text
 import androidx.compose.material3.TopAppBarDefaults
@@ -54,12 +57,18 @@
                 title = { Text("Simple TopAppBar") },
                 navigationIcon = {
                     IconButton(onClick = { /* doSomething() */ }) {
-                        Icon(Icons.Filled.Menu, contentDescription = "Localized description")
+                        Icon(
+                            imageVector = Icons.Filled.Menu,
+                            contentDescription = "Localized description"
+                        )
                     }
                 },
                 actions = {
                     IconButton(onClick = { /* doSomething() */ }) {
-                        Icon(Icons.Filled.Favorite, contentDescription = "Localized description")
+                        Icon(
+                            imageVector = Icons.Filled.Favorite,
+                            contentDescription = "Localized description"
+                        )
                     }
                 }
             )
@@ -83,26 +92,32 @@
 }
 
 /**
- * A sample for a simple use of [SmallCenteredTopAppBar].
+ * A sample for a simple use of [CenterAlignedTopAppBar].
  *
  * The top app bar here does not react to any scroll events in the content under it.
  */
 @OptIn(ExperimentalMaterial3Api::class)
 @Sampled
 @Composable
-fun SimpleCenteredTopAppBar() {
+fun SimpleCenterAlignedTopAppBar() {
     Scaffold(
         topBar = {
-            SmallCenteredTopAppBar(
+            CenterAlignedTopAppBar(
                 title = { Text("Centered TopAppBar") },
                 navigationIcon = {
                     IconButton(onClick = { /* doSomething() */ }) {
-                        Icon(Icons.Filled.Menu, contentDescription = "Localized description")
+                        Icon(
+                            imageVector = Icons.Filled.Menu,
+                            contentDescription = "Localized description"
+                        )
                     }
                 },
                 actions = {
                     IconButton(onClick = { /* doSomething() */ }) {
-                        Icon(Icons.Filled.Favorite, contentDescription = "Localized description")
+                        Icon(
+                            imageVector = Icons.Filled.Favorite,
+                            contentDescription = "Localized description"
+                        )
                     }
                 }
             )
@@ -143,16 +158,25 @@
                 title = { Text("Small TopAppBar") },
                 navigationIcon = {
                     IconButton(onClick = { /* doSomething() */ }) {
-                        Icon(Icons.Filled.Menu, contentDescription = "Localized description")
+                        Icon(
+                            imageVector = Icons.Filled.Menu,
+                            contentDescription = "Localized description"
+                        )
                     }
                 },
                 actions = {
                     // RowScope here, so these icons will be placed horizontally
                     IconButton(onClick = { /* doSomething() */ }) {
-                        Icon(Icons.Filled.Favorite, contentDescription = "Localized description")
+                        Icon(
+                            imageVector = Icons.Filled.Favorite,
+                            contentDescription = "Localized description"
+                        )
                     }
                     IconButton(onClick = { /* doSomething() */ }) {
-                        Icon(Icons.Filled.Favorite, contentDescription = "Localized description")
+                        Icon(
+                            imageVector = Icons.Filled.Favorite,
+                            contentDescription = "Localized description"
+                        )
                     }
                 },
                 scrollBehavior = scrollBehavior
@@ -192,12 +216,126 @@
                 title = { Text("Small TopAppBar") },
                 navigationIcon = {
                     IconButton(onClick = { /* doSomething() */ }) {
-                        Icon(Icons.Filled.Menu, contentDescription = "Localized description")
+                        Icon(
+                            imageVector = Icons.Filled.Menu,
+                            contentDescription = "Localized description"
+                        )
                     }
                 },
                 actions = {
                     IconButton(onClick = { /* doSomething() */ }) {
-                        Icon(Icons.Filled.Favorite, contentDescription = "Localized description")
+                        Icon(
+                            imageVector = Icons.Filled.Favorite,
+                            contentDescription = "Localized description"
+                        )
+                    }
+                },
+                scrollBehavior = scrollBehavior
+            )
+        },
+        content = { innerPadding ->
+            LazyColumn(
+                contentPadding = innerPadding,
+                verticalArrangement = Arrangement.spacedBy(8.dp)
+            ) {
+                val list = (0..75).map { it.toString() }
+                items(count = list.size) {
+                    Text(
+                        text = list[it],
+                        style = MaterialTheme.typography.bodyLarge,
+                        modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp)
+                    )
+                }
+            }
+        }
+    )
+}
+
+/**
+ * A sample for a [MediumTopAppBar] that collapses when the content is scrolled up, and
+ * appears when the content is completely scrolled back down.
+ */
+@OptIn(ExperimentalMaterial3Api::class)
+@Sampled
+@Composable
+fun ExitUntilCollapsedMediumTopAppBar() {
+    val decayAnimationSpec = rememberSplineBasedDecay<Float>()
+    val scrollBehavior = remember(decayAnimationSpec) {
+        TopAppBarDefaults.exitUntilCollapsedScrollBehavior(decayAnimationSpec)
+    }
+    Scaffold(
+        modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
+        topBar = {
+            MediumTopAppBar(
+                title = { Text("Medium TopAppBar") },
+                navigationIcon = {
+                    IconButton(onClick = { /* doSomething() */ }) {
+                        Icon(
+                            imageVector = Icons.Filled.Menu,
+                            contentDescription = "Localized description"
+                        )
+                    }
+                },
+                actions = {
+                    IconButton(onClick = { /* doSomething() */ }) {
+                        Icon(
+                            imageVector = Icons.Filled.Favorite,
+                            contentDescription = "Localized description"
+                        )
+                    }
+                },
+                scrollBehavior = scrollBehavior
+            )
+        },
+        content = { innerPadding ->
+            LazyColumn(
+                contentPadding = innerPadding,
+                verticalArrangement = Arrangement.spacedBy(8.dp)
+            ) {
+                val list = (0..75).map { it.toString() }
+                items(count = list.size) {
+                    Text(
+                        text = list[it],
+                        style = MaterialTheme.typography.bodyLarge,
+                        modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp)
+                    )
+                }
+            }
+        }
+    )
+}
+
+/**
+ * A sample for a [LargeTopAppBar] that collapses when the content is scrolled up, and
+ * appears when the content is completely scrolled back down.
+ */
+@OptIn(ExperimentalMaterial3Api::class)
+@Sampled
+@Composable
+fun ExitUntilCollapsedLargeTopAppBar() {
+    val decayAnimationSpec = rememberSplineBasedDecay<Float>()
+    val scrollBehavior = remember(decayAnimationSpec) {
+        TopAppBarDefaults.exitUntilCollapsedScrollBehavior(decayAnimationSpec)
+    }
+    Scaffold(
+        modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
+        topBar = {
+            LargeTopAppBar(
+                title = { Text("Large TopAppBar") },
+                navigationIcon = {
+                    IconButton(onClick = { /* doSomething() */ }) {
+                        Icon(
+                            imageVector = Icons.Filled.Menu,
+                            contentDescription = "Localized description"
+                        )
+                    }
+                },
+                actions = {
+                    IconButton(onClick = { /* doSomething() */ }) {
+                        Icon(
+                            imageVector = Icons.Filled.Favorite,
+                            contentDescription = "Localized description"
+                        )
                     }
                 },
                 scrollBehavior = scrollBehavior
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/BadgeSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/BadgeSamples.kt
new file mode 100644
index 0000000..b43f9fa
--- /dev/null
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/BadgeSamples.kt
@@ -0,0 +1,47 @@
+/*
+ * 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.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Star
+import androidx.compose.material3.Badge
+import androidx.compose.material3.BadgedBox
+import androidx.compose.material3.Icon
+import androidx.compose.material3.NavigationBar
+import androidx.compose.material3.NavigationBarItem
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+
+@Sampled
+@Composable
+fun NavigationBarItemWithBadge() {
+    NavigationBar {
+        NavigationBarItem(
+            icon = {
+                BadgedBox(badge = { Badge { Text("8") } }) {
+                    Icon(
+                        Icons.Filled.Star,
+                        contentDescription = "Favorite"
+                    )
+                }
+            },
+            selected = false,
+            onClick = {}
+        )
+    }
+}
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ButtonSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ButtonSamples.kt
new file mode 100644
index 0000000..d9a844e
--- /dev/null
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ButtonSamples.kt
@@ -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.compose.material3.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Favorite
+import androidx.compose.material3.Button
+import androidx.compose.material3.ButtonDefaults
+import androidx.compose.material3.ElevatedButton
+import androidx.compose.material3.FilledTonalButton
+import androidx.compose.material3.Icon
+import androidx.compose.material3.OutlinedButton
+import androidx.compose.material3.Text
+import androidx.compose.material3.TextButton
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+
+@Sampled
+@Composable
+fun ButtonSample() {
+    Button(onClick = { /* Do something! */ }) { Text("Button") }
+}
+
+@Sampled
+@Composable
+fun ElevatedButtonSample() {
+    ElevatedButton(onClick = { /* Do something! */ }) { Text("Elevated Button") }
+}
+
+@Sampled
+@Composable
+fun FilledTonalButtonSample() {
+    FilledTonalButton(onClick = { /* Do something! */ }) { Text("Filled Tonal Button") }
+}
+
+@Sampled
+@Composable
+fun OutlinedButtonSample() {
+    OutlinedButton(onClick = { /* Do something! */ }) { Text("Outlined Button") }
+}
+
+@Sampled
+@Composable
+fun TextButtonSample() {
+    TextButton(onClick = { /* Do something! */ }) { Text("Text Button") }
+}
+
+@Sampled
+@Composable
+fun ButtonWithIconSample() {
+    Button(onClick = { /* Do something! */ }) {
+        Icon(
+            Icons.Filled.Favorite,
+            contentDescription = "Localized description",
+            modifier = Modifier.size(ButtonDefaults.IconSize)
+        )
+        Spacer(Modifier.size(ButtonDefaults.IconSpacing))
+        Text("Like")
+    }
+}
\ No newline at end of file
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/DrawerSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/DrawerSamples.kt
new file mode 100644
index 0000000..3257fb5
--- /dev/null
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/DrawerSamples.kt
@@ -0,0 +1,66 @@
+/*
+ * 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.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.material3.Button
+import androidx.compose.material3.DrawerValue
+import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.NavigationDrawer
+import androidx.compose.material3.Text
+import androidx.compose.material3.rememberDrawerState
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.dp
+import kotlinx.coroutines.launch
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Sampled
+@Composable
+fun NavigationDrawerSample() {
+    val drawerState = rememberDrawerState(DrawerValue.Closed)
+    val scope = rememberCoroutineScope()
+    NavigationDrawer(
+        drawerState = drawerState,
+        drawerContent = {
+            Button(
+                modifier = Modifier.align(Alignment.CenterHorizontally).padding(top = 16.dp),
+                onClick = { scope.launch { drawerState.close() } },
+                content = { Text("Close Drawer") }
+            )
+        },
+        content = {
+            Column(
+                modifier = Modifier.fillMaxSize().padding(16.dp),
+                horizontalAlignment = Alignment.CenterHorizontally
+            ) {
+                Text(text = if (drawerState.isClosed) ">>> Swipe >>>" else "<<< Swipe <<<")
+                Spacer(Modifier.height(20.dp))
+                Button(onClick = { scope.launch { drawerState.open() } }) {
+                    Text("Click to open")
+                }
+            }
+        }
+    )
+}
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/FloatingActionButtonSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/FloatingActionButtonSamples.kt
new file mode 100644
index 0000000..e9e352d
--- /dev/null
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/FloatingActionButtonSamples.kt
@@ -0,0 +1,80 @@
+/*
+ * 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.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.foundation.layout.size
+import androidx.compose.material.ExperimentalMaterialApi
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Add
+import androidx.compose.material3.ExtendedFloatingActionButton
+import androidx.compose.material3.FloatingActionButton
+import androidx.compose.material3.FloatingActionButtonDefaults
+import androidx.compose.material3.Icon
+import androidx.compose.material3.LargeFloatingActionButton
+import androidx.compose.material3.SmallFloatingActionButton
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+
+@OptIn(ExperimentalMaterialApi::class)
+@Sampled
+@Composable
+fun FloatingActionButtonSample() {
+    FloatingActionButton(
+        onClick = { /* do something */ },
+    ) {
+        Icon(Icons.Filled.Add, "Localized description")
+    }
+}
+
+@OptIn(ExperimentalMaterialApi::class)
+@Sampled
+@Composable
+fun SmallFloatingActionButtonSample() {
+    SmallFloatingActionButton(
+        onClick = { /* do something */ },
+    ) {
+        Icon(Icons.Filled.Add, contentDescription = "Localized description")
+    }
+}
+
+@OptIn(ExperimentalMaterialApi::class)
+@Sampled
+@Composable
+fun LargeFloatingActionButtonSample() {
+    LargeFloatingActionButton(
+        onClick = { /* do something */ },
+    ) {
+        Icon(
+            Icons.Filled.Add,
+            contentDescription = "Localized description",
+            modifier = Modifier.size(FloatingActionButtonDefaults.LargeIconSize),
+        )
+    }
+}
+
+@OptIn(ExperimentalMaterialApi::class)
+@Sampled
+@Composable
+fun ExtendedFloatingActionButtonSample() {
+    ExtendedFloatingActionButton(
+        onClick = { /* do something */ },
+        icon = { Icon(Icons.Filled.Add, "Localized description") },
+        text = { Text(text = "Extended FAB") },
+    )
+}
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/NavigationBarSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/NavigationBarSamples.kt
new file mode 100644
index 0000000..0fe4ec5
--- /dev/null
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/NavigationBarSamples.kt
@@ -0,0 +1,66 @@
+/*
+ * 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.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Favorite
+import androidx.compose.material3.Icon
+import androidx.compose.material3.NavigationBar
+import androidx.compose.material3.NavigationBarItem
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+
+@Sampled
+@Composable
+fun NavigationBarSample() {
+    var selectedItem by remember { mutableStateOf(0) }
+    val items = listOf("Songs", "Artists", "Playlists")
+
+    NavigationBar {
+        items.forEachIndexed { index, item ->
+            NavigationBarItem(
+                icon = { Icon(Icons.Filled.Favorite, contentDescription = null) },
+                label = { Text(item) },
+                selected = selectedItem == index,
+                onClick = { selectedItem = index }
+            )
+        }
+    }
+}
+
+@Composable
+fun NavigationBarWithOnlySelectedLabelsSample() {
+    var selectedItem by remember { mutableStateOf(0) }
+    val items = listOf("Songs", "Artists", "Playlists")
+
+    NavigationBar {
+        items.forEachIndexed { index, item ->
+            NavigationBarItem(
+                icon = { Icon(Icons.Filled.Favorite, contentDescription = null) },
+                label = { Text(item) },
+                selected = selectedItem == index,
+                onClick = { selectedItem = index },
+                alwaysShowLabel = false
+            )
+        }
+    }
+}
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/NavigationRailSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/NavigationRailSamples.kt
new file mode 100644
index 0000000..3f76cde
--- /dev/null
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/NavigationRailSamples.kt
@@ -0,0 +1,91 @@
+/*
+ * 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.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Home
+import androidx.compose.material.icons.filled.Search
+import androidx.compose.material.icons.filled.Settings
+import androidx.compose.material3.Icon
+import androidx.compose.material3.NavigationRail
+import androidx.compose.material3.NavigationRailItem
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+
+@Sampled
+@Composable
+fun NavigationRailSample() {
+    var selectedItem by remember { mutableStateOf(0) }
+    val items = listOf("Home", "Search", "Settings")
+    val icons = listOf(Icons.Filled.Home, Icons.Filled.Search, Icons.Filled.Settings)
+    NavigationRail {
+        items.forEachIndexed { index, item ->
+            NavigationRailItem(
+                icon = { Icon(icons[index], contentDescription = item) },
+                label = { Text(item) },
+                selected = selectedItem == index,
+                onClick = { selectedItem = index }
+            )
+        }
+    }
+}
+
+@Composable
+fun NavigationRailWithOnlySelectedLabelsSample() {
+    var selectedItem by remember { mutableStateOf(0) }
+    val items = listOf("Home", "Search", "Settings")
+    val icons = listOf(Icons.Filled.Home, Icons.Filled.Search, Icons.Filled.Settings)
+    NavigationRail {
+        items.forEachIndexed { index, item ->
+            NavigationRailItem(
+                icon = { Icon(icons[index], contentDescription = item) },
+                label = { Text(item) },
+                selected = selectedItem == index,
+                onClick = { selectedItem = index },
+                alwaysShowLabel = false
+            )
+        }
+    }
+}
+
+@Composable
+fun NavigationRailBottomAlignSample() {
+    var selectedItem by remember { mutableStateOf(0) }
+    val items = listOf("Home", "Search", "Settings")
+    val icons = listOf(Icons.Filled.Home, Icons.Filled.Search, Icons.Filled.Settings)
+
+    NavigationRail {
+        // A Spacer that pushes the NavigationRail items to the bottom of the NavigationRail.
+        Spacer(Modifier.weight(1f))
+        items.forEachIndexed { index, item ->
+            NavigationRailItem(
+                icon = { Icon(icons[index], contentDescription = item) },
+                label = { Text(item) },
+                selected = selectedItem == index,
+                onClick = { selectedItem = index },
+                alwaysShowLabel = false
+            )
+        }
+    }
+}
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AlertDialogScreenshotTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AlertDialogScreenshotTest.kt
index b6bd598..7078717 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AlertDialogScreenshotTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AlertDialogScreenshotTest.kt
@@ -17,17 +17,13 @@
 package androidx.compose.material3
 
 import android.os.Build
-import androidx.compose.foundation.layout.PaddingValues
-import androidx.compose.foundation.layout.padding
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.Favorite
 import androidx.compose.testutils.assertAgainstGolden
-import androidx.compose.ui.Modifier
 import androidx.compose.ui.test.ExperimentalTestApi
 import androidx.compose.ui.test.captureToImage
 import androidx.compose.ui.test.isDialog
 import androidx.compose.ui.test.junit4.createComposeRule
-import androidx.compose.ui.unit.dp
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
@@ -63,12 +59,15 @@
                                 "which presents the details regarding the Dialog's purpose."
                         )
                     },
-                    // TODO(b/198216553): Wrap with Material 3 TextButton when available.
                     confirmButton = {
-                        Text("Confirm", Modifier.padding(TextButtonContentPadding))
+                        TextButton(onClick = { /* doSomething() */ }) {
+                            Text("Confirm")
+                        }
                     },
                     dismissButton = {
-                        Text("Dismiss", Modifier.padding(TextButtonContentPadding))
+                        TextButton(onClick = { /* doSomething() */ }) {
+                            Text("Dismiss")
+                        }
                     }
                 )
             }
@@ -92,12 +91,15 @@
                                 "which presents the details regarding the Dialog's purpose."
                         )
                     },
-                    // TODO(b/198216553): Wrap with Material 3 TextButton when available.
                     confirmButton = {
-                        Text("Confirm", Modifier.padding(TextButtonContentPadding))
+                        TextButton(onClick = { /* doSomething() */ }) {
+                            Text("Confirm")
+                        }
                     },
                     dismissButton = {
-                        Text("Dismiss", Modifier.padding(TextButtonContentPadding))
+                        TextButton(onClick = { /* doSomething() */ }) {
+                            Text("Dismiss")
+                        }
                     }
                 )
             }
@@ -122,12 +124,15 @@
                                 "which presents the details regarding the Dialog's purpose."
                         )
                     },
-                    // TODO(b/198216553): Wrap with Material 3 TextButton when available.
                     confirmButton = {
-                        Text("Confirm", Modifier.padding(TextButtonContentPadding))
+                        TextButton(onClick = { /* doSomething() */ }) {
+                            Text("Confirm")
+                        }
                     },
                     dismissButton = {
-                        Text("Dismiss", Modifier.padding(TextButtonContentPadding))
+                        TextButton(onClick = { /* doSomething() */ }) {
+                            Text("Dismiss")
+                        }
                     }
                 )
             }
@@ -152,12 +157,15 @@
                                 "which presents the details regarding the Dialog's purpose."
                         )
                     },
-                    // TODO(b/198216553): Wrap with Material 3 TextButton when available.
                     confirmButton = {
-                        Text("Confirm", Modifier.padding(TextButtonContentPadding))
+                        TextButton(onClick = { /* doSomething() */ }) {
+                            Text("Confirm")
+                        }
                     },
                     dismissButton = {
-                        Text("Dismiss", Modifier.padding(TextButtonContentPadding))
+                        TextButton(onClick = { /* doSomething() */ }) {
+                            Text("Dismiss")
+                        }
                     }
                 )
             }
@@ -171,13 +179,4 @@
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenIdentifier)
     }
-
-    // TODO(b/198216553): Remove once Material 3 TextButton is available.
-    private val TextButtonContentPadding =
-        PaddingValues(
-            start = 8.dp,
-            top = 16.dp,
-            end = 8.dp,
-            bottom = 16.dp,
-        )
 }
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AlertDialogTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AlertDialogTest.kt
index dcbe719..616e103 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AlertDialogTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AlertDialogTest.kt
@@ -20,8 +20,6 @@
 import androidx.compose.foundation.border
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.filled.Check
-import androidx.compose.material.icons.filled.Close
 import androidx.compose.material.icons.filled.Favorite
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
@@ -86,14 +84,15 @@
                     Text("Text")
                     textContentColor = LocalContentColor.current
                 },
-                // TODO(b/198216553): Wrap with Material 3 TextButton when available.
                 confirmButton = {
-                    Text("Confirm")
-                    buttonContentColor = LocalContentColor.current
-                    expectedButtonContentColor =
-                        MaterialTheme.colorScheme.fromToken(
-                            androidx.compose.material3.tokens.Dialog.ActionLabelTextColor
-                        )
+                    TextButton(onClick = { /* doSomething() */ }) {
+                        Text("Confirm")
+                        buttonContentColor = LocalContentColor.current
+                        expectedButtonContentColor =
+                            MaterialTheme.colorScheme.fromToken(
+                                androidx.compose.material3.tokens.Dialog.ActionLabelTextColor
+                            )
+                    }
                 },
                 containerColor = Color.Yellow,
                 tonalElevation = 0.dp,
@@ -146,9 +145,16 @@
                             "which presents the details regarding the Dialog's purpose."
                     )
                 },
-                // TODO(b/198216553): Wrap with Material 3 TextButton when available.
-                confirmButton = { Text("Confirm") },
-                dismissButton = { Text("Dismiss") },
+                confirmButton = {
+                    TextButton(onClick = { /* doSomething() */ }) {
+                        Text("Confirm")
+                    }
+                },
+                dismissButton = {
+                    TextButton(onClick = { /* doSomething() */ }) {
+                        Text("Dismiss")
+                    }
+                },
             )
         }
 
@@ -171,8 +177,11 @@
                 onDismissRequest = {},
                 title = { Text(text = "Title") },
                 text = { Text("Short") },
-                // TODO(b/198216553): Wrap with Material 3 TextButton when available.
-                confirmButton = { Text("Confirm") }
+                confirmButton = {
+                    TextButton(onClick = { /* doSomething() */ }) {
+                        Text("Confirm")
+                    }
+                }
             )
         }
 
@@ -196,22 +205,20 @@
                 },
                 title = { Text(text = "Title", modifier = Modifier.testTag(TitleTestTag)) },
                 text = { Text("Text", modifier = Modifier.testTag(TextTestTag)) },
-                // TODO(b/198216553): Using IconButton to ensure a minimum touch target of 48dp.
-                //  Wrap with Material 3 TextButton when available.
                 confirmButton = {
-                    IconButton(
+                    TextButton(
                         onClick = { /* doSomething() */ },
                         Modifier.testTag(ConfirmButtonTestTag).semantics(mergeDescendants = true) {}
                     ) {
-                        Icon(Icons.Filled.Check, contentDescription = null)
+                        Text("Confirm")
                     }
                 },
                 dismissButton = {
-                    IconButton(
+                    TextButton(
                         onClick = { /* doSomething() */ },
                         Modifier.testTag(DismissButtonTestTag).semantics(mergeDescendants = true) {}
                     ) {
-                        Icon(Icons.Filled.Close, contentDescription = null)
+                        Text("Dismiss")
                     }
                 }
             )
@@ -271,15 +278,13 @@
                 onDismissRequest = {},
                 title = { Text(text = "Title", modifier = Modifier.testTag(TitleTestTag)) },
                 text = { Text("Text", modifier = Modifier.testTag(TextTestTag)) },
-                // TODO(b/198216553): Using IconButton to ensure a minimum touch target of 48dp.
-                //  Wrap with Material 3 TextButton when available.
                 confirmButton = {},
                 dismissButton = {
-                    IconButton(
+                    TextButton(
                         onClick = { /* doSomething() */ },
                         Modifier.testTag(DismissButtonTestTag).semantics(mergeDescendants = true) {}
                     ) {
-                        Icon(Icons.Filled.Close, contentDescription = null)
+                        Text("Dismiss")
                     }
                 }
             )
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AppBarScreenshotTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AppBarScreenshotTest.kt
index 56902e6..215cae5 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AppBarScreenshotTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AppBarScreenshotTest.kt
@@ -56,7 +56,10 @@
                     SmallTopAppBar(
                         navigationIcon = {
                             IconButton(onClick = { /* doSomething() */ }) {
-                                Icon(Icons.Filled.ArrowBack, null)
+                                Icon(
+                                    imageVector = Icons.Filled.ArrowBack,
+                                    contentDescription = "Back"
+                                )
                             }
                         },
                         title = {
@@ -64,7 +67,10 @@
                         },
                         actions = {
                             IconButton(onClick = { /* doSomething() */ }) {
-                                Icon(Icons.Filled.Favorite, null)
+                                Icon(
+                                    imageVector = Icons.Filled.Favorite,
+                                    contentDescription = "Like"
+                                )
                             }
                         }
                     )
@@ -83,7 +89,10 @@
                     SmallTopAppBar(
                         navigationIcon = {
                             IconButton(onClick = { /* doSomething() */ }) {
-                                Icon(Icons.Filled.ArrowBack, null)
+                                Icon(
+                                    imageVector = Icons.Filled.ArrowBack,
+                                    contentDescription = "Back"
+                                )
                             }
                         },
                         title = {
@@ -91,7 +100,10 @@
                         },
                         actions = {
                             IconButton(onClick = { /* doSomething() */ }) {
-                                Icon(Icons.Filled.Favorite, null)
+                                Icon(
+                                    imageVector = Icons.Filled.Favorite,
+                                    contentDescription = "Like"
+                                )
                             }
                         }
                     )
@@ -103,14 +115,17 @@
     }
 
     @Test
-    fun smallCenteredAppBar_lightTheme() {
+    fun centerAlignedAppBar_lightTheme() {
         composeTestRule.setContent {
             MaterialTheme {
                 Box(Modifier.testTag(TestTag)) {
-                    SmallCenteredTopAppBar(
+                    CenterAlignedTopAppBar(
                         navigationIcon = {
                             IconButton(onClick = { /* doSomething() */ }) {
-                                Icon(Icons.Filled.ArrowBack, null)
+                                Icon(
+                                    imageVector = Icons.Filled.ArrowBack,
+                                    contentDescription = "Back"
+                                )
                             }
                         },
                         title = {
@@ -118,7 +133,10 @@
                         },
                         actions = {
                             IconButton(onClick = { /* doSomething() */ }) {
-                                Icon(Icons.Filled.Favorite, null)
+                                Icon(
+                                    imageVector = Icons.Filled.Favorite,
+                                    contentDescription = "Like"
+                                )
                             }
                         }
                     )
@@ -126,18 +144,21 @@
             }
         }
 
-        assertAppBarAgainstGolden(goldenIdentifier = "smallCenteredAppBar_lightTheme")
+        assertAppBarAgainstGolden(goldenIdentifier = "centerAlignedAppBar_lightTheme")
     }
 
     @Test
-    fun smallCenteredAppBar_darkTheme() {
+    fun centerAlignedAppBar_darkTheme() {
         composeTestRule.setContent {
             MaterialTheme(colorScheme = darkColorScheme()) {
                 Box(Modifier.testTag(TestTag)) {
-                    SmallCenteredTopAppBar(
+                    CenterAlignedTopAppBar(
                         navigationIcon = {
                             IconButton(onClick = { /* doSomething() */ }) {
-                                Icon(Icons.Filled.ArrowBack, null)
+                                Icon(
+                                    imageVector = Icons.Filled.ArrowBack,
+                                    contentDescription = "Back"
+                                )
                             }
                         },
                         title = {
@@ -145,7 +166,10 @@
                         },
                         actions = {
                             IconButton(onClick = { /* doSomething() */ }) {
-                                Icon(Icons.Filled.Favorite, null)
+                                Icon(
+                                    imageVector = Icons.Filled.Favorite,
+                                    contentDescription = "Like"
+                                )
                             }
                         }
                     )
@@ -153,7 +177,139 @@
             }
         }
 
-        assertAppBarAgainstGolden(goldenIdentifier = "smallCenteredAppBar_darkTheme")
+        assertAppBarAgainstGolden(goldenIdentifier = "centerAlignedAppBar_darkTheme")
+    }
+
+    @Test
+    fun mediumAppBar_lightTheme() {
+        composeTestRule.setContent {
+            MaterialTheme {
+                Box(Modifier.testTag(TestTag)) {
+                    MediumTopAppBar(
+                        navigationIcon = {
+                            IconButton(onClick = { /* doSomething() */ }) {
+                                Icon(
+                                    imageVector = Icons.Filled.ArrowBack,
+                                    contentDescription = "Back"
+                                )
+                            }
+                        },
+                        title = {
+                            Text("Title")
+                        },
+                        actions = {
+                            IconButton(onClick = { /* doSomething() */ }) {
+                                Icon(
+                                    imageVector = Icons.Filled.Favorite,
+                                    contentDescription = "Like"
+                                )
+                            }
+                        }
+                    )
+                }
+            }
+        }
+
+        assertAppBarAgainstGolden(goldenIdentifier = "mediumAppBar_lightTheme")
+    }
+
+    @Test
+    fun mediumAppBar_darkTheme() {
+        composeTestRule.setContent {
+            MaterialTheme(colorScheme = darkColorScheme()) {
+                Box(Modifier.testTag(TestTag)) {
+                    MediumTopAppBar(
+                        navigationIcon = {
+                            IconButton(onClick = { /* doSomething() */ }) {
+                                Icon(
+                                    imageVector = Icons.Filled.ArrowBack,
+                                    contentDescription = "Back"
+                                )
+                            }
+                        },
+                        title = {
+                            Text("Title")
+                        },
+                        actions = {
+                            IconButton(onClick = { /* doSomething() */ }) {
+                                Icon(
+                                    imageVector = Icons.Filled.Favorite,
+                                    contentDescription = "Like"
+                                )
+                            }
+                        }
+                    )
+                }
+            }
+        }
+
+        assertAppBarAgainstGolden(goldenIdentifier = "mediumAppBar_darkTheme")
+    }
+
+    @Test
+    fun largeAppBar_lightTheme() {
+        composeTestRule.setContent {
+            MaterialTheme {
+                Box(Modifier.testTag(TestTag)) {
+                    LargeTopAppBar(
+                        navigationIcon = {
+                            IconButton(onClick = { /* doSomething() */ }) {
+                                Icon(
+                                    imageVector = Icons.Filled.ArrowBack,
+                                    contentDescription = "Back"
+                                )
+                            }
+                        },
+                        title = {
+                            Text("Title")
+                        },
+                        actions = {
+                            IconButton(onClick = { /* doSomething() */ }) {
+                                Icon(
+                                    imageVector = Icons.Filled.Favorite,
+                                    contentDescription = "Like"
+                                )
+                            }
+                        }
+                    )
+                }
+            }
+        }
+
+        assertAppBarAgainstGolden(goldenIdentifier = "largeAppBar_lightTheme")
+    }
+
+    @Test
+    fun largeAppBar_darkTheme() {
+        composeTestRule.setContent {
+            MaterialTheme(colorScheme = darkColorScheme()) {
+                Box(Modifier.testTag(TestTag)) {
+                    LargeTopAppBar(
+                        navigationIcon = {
+                            IconButton(onClick = { /* doSomething() */ }) {
+                                Icon(
+                                    imageVector = Icons.Filled.ArrowBack,
+                                    contentDescription = "Back"
+                                )
+                            }
+                        },
+                        title = {
+                            Text("Title")
+                        },
+                        actions = {
+                            IconButton(onClick = { /* doSomething() */ }) {
+                                Icon(
+                                    imageVector = Icons.Filled.Favorite,
+                                    contentDescription = "Like"
+                                )
+                            }
+                        }
+                    )
+                }
+            }
+        }
+
+        assertAppBarAgainstGolden(goldenIdentifier = "largeAppBar_darkTheme")
     }
 
     private fun assertAppBarAgainstGolden(goldenIdentifier: String) {
@@ -161,6 +317,6 @@
             .captureToImage()
             .assertAgainstGolden(screenshotRule, goldenIdentifier)
     }
-}
 
-private const val TestTag = "topAppBar"
+    private val TestTag = "topAppBar"
+}
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AppBarTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AppBarTest.kt
index 5411019..dd71a66 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AppBarTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AppBarTest.kt
@@ -17,25 +17,34 @@
 package androidx.compose.material3
 
 import android.os.Build
+import androidx.compose.animation.rememberSplineBasedDecay
 import androidx.compose.foundation.layout.Box
+import androidx.compose.material3.tokens.TopAppBarLarge
+import androidx.compose.material3.tokens.TopAppBarMedium
 import androidx.compose.material3.tokens.TopAppBarSmall
 import androidx.compose.material3.tokens.TopAppBarSmallCentered
 import androidx.compose.runtime.Composable
 import androidx.compose.testutils.assertContainsColor
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.compositeOver
 import androidx.compose.ui.graphics.painter.ColorPainter
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.test.assertHeightIsEqualTo
 import androidx.compose.ui.test.assertIsDisplayed
+import androidx.compose.ui.test.assertIsEqualTo
+import androidx.compose.ui.test.assertIsNotDisplayed
 import androidx.compose.ui.test.assertLeftPositionInRootIsEqualTo
 import androidx.compose.ui.test.assertTopPositionInRootIsEqualTo
 import androidx.compose.ui.test.assertWidthIsEqualTo
 import androidx.compose.ui.test.captureToImage
 import androidx.compose.ui.test.getUnclippedBoundsInRoot
 import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onAllNodesWithTag
+import androidx.compose.ui.test.onFirst
+import androidx.compose.ui.test.onLast
 import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.test.onNodeWithText
 import androidx.compose.ui.text.TextStyle
@@ -46,7 +55,6 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
 import androidx.test.filters.SdkSuppress
-import androidx.test.screenshot.AndroidXScreenshotTestRule
 import com.google.common.truth.Truth.assertThat
 import org.junit.Rule
 import org.junit.Test
@@ -59,9 +67,6 @@
     @get:Rule
     val rule = createComposeRule()
 
-    @get:Rule
-    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
-
     @Test
     fun smallTopAppBar_expandsToScreen() {
         rule
@@ -156,7 +161,7 @@
                     navigationIconColor = LocalContentColor.current
                     expectedNavigationIconColor =
                         TopAppBarDefaults.smallTopAppBarColors()
-                            .navigationIconColor(scrollFraction = 0f).value
+                            .navigationIconContentColor(scrollFraction = 0f).value
                     // scrollFraction = 0f to indicate no scroll.
                     expectedContainerColor = TopAppBarDefaults
                         .smallTopAppBarColors()
@@ -168,7 +173,7 @@
                     titleColor = LocalContentColor.current
                     expectedTitleColor = TopAppBarDefaults
                         .smallTopAppBarColors()
-                        .titleColor(scrollFraction = 0f)
+                        .titleContentColor(scrollFraction = 0f)
                         .value
                 },
                 actions = {
@@ -176,7 +181,7 @@
                     actionsColor = LocalContentColor.current
                     expectedActionsColor = TopAppBarDefaults
                         .smallTopAppBarColors()
-                        .actionIconColor(scrollFraction = 0f)
+                        .actionIconContentColor(scrollFraction = 0f)
                         .value
                 }
             )
@@ -192,6 +197,7 @@
             .assertContainsColor(expectedContainerColor)
     }
 
+    @OptIn(ExperimentalMaterial3Api::class)
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
     fun smallTopAppBar_scrolledContentColor() {
@@ -221,6 +227,7 @@
             .assertContainsColor(expectedScrolledContainerColor)
     }
 
+    @OptIn(ExperimentalMaterial3Api::class)
     @Test
     fun smallTopAppBar_scrolledPositioning() {
         val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior()
@@ -228,12 +235,10 @@
         var scrollOffsetPx = 0f
 
         rule.setMaterialContent {
+            scrollOffsetPx = with(LocalDensity.current) { scrollOffsetDp.toPx() }
             SmallTopAppBar(
                 modifier = Modifier.testTag(TopAppBarTestTag),
-                title = {
-                    Text("Title", Modifier.testTag(TitleTestTag))
-                    scrollOffsetPx = with(LocalDensity.current) { scrollOffsetDp.toPx() }
-                },
+                title = { Text("Title", Modifier.testTag(TitleTestTag)) },
                 scrollBehavior = scrollBehavior
             )
         }
@@ -249,30 +254,30 @@
     }
 
     @Test
-    fun smallCenteredTopAppBar_expandsToScreen() {
+    fun centerAlignedTopAppBar_expandsToScreen() {
         rule.setMaterialContentForSizeAssertions {
-            SmallCenteredTopAppBar(title = { Text("Title") })
+            CenterAlignedTopAppBar(title = { Text("Title") })
         }
             .assertHeightIsEqualTo(TopAppBarSmallCentered.SmallCenteredContainerHeight)
             .assertWidthIsEqualTo(rule.rootWidth())
     }
 
     @Test
-    fun smallCenteredTopAppBar_withTitle() {
+    fun centerAlignedTopAppBar_withTitle() {
         val title = "Title"
         rule.setMaterialContent {
             Box(Modifier.testTag(TopAppBarTestTag)) {
-                SmallCenteredTopAppBar(title = { Text(title) })
+                CenterAlignedTopAppBar(title = { Text(title) })
             }
         }
         rule.onNodeWithText(title).assertIsDisplayed()
     }
 
     @Test
-    fun smallCenteredTopAppBar_default_positioning() {
+    fun centerAlignedTopAppBar_default_positioning() {
         rule.setMaterialContent {
             Box(Modifier.testTag(TopAppBarTestTag)) {
-                SmallTopAppBar(
+                CenterAlignedTopAppBar(
                     navigationIcon = {
                         FakeIcon(Modifier.testTag(NavigationIconTestTag))
                     },
@@ -285,14 +290,14 @@
                 )
             }
         }
-        assertSmallDefaultPositioning()
+        assertSmallDefaultPositioning(isCenteredTitle = true)
     }
 
     @Test
-    fun smallCenteredTopAppBar_noNavigationIcon_positioning() {
+    fun centerAlignedTopAppBar_noNavigationIcon_positioning() {
         rule.setMaterialContent {
             Box(Modifier.testTag(TopAppBarTestTag)) {
-                SmallTopAppBar(
+                CenterAlignedTopAppBar(
                     title = {
                         Text("Title", Modifier.testTag(TitleTestTag))
                     },
@@ -302,15 +307,15 @@
                 )
             }
         }
-        assertSmallPositioningWithoutNavigation()
+        assertSmallPositioningWithoutNavigation(isCenteredTitle = true)
     }
 
     @Test
-    fun smallCenteredTopAppBar_titleDefaultStyle() {
+    fun centerAlignedTopAppBar_titleDefaultStyle() {
         var textStyle: TextStyle? = null
         var expectedTextStyle: TextStyle? = null
         rule.setMaterialContent {
-            SmallCenteredTopAppBar(
+            CenterAlignedTopAppBar(
                 title = {
                     Text("Title")
                     textStyle = LocalTextStyle.current
@@ -327,7 +332,7 @@
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
-    fun smallCenteredTopAppBar_contentColor() {
+    fun centerAlignedTopAppBar_contentColor() {
         var titleColor: Color = Color.Unspecified
         var navigationIconColor: Color = Color.Unspecified
         var actionsColor: Color = Color.Unspecified
@@ -337,32 +342,32 @@
         var expectedContainerColor: Color = Color.Unspecified
 
         rule.setMaterialContent {
-            SmallCenteredTopAppBar(
+            CenterAlignedTopAppBar(
                 modifier = Modifier.testTag(TopAppBarTestTag),
                 navigationIcon = {
                     FakeIcon(Modifier.testTag(NavigationIconTestTag))
                     navigationIconColor = LocalContentColor.current
                     expectedNavigationIconColor =
-                        TopAppBarDefaults.smallCenteredTopAppBarColors()
-                            .navigationIconColor(scrollFraction = 0f).value
+                        TopAppBarDefaults.centerAlignedTopAppBarColors()
+                            .navigationIconContentColor(scrollFraction = 0f).value
                     // scrollFraction = 0f to indicate no scroll.
                     expectedContainerColor =
-                        TopAppBarDefaults.smallCenteredTopAppBarColors()
+                        TopAppBarDefaults.centerAlignedTopAppBarColors()
                             .containerColor(scrollFraction = 0f).value
                 },
                 title = {
                     Text("Title", Modifier.testTag(TitleTestTag))
                     titleColor = LocalContentColor.current
                     expectedTitleColor =
-                        TopAppBarDefaults.smallCenteredTopAppBarColors()
-                            .titleColor(scrollFraction = 0f).value
+                        TopAppBarDefaults.centerAlignedTopAppBarColors()
+                            .titleContentColor(scrollFraction = 0f).value
                 },
                 actions = {
                     FakeIcon(Modifier.testTag(ActionsTestTag))
                     actionsColor = LocalContentColor.current
                     expectedActionsColor =
-                        TopAppBarDefaults.smallCenteredTopAppBarColors()
-                            .actionIconColor(scrollFraction = 0f).value
+                        TopAppBarDefaults.centerAlignedTopAppBarColors()
+                            .actionIconContentColor(scrollFraction = 0f).value
                 }
             )
         }
@@ -377,20 +382,21 @@
             .assertContainsColor(expectedContainerColor)
     }
 
+    @OptIn(ExperimentalMaterial3Api::class)
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     @Test
-    fun smallCenteredTopAppBar_scrolledContentColor() {
+    fun centerAlignedTopAppBar_scrolledContentColor() {
         var expectedScrolledContainerColor: Color = Color.Unspecified
         val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
 
         rule.setMaterialContent {
-            SmallCenteredTopAppBar(
+            CenterAlignedTopAppBar(
                 modifier = Modifier.testTag(TopAppBarTestTag),
                 title = {
                     Text("Title", Modifier.testTag(TitleTestTag))
                     // scrollFraction = 1f to indicate a scroll.
                     expectedScrolledContainerColor =
-                        TopAppBarDefaults.smallCenteredTopAppBarColors()
+                        TopAppBarDefaults.centerAlignedTopAppBarColors()
                             .containerColor(scrollFraction = 1f).value
                 },
                 scrollBehavior = scrollBehavior
@@ -406,18 +412,185 @@
             .assertContainsColor(expectedScrolledContainerColor)
     }
 
+    @Test
+    fun mediumTopAppBar_expandsToScreen() {
+        rule.setMaterialContentForSizeAssertions {
+            MediumTopAppBar(title = { Text("Medium Title") })
+        }
+            .assertHeightIsEqualTo(TopAppBarMedium.MediumContainerHeight)
+            .assertWidthIsEqualTo(rule.rootWidth())
+    }
+
+    @Test
+    fun mediumTopAppBar_expanded_positioning() {
+        rule.setMaterialContent {
+            Box(Modifier.testTag(TopAppBarTestTag)) {
+                MediumTopAppBar(
+                    navigationIcon = {
+                        FakeIcon(Modifier.testTag(NavigationIconTestTag))
+                    },
+                    title = {
+                        Text("Title", Modifier.testTag(TitleTestTag))
+                    },
+                    actions = {
+                        FakeIcon(Modifier.testTag(ActionsTestTag))
+                    }
+                )
+            }
+        }
+
+        // The bottom text baseline should be 24.dp from the bottom of the app bar.
+        assertMediumOrLargeDefaultPositioning(
+            expectedAppBarHeight = TopAppBarMedium.MediumContainerHeight,
+            bottomTextPadding = 24.dp
+        )
+    }
+
+    @Test
+    fun mediumTopAppBar_scrolled_positioning() {
+        val content = @Composable { scrollBehavior: TopAppBarScrollBehavior? ->
+            Box(Modifier.testTag(TopAppBarTestTag)) {
+                MediumTopAppBar(
+                    navigationIcon = {
+                        FakeIcon(Modifier.testTag(NavigationIconTestTag))
+                    },
+                    title = {
+                        Text("Title", Modifier.testTag(TitleTestTag))
+                    },
+                    actions = {
+                        FakeIcon(Modifier.testTag(ActionsTestTag))
+                    },
+                    scrollBehavior = scrollBehavior
+                )
+            }
+        }
+        assertMediumOrLargeScrolledHeight(
+            TopAppBarMedium.MediumContainerHeight,
+            TopAppBarSmall.SmallContainerHeight,
+            content
+        )
+    }
+
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    @Test
+    fun mediumTopAppBar_scrolledContainerColor() {
+        val content = @Composable { scrollBehavior: TopAppBarScrollBehavior? ->
+            MediumTopAppBar(
+                modifier = Modifier.testTag(TopAppBarTestTag),
+                title = {
+                    Text("Title", Modifier.testTag(TitleTestTag))
+                },
+                scrollBehavior = scrollBehavior
+            )
+        }
+
+        assertMediumOrLargeScrolledColors(
+            TopAppBarMedium.MediumContainerHeight,
+            TopAppBarSmall.SmallContainerHeight,
+            content
+        )
+    }
+
+    @Test
+    fun largeTopAppBar_expandsToScreen() {
+        rule.setMaterialContentForSizeAssertions {
+            LargeTopAppBar(title = { Text("Large Title") })
+        }
+            .assertHeightIsEqualTo(TopAppBarLarge.LargeContainerHeight)
+            .assertWidthIsEqualTo(rule.rootWidth())
+    }
+
+    @Test
+    fun largeTopAppBar_expanded_positioning() {
+        rule.setMaterialContent {
+            Box(Modifier.testTag(TopAppBarTestTag)) {
+                LargeTopAppBar(
+                    navigationIcon = {
+                        FakeIcon(Modifier.testTag(NavigationIconTestTag))
+                    },
+                    title = {
+                        Text("Title", Modifier.testTag(TitleTestTag))
+                    },
+                    actions = {
+                        FakeIcon(Modifier.testTag(ActionsTestTag))
+                    }
+                )
+            }
+        }
+
+        // The bottom text baseline should be 28.dp from the bottom of the app bar.
+        assertMediumOrLargeDefaultPositioning(
+            expectedAppBarHeight = TopAppBarLarge.LargeContainerHeight,
+            bottomTextPadding = 28.dp
+        )
+    }
+
+    @Test
+    fun largeTopAppBar_scrolled_positioning() {
+        val content = @Composable { scrollBehavior: TopAppBarScrollBehavior? ->
+            Box(Modifier.testTag(TopAppBarTestTag)) {
+                LargeTopAppBar(
+                    navigationIcon = {
+                        FakeIcon(Modifier.testTag(NavigationIconTestTag))
+                    },
+                    title = {
+                        Text("Title", Modifier.testTag(TitleTestTag))
+                    },
+                    actions = {
+                        FakeIcon(Modifier.testTag(ActionsTestTag))
+                    },
+                    scrollBehavior = scrollBehavior
+                )
+            }
+        }
+        assertMediumOrLargeScrolledHeight(
+            TopAppBarLarge.LargeContainerHeight,
+            TopAppBarSmall.SmallContainerHeight,
+            content
+        )
+    }
+
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    @Test
+    fun largeTopAppBar_scrolledContainerColor() {
+        val content = @Composable { scrollBehavior: TopAppBarScrollBehavior? ->
+            LargeTopAppBar(
+                modifier = Modifier.testTag(TopAppBarTestTag),
+                title = {
+                    Text("Title", Modifier.testTag(TitleTestTag))
+                },
+                scrollBehavior = scrollBehavior
+            )
+        }
+        assertMediumOrLargeScrolledColors(
+            TopAppBarLarge.LargeContainerHeight,
+            TopAppBarSmall.SmallContainerHeight,
+            content
+        )
+    }
+
     /**
      * Checks the app bar's components positioning when it's a [SmallTopAppBar], a
-     * [SmallCenteredTopAppBar], or a larger app bar that is scrolled up and collapsed into a small
+     * [CenterAlignedTopAppBar], or a larger app bar that is scrolled up and collapsed into a small
      * configuration and there is no navigation icon.
      */
-    private fun assertSmallPositioningWithoutNavigation() {
+    private fun assertSmallPositioningWithoutNavigation(isCenteredTitle: Boolean = false) {
         val appBarBounds = rule.onNodeWithTag(TopAppBarTestTag).getUnclippedBoundsInRoot()
+        val titleBounds = rule.onNodeWithTag(TitleTestTag).getUnclippedBoundsInRoot()
 
-        rule.onNodeWithTag(TitleTestTag)
+        val titleNode = rule.onNodeWithTag(TitleTestTag)
+        // Title should be vertically centered
+        titleNode.assertTopPositionInRootIsEqualTo((appBarBounds.height - titleBounds.height) / 2)
+        if (isCenteredTitle) {
+            // Title should be horizontally centered
+            titleNode.assertLeftPositionInRootIsEqualTo(
+                (appBarBounds.width - titleBounds.width) / 2
+            )
+        } else {
             // Title should now be placed 16.dp from the start, as there is no navigation icon
             // 4.dp padding for the whole app bar + 12.dp inset
-            .assertLeftPositionInRootIsEqualTo(4.dp + 12.dp)
+            titleNode.assertLeftPositionInRootIsEqualTo(4.dp + 12.dp)
+        }
 
         rule.onNodeWithTag(ActionsTestTag)
             // Action should still be placed at the end
@@ -425,11 +598,10 @@
     }
 
     /**
-     * Checks the app bar's components positioning when it's a [SmallTopAppBar], a
-     * [SmallCenteredTopAppBar], or a larger app bar that is scrolled up and collapsed into a small
-     * configuration.
+     * Checks the app bar's components positioning when it's a [SmallTopAppBar] or a
+     * [CenterAlignedTopAppBar].
      */
-    private fun assertSmallDefaultPositioning() {
+    private fun assertSmallDefaultPositioning(isCenteredTitle: Boolean = false) {
         val appBarBounds = rule.onNodeWithTag(TopAppBarTestTag).getUnclippedBoundsInRoot()
         val titleBounds = rule.onNodeWithTag(TitleTestTag).getUnclippedBoundsInRoot()
         val appBarBottomEdgeY = appBarBounds.top + appBarBounds.height
@@ -442,12 +614,19 @@
                 appBarBottomEdgeY - AppBarTopAndBottomPadding - FakeIconSize
             )
 
-        rule.onNodeWithTag(TitleTestTag)
+        val titleNode = rule.onNodeWithTag(TitleTestTag)
+        // Title should be vertically centered
+        titleNode.assertTopPositionInRootIsEqualTo((appBarBounds.height - titleBounds.height) / 2)
+        if (isCenteredTitle) {
+            // Title should be horizontally centered
+            titleNode.assertLeftPositionInRootIsEqualTo(
+                (appBarBounds.width - titleBounds.width) / 2
+            )
+        } else {
             // Title should be 56.dp from the start
             // 4.dp padding for the whole app bar + 48.dp icon size + 4.dp title padding.
-            .assertLeftPositionInRootIsEqualTo(4.dp + FakeIconSize + 4.dp)
-            // Title should be vertically centered
-            .assertTopPositionInRootIsEqualTo((appBarBounds.height - titleBounds.height) / 2)
+            titleNode.assertLeftPositionInRootIsEqualTo(4.dp + FakeIconSize + 4.dp)
+        }
 
         rule.onNodeWithTag(ActionsTestTag)
             // Action should be placed at the end
@@ -459,6 +638,209 @@
     }
 
     /**
+     * Checks the app bar's components positioning when it's a [MediumTopAppBar] or a
+     * [LargeTopAppBar].
+     */
+    private fun assertMediumOrLargeDefaultPositioning(
+        expectedAppBarHeight: Dp,
+        bottomTextPadding: Dp
+    ) {
+        val appBarBounds = rule.onNodeWithTag(TopAppBarTestTag).getUnclippedBoundsInRoot()
+        appBarBounds.height.assertIsEqualTo(expectedAppBarHeight, "top app bar height")
+
+        // Expecting the title composable to be reused for the top and bottom rows of the top app
+        // bar, so obtaining the node with the title tag should return two nodes, one for each row.
+        val allTitleNodes = rule.onAllNodesWithTag(TitleTestTag)
+        val topTitleNode = allTitleNodes.onFirst()
+        val bottomTitleNode = allTitleNodes.onLast()
+
+        val topTitleBounds = topTitleNode.getUnclippedBoundsInRoot()
+        val bottomTitleBounds = bottomTitleNode.getUnclippedBoundsInRoot()
+        val topAppBarBottomEdgeY = appBarBounds.top + TopAppBarSmall.SmallContainerHeight
+        val bottomAppBarBottomEdgeY = appBarBounds.top + appBarBounds.height
+
+        rule.onNodeWithTag(NavigationIconTestTag)
+            // Navigation icon should be 4.dp from the start
+            .assertLeftPositionInRootIsEqualTo(AppBarStartAndEndPadding)
+            // Navigation icon should be centered within the height of the top part of the app bar.
+            .assertTopPositionInRootIsEqualTo(
+                topAppBarBottomEdgeY - AppBarTopAndBottomPadding - FakeIconSize
+            )
+
+        rule.onNodeWithTag(ActionsTestTag)
+            // Action should be placed at the end
+            .assertLeftPositionInRootIsEqualTo(expectedActionPosition(appBarBounds.width))
+            // Action should be 8.dp from the top
+            .assertTopPositionInRootIsEqualTo(
+                topAppBarBottomEdgeY - AppBarTopAndBottomPadding - FakeIconSize
+            )
+
+        topTitleNode
+            // Top title should be 56.dp from the start
+            // 4.dp padding for the whole app bar + 48.dp icon size + 4.dp title padding.
+            .assertLeftPositionInRootIsEqualTo(4.dp + FakeIconSize + 4.dp)
+            // Title should be vertically centered in the top part, which has a height of a small
+            // app bar.
+            .assertTopPositionInRootIsEqualTo((topAppBarBottomEdgeY - topTitleBounds.height) / 2)
+
+        bottomTitleNode
+            // Bottom title should be 16.dp from the start.
+            .assertLeftPositionInRootIsEqualTo(16.dp)
+
+        // Check if the bottom text baseline is at the expected distance from the bottom of the
+        // app bar.
+        val bottomTextBaselineY = bottomTitleBounds.top + bottomTitleNode.getLastBaselinePosition()
+        (bottomAppBarBottomEdgeY - bottomTextBaselineY).assertIsEqualTo(
+            bottomTextPadding,
+            "text baseline distance from the bottom"
+        )
+    }
+
+    /**
+     * Checks that changing values at a [MediumTopAppBar] or a [LargeTopAppBar] scroll behavior
+     * affects the height of the app bar.
+     *
+     * This check partially and fully collapses the app bar to test its height.
+     *
+     * @param appBarMaxHeight the max height of the app bar [content]
+     * @param appBarMinHeight the min height of the app bar [content]
+     * @param content a Composable that adds a MediumTopAppBar or a LargeTopAppBar
+     */
+    @OptIn(ExperimentalMaterial3Api::class)
+    private fun assertMediumOrLargeScrolledHeight(
+        appBarMaxHeight: Dp,
+        appBarMinHeight: Dp,
+        content: @Composable (TopAppBarScrollBehavior?) -> Unit
+    ) {
+        val fullyCollapsedOffsetDp = appBarMaxHeight - appBarMinHeight
+        val partiallyCollapsedOffsetDp = fullyCollapsedOffsetDp / 3
+        var partiallyCollapsedOffsetPx = 0f
+        var fullyCollapsedOffsetPx = 0f
+        var scrollBehavior: TopAppBarScrollBehavior? = null
+        rule.setMaterialContent {
+            scrollBehavior =
+                TopAppBarDefaults.exitUntilCollapsedScrollBehavior(rememberSplineBasedDecay())
+            with(LocalDensity.current) {
+                partiallyCollapsedOffsetPx = partiallyCollapsedOffsetDp.toPx()
+                fullyCollapsedOffsetPx = fullyCollapsedOffsetDp.toPx()
+            }
+
+            content(scrollBehavior)
+        }
+
+        // Simulate a partially collapsed app bar.
+        rule.runOnIdle {
+            scrollBehavior!!.offset = -partiallyCollapsedOffsetPx
+            scrollBehavior!!.contentOffset = -partiallyCollapsedOffsetPx
+        }
+        rule.waitForIdle()
+        rule.onNodeWithTag(TopAppBarTestTag)
+            .assertHeightIsEqualTo(appBarMaxHeight - partiallyCollapsedOffsetDp)
+
+        // Simulate a fully collapsed app bar.
+        rule.runOnIdle {
+            scrollBehavior!!.offset = -fullyCollapsedOffsetPx
+            // Simulate additional content scroll beyond the max offset scroll.
+            scrollBehavior!!.contentOffset = -fullyCollapsedOffsetPx - partiallyCollapsedOffsetPx
+        }
+        rule.waitForIdle()
+        // Check that the app bar collapsed to its min height.
+        rule.onNodeWithTag(TopAppBarTestTag).assertHeightIsEqualTo(appBarMinHeight)
+    }
+
+    /**
+     * Checks that changing values at a [MediumTopAppBar] or a [LargeTopAppBar] scroll behavior
+     * affects the container color and the title's content color of the app bar.
+     *
+     * This check partially and fully collapses the app bar to test its colors.
+     *
+     * @param appBarMaxHeight the max height of the app bar [content]
+     * @param appBarMinHeight the min height of the app bar [content]
+     * @param content a Composable that adds a MediumTopAppBar or a LargeTopAppBar
+     */
+    @OptIn(ExperimentalMaterial3Api::class)
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    private fun assertMediumOrLargeScrolledColors(
+        appBarMaxHeight: Dp,
+        appBarMinHeight: Dp,
+        content: @Composable (TopAppBarScrollBehavior?) -> Unit
+    ) {
+        val fullyCollapsedOffsetDp = appBarMaxHeight - appBarMinHeight
+        val oneThirdCollapsedOffsetDp = fullyCollapsedOffsetDp / 3
+        var fullyCollapsedOffsetPx = 0f
+        var oneThirdCollapsedOffsetPx = 0f
+        var fullyCollapsedContainerColor: Color = Color.Unspecified
+        var oneThirdCollapsedContainerColor: Color = Color.Unspecified
+        var titleContentColor: Color = Color.Unspecified
+        var scrollBehavior: TopAppBarScrollBehavior? = null
+        rule.setMaterialContent {
+            scrollBehavior =
+                TopAppBarDefaults.exitUntilCollapsedScrollBehavior(rememberSplineBasedDecay())
+            // Using the mediumTopAppBarColors for both Medium and Large top app bars, as the
+            // current content color settings are the same.
+            oneThirdCollapsedContainerColor =
+                TopAppBarDefaults.mediumTopAppBarColors()
+                    .containerColor(scrollFraction = 1 / 3f).value
+            fullyCollapsedContainerColor =
+                TopAppBarDefaults.mediumTopAppBarColors()
+                    .containerColor(scrollFraction = 1f).value
+
+            // Resolve the title's content color. The default implementation returns the same color
+            // regardless of the scrollFraction, and the color is applied later with alpha.
+            titleContentColor =
+                TopAppBarDefaults.mediumTopAppBarColors()
+                    .titleContentColor(scrollFraction = 1f).value
+
+            with(LocalDensity.current) {
+                oneThirdCollapsedOffsetPx = oneThirdCollapsedOffsetDp.toPx()
+                fullyCollapsedOffsetPx = fullyCollapsedOffsetDp.toPx()
+            }
+
+            content(scrollBehavior)
+        }
+
+        // Expecting the title composable to be reused for the top and bottom rows of the top app
+        // bar, so obtaining the node with the title tag should return two nodes, one for each row.
+        val allTitleNodes = rule.onAllNodesWithTag(TitleTestTag)
+        val topTitleNode = allTitleNodes.onFirst()
+        val bottomTitleNode = allTitleNodes.onLast()
+
+        // Simulate 1/3 collapsed content.
+        rule.runOnIdle {
+            scrollBehavior!!.offset = -oneThirdCollapsedOffsetPx
+            scrollBehavior!!.contentOffset = -oneThirdCollapsedOffsetPx
+        }
+        rule.waitForIdle()
+        rule.onNodeWithTag(TopAppBarTestTag).captureToImage()
+            .assertContainsColor(oneThirdCollapsedContainerColor)
+
+        // Both top and bottom titles should be visible. The top should have the title text color
+        // with ~33.333% alpha, and the bottom with ~66.666% alpha.
+        topTitleNode.captureToImage()
+            .assertContainsColor(
+                titleContentColor.copy(alpha = 1 / 3f)
+                    .compositeOver(oneThirdCollapsedContainerColor)
+            )
+        bottomTitleNode.captureToImage()
+            .assertContainsColor(
+                titleContentColor.copy(alpha = 2 / 3f)
+                    .compositeOver(oneThirdCollapsedContainerColor)
+            )
+
+        // Simulate fully collapsed content.
+        rule.runOnIdle {
+            scrollBehavior!!.offset = -fullyCollapsedOffsetPx
+            scrollBehavior!!.contentOffset = -fullyCollapsedOffsetPx
+        }
+        rule.waitForIdle()
+        rule.onNodeWithTag(TopAppBarTestTag).captureToImage()
+            .assertContainsColor(fullyCollapsedContainerColor)
+        // Only the top title should be visible in the collapsed form.
+        topTitleNode.captureToImage().assertContainsColor(titleContentColor)
+        bottomTitleNode.assertIsNotDisplayed()
+    }
+
+    /**
      * An [IconButton] with an [Icon] inside for testing positions.
      *
      * An [IconButton] is defaulted to be 48X48dp, while its child [Icon] is defaulted to 24x24dp.
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifiedRelocationRequesterNode.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AutoTestFrameClock.kt
similarity index 63%
rename from compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifiedRelocationRequesterNode.kt
rename to compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AutoTestFrameClock.kt
index 25cdd15..31cc60e 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifiedRelocationRequesterNode.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/AutoTestFrameClock.kt
@@ -14,15 +14,15 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.node
+package androidx.compose.material3
 
-import androidx.compose.ui.layout.RelocationRequesterModifier
+import androidx.compose.runtime.MonotonicFrameClock
+import java.util.concurrent.atomic.AtomicLong
 
-internal class ModifiedRelocationRequesterNode(
-    wrapped: LayoutNodeWrapper,
-    modifier: RelocationRequesterModifier
-) : DelegatingLayoutNodeWrapper<RelocationRequesterModifier>(wrapped, modifier) {
-    init {
-        modifier.relocationRequesterNode = this
+class AutoTestFrameClock : MonotonicFrameClock {
+    private val time = AtomicLong(0)
+
+    override suspend fun <R> withFrameNanos(onFrame: (frameTimeNanos: Long) -> R): R {
+        return onFrame(time.getAndAdd(16_000_000))
     }
 }
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/BadgeScreenshotTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/BadgeScreenshotTest.kt
new file mode 100644
index 0000000..dc2f4c2
--- /dev/null
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/BadgeScreenshotTest.kt
@@ -0,0 +1,141 @@
+/*
+ * 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 android.os.Build
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.size
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Favorite
+import androidx.compose.testutils.assertAgainstGolden
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.test.ExperimentalTestApi
+import androidx.compose.ui.test.captureToImage
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.unit.dp
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
+import androidx.test.screenshot.AndroidXScreenshotTestRule
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+@OptIn(ExperimentalTestApi::class)
+class BadgeScreenshotTest {
+
+    @get:Rule
+    val composeTestRule = createComposeRule()
+
+    @get:Rule
+    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+
+    @Test
+    fun lightTheme_noContent() {
+        composeTestRule.setContent {
+            MaterialTheme(lightColorScheme()) {
+                Box(
+                    Modifier.size(56.dp).semantics(mergeDescendants = true) {}.testTag(TestTag),
+                    contentAlignment = Alignment.Center
+                ) {
+                    BadgedBox(badge = { Badge() }) {
+                        Icon(Icons.Filled.Favorite, null)
+                    }
+                }
+            }
+        }
+
+        assertBadgeAgainstGolden(
+            goldenIdentifier = "badge_lightTheme_noContent"
+        )
+    }
+
+    @Test
+    fun darkTheme_noContent() {
+        composeTestRule.setContent {
+            MaterialTheme(darkColorScheme()) {
+                Box(
+                    Modifier.size(56.dp).semantics(mergeDescendants = true) {}.testTag(TestTag),
+                    contentAlignment = Alignment.Center
+                ) {
+                    BadgedBox(badge = { Badge() }) {
+                        Icon(Icons.Filled.Favorite, null)
+                    }
+                }
+            }
+        }
+
+        assertBadgeAgainstGolden(
+            goldenIdentifier = "badge_darkTheme_noContent"
+        )
+    }
+
+    @Test
+    fun lightTheme_withContent() {
+        composeTestRule.setContent {
+            MaterialTheme(lightColorScheme()) {
+                Box(
+                    Modifier.size(56.dp).semantics(mergeDescendants = true) {}.testTag(TestTag),
+                    contentAlignment = Alignment.Center
+                ) {
+                    BadgedBox(badge = { Badge { Text("8") } }) {
+                        Icon(Icons.Filled.Favorite, null)
+                    }
+                }
+            }
+        }
+
+        assertBadgeAgainstGolden(
+            goldenIdentifier = "badge_lightTheme_withContent"
+        )
+    }
+
+    @Test
+    fun darkTheme_withContent() {
+        composeTestRule.setContent {
+            MaterialTheme(darkColorScheme()) {
+                Box(
+                    Modifier.size(56.dp).semantics(mergeDescendants = true) {}.testTag(TestTag),
+                    contentAlignment = Alignment.Center
+                ) {
+                    BadgedBox(badge = { Badge { Text("8") } }) {
+                        Icon(Icons.Filled.Favorite, null)
+                    }
+                }
+            }
+        }
+
+        assertBadgeAgainstGolden(
+            goldenIdentifier = "badge_darkTheme_withContent"
+        )
+    }
+
+    private fun assertBadgeAgainstGolden(goldenIdentifier: String) {
+        composeTestRule.onNodeWithTag(TestTag)
+            .captureToImage()
+            .assertAgainstGolden(screenshotRule, goldenIdentifier)
+    }
+}
+
+private const val TestTag = "badge"
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/BadgeTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/BadgeTest.kt
new file mode 100644
index 0000000..4714915
--- /dev/null
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/BadgeTest.kt
@@ -0,0 +1,234 @@
+/*
+ * 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 android.os.Build
+import androidx.compose.foundation.layout.size
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Favorite
+import androidx.compose.material3.tokens.NavigationBar
+import androidx.compose.testutils.assertShape
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.contentDescription
+import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.test.assertContentDescriptionEquals
+import androidx.compose.ui.test.assertHeightIsEqualTo
+import androidx.compose.ui.test.assertPositionInRootIsEqualTo
+import androidx.compose.ui.test.assertWidthIsAtLeast
+import androidx.compose.ui.test.assertWidthIsEqualTo
+import androidx.compose.ui.test.captureToImage
+import androidx.compose.ui.test.getUnclippedBoundsInRoot
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.onSibling
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.height
+import androidx.compose.ui.unit.max
+import androidx.compose.ui.unit.width
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+class BadgeTest {
+
+    private val icon = Icons.Filled.Favorite
+
+    @get:Rule
+    val rule = createComposeRule()
+
+    @Test
+    fun badge_noContent_size() {
+        rule
+            .setMaterialContentForSizeAssertions {
+                Badge()
+            }
+            .assertHeightIsEqualTo(NavigationBar.BadgeSize)
+            .assertWidthIsEqualTo(NavigationBar.BadgeSize)
+    }
+
+    @Test
+    fun badge_shortContent_size() {
+        rule
+            .setMaterialContentForSizeAssertions {
+                Badge { Text("1") }
+            }
+            .assertHeightIsEqualTo(NavigationBar.LargeBadgeSize)
+            .assertWidthIsEqualTo(NavigationBar.LargeBadgeSize)
+    }
+
+    @Test
+    fun badge_longContent_size() {
+        rule
+            .setMaterialContentForSizeAssertions {
+                Badge { Text("999+") }
+            }
+            .assertHeightIsEqualTo(NavigationBar.LargeBadgeSize)
+            .assertWidthIsAtLeast(NavigationBar.LargeBadgeSize)
+    }
+
+    @Test
+    fun badge_shortContent_customSizeModifier_size() {
+        val customWidth = 24.dp
+        val customHeight = 6.dp
+        rule
+            .setMaterialContentForSizeAssertions {
+                Badge(modifier = Modifier.size(customWidth, customHeight)) {
+                    Text("1")
+                }
+            }
+            .assertHeightIsEqualTo(customHeight)
+            .assertWidthIsEqualTo(customWidth)
+    }
+
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    @Test
+    fun badge_noContent_shape() {
+        var errorColor = Color.Unspecified
+        rule.setMaterialContent {
+            errorColor = MaterialTheme.colorScheme.fromToken(NavigationBar.BadgeColor)
+            Badge(modifier = Modifier.testTag(TestBadgeTag))
+        }
+
+        rule.onNodeWithTag(TestBadgeTag)
+            .captureToImage()
+            .assertShape(
+                density = rule.density,
+                shape = NavigationBar.BadgeShape,
+                shapeColor = errorColor,
+                backgroundColor = Color.White,
+                shapeOverlapPixelCount = with(rule.density) { 1.dp.toPx() }
+            )
+    }
+
+    @Test
+    fun badgeBox_noContent_position() {
+        rule
+            .setMaterialContent {
+                BadgedBox(badge = { Badge(Modifier.testTag(TestBadgeTag)) }) {
+                    Icon(
+                        icon,
+                        null,
+                        modifier = Modifier.testTag(TestAnchorTag)
+                    )
+                }
+            }
+        val badge = rule.onNodeWithTag(TestBadgeTag)
+        val anchorBounds = rule.onNodeWithTag(TestAnchorTag).getUnclippedBoundsInRoot()
+        val badgeBounds = badge.getUnclippedBoundsInRoot()
+        badge.assertPositionInRootIsEqualTo(
+            expectedLeft =
+                anchorBounds.right + BadgeOffset +
+                    max((NavigationBar.BadgeSize - badgeBounds.width) / 2, 0.dp),
+            expectedTop = -badgeBounds.height / 2
+        )
+    }
+
+    @Test
+    fun badgeBox_shortContent_position() {
+        rule
+            .setMaterialContent {
+                BadgedBox(badge = { Badge { Text("8") } }) {
+                    Icon(
+                        icon,
+                        null,
+                        modifier = Modifier.testTag(TestAnchorTag)
+                    )
+                }
+            }
+        val badge = rule.onNodeWithTag(TestAnchorTag).onSibling()
+        val anchorBounds = rule.onNodeWithTag(TestAnchorTag).getUnclippedBoundsInRoot()
+        val badgeBounds = badge.getUnclippedBoundsInRoot()
+        badge.assertPositionInRootIsEqualTo(
+            expectedLeft = anchorBounds.right + BadgeWithContentHorizontalOffset + max
+            (
+                (
+                    NavigationBar.LargeBadgeSize - badgeBounds.width
+                    ) / 2,
+                0.dp
+            ),
+            expectedTop = -badgeBounds.height / 2 + BadgeWithContentVerticalOffset
+        )
+    }
+
+    @Test
+    fun badgeBox_longContent_position() {
+        rule
+            .setMaterialContent {
+                BadgedBox(badge = { Badge { Text("999+") } }) {
+                    Icon(
+                        icon,
+                        null,
+                        modifier = Modifier.testTag(TestAnchorTag)
+                    )
+                }
+            }
+        val badge = rule.onNodeWithTag(TestAnchorTag).onSibling()
+        val anchorBounds = rule.onNodeWithTag(TestAnchorTag).getUnclippedBoundsInRoot()
+        val badgeBounds = badge.getUnclippedBoundsInRoot()
+
+        val totalBadgeHorizontalOffset = BadgeWithContentHorizontalOffset +
+            BadgeWithContentHorizontalPadding
+        badge.assertPositionInRootIsEqualTo(
+            expectedLeft = anchorBounds.right + totalBadgeHorizontalOffset,
+            expectedTop = -badgeBounds.height / 2 + BadgeWithContentVerticalOffset
+        )
+    }
+
+    @Test
+    fun badge_notMergingDescendants_withOwnContentDescription() {
+        rule.setMaterialContent {
+            BadgedBox(
+                badge = {
+                    Badge { Text("99+") }
+                },
+                modifier = Modifier.testTag(TestBadgeTag).semantics {
+                    this.contentDescription = "more than 99 new email"
+                }
+            ) {
+                Text(
+                    "inbox",
+                    Modifier.semantics {
+                        this.contentDescription = "inbox"
+                    }.testTag(TestAnchorTag)
+                )
+            }
+        }
+
+        rule.onNodeWithTag(TestBadgeTag).assertContentDescriptionEquals("more than 99 new email")
+        rule.onNodeWithTag(TestAnchorTag).assertContentDescriptionEquals("inbox")
+    }
+
+    @Test
+    fun badgeBox_size() {
+        rule.setMaterialContentForSizeAssertions {
+            BadgedBox(badge = { Badge { Text("999+") } }) {
+                Icon(icon, null)
+            }
+        }
+            .assertWidthIsEqualTo(icon.defaultWidth)
+            .assertHeightIsEqualTo(icon.defaultHeight)
+    }
+}
+
+private const val TestBadgeTag = "badge"
+private const val TestAnchorTag = "anchor"
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationBarScreenshotTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationBarScreenshotTest.kt
new file mode 100644
index 0000000..897a894
--- /dev/null
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationBarScreenshotTest.kt
@@ -0,0 +1,213 @@
+/*
+ * 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 android.os.Build
+import androidx.compose.foundation.interaction.Interaction
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.interaction.PressInteraction
+import androidx.compose.foundation.layout.Box
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Favorite
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.testutils.assertAgainstGolden
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.test.ExperimentalTestApi
+import androidx.compose.ui.test.captureToImage
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
+import androidx.test.screenshot.AndroidXScreenshotTestRule
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.launch
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+@OptIn(ExperimentalMaterial3Api::class, ExperimentalTestApi::class)
+class NavigationBarScreenshotTest {
+
+    @get:Rule
+    val composeTestRule = createComposeRule()
+
+    @get:Rule
+    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+
+    @Test
+    fun lightTheme_defaultColors() {
+        val interactionSource = MutableInteractionSource()
+
+        var scope: CoroutineScope? = null
+
+        composeTestRule.setContent {
+            MaterialTheme(lightColorScheme()) {
+                scope = rememberCoroutineScope()
+                DefaultNavigationBar(interactionSource)
+            }
+        }
+
+        assertNavigationBarMatches(
+            scope = scope!!,
+            interactionSource = interactionSource,
+            interaction = null,
+            goldenIdentifier = "navigationBar_lightTheme_defaultColors"
+        )
+    }
+
+    @Test
+    fun lightTheme_defaultColors_pressed() {
+        val interactionSource = MutableInteractionSource()
+
+        var scope: CoroutineScope? = null
+
+        composeTestRule.setContent {
+            MaterialTheme(lightColorScheme()) {
+                scope = rememberCoroutineScope()
+                DefaultNavigationBar(interactionSource)
+            }
+        }
+
+        assertNavigationBarMatches(
+            scope = scope!!,
+            interactionSource = interactionSource,
+            interaction = PressInteraction.Press(Offset(10f, 10f)),
+            goldenIdentifier = "navigationBar_lightTheme_defaultColors_pressed"
+        )
+    }
+
+    @Test
+    fun darkTheme_defaultColors() {
+        val interactionSource = MutableInteractionSource()
+
+        var scope: CoroutineScope? = null
+
+        composeTestRule.setContent {
+            MaterialTheme(darkColorScheme()) {
+                scope = rememberCoroutineScope()
+                DefaultNavigationBar(interactionSource)
+            }
+        }
+
+        assertNavigationBarMatches(
+            scope = scope!!,
+            interactionSource = interactionSource,
+            interaction = null,
+            goldenIdentifier = "navigationBar_darkTheme_defaultColors"
+        )
+    }
+
+    @Test
+    fun darkTheme_defaultColors_pressed() {
+        val interactionSource = MutableInteractionSource()
+
+        var scope: CoroutineScope? = null
+
+        composeTestRule.setContent {
+            MaterialTheme(darkColorScheme()) {
+                scope = rememberCoroutineScope()
+                DefaultNavigationBar(interactionSource)
+            }
+        }
+
+        assertNavigationBarMatches(
+            scope = scope!!,
+            interactionSource = interactionSource,
+            interaction = PressInteraction.Press(Offset(10f, 10f)),
+            goldenIdentifier = "navigationBar_darkTheme_defaultColors_pressed"
+        )
+    }
+
+    /**
+     * Asserts that the [NavigationBar] matches the screenshot with identifier [goldenIdentifier].
+     *
+     * @param scope [CoroutineScope] used to interact with [MutableInteractionSource]
+     * @param interactionSource the [MutableInteractionSource] used for the first
+     * [NavigationBarItem]
+     * @param interaction the [Interaction] to assert for, or `null` if no [Interaction].
+     * @param goldenIdentifier the identifier for the corresponding screenshot
+     */
+    private fun assertNavigationBarMatches(
+        scope: CoroutineScope,
+        interactionSource: MutableInteractionSource,
+        interaction: Interaction? = null,
+        goldenIdentifier: String
+    ) {
+        if (interaction != null) {
+            composeTestRule.runOnIdle {
+                // Start ripple
+                scope.launch {
+                    interactionSource.emit(interaction)
+                }
+            }
+
+            composeTestRule.waitForIdle()
+            // Ripples are drawn on the RenderThread, not the main (UI) thread, so we can't
+            // properly wait for synchronization. Instead just wait until after the ripples are
+            // finished animating.
+            Thread.sleep(300)
+        }
+
+        // Capture and compare screenshots
+        composeTestRule.onNodeWithTag(Tag)
+            .captureToImage()
+            .assertAgainstGolden(screenshotRule, goldenIdentifier)
+    }
+}
+
+/**
+ * Default colored [NavigationBar] with three [NavigationBarItem]s. The first
+ * [NavigationBarItem] is selected, and the rest are not.
+ *
+ * @param interactionSource the [MutableInteractionSource] for the first [NavigationBarItem], to
+ * control its visual state.
+ */
+@Composable
+private fun DefaultNavigationBar(
+    interactionSource: MutableInteractionSource
+) {
+    Box(Modifier.semantics(mergeDescendants = true) {}.testTag(Tag)) {
+        NavigationBar {
+            NavigationBarItem(
+                icon = { Icon(Icons.Filled.Favorite, null) },
+                selected = true,
+                onClick = {},
+                interactionSource = interactionSource
+            )
+            NavigationBarItem(
+                icon = { Icon(Icons.Filled.Favorite, null) },
+                selected = false,
+                onClick = {}
+            )
+            NavigationBarItem(
+                icon = { Icon(Icons.Filled.Favorite, null) },
+                selected = false,
+                onClick = {}
+            )
+        }
+    }
+}
+
+private const val Tag = "NavigationBar"
\ No newline at end of file
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationBarTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationBarTest.kt
new file mode 100644
index 0000000..fb6a126
--- /dev/null
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationBarTest.kt
@@ -0,0 +1,338 @@
+/*
+ * 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.layout.Box
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Favorite
+import androidx.compose.material3.samples.NavigationBarSample
+import androidx.compose.testutils.assertIsEqualTo
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.layout.LayoutCoordinates
+import androidx.compose.ui.layout.onGloballyPositioned
+import androidx.compose.ui.layout.positionInWindow
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.Role
+import androidx.compose.ui.semantics.SemanticsProperties
+import androidx.compose.ui.test.SemanticsMatcher
+import androidx.compose.ui.test.assert
+import androidx.compose.ui.test.assertCountEquals
+import androidx.compose.ui.test.assertHasClickAction
+import androidx.compose.ui.test.assertHeightIsEqualTo
+import androidx.compose.ui.test.assertIsEnabled
+import androidx.compose.ui.test.assertIsNotDisplayed
+import androidx.compose.ui.test.assertIsNotEnabled
+import androidx.compose.ui.test.assertIsNotSelected
+import androidx.compose.ui.test.assertIsSelected
+import androidx.compose.ui.test.assertLeftPositionInRootIsEqualTo
+import androidx.compose.ui.test.assertTopPositionInRootIsEqualTo
+import androidx.compose.ui.test.assertWidthIsEqualTo
+import androidx.compose.ui.test.getUnclippedBoundsInRoot
+import androidx.compose.ui.test.isSelectable
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.onNodeWithText
+import androidx.compose.ui.test.onParent
+import androidx.compose.ui.test.performClick
+import androidx.compose.ui.unit.height
+import androidx.compose.ui.unit.width
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import com.google.common.truth.Truth
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import androidx.compose.material3.tokens.NavigationBar as NavigationBarTokens
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+/**
+ * Test for [NavigationBar] and [NavigationBarItem].
+ */
+class NavigationBarTest {
+    @get:Rule
+    val rule = createComposeRule()
+
+    @Test
+    fun defaultSemantics() {
+        rule.setMaterialContent {
+            NavigationBar {
+                NavigationBarItem(
+                    modifier = Modifier.testTag("item"),
+                    icon = {
+                        Icon(Icons.Filled.Favorite, null)
+                    },
+                    label = {
+                        Text("ItemText")
+                    },
+                    selected = true,
+                    onClick = {}
+                )
+            }
+        }
+
+        rule.onNodeWithTag("item")
+            .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
+            .assertIsSelected()
+            .assertIsEnabled()
+            .assertHasClickAction()
+
+        rule.onNodeWithTag("item")
+            .onParent()
+            .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.SelectableGroup))
+    }
+
+    @Test
+    fun disabledSemantics() {
+        rule.setMaterialContent {
+            NavigationBar {
+                NavigationBarItem(
+                    enabled = false,
+                    modifier = Modifier.testTag("item"),
+                    icon = {
+                        Icon(Icons.Filled.Favorite, null)
+                    },
+                    label = {
+                        Text("ItemText")
+                    },
+                    selected = true,
+                    onClick = {}
+                )
+            }
+        }
+
+        rule.onNodeWithTag("item")
+            .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
+            .assertIsSelected()
+            .assertIsNotEnabled()
+            .assertHasClickAction()
+    }
+
+    @Test
+    fun navigationBar_size() {
+        val height = NavigationBarTokens.ContainerHeight
+        rule.setMaterialContentForSizeAssertions {
+            NavigationBarSample()
+        }
+            .assertWidthIsEqualTo(rule.rootWidth())
+            .assertHeightIsEqualTo(height)
+    }
+
+    @Test
+    fun navigationBarItem_sizeAndPositions() {
+        lateinit var parentCoords: LayoutCoordinates
+        val itemCoords = mutableMapOf<Int, LayoutCoordinates>()
+        rule.setMaterialContent(
+            Modifier.onGloballyPositioned { coords: LayoutCoordinates ->
+                parentCoords = coords
+            }
+        ) {
+            Box {
+                NavigationBar {
+                    repeat(4) { index ->
+                        NavigationBarItem(
+                            icon = { Icon(Icons.Filled.Favorite, null) },
+                            label = { Text("Item $index") },
+                            selected = index == 0,
+                            onClick = {},
+                            modifier = Modifier.onGloballyPositioned { coords ->
+                                itemCoords[index] = coords
+                            }
+                        )
+                    }
+                }
+            }
+        }
+
+        rule.runOnIdleWithDensity {
+            val totalWidth = parentCoords.size.width
+
+            val expectedItemWidth = totalWidth / 4
+            val expectedItemHeight = NavigationBarTokens.ContainerHeight.roundToPx()
+
+            Truth.assertThat(itemCoords.size).isEqualTo(4)
+
+            itemCoords.forEach { (index, coord) ->
+                Truth.assertThat(coord.size.width).isEqualTo(expectedItemWidth)
+                Truth.assertThat(coord.size.height).isEqualTo(expectedItemHeight)
+                Truth.assertThat(coord.positionInWindow().x)
+                    .isEqualTo((expectedItemWidth * index).toFloat())
+            }
+        }
+    }
+
+    @Test
+    fun navigationBarItemContent_withLabel_sizeAndPosition() {
+        rule.setMaterialContent {
+            Box {
+                NavigationBar {
+                    NavigationBarItem(
+                        modifier = Modifier.testTag("item"),
+                        icon = {
+                            Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon"))
+                        },
+                        label = {
+                            Text("ItemText")
+                        },
+                        selected = true,
+                        onClick = {}
+                    )
+                }
+            }
+        }
+
+        val itemBounds = rule.onNodeWithTag("item").getUnclippedBoundsInRoot()
+        val iconBounds = rule.onNodeWithTag("icon", useUnmergedTree = true)
+            .getUnclippedBoundsInRoot()
+        val textBounds = rule.onNodeWithText("ItemText").getUnclippedBoundsInRoot()
+
+        // Distance from the bottom to the text baseline, and from the top of the icon to the
+        // top of the item
+        val verticalPadding = NavigationBarItemVerticalPadding
+
+        // Relative position of the baseline to the top of text
+        val relativeTextBaseline = rule.onNodeWithText("ItemText").getLastBaselinePosition()
+        // Absolute y position of the text baseline
+        val absoluteTextBaseline = textBounds.top + relativeTextBaseline
+
+        val itemBottom = itemBounds.height + itemBounds.top
+        // Text baseline should be `verticalPadding` from the bottom of the item
+        absoluteTextBaseline.assertIsEqualTo(itemBottom - verticalPadding)
+
+        rule.onNodeWithTag("icon", useUnmergedTree = true)
+            // The icon should be centered in the item
+            .assertLeftPositionInRootIsEqualTo((itemBounds.width - iconBounds.width) / 2)
+            // The top of the icon is `verticalPadding` below the top of the item
+            .assertTopPositionInRootIsEqualTo(itemBounds.top + verticalPadding)
+    }
+
+    @Test
+    fun navigationBarItemContent_withLabel_unselected_sizeAndPosition() {
+        rule.setMaterialContent {
+            Box {
+                NavigationBar {
+                    NavigationBarItem(
+                        modifier = Modifier.testTag("item"),
+                        icon = {
+                            Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon"))
+                        },
+                        label = {
+                            Text("ItemText")
+                        },
+                        selected = false,
+                        onClick = {},
+                        alwaysShowLabel = false
+                    )
+                }
+            }
+        }
+
+        // The text should not be placed, since the item is not selected and alwaysShowLabels
+        // is false
+        rule.onNodeWithText("ItemText", useUnmergedTree = true).assertIsNotDisplayed()
+
+        val itemBounds = rule.onNodeWithTag("item").getUnclippedBoundsInRoot()
+        val iconBounds = rule.onNodeWithTag("icon", useUnmergedTree = true)
+            .getUnclippedBoundsInRoot()
+
+        rule.onNodeWithTag("icon", useUnmergedTree = true)
+            .assertLeftPositionInRootIsEqualTo((itemBounds.width - iconBounds.width) / 2)
+            .assertTopPositionInRootIsEqualTo((itemBounds.height - iconBounds.height) / 2)
+    }
+
+    @Test
+    fun navigationBarItemContent_withoutLabel_sizeAndPosition() {
+        rule.setMaterialContent {
+            Box {
+                NavigationBar {
+                    NavigationBarItem(
+                        modifier = Modifier.testTag("item"),
+                        icon = {
+                            Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon"))
+                        },
+                        label = null,
+                        selected = false,
+                        onClick = {}
+                    )
+                }
+            }
+        }
+
+        val itemBounds = rule.onNodeWithTag("item").getUnclippedBoundsInRoot()
+        val iconBounds = rule.onNodeWithTag("icon", useUnmergedTree = true)
+            .getUnclippedBoundsInRoot()
+
+        // The icon should be centered in the item, as there is no text placeable provided
+        rule.onNodeWithTag("icon", useUnmergedTree = true)
+            .assertLeftPositionInRootIsEqualTo((itemBounds.width - iconBounds.width) / 2)
+            .assertTopPositionInRootIsEqualTo((itemBounds.height - iconBounds.height) / 2)
+    }
+
+    @Test
+    fun navigationBar_selectNewItem() {
+        rule.setMaterialContent {
+            NavigationBarSample()
+        }
+
+        // Find all items and ensure there are 3
+        rule.onAllNodes(isSelectable())
+            .assertCountEquals(3)
+            // Ensure semantics match for selected state of the items
+            .apply {
+                get(0).assertIsSelected()
+                get(1).assertIsNotSelected()
+                get(2).assertIsNotSelected()
+            }
+            // Click the last item
+            .apply {
+                get(2).performClick()
+            }
+            .apply {
+                get(0).assertIsNotSelected()
+                get(1).assertIsNotSelected()
+                get(2).assertIsSelected()
+            }
+    }
+
+    @Test
+    fun disabled_noClicks() {
+        var clicks = 0
+        rule.setMaterialContent {
+            NavigationBar {
+                NavigationBarItem(
+                    enabled = false,
+                    modifier = Modifier.testTag("item"),
+                    icon = {
+                        Icon(Icons.Filled.Favorite, null)
+                    },
+                    label = {
+                        Text("ItemText")
+                    },
+                    selected = true,
+                    onClick = { clicks++ }
+                )
+            }
+        }
+
+        rule.onNodeWithTag("item")
+            .performClick()
+
+        rule.runOnIdle {
+            Truth.assertThat(clicks).isEqualTo(0)
+        }
+    }
+}
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationDrawerScreenshotTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationDrawerScreenshotTest.kt
new file mode 100644
index 0000000..a2991a4
--- /dev/null
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationDrawerScreenshotTest.kt
@@ -0,0 +1,123 @@
+/*
+ * 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 android.os.Build
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.requiredSize
+import androidx.compose.runtime.Composable
+import androidx.compose.testutils.assertAgainstGolden
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.captureToImage
+import androidx.compose.ui.test.junit4.ComposeContentTestRule
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.unit.dp
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
+import androidx.test.screenshot.AndroidXScreenshotTestRule
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+@OptIn(ExperimentalMaterial3Api::class)
+@SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+class NavigationDrawerScreenshotTest {
+
+    @Suppress("DEPRECATION")
+    @get:Rule
+    val rule = createComposeRule()
+
+    @get:Rule
+    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+
+    private fun ComposeContentTestRule.setnavigationDrawer(drawerValue: DrawerValue) {
+        setMaterialContent {
+            Box(Modifier.requiredSize(400.dp, 32.dp).testTag(ContainerTestTag)) {
+                NavigationDrawer(
+                    drawerState = rememberDrawerState(drawerValue),
+                    drawerContent = {},
+                    content = {
+                        Box(
+                            Modifier.fillMaxSize().background(MaterialTheme.colorScheme.background)
+                        )
+                    }
+                )
+            }
+        }
+    }
+
+    // TODO(b/196872589): Move to MaterialTest
+    private fun ComposeContentTestRule.setMaterialContentWithDarkTheme(
+        modifier: Modifier = Modifier,
+        composable: @Composable () -> Unit,
+    ) {
+        setContent {
+            MaterialTheme(colorScheme = darkColorScheme()) {
+                Surface(modifier = modifier, content = composable)
+            }
+        }
+    }
+
+    private fun ComposeContentTestRule.setDarknavigationDrawer(drawerValue: DrawerValue) {
+        setMaterialContentWithDarkTheme {
+            Box(Modifier.requiredSize(400.dp, 32.dp).testTag(ContainerTestTag)) {
+                NavigationDrawer(
+                    drawerState = rememberDrawerState(drawerValue),
+                    drawerContent = {},
+                    content = {
+                        Box(
+                            Modifier.fillMaxSize().background(MaterialTheme.colorScheme.background)
+                        )
+                    }
+                )
+            }
+        }
+    }
+
+    @Test
+    fun lightTheme_navigationDrawer_closed() {
+        rule.setnavigationDrawer(DrawerValue.Closed)
+        assertScreenshotAgainstGolden("navigationDrawer_closed")
+    }
+
+    @Test
+    fun lightTheme_navigationDrawer_open() {
+        rule.setnavigationDrawer(DrawerValue.Open)
+        assertScreenshotAgainstGolden("navigationDrawer_light_opened")
+    }
+
+    @Test
+    fun darkTheme_navigationDrawer_open() {
+        rule.setDarknavigationDrawer(DrawerValue.Open)
+        assertScreenshotAgainstGolden("navigationDrawer_dark_opened")
+    }
+
+    private fun assertScreenshotAgainstGolden(goldenName: String) {
+        rule.onNodeWithTag("container")
+            .captureToImage()
+            .assertAgainstGolden(screenshotRule, goldenName)
+    }
+}
+
+private val ContainerTestTag = "container"
\ No newline at end of file
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationDrawerTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationDrawerTest.kt
new file mode 100644
index 0000000..f2ac639
--- /dev/null
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationDrawerTest.kt
@@ -0,0 +1,534 @@
+/*
+ * 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.animation.core.TweenSpec
+import androidx.compose.foundation.background
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.material3.tokens.NavigationDrawer
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalLayoutDirection
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.SemanticsActions
+import androidx.compose.ui.semantics.SemanticsProperties
+import androidx.compose.ui.test.SemanticsMatcher
+import androidx.compose.ui.test.assert
+import androidx.compose.ui.test.assertHasClickAction
+import androidx.compose.ui.test.assertLeftPositionInRootIsEqualTo
+import androidx.compose.ui.test.assertWidthIsEqualTo
+import androidx.compose.ui.test.click
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithContentDescription
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.onParent
+import androidx.compose.ui.test.performClick
+import androidx.compose.ui.test.performSemanticsAction
+import androidx.compose.ui.test.performTouchInput
+import androidx.compose.ui.test.swipeLeft
+import androidx.compose.ui.test.swipeRight
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.dp
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.test.filters.MediumTest
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.runBlocking
+import org.junit.Assert.assertEquals
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+@OptIn(ExperimentalMaterial3Api::class)
+class NavigationDrawerTest {
+
+    @get:Rule
+    val rule = createComposeRule()
+
+    private fun advanceClock() {
+        rule.mainClock.advanceTimeBy(100_000L)
+    }
+
+    @Test
+    fun navigationDrawer_testOffset_whenOpen() {
+        rule.setMaterialContent {
+            val drawerState = rememberDrawerState(DrawerValue.Open)
+            NavigationDrawer(
+                drawerState = drawerState,
+                drawerContent = {
+                    Box(Modifier.fillMaxSize().testTag("content"))
+                },
+                content = {}
+            )
+        }
+
+        rule.onNodeWithTag("content")
+            .assertLeftPositionInRootIsEqualTo(0.dp)
+    }
+
+    @Test
+    fun navigationDrawer_testOffset_whenClosed() {
+        rule.setMaterialContent {
+            val drawerState = rememberDrawerState(DrawerValue.Closed)
+            NavigationDrawer(
+                drawerState = drawerState,
+                drawerContent = {
+                    Box(Modifier.fillMaxSize().testTag("content"))
+                },
+                content = {}
+            )
+        }
+
+        val width = rule.rootWidth()
+        rule.onNodeWithTag("content")
+            .assertLeftPositionInRootIsEqualTo(-width)
+    }
+
+    @Test
+    fun navigationDrawer_testWidth_whenOpen() {
+        rule.setMaterialContent {
+            val drawerState = rememberDrawerState(DrawerValue.Open)
+            NavigationDrawer(
+                drawerState = drawerState,
+                drawerContent = {
+                    Box(Modifier.fillMaxSize().testTag("content"))
+                },
+                content = {}
+            )
+        }
+
+        rule.onNodeWithTag("content")
+            .assertWidthIsEqualTo(NavigationDrawer.ContainerWidth)
+    }
+
+    @Test
+    @SmallTest
+    fun navigationDrawer_hasPaneTitle() {
+        lateinit var navigationMenu: String
+        rule.setMaterialContent {
+            NavigationDrawer(
+                drawerState = rememberDrawerState(DrawerValue.Open),
+                drawerContent = {
+                    Box(Modifier.fillMaxSize().testTag("navigationDrawerTag"))
+                },
+                content = {}
+            )
+            navigationMenu = getString(Strings.NavigationMenu)
+        }
+
+        rule.onNodeWithTag("navigationDrawerTag", useUnmergedTree = true)
+            .onParent()
+            .assert(SemanticsMatcher.expectValue(SemanticsProperties.PaneTitle, navigationMenu))
+    }
+
+    @Test
+    @LargeTest
+    fun navigationDrawer_openAndClose(): Unit = runBlocking(AutoTestFrameClock()) {
+        lateinit var drawerState: DrawerState
+        rule.setMaterialContent {
+            drawerState = rememberDrawerState(DrawerValue.Closed)
+            NavigationDrawer(
+                drawerState = drawerState,
+                drawerContent = {
+                    Box(Modifier.fillMaxSize().testTag(DrawerTestTag))
+                },
+                content = {}
+            )
+        }
+
+        val width = rule.rootWidth()
+
+        // Drawer should start in closed state
+        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(-width)
+
+        // When the drawer state is set to Opened
+        drawerState.open()
+        // Then the drawer should be opened
+        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(0.dp)
+
+        // When the drawer state is set to Closed
+        drawerState.close()
+        // Then the drawer should be closed
+        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(-width)
+    }
+
+    @Test
+    @LargeTest
+    fun navigationDrawer_animateTo(): Unit = runBlocking(AutoTestFrameClock()) {
+        lateinit var drawerState: DrawerState
+        rule.setMaterialContent {
+            drawerState = rememberDrawerState(DrawerValue.Closed)
+            NavigationDrawer(
+                drawerState = drawerState,
+                drawerContent = {
+                    Box(Modifier.fillMaxSize().testTag(DrawerTestTag))
+                },
+                content = {}
+            )
+        }
+
+        val width = rule.rootWidth()
+
+        // Drawer should start in closed state
+        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(-width)
+
+        // When the drawer state is set to Opened
+        drawerState.animateTo(DrawerValue.Open, TweenSpec())
+        // Then the drawer should be opened
+        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(0.dp)
+
+        // When the drawer state is set to Closed
+        drawerState.animateTo(DrawerValue.Closed, TweenSpec())
+        // Then the drawer should be closed
+        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(-width)
+    }
+
+    @Test
+    @LargeTest
+    fun navigationDrawer_snapTo(): Unit = runBlocking(AutoTestFrameClock()) {
+        lateinit var drawerState: DrawerState
+        rule.setMaterialContent {
+            drawerState = rememberDrawerState(DrawerValue.Closed)
+            NavigationDrawer(
+                drawerState = drawerState,
+                drawerContent = {
+                    Box(Modifier.fillMaxSize().testTag(DrawerTestTag))
+                },
+                content = {}
+            )
+        }
+
+        val width = rule.rootWidth()
+
+        // Drawer should start in closed state
+        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(-width)
+
+        // When the drawer state is set to Opened
+        drawerState.snapTo(DrawerValue.Open)
+        // Then the drawer should be opened
+        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(0.dp)
+
+        // When the drawer state is set to Closed
+        drawerState.snapTo(DrawerValue.Closed)
+        // Then the drawer should be closed
+        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(-width)
+    }
+
+    @Test
+    @LargeTest
+    fun navigationDrawer_currentValue(): Unit = runBlocking(AutoTestFrameClock()) {
+        lateinit var drawerState: DrawerState
+        rule.setMaterialContent {
+            drawerState = rememberDrawerState(DrawerValue.Closed)
+            NavigationDrawer(
+                drawerState = drawerState,
+                drawerContent = {
+                    Box(Modifier.fillMaxSize().testTag(DrawerTestTag))
+                },
+                content = {}
+            )
+        }
+
+        // Drawer should start in closed state
+        assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Closed)
+
+        // When the drawer state is set to Opened
+        drawerState.snapTo(DrawerValue.Open)
+        // Then the drawer should be opened
+        assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open)
+
+        // When the drawer state is set to Closed
+        drawerState.snapTo(DrawerValue.Closed)
+        // Then the drawer should be closed
+        assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Closed)
+    }
+
+    @Test
+    @LargeTest
+    fun navigationDrawer_bodyContent_clickable(): Unit = runBlocking(AutoTestFrameClock()) {
+        var drawerClicks = 0
+        var bodyClicks = 0
+        lateinit var drawerState: DrawerState
+        rule.setMaterialContent {
+            drawerState = rememberDrawerState(DrawerValue.Closed)
+            // emulate click on the screen
+            NavigationDrawer(
+                drawerState = drawerState,
+                drawerContent = {
+                    Box(Modifier.fillMaxSize().clickable { drawerClicks += 1 })
+                },
+                content = {
+                    Box(Modifier.testTag(DrawerTestTag).fillMaxSize().clickable { bodyClicks += 1 })
+                }
+            )
+        }
+
+        // Click in the middle of the drawer (which is the middle of the body)
+        rule.onNodeWithTag(DrawerTestTag).performTouchInput { click() }
+
+        rule.runOnIdle {
+            assertThat(drawerClicks).isEqualTo(0)
+            assertThat(bodyClicks).isEqualTo(1)
+        }
+        drawerState.open()
+
+        // Click on the left-center pixel of the drawer
+        rule.onNodeWithTag(DrawerTestTag).performTouchInput {
+            click(centerLeft)
+        }
+
+        rule.runOnIdle {
+            assertThat(drawerClicks).isEqualTo(1)
+            assertThat(bodyClicks).isEqualTo(1)
+        }
+    }
+
+    @Test
+    @LargeTest
+    fun navigationDrawer_drawerContent_doesntPropagateClicksWhenOpen(): Unit = runBlocking(
+        AutoTestFrameClock()
+    ) {
+        var bodyClicks = 0
+        lateinit var drawerState: DrawerState
+        rule.setMaterialContent {
+            drawerState = rememberDrawerState(DrawerValue.Closed)
+            NavigationDrawer(
+                drawerState = drawerState,
+                drawerContent = {
+                    Box(Modifier.fillMaxSize().testTag(DrawerTestTag))
+                },
+                content = {
+                    Box(Modifier.fillMaxSize().clickable { bodyClicks += 1 })
+                }
+            )
+        }
+
+        // Click in the middle of the drawer
+        rule.onNodeWithTag(DrawerTestTag).performClick()
+
+        rule.runOnIdle {
+            assertThat(bodyClicks).isEqualTo(1)
+        }
+        drawerState.open()
+
+        // Click on the left-center pixel of the drawer
+        rule.onNodeWithTag(DrawerTestTag).performTouchInput {
+            click(centerLeft)
+        }
+
+        rule.runOnIdle {
+            assertThat(bodyClicks).isEqualTo(1)
+        }
+    }
+
+    @Test
+    @LargeTest
+    fun navigationDrawer_openBySwipe() {
+        lateinit var drawerState: DrawerState
+        rule.setMaterialContent {
+            drawerState = rememberDrawerState(DrawerValue.Closed)
+            Box(Modifier.testTag(DrawerTestTag)) {
+                NavigationDrawer(
+                    drawerState = drawerState,
+                    drawerContent = {
+                        Box(Modifier.fillMaxSize().background(color = Color.Magenta))
+                    },
+                    content = {
+                        Box(Modifier.fillMaxSize().background(color = Color.Red))
+                    }
+                )
+            }
+        }
+
+        rule.onNodeWithTag(DrawerTestTag)
+            .performTouchInput { swipeRight() }
+
+        rule.runOnIdle {
+            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open)
+        }
+
+        rule.onNodeWithTag(DrawerTestTag)
+            .performTouchInput { swipeLeft() }
+
+        rule.runOnIdle {
+            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Closed)
+        }
+    }
+
+    @Test
+    @LargeTest
+    fun navigationDrawer_confirmStateChangeRespect() {
+        lateinit var drawerState: DrawerState
+        rule.setMaterialContent {
+            drawerState = rememberDrawerState(
+                DrawerValue.Open,
+                confirmStateChange = {
+                    it != DrawerValue.Closed
+                }
+            )
+            Box(Modifier.testTag(DrawerTestTag)) {
+                NavigationDrawer(
+                    drawerState = drawerState,
+                    drawerContent = {
+                        Box(
+                            Modifier.fillMaxSize()
+                                .testTag("content")
+                                .background(color = Color.Magenta)
+                        )
+                    },
+                    content = {
+                        Box(Modifier.fillMaxSize().background(color = Color.Red))
+                    }
+                )
+            }
+        }
+
+        rule.onNodeWithTag(DrawerTestTag)
+            .performTouchInput { swipeLeft() }
+
+        // still open
+        rule.runOnIdle {
+            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open)
+        }
+
+        rule.onNodeWithTag("content", useUnmergedTree = true)
+            .onParent()
+            .performSemanticsAction(SemanticsActions.Dismiss)
+
+        rule.runOnIdle {
+            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open)
+        }
+    }
+
+    @Test
+    @LargeTest
+    fun navigationDrawer_openBySwipe_rtl() {
+        lateinit var drawerState: DrawerState
+        rule.setMaterialContent {
+            drawerState = rememberDrawerState(DrawerValue.Closed)
+            // emulate click on the screen
+            CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
+                Box(Modifier.testTag(DrawerTestTag)) {
+                    NavigationDrawer(
+                        drawerState = drawerState,
+                        drawerContent = {
+                            Box(Modifier.fillMaxSize().background(color = Color.Magenta))
+                        },
+                        content = {
+                            Box(Modifier.fillMaxSize().background(color = Color.Red))
+                        }
+                    )
+                }
+            }
+        }
+
+        rule.onNodeWithTag(DrawerTestTag)
+            .performTouchInput { swipeLeft() }
+
+        rule.runOnIdle {
+            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Open)
+        }
+
+        rule.onNodeWithTag(DrawerTestTag)
+            .performTouchInput { swipeRight() }
+
+        rule.runOnIdle {
+            assertThat(drawerState.currentValue).isEqualTo(DrawerValue.Closed)
+        }
+    }
+
+    @Test
+    @LargeTest
+    fun navigationDrawer_noDismissActionWhenClosed_hasDissmissActionWhenOpen(): Unit = runBlocking(
+        AutoTestFrameClock()
+    ) {
+        lateinit var drawerState: DrawerState
+        rule.setMaterialContent {
+            drawerState = rememberDrawerState(DrawerValue.Closed)
+            NavigationDrawer(
+                drawerState = drawerState,
+                drawerContent = {
+                    Box(Modifier.fillMaxSize().testTag(DrawerTestTag))
+                },
+                content = {}
+            )
+        }
+
+        // Drawer should start in closed state and have no dismiss action
+        rule.onNodeWithTag(DrawerTestTag, useUnmergedTree = true)
+            .onParent()
+            .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Dismiss))
+
+        // When the drawer state is set to Opened
+        drawerState.open()
+        // Then the drawer should be opened and have dismiss action
+        rule.onNodeWithTag(DrawerTestTag, useUnmergedTree = true)
+            .onParent()
+            .assert(SemanticsMatcher.keyIsDefined(SemanticsActions.Dismiss))
+
+        // When the drawer state is set to Closed using dismiss action
+        rule.onNodeWithTag(DrawerTestTag, useUnmergedTree = true)
+            .onParent()
+            .performSemanticsAction(SemanticsActions.Dismiss)
+        // Then the drawer should be closed and have no dismiss action
+        rule.onNodeWithTag(DrawerTestTag, useUnmergedTree = true)
+            .onParent()
+            .assert(SemanticsMatcher.keyNotDefined(SemanticsActions.Dismiss))
+    }
+
+    @Test
+    fun navigationDrawer_scrimNode_reportToSemanticsWhenOpen_notReportToSemanticsWhenClosed() {
+        val topTag = "navigationDrawer"
+        lateinit var closeDrawer: String
+        rule.setMaterialContent {
+            NavigationDrawer(
+                modifier = Modifier.testTag(topTag),
+                drawerState = rememberDrawerState(DrawerValue.Open),
+                drawerContent = {
+                    Box(Modifier.fillMaxSize().testTag(DrawerTestTag))
+                },
+                content = {
+                    Box(Modifier.fillMaxSize().testTag("body"))
+                }
+            )
+            closeDrawer = getString(Strings.CloseDrawer)
+        }
+
+        // The drawer should be opened
+        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(0.dp)
+
+        var topNode = rule.onNodeWithTag(topTag).fetchSemanticsNode()
+        assertEquals(3, topNode.children.size)
+        rule.onNodeWithContentDescription(closeDrawer)
+            .assertHasClickAction()
+            .performSemanticsAction(SemanticsActions.OnClick)
+
+        // Then the drawer should be closed
+        rule.onNodeWithTag(DrawerTestTag).assertLeftPositionInRootIsEqualTo(-rule.rootWidth())
+
+        topNode = rule.onNodeWithTag(topTag).fetchSemanticsNode()
+        assertEquals(2, topNode.children.size)
+    }
+}
+
+private val DrawerTestTag = "drawer"
\ No newline at end of file
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationRailScreenshotTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationRailScreenshotTest.kt
new file mode 100644
index 0000000..7fe8197
--- /dev/null
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationRailScreenshotTest.kt
@@ -0,0 +1,282 @@
+/*
+ * 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 android.os.Build
+import androidx.compose.foundation.interaction.Interaction
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.interaction.PressInteraction
+import androidx.compose.foundation.layout.Box
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Edit
+import androidx.compose.material.icons.filled.Favorite
+import androidx.compose.material.icons.filled.Home
+import androidx.compose.material.icons.filled.Search
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.testutils.assertAgainstGolden
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.test.ExperimentalTestApi
+import androidx.compose.ui.test.captureToImage
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
+import androidx.test.screenshot.AndroidXScreenshotTestRule
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.launch
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+@OptIn(ExperimentalMaterial3Api::class, ExperimentalTestApi::class)
+class NavigationRailScreenshotTest {
+    @get:Rule
+    val composeTestRule = createComposeRule()
+
+    @get:Rule
+    val screenshotRule = AndroidXScreenshotTestRule(GOLDEN_MATERIAL3)
+
+    @Test
+    fun lightTheme_defaultColors() {
+        val interactionSource = MutableInteractionSource()
+
+        var scope: CoroutineScope? = null
+
+        composeTestRule.setContent {
+            MaterialTheme(lightColorScheme()) {
+                scope = rememberCoroutineScope()
+                DefaultNavigationRail(interactionSource)
+            }
+        }
+
+        assertNavigationRailMatches(
+            scope = scope!!,
+            interactionSource = interactionSource,
+            interaction = null,
+            goldenIdentifier = "navigationRail_lightTheme_defaultColors"
+        )
+    }
+
+    @Test
+    fun lightTheme_defaultColors_pressed() {
+        val interactionSource = MutableInteractionSource()
+
+        var scope: CoroutineScope? = null
+
+        composeTestRule.setContent {
+            MaterialTheme(lightColorScheme()) {
+                scope = rememberCoroutineScope()
+                DefaultNavigationRail(interactionSource)
+            }
+        }
+
+        assertNavigationRailMatches(
+            scope = scope!!,
+            interactionSource = interactionSource,
+            interaction = PressInteraction.Press(Offset(10f, 10f)),
+            goldenIdentifier = "navigationRail_lightTheme_defaultColors_pressed"
+        )
+    }
+
+    @Test
+    fun darkTheme_defaultColors() {
+        val interactionSource = MutableInteractionSource()
+
+        var scope: CoroutineScope? = null
+
+        composeTestRule.setContent {
+            MaterialTheme(darkColorScheme()) {
+                scope = rememberCoroutineScope()
+                DefaultNavigationRail(interactionSource)
+            }
+        }
+
+        assertNavigationRailMatches(
+            scope = scope!!,
+            interactionSource = interactionSource,
+            interaction = null,
+            goldenIdentifier = "navigationRail_darkTheme_defaultColors"
+        )
+    }
+
+    @Test
+    fun darkTheme_defaultColors_pressed() {
+        val interactionSource = MutableInteractionSource()
+
+        var scope: CoroutineScope? = null
+
+        composeTestRule.setContent {
+            MaterialTheme(darkColorScheme()) {
+                scope = rememberCoroutineScope()
+                DefaultNavigationRail(interactionSource)
+            }
+        }
+
+        assertNavigationRailMatches(
+            scope = scope!!,
+            interactionSource = interactionSource,
+            interaction = PressInteraction.Press(Offset(10f, 10f)),
+            goldenIdentifier = "navigationRail_darkTheme_defaultColors_pressed"
+        )
+    }
+
+    @Test
+    fun lightTheme_defaultColors_withHeaderFab() {
+        val interactionSource = MutableInteractionSource()
+
+        var scope: CoroutineScope? = null
+
+        composeTestRule.setContent {
+            MaterialTheme(lightColorScheme()) {
+                scope = rememberCoroutineScope()
+                DefaultNavigationRail(interactionSource, withHeaderFab = true)
+            }
+        }
+
+        assertNavigationRailMatches(
+            scope = scope!!,
+            interactionSource = interactionSource,
+            interaction = null,
+            goldenIdentifier = "navigationRail_lightTheme_defaultColors_withFab"
+        )
+    }
+
+    @Test
+    fun lightTheme_defaultColors_withHeaderFab_pressed() {
+        val interactionSource = MutableInteractionSource()
+
+        var scope: CoroutineScope? = null
+
+        composeTestRule.setContent {
+            MaterialTheme(lightColorScheme()) {
+                scope = rememberCoroutineScope()
+                DefaultNavigationRail(interactionSource, withHeaderFab = true)
+            }
+        }
+
+        assertNavigationRailMatches(
+            scope = scope!!,
+            interactionSource = interactionSource,
+            interaction = PressInteraction.Press(Offset(10f, 100f)),
+            goldenIdentifier = "navigationRail_lightTheme_defaultColors_withFab_pressed"
+        )
+    }
+
+    /**
+     * Asserts that the NavigationRail matches the screenshot with identifier [goldenIdentifier].
+     *
+     * @param scope [CoroutineScope] used to interact with [MutableInteractionSource]
+     * @param interactionSource the [MutableInteractionSource] used for the first
+     * NavigationRailItem
+     * @param interaction the [Interaction] to assert for, or `null` if no [Interaction].
+     * @param goldenIdentifier the identifier for the corresponding screenshot
+     */
+    private fun assertNavigationRailMatches(
+        scope: CoroutineScope,
+        interactionSource: MutableInteractionSource,
+        interaction: Interaction? = null,
+        goldenIdentifier: String
+    ) {
+        if (interaction != null) {
+            composeTestRule.runOnIdle {
+                // Start ripple
+                scope.launch {
+                    interactionSource.emit(interaction)
+                }
+            }
+
+            composeTestRule.waitForIdle()
+            // Ripples are drawn on the RenderThread, not the main (UI) thread, so we can't
+            // properly wait for synchronization. Instead just wait until after the ripples are
+            // finished animating.
+            Thread.sleep(300)
+        }
+
+        // Capture and compare screenshots
+        composeTestRule.onNodeWithTag(Tag)
+            .captureToImage()
+            .assertAgainstGolden(screenshotRule, goldenIdentifier)
+    }
+}
+
+/**
+ * Default colored [NavigationRailItem] with three [NavigationRailItem]s. The first
+ * [NavigationRailItem] is selected, and the rest are not.
+ *
+ * @param interactionSource the [MutableInteractionSource] for the first [NavigationRailItem], to
+ * control its visual state.
+ * @param withHeaderFab when true, shows a [FloatingActionButton] as the [NavigationRail] header.
+ */
+@OptIn(ExperimentalMaterial3Api::class)
+@Composable
+private fun DefaultNavigationRail(
+    interactionSource: MutableInteractionSource,
+    withHeaderFab: Boolean = false
+) {
+    Box(Modifier.semantics(mergeDescendants = true) {}.testTag(Tag)) {
+        NavigationRail(
+            header = if (withHeaderFab) {
+                { HeaderFab() }
+            } else {
+                null
+            }
+        ) {
+            NavigationRailItem(
+                icon = { Icon(Icons.Filled.Favorite, null) },
+                label = { Text("Favorites") },
+                selected = true,
+                onClick = {},
+                interactionSource = interactionSource
+            )
+            NavigationRailItem(
+                icon = { Icon(Icons.Filled.Home, null) },
+                label = { Text("Home") },
+                selected = false,
+                onClick = {}
+            )
+            NavigationRailItem(
+                icon = { Icon(Icons.Filled.Search, null) },
+                label = { Text("Search") },
+                selected = false,
+                onClick = {}
+            )
+        }
+    }
+}
+
+/**
+ * Default [FloatingActionButton] to be used along with the [DefaultNavigationRail] when the
+ * withHeaderFab flag is true.
+ */
+@Composable
+private fun HeaderFab() {
+    FloatingActionButton(
+        onClick = { },
+    ) {
+        Icon(Icons.Filled.Edit, contentDescription = "Edit")
+    }
+}
+
+private const val Tag = "NavigationRail"
\ No newline at end of file
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationRailTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationRailTest.kt
new file mode 100644
index 0000000..0baaf11
--- /dev/null
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationRailTest.kt
@@ -0,0 +1,342 @@
+/*
+ * 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.layout.Box
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Favorite
+import androidx.compose.material3.samples.NavigationRailSample
+import androidx.compose.testutils.assertIsEqualTo
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.layout.LayoutCoordinates
+import androidx.compose.ui.layout.onGloballyPositioned
+import androidx.compose.ui.layout.positionInWindow
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.Role
+import androidx.compose.ui.semantics.SemanticsProperties
+import androidx.compose.ui.test.SemanticsMatcher
+import androidx.compose.ui.test.assert
+import androidx.compose.ui.test.assertCountEquals
+import androidx.compose.ui.test.assertHasClickAction
+import androidx.compose.ui.test.assertIsEnabled
+import androidx.compose.ui.test.assertIsNotDisplayed
+import androidx.compose.ui.test.assertIsNotEnabled
+import androidx.compose.ui.test.assertIsNotSelected
+import androidx.compose.ui.test.assertIsSelected
+import androidx.compose.ui.test.assertLeftPositionInRootIsEqualTo
+import androidx.compose.ui.test.assertTopPositionInRootIsEqualTo
+import androidx.compose.ui.test.assertWidthIsEqualTo
+import androidx.compose.ui.test.getUnclippedBoundsInRoot
+import androidx.compose.ui.test.isSelectable
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.onNodeWithText
+import androidx.compose.ui.test.onParent
+import androidx.compose.ui.test.performClick
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.height
+import androidx.compose.ui.unit.width
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import com.google.common.truth.Truth
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+/**
+ * Test for [NavigationRail] and [NavigationRailItem].
+ */
+class NavigationRailTest {
+    @get:Rule
+    val rule = createComposeRule()
+
+    @Test
+    fun defaultSemantics() {
+        rule.setMaterialContent {
+            NavigationRail {
+                NavigationRailItem(
+                    modifier = Modifier.testTag("item"),
+                    icon = {
+                        Icon(Icons.Filled.Favorite, null)
+                    },
+                    label = {
+                        Text("ItemText")
+                    },
+                    selected = true,
+                    onClick = {}
+                )
+            }
+        }
+
+        rule.onNodeWithTag("item")
+            .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
+            .assertIsSelected()
+            .assertIsEnabled()
+            .assertHasClickAction()
+
+        rule.onNodeWithTag("item")
+            .onParent()
+            .assert(SemanticsMatcher.keyIsDefined(SemanticsProperties.SelectableGroup))
+    }
+
+    @Test
+    fun disabledSemantics() {
+        rule.setMaterialContent {
+            NavigationRail {
+                NavigationRailItem(
+                    enabled = false,
+                    modifier = Modifier.testTag("item"),
+                    icon = {
+                        Icon(Icons.Filled.Favorite, null)
+                    },
+                    label = {
+                        Text("ItemText")
+                    },
+                    selected = true,
+                    onClick = {}
+                )
+            }
+        }
+
+        rule.onNodeWithTag("item")
+            .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Tab))
+            .assertIsSelected()
+            .assertIsNotEnabled()
+            .assertHasClickAction()
+    }
+
+    @Test
+    fun navigationRail_width() {
+        val defaultWidth = NavigationRailItemWidth
+        rule.setMaterialContentForSizeAssertions {
+            NavigationRailSample()
+        }.assertWidthIsEqualTo(defaultWidth)
+    }
+
+    @Test
+    fun navigationRailItem_sizeAndPositions() {
+        val itemCoords = mutableMapOf<Int, LayoutCoordinates>()
+        rule.setMaterialContent {
+            Box {
+                NavigationRail {
+                    repeat(4) { index ->
+                        NavigationRailItem(
+                            icon = { Icon(Icons.Filled.Favorite, null) },
+                            label = { Text("Item $index") },
+                            selected = index == 0,
+                            onClick = {},
+                            modifier = Modifier.onGloballyPositioned { coords ->
+                                itemCoords[index] = coords
+                            }
+                        )
+                    }
+                }
+            }
+        }
+
+        assertDimension(itemCoords, NavigationRailItemWidth, NavigationRailItemHeight)
+    }
+
+    private fun assertDimension(
+        itemCoords: MutableMap<Int, LayoutCoordinates>,
+        expectedItemWidth: Dp,
+        expectedItemHeight: Dp
+    ) {
+        rule.runOnIdleWithDensity {
+            val expectedItemWidthPx = expectedItemWidth.roundToPx()
+            val expectedItemHeightPx = expectedItemHeight.roundToPx()
+            val navigationRailPadding = NavigationRailItemVerticalPadding.roundToPx()
+
+            Truth.assertThat(itemCoords.size).isEqualTo(4)
+
+            itemCoords.forEach { (index, coord) ->
+                Truth.assertThat(coord.size.width).isEqualTo(expectedItemWidthPx)
+                Truth.assertThat(coord.size.height).isEqualTo(expectedItemHeightPx)
+                // Height of all items + paddings above (index 0 has padding as well).
+                val expectedY = expectedItemHeightPx * index + navigationRailPadding * (index + 1)
+                Truth.assertThat(coord.positionInWindow().y).isEqualTo(expectedY.toFloat())
+            }
+        }
+    }
+
+    @Test
+    fun navigationRailItemContent_withLabel_sizeAndPosition() {
+        rule.setMaterialContent {
+            Box {
+                NavigationRail {
+                    NavigationRailItem(
+                        modifier = Modifier.testTag("item"),
+                        icon = {
+                            Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon"))
+                        },
+                        label = {
+                            Text("ItemText", Modifier.testTag("label"))
+                        },
+                        selected = true,
+                        onClick = {}
+                    )
+                }
+            }
+        }
+
+        val itemBounds = rule.onNodeWithTag("item").getUnclippedBoundsInRoot()
+        val iconBounds = rule.onNodeWithTag("icon", useUnmergedTree = true)
+            .getUnclippedBoundsInRoot()
+        val textBounds = rule.onNodeWithTag("label", useUnmergedTree = true)
+            .getUnclippedBoundsInRoot()
+
+        // Distance from the container bottom to the text bottom, and from the top of the icon to
+        // the top of the item
+        val verticalPadding = NavigationRailItemVerticalPadding
+
+        val textBottom = textBounds.bottom
+
+        val itemBottom = itemBounds.height + itemBounds.top
+        // Text bottom should be `verticalPadding` from the bottom of the item
+        textBottom.assertIsEqualTo(itemBottom - verticalPadding)
+
+        rule.onNodeWithTag("icon", useUnmergedTree = true)
+            // The icon should be centered in the item
+            .assertLeftPositionInRootIsEqualTo((itemBounds.width - iconBounds.width) / 2)
+            // The top of the icon is `verticalPadding` below the top of the item
+            .assertTopPositionInRootIsEqualTo(itemBounds.top + verticalPadding)
+    }
+
+    @Test
+    fun navigationRailItemContent_withLabel_unselected_sizeAndPosition() {
+        rule.setMaterialContent {
+            Box {
+                NavigationRail {
+                    NavigationRailItem(
+                        modifier = Modifier.testTag("item"),
+                        icon = {
+                            Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon"))
+                        },
+                        label = {
+                            Text("ItemText")
+                        },
+                        selected = false,
+                        onClick = {},
+                        alwaysShowLabel = false
+                    )
+                }
+            }
+        }
+
+        // The text should not be placed, since the item is not selected and alwaysShowLabels
+        // is false
+        rule.onNodeWithText("ItemText", useUnmergedTree = true).assertIsNotDisplayed()
+
+        val itemBounds = rule.onNodeWithTag("item").getUnclippedBoundsInRoot()
+        val iconBounds = rule.onNodeWithTag("icon", useUnmergedTree = true)
+            .getUnclippedBoundsInRoot()
+
+        rule.onNodeWithTag("icon", useUnmergedTree = true)
+            .assertLeftPositionInRootIsEqualTo((itemBounds.width - iconBounds.width) / 2)
+            // The item's container has a `NavigationRailItemVerticalPadding` top-padding
+            .assertTopPositionInRootIsEqualTo(
+                NavigationRailItemVerticalPadding + (itemBounds.height - iconBounds.height) / 2
+            )
+    }
+
+    @Test
+    fun navigationRailItemContent_withoutLabel_sizeAndPosition() {
+        rule.setMaterialContent {
+            Box {
+                NavigationRail {
+                    NavigationRailItem(
+                        modifier = Modifier.testTag("item"),
+                        icon = {
+                            Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon"))
+                        },
+                        label = null,
+                        selected = false,
+                        onClick = {}
+                    )
+                }
+            }
+        }
+
+        val itemBounds = rule.onNodeWithTag("item").getUnclippedBoundsInRoot()
+        val iconBounds = rule.onNodeWithTag("icon", useUnmergedTree = true)
+            .getUnclippedBoundsInRoot()
+
+        // The icon should be centered in the item, as there is no text placeable provided
+        rule.onNodeWithTag("icon", useUnmergedTree = true)
+            .assertLeftPositionInRootIsEqualTo((itemBounds.width - iconBounds.width) / 2)
+            // The item's container has a `NavigationRailItemVerticalPadding` top-padding
+            .assertTopPositionInRootIsEqualTo(
+                NavigationRailItemVerticalPadding + (itemBounds.height - iconBounds.height) / 2
+            )
+    }
+
+    @Test
+    fun navigationRail_selectNewItem() {
+        rule.setMaterialContent {
+            NavigationRailSample()
+        }
+
+        // Find all items and ensure there are 3
+        rule.onAllNodes(isSelectable())
+            .assertCountEquals(3)
+            // Ensure semantics match for selected state of the items
+            .apply {
+                get(0).assertIsSelected()
+                get(1).assertIsNotSelected()
+                get(2).assertIsNotSelected()
+            }
+            // Click the last item
+            .apply {
+                get(2).performClick()
+            }
+            .apply {
+                get(0).assertIsNotSelected()
+                get(1).assertIsNotSelected()
+                get(2).assertIsSelected()
+            }
+    }
+
+    @Test
+    fun disabled_noClicks() {
+        var clicks = 0
+        rule.setMaterialContent {
+            NavigationRail {
+                NavigationRailItem(
+                    enabled = false,
+                    modifier = Modifier.testTag("item"),
+                    icon = {
+                        Icon(Icons.Filled.Favorite, null)
+                    },
+                    label = {
+                        Text("ItemText")
+                    },
+                    selected = true,
+                    onClick = { clicks++ }
+                )
+            }
+        }
+
+        rule.onNodeWithTag("item")
+            .performClick()
+
+        rule.runOnIdle {
+            Truth.assertThat(clicks).isEqualTo(0)
+        }
+    }
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/AndroidAlertDialog.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/AndroidAlertDialog.android.kt
index e80bf5a..0b9d707 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/AndroidAlertDialog.android.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/AndroidAlertDialog.android.kt
@@ -25,9 +25,9 @@
 import androidx.compose.ui.window.Dialog
 import androidx.compose.ui.window.DialogProperties
 
-// TODO(b/197880751): Update the docs with the 3P location of the AlertDialogSamples, specs, and
-//  images.
 /**
+ * ![Basic dialog image](https://developer.android.com/images/reference/androidx/compose/material3/basic-dialog.png)
+ *
  * Material Design basic dialog.
  *
  * Dialogs interrupt users with urgent information, details, or actions.
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/Strings.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/Strings.android.kt
new file mode 100644
index 0000000..0da6f99
--- /dev/null
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/Strings.android.kt
@@ -0,0 +1,36 @@
+/*
+ * 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.Composable
+import androidx.compose.ui.R
+import androidx.compose.ui.platform.LocalConfiguration
+import androidx.compose.ui.platform.LocalContext
+
+@Composable
+internal actual fun getString(string: Strings): String {
+    LocalConfiguration.current
+    val resources = LocalContext.current.resources
+    return when (string) {
+        Strings.NavigationMenu -> resources.getString(R.string.navigation_menu)
+        Strings.CloseDrawer -> resources.getString(R.string.close_drawer)
+        Strings.CloseSheet -> resources.getString(R.string.close_sheet)
+        Strings.DefaultErrorMessage -> resources.getString(R.string.default_error_message)
+        Strings.ExposedDropdownMenu -> resources.getString(R.string.dropdown_menu)
+        else -> ""
+    }
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt
index b4ccdca..c355453 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt
@@ -17,13 +17,21 @@
 package androidx.compose.material3
 
 import androidx.compose.animation.animateColorAsState
+import androidx.compose.animation.core.AnimationState
+import androidx.compose.animation.core.DecayAnimationSpec
+import androidx.compose.animation.core.FastOutLinearInEasing
 import androidx.compose.animation.core.LinearOutSlowInEasing
+import androidx.compose.animation.core.animateDecay
+import androidx.compose.animation.core.animateTo
 import androidx.compose.animation.core.tween
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.RowScope
 import androidx.compose.foundation.layout.padding
+import androidx.compose.material3.tokens.TopAppBarLarge
+import androidx.compose.material3.tokens.TopAppBarMedium
 import androidx.compose.material3.tokens.TopAppBarSmall
 import androidx.compose.material3.tokens.TopAppBarSmallCentered
 import androidx.compose.runtime.Composable
@@ -34,11 +42,14 @@
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberUpdatedState
 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.graphics.Color
+import androidx.compose.ui.graphics.graphicsLayer
+import androidx.compose.ui.graphics.lerp
 import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
 import androidx.compose.ui.input.nestedscroll.NestedScrollSource
 import androidx.compose.ui.layout.AlignmentLine
@@ -47,11 +58,16 @@
 import androidx.compose.ui.layout.layoutId
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.Velocity
 import androidx.compose.ui.unit.dp
+import kotlin.math.abs
 import kotlin.math.max
 import kotlin.math.roundToInt
 
 /**
+ * ![Small top app bar image](https://developer.android.com/images/reference/androidx/compose/material3/small-top-app-bar.png)
+ *
  * Material Design small top app bar.
  *
  * The top app bar displays information and actions relating to the current screen.
@@ -100,15 +116,17 @@
 }
 
 /**
+ * ![Center-aligned top app bar image](https://developer.android.com/images/reference/androidx/compose/material3/center-aligned-top-app-bar.png)
+ *
  * Material Design small top app bar with a header title that is horizontally aligned to the center.
  *
  * The top app bar displays information and actions relating to the current screen.
  *
- * This SmallCenteredTopAppBar has slots for a title, navigation icon, and actions.
+ * This CenterAlignedTopAppBar has slots for a title, navigation icon, and actions.
  *
- * A small centered top app bar that uses a [scrollBehavior] to customize its nested scrolling
+ * A center aligned top app bar that uses a [scrollBehavior] to customize its nested scrolling
  * behavior when working in conjunction with a scrolling content looks like:
- * @sample androidx.compose.material3.samples.SimpleCenteredTopAppBar
+ * @sample androidx.compose.material3.samples.SimpleCenterAlignedTopAppBar
  *
  * @param title the title to be displayed in the top app bar
  * @param modifier the [Modifier] to be applied to this top app bar
@@ -117,19 +135,19 @@
  * @param actions the actions displayed at the end of the top app bar. This should typically be
  * [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
  * @param colors a [TopAppBarColors] that will be used to resolve the colors used for this top app
- * bar in different states. See [TopAppBarDefaults.smallCenteredTopAppBarColors].
+ * bar in different states. See [TopAppBarDefaults.centerAlignedTopAppBarColors].
  * @param scrollBehavior a [TopAppBarScrollBehavior] which holds various offset values that will be
  * applied by this top app bar to set up its height and colors. A scroll behavior is designed to
  * work in conjunction with a scrolled content to change the top app bar appearance as the content
  * scrolls. See [TopAppBarScrollBehavior.nestedScrollConnection].
  */
 @Composable
-fun SmallCenteredTopAppBar(
+fun CenterAlignedTopAppBar(
     title: @Composable () -> Unit,
     modifier: Modifier = Modifier,
     navigationIcon: @Composable () -> Unit = {},
     actions: @Composable RowScope.() -> Unit = {},
-    colors: TopAppBarColors = TopAppBarDefaults.smallCenteredTopAppBarColors(),
+    colors: TopAppBarColors = TopAppBarDefaults.centerAlignedTopAppBarColors(),
     scrollBehavior: TopAppBarScrollBehavior? = null
 ) {
     SingleRowTopAppBar(
@@ -146,10 +164,120 @@
 }
 
 /**
+ * ![Medium top app bar image](https://developer.android.com/images/reference/androidx/compose/material3/medium-top-app-bar.png)
+ *
+ * Material Design medium top app bar.
+ *
+ * The top app bar displays information and actions relating to the current screen.
+ *
+ * This MediumTopAppBar has slots for a title, navigation icon, and actions. In its default expanded
+ * state, the title is displayed in a second row under the navigation and actions.
+ *
+ * A medium top app bar that uses a [scrollBehavior] to customize its nested scrolling behavior when
+ * working in conjunction with scrolling content looks like:
+ * @sample androidx.compose.material3.samples.ExitUntilCollapsedMediumTopAppBar
+ *
+ * @param title the title to be displayed in the top app bar. This title will be used in the app
+ * bar's expanded and collapsed states, although in its collapsed state it will be composed with a
+ * smaller sized [TextStyle]
+ * @param modifier the [Modifier] to be applied to this top app bar
+ * @param navigationIcon the navigation icon displayed at the start of the top app bar. This should
+ * typically be an [IconButton] or [IconToggleButton].
+ * @param actions the actions displayed at the end of the top app bar. This should typically be
+ * [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
+ * @param colors a [TopAppBarColors] that will be used to resolve the colors used for this top app
+ * bar in different states. See [TopAppBarDefaults.mediumTopAppBarColors].
+ * @param scrollBehavior a [TopAppBarScrollBehavior] which holds various offset values that will be
+ * applied by this top app bar to set up its height and colors. A scroll behavior is designed to
+ * work in conjunction with a scrolled content to change the top app bar appearance as the content
+ * scrolls. See [TopAppBarScrollBehavior.nestedScrollConnection].
+ */
+@Composable
+fun MediumTopAppBar(
+    title: @Composable () -> Unit,
+    modifier: Modifier = Modifier,
+    navigationIcon: @Composable () -> Unit = {},
+    actions: @Composable RowScope.() -> Unit = {},
+    colors: TopAppBarColors = TopAppBarDefaults.mediumTopAppBarColors(),
+    scrollBehavior: TopAppBarScrollBehavior? = null
+) {
+    TwoRowsTopAppBar(
+        modifier = modifier,
+        title = title,
+        titleTextStyle = MaterialTheme.typography.fromToken(TopAppBarMedium.MediumHeadlineFont),
+        smallTitleTextStyle = MaterialTheme.typography.fromToken(TopAppBarSmall.SmallHeadlineFont),
+        titleBottomPadding = MediumTitleBottomPadding,
+        smallTitle = title,
+        navigationIcon = navigationIcon,
+        actions = actions,
+        colors = colors,
+        maxHeight = TopAppBarMedium.MediumContainerHeight,
+        pinnedHeight = TopAppBarSmall.SmallContainerHeight,
+        scrollBehavior = scrollBehavior
+    )
+}
+
+/**
+ * ![Large top app bar image](https://developer.android.com/images/reference/androidx/compose/material3/large-top-app-bar.png)
+ *
+ * Material Design large top app bar.
+ *
+ * The top app bar displays information and actions relating to the current screen.
+ *
+ * This LargeTopAppBar has slots for a title, navigation icon, and actions. In its default expanded
+ * state, the title is displayed in a second row under the navigation and actions.
+ *
+ * A large top app bar that uses a [scrollBehavior] to customize its nested scrolling behavior when
+ * working in conjunction with scrolling content looks like:
+ * @sample androidx.compose.material3.samples.ExitUntilCollapsedLargeTopAppBar
+ *
+ * @param title the title to be displayed in the top app bar. This title will be used in the app
+ * bar's expanded and collapsed states, although in its collapsed state it will be composed with a
+ * smaller sized [TextStyle]
+ * @param modifier The [Modifier] to be applied to this top app bar
+ * @param navigationIcon The navigation icon displayed at the start of the top app bar. This should
+ * typically be an [IconButton] or [IconToggleButton].
+ * @param actions The actions displayed at the end of the top app bar. This should typically be
+ * [IconButton]s. The default layout here is a [Row], so icons inside will be placed horizontally.
+ * @param colors a [TopAppBarColors] that will be used to resolve the colors used for this top app
+ * bar in different states. See [TopAppBarDefaults.largeTopAppBarColors].
+ * @param scrollBehavior a [TopAppBarScrollBehavior] which holds various offset values that will be
+ * applied by this top app bar to set up its height and colors. A scroll behavior is designed to
+ * work in conjunction with a scrolled content to change the top app bar appearance as the content
+ * scrolls. See [TopAppBarScrollBehavior.nestedScrollConnection].
+ */
+@Composable
+fun LargeTopAppBar(
+    title: @Composable () -> Unit,
+    modifier: Modifier = Modifier,
+    navigationIcon: @Composable () -> Unit = {},
+    actions: @Composable RowScope.() -> Unit = {},
+    colors: TopAppBarColors = TopAppBarDefaults.largeTopAppBarColors(),
+    scrollBehavior: TopAppBarScrollBehavior? = null
+) {
+    TwoRowsTopAppBar(
+        title = title,
+        titleTextStyle = MaterialTheme.typography.fromToken(TopAppBarLarge.LargeHeadlineFont),
+        smallTitleTextStyle = MaterialTheme.typography.fromToken(TopAppBarSmall.SmallHeadlineFont),
+        titleBottomPadding = LargeTitleBottomPadding,
+        smallTitle = title,
+        modifier = modifier,
+        navigationIcon = navigationIcon,
+        actions = actions,
+        colors = colors,
+        maxHeight = TopAppBarLarge.LargeContainerHeight,
+        pinnedHeight = TopAppBarSmall.SmallContainerHeight,
+        scrollBehavior = scrollBehavior
+    )
+}
+
+/**
  * A TopAppBarScrollBehavior defines how an app bar should behave when the content under it is
  * scrolled.
  *
  * @see [TopAppBarDefaults.pinnedScrollBehavior]
+ * @see [TopAppBarDefaults.enterAlwaysScrollBehavior]
+ * @see [TopAppBarDefaults.exitUntilCollapsedScrollBehavior]
  */
 @Stable
 interface TopAppBarScrollBehavior {
@@ -179,7 +307,7 @@
      * allowed to scroll when the scrollable content is scrolled.
      *
      * This limit is represented by a negative [Float], and used to coerce the [offset] value when
-     * the scaffold's content is scrolled.
+     * the content is scrolled.
      */
     var offsetLimit: Float
 
@@ -219,34 +347,34 @@
     fun containerColor(scrollFraction: Float): State<Color>
 
     /**
-     * Represents the color used for the top app bar's navigation icon depending on whether the app
+     * Represents the content color used for the top app bar's navigation icon depending on whether
+     * the app bar is scrolled, and the percentage of its area that is scrolled.
+     *
+     * @param scrollFraction the scroll percentage of the top app bar (0.0 when the app bar is
+     * considered expanded to 1.0 when the app bar is scrolled to its target offset)
+     */
+    @Composable
+    fun navigationIconContentColor(scrollFraction: Float): State<Color>
+
+    /**
+     * Represents the content color used for the top app bar's title depending on whether the app
      * bar is scrolled, and the percentage of its area that is scrolled.
      *
      * @param scrollFraction the scroll percentage of the top app bar (0.0 when the app bar is
      * considered expanded to 1.0 when the app bar is scrolled to its target offset)
      */
     @Composable
-    fun navigationIconColor(scrollFraction: Float): State<Color>
+    fun titleContentColor(scrollFraction: Float): State<Color>
 
     /**
-     * Represents the color used for the top app bar's title depending on whether the app bar is
-     * scrolled, and the percentage of its area that is scrolled.
+     * Represents the content color used for the top app bar's action icons depending on whether the
+     * app bar is scrolled, and the percentage of its area that is scrolled.
      *
      * @param scrollFraction the scroll percentage of the top app bar (0.0 when the app bar is
      * considered expanded to 1.0 when the app bar is scrolled to its target offset)
      */
     @Composable
-    fun titleColor(scrollFraction: Float): State<Color>
-
-    /**
-     * Represents the color used for the top app bar's action icons depending on whether the app bar
-     * is scrolled, and the percentage of its area that is scrolled.
-     *
-     * @param scrollFraction the scroll percentage of the top app bar (0.0 when the app bar is
-     * considered expanded to 1.0 when the app bar is scrolled to its target offset)
-     */
-    @Composable
-    fun actionIconColor(scrollFraction: Float): State<Color>
+    fun actionIconContentColor(scrollFraction: Float): State<Color>
 }
 
 /** Contains default values used for the top app bar implementations. */
@@ -254,13 +382,13 @@
 
     /**
      * Creates a [TopAppBarColors] for small top app bars. The default implementation animates
-     * between the provided colors according to the Material specification.
+     * between the provided colors according to the Material Design specification.
      *
      * @param containerColor the container color
      * @param scrolledContainerColor the container color when content is scrolled behind it
-     * @param navigationIconColor the content color used for the navigation icon
-     * @param titleColor the content color used for the title
-     * @param actionIconsColor the content color used for actions
+     * @param navigationIconContentColor the content color used for the navigation icon
+     * @param titleContentColor the content color used for the title
+     * @param actionIconContentColor the content color used for actions
      * @return the resulting [TopAppBarColors] used for the top app bar
      */
     @Composable
@@ -271,57 +399,58 @@
             backgroundColor = containerColor,
             elevation = TopAppBarSmall.SmallOnScrollContainerElevation
         ),
-        navigationIconColor: Color =
+        navigationIconContentColor: Color =
             MaterialTheme.colorScheme.fromToken(TopAppBarSmall.SmallLeadingIconColor),
-        titleColor: Color = MaterialTheme.colorScheme.fromToken(TopAppBarSmall.SmallHeadlineColor),
-        actionIconsColor: Color =
+        titleContentColor: Color =
+            MaterialTheme.colorScheme.fromToken(TopAppBarSmall.SmallHeadlineColor),
+        actionIconContentColor: Color =
             MaterialTheme.colorScheme.fromToken(TopAppBarSmall.SmallTrailingIconColor)
     ): TopAppBarColors {
         return remember(
             containerColor,
             scrolledContainerColor,
-            navigationIconColor,
-            titleColor,
-            actionIconsColor
+            navigationIconContentColor,
+            titleContentColor,
+            actionIconContentColor
         ) {
             AnimatingTopAppBarColors(
                 containerColor,
                 scrolledContainerColor,
-                navigationIconColor,
-                titleColor,
-                actionIconsColor
+                navigationIconContentColor,
+                titleContentColor,
+                actionIconContentColor
             )
         }
     }
 
     /**
-     * Creates a [TopAppBarColors] for small-centered top app bars. The default implementation
-     * animates between the provided colors according to the Material specification.
+     * Creates a [TopAppBarColors] for center aligned top app bars. The default implementation
+     * animates between the provided colors according to the Material Design specification.
      *
      * @param containerColor the container color
      * @param scrolledContainerColor the container color when content is scrolled behind it
-     * @param navigationIconColor the content used color for the navigation icon
-     * @param titleColor the content color used for the title
-     * @param actionIconsColor the content color used for actions
+     * @param navigationIconContentColor the content color used for the navigation icon
+     * @param titleContentColor the content color used for the title
+     * @param actionIconContentColor the content color used for actions
      * @return the resulting [TopAppBarColors] used for the top app bar
      */
     @Composable
-    fun smallCenteredTopAppBarColors(
+    fun centerAlignedTopAppBarColors(
         containerColor: Color =
             MaterialTheme.colorScheme.fromToken(TopAppBarSmallCentered.SmallCenteredContainerColor),
         scrolledContainerColor: Color = MaterialTheme.colorScheme.applyTonalElevation(
             backgroundColor = containerColor,
             elevation = TopAppBarSmall.SmallOnScrollContainerElevation
         ),
-        navigationIconColor: Color =
+        navigationIconContentColor: Color =
             MaterialTheme.colorScheme.fromToken(
                 TopAppBarSmallCentered.SmallCenteredLeadingIconColor
             ),
-        titleColor: Color =
+        titleContentColor: Color =
             MaterialTheme.colorScheme.fromToken(
                 TopAppBarSmallCentered.SmallCenteredHeadlineColor
             ),
-        actionIconsColor: Color =
+        actionIconContentColor: Color =
             MaterialTheme.colorScheme.fromToken(
                 TopAppBarSmallCentered.SmallCenteredTrailingIconColor
             )
@@ -329,16 +458,104 @@
         return remember(
             containerColor,
             scrolledContainerColor,
-            navigationIconColor,
-            titleColor,
-            actionIconsColor
+            navigationIconContentColor,
+            titleContentColor,
+            actionIconContentColor
         ) {
             AnimatingTopAppBarColors(
                 containerColor,
                 scrolledContainerColor,
-                navigationIconColor,
-                titleColor,
-                actionIconsColor
+                navigationIconContentColor,
+                titleContentColor,
+                actionIconContentColor
+            )
+        }
+    }
+
+    /**
+     * Creates a [TopAppBarColors] for medium top app bars. The default implementation interpolates
+     * between the provided colors as the top app bar scrolls according to the Material Design
+     * specification.
+     *
+     * @param containerColor the container color
+     * @param scrolledContainerColor the container color when content is scrolled behind it
+     * @param navigationIconContentColor the content color used for the navigation icon
+     * @param titleContentColor the content color used for the title
+     * @param actionIconContentColor the content color used for actions
+     * @return the resulting [TopAppBarColors] used for the top app bar
+     */
+    @Composable
+    fun mediumTopAppBarColors(
+        containerColor: Color =
+            MaterialTheme.colorScheme.fromToken(TopAppBarMedium.MediumContainerColor),
+        scrolledContainerColor: Color = MaterialTheme.colorScheme.applyTonalElevation(
+            backgroundColor = containerColor,
+            elevation = TopAppBarSmall.SmallOnScrollContainerElevation
+        ),
+        navigationIconContentColor: Color =
+            MaterialTheme.colorScheme.fromToken(TopAppBarMedium.MediumLeadingIconColor),
+        titleContentColor: Color =
+            MaterialTheme.colorScheme.fromToken(TopAppBarMedium.MediumHeadlineColor),
+        actionIconContentColor: Color =
+            MaterialTheme.colorScheme.fromToken(TopAppBarMedium.MediumTrailingIconColor)
+    ): TopAppBarColors {
+        return remember(
+            containerColor,
+            scrolledContainerColor,
+            navigationIconContentColor,
+            titleContentColor,
+            actionIconContentColor
+        ) {
+            InterpolatingTopAppBarColors(
+                containerColor,
+                scrolledContainerColor,
+                navigationIconContentColor,
+                titleContentColor,
+                actionIconContentColor
+            )
+        }
+    }
+
+    /**
+     * Creates a [TopAppBarColors] for large top app bars. The default implementation interpolates
+     * between the provided colors as the top app bar scrolls according to the Material Design
+     * specification.
+     *
+     * @param containerColor the container color
+     * @param scrolledContainerColor the container color when content is scrolled behind it
+     * @param navigationIconContentColor the content color used for the navigation icon
+     * @param titleContentColor the content color used for the title
+     * @param actionIconContentColor the content color used for actions
+     * @return the resulting [TopAppBarColors] used for the top app bar
+     */
+    @Composable
+    fun largeTopAppBarColors(
+        containerColor: Color =
+            MaterialTheme.colorScheme.fromToken(TopAppBarLarge.LargeContainerColor),
+        scrolledContainerColor: Color = MaterialTheme.colorScheme.applyTonalElevation(
+            backgroundColor = containerColor,
+            elevation = TopAppBarSmall.SmallOnScrollContainerElevation
+        ),
+        navigationIconContentColor: Color =
+            MaterialTheme.colorScheme.fromToken(TopAppBarLarge.LargeLeadingIconColor),
+        titleContentColor: Color =
+            MaterialTheme.colorScheme.fromToken(TopAppBarLarge.LargeHeadlineColor),
+        actionIconContentColor: Color =
+            MaterialTheme.colorScheme.fromToken(TopAppBarLarge.LargeTrailingIconColor)
+    ): TopAppBarColors {
+        return remember(
+            containerColor,
+            scrolledContainerColor,
+            navigationIconContentColor,
+            titleContentColor,
+            actionIconContentColor
+        ) {
+            InterpolatingTopAppBarColors(
+                containerColor,
+                scrolledContainerColor,
+                navigationIconContentColor,
+                titleContentColor,
+                actionIconContentColor
             )
         }
     }
@@ -350,28 +567,47 @@
      * @param canScroll a callback used to determine whether scroll events are to be handled by this
      * pinned [TopAppBarScrollBehavior]
      */
+    @ExperimentalMaterial3Api
     fun pinnedScrollBehavior(canScroll: () -> Boolean = { true }): TopAppBarScrollBehavior =
         PinnedScrollBehavior(canScroll)
 
     /**
-     * Returns a [TopAppBarScrollBehavior] that tracks nested-scroll callbacks and
-     * updates its [TopAppBarScrollBehavior.offset] and [TopAppBarScrollBehavior.contentOffset]
-     * accordingly.
+     * Returns a [TopAppBarScrollBehavior]. A top app bar that is set up with this
+     * [TopAppBarScrollBehavior] will immediately collapse when the content is pulled up, and will
+     * immediately appear when the content is pulled down.
      *
-     * This scroll-connection updates the `offset` value immediately whenever the content is pulled
-     * up or down. A top-bar that is set up with this [TopAppBarScrollBehavior] managed by this
-     * [EnterAlwaysScrollBehavior] will immediately collapse when the scaffold's content is pulled
-     * up, and will immediately appear when the content is pulled down.
-     *
-     * @param canScroll a callback used to determine whether scroll events are to be handled by this
-     * [EnterAlwaysScrollBehavior]
+     * @param canScroll a callback used to determine whether scroll events are to be
+     * handled by this [EnterAlwaysScrollBehavior]
      */
+    @ExperimentalMaterial3Api
     fun enterAlwaysScrollBehavior(canScroll: () -> Boolean = { true }): TopAppBarScrollBehavior =
         EnterAlwaysScrollBehavior(canScroll)
+
+    /**
+     * Returns a [TopAppBarScrollBehavior] that adjusts its properties to affect the colors and
+     * height of the top app bar.
+     *
+     * A top app bar that is set up with this [TopAppBarScrollBehavior] will immediately collapse
+     * when the nested content is pulled up, and will expand back the collapsed area when the
+     * content is  pulled all the way down.
+     *
+     * @param decayAnimationSpec a [DecayAnimationSpec] that will be used by the top app bar motion
+     * when the user flings the content. Preferably, this should match the animation spec used by
+     * the scrollable content. See also [androidx.compose.animation.rememberSplineBasedDecay] for a
+     * default [DecayAnimationSpec] that can be used with this behavior.
+     * @param canScroll a callback used to determine whether scroll events are to be
+     * handled by this [ExitUntilCollapsedScrollBehavior]
+     */
+    @ExperimentalMaterial3Api
+    fun exitUntilCollapsedScrollBehavior(
+        decayAnimationSpec: DecayAnimationSpec<Float>,
+        canScroll: () -> Boolean = { true }
+    ): TopAppBarScrollBehavior =
+        ExitUntilCollapsedScrollBehavior(decayAnimationSpec, canScroll)
 }
 
 /**
- * A single-row top app bar that is designed to be called by the Small and Small-Centered top app
+ * A single-row top app bar that is designed to be called by the small and center aligned top app
  * bar composables.
  *
  * This SingleRowTopAppBar has slots for a title, navigation icon, and actions. When the
@@ -421,9 +657,9 @@
         }
         TopAppBarLayout(
             heightPx = height,
-            navigationIconColor = colors.navigationIconColor(scrollFraction).value,
-            titleColor = colors.titleColor(scrollFraction).value,
-            actionIconsColor = colors.actionIconColor(scrollFraction).value,
+            navigationIconContentColor = colors.navigationIconContentColor(scrollFraction).value,
+            titleContentColor = colors.titleContentColor(scrollFraction).value,
+            actionIconContentColor = colors.actionIconContentColor(scrollFraction).value,
             title = title,
             titleTextStyle = titleTextStyle,
             titleHorizontalArrangement =
@@ -435,17 +671,112 @@
 }
 
 /**
+ * A two-rows top app bar that is designed to be called by the Large and Medium top app bar
+ * composables.
+ *
+ * @throws [IllegalArgumentException] if the given [maxHeight] is equal or smaller than the
+ * [pinnedHeight]
+ */
+@Composable
+private fun TwoRowsTopAppBar(
+    modifier: Modifier = Modifier,
+    title: @Composable () -> Unit,
+    titleTextStyle: TextStyle,
+    titleBottomPadding: Dp,
+    smallTitle: @Composable () -> Unit,
+    smallTitleTextStyle: TextStyle,
+    navigationIcon: @Composable () -> Unit,
+    actions: @Composable RowScope.() -> Unit,
+    colors: TopAppBarColors,
+    maxHeight: Dp,
+    pinnedHeight: Dp,
+    scrollBehavior: TopAppBarScrollBehavior?
+) {
+    if (maxHeight <= pinnedHeight) {
+        throw IllegalArgumentException(
+            "A TwoRowsTopAppBar max height should be greater than its pinned height"
+        )
+    }
+    val pinnedHeightPx: Float
+    val maxHeightPx: Float
+    val titleBottomPaddingPx: Int
+    LocalDensity.current.run {
+        pinnedHeightPx = pinnedHeight.toPx()
+        maxHeightPx = maxHeight.toPx()
+        titleBottomPaddingPx = titleBottomPadding.roundToPx()
+    }
+
+    // Set a scroll offset limit that will hide just the title area and will keep the small title
+    // area visible.
+    SideEffect {
+        if (scrollBehavior?.offsetLimit != pinnedHeightPx - maxHeightPx) {
+            scrollBehavior?.offsetLimit = pinnedHeightPx - maxHeightPx
+        }
+    }
+
+    val titleAlpha =
+        if (scrollBehavior == null || scrollBehavior.offsetLimit == 0f) {
+            1f
+        } else {
+            1f - (scrollBehavior.offset / scrollBehavior.offsetLimit)
+        }
+    // Obtain the container Color from the TopAppBarColors.
+    // This will potentially animate or interpolate a transition between the container color and the
+    // container's scrolled color according to the app bar's scroll state.
+    val scrollFraction = scrollBehavior?.scrollFraction ?: 0f
+    val appBarContainerColor by colors.containerColor(scrollFraction)
+
+    // Wrap the given actions in a Row.
+    val actionsRow = @Composable {
+        Row(
+            horizontalArrangement = Arrangement.End,
+            verticalAlignment = Alignment.CenterVertically,
+            content = actions
+        )
+    }
+    Surface(modifier = modifier, color = appBarContainerColor) {
+        Column {
+            TopAppBarLayout(
+                heightPx = pinnedHeightPx,
+                navigationIconContentColor =
+                    colors.navigationIconContentColor(scrollFraction).value,
+                titleContentColor = colors.titleContentColor(scrollFraction).value,
+                actionIconContentColor = colors.actionIconContentColor(scrollFraction).value,
+                title = smallTitle,
+                titleTextStyle = smallTitleTextStyle,
+                titleAlpha = 1f - titleAlpha,
+                navigationIcon = navigationIcon,
+                actions = actionsRow,
+            )
+            TopAppBarLayout(
+                heightPx = maxHeightPx - pinnedHeightPx + (scrollBehavior?.offset ?: 0f),
+                navigationIconContentColor =
+                    colors.navigationIconContentColor(scrollFraction).value,
+                titleContentColor = colors.titleContentColor(scrollFraction).value,
+                actionIconContentColor = colors.actionIconContentColor(scrollFraction).value,
+                title = title,
+                titleTextStyle = titleTextStyle,
+                titleAlpha = titleAlpha,
+                titleVerticalArrangement = Arrangement.Bottom,
+                titleBottomPadding = titleBottomPaddingPx,
+                modifier = Modifier.graphicsLayer { clip = true }
+            )
+        }
+    }
+}
+
+/**
  * The base [Layout] for all top app bars. This function lays out a top app bar navigation icon
  * (leading icon), a title (header), and action icons (trailing icons). Note that the navigation and
  * the actions are optional.
  *
  * @param heightPx the total height this layout is capped to
- * @param navigationIconColor the color that will be applied via a [LocalContentColor] when
- * composing the navigation icon
- * @param titleColor the color that will be applied via a [LocalContentColor] when composing the
- * title
- * @param actionIconsColor the color that will be applied via a [LocalContentColor] when composing
- * the action icons
+ * @param navigationIconContentColor the content color that will be applied via a
+ * [LocalContentColor] when composing the navigation icon
+ * @param titleContentColor the color that will be applied via a [LocalContentColor] when composing
+ * the title
+ * @param actionIconContentColor the content color that will be applied via a [LocalContentColor]
+ * when composing the action icons
  * @param title the top app bar title (header)
  * @param titleTextStyle the title's text style
  * @param modifier a [Modifier]
@@ -459,9 +790,9 @@
 @Composable
 private fun TopAppBarLayout(
     heightPx: Float,
-    navigationIconColor: Color,
-    titleColor: Color,
-    actionIconsColor: Color,
+    navigationIconContentColor: Color,
+    titleContentColor: Color,
+    actionIconContentColor: Color,
     title: @Composable () -> Unit,
     titleTextStyle: TextStyle,
     modifier: Modifier = Modifier,
@@ -476,21 +807,21 @@
         {
             Box(Modifier.layoutId("navigationIcon").padding(start = TopAppBarHorizontalPadding)) {
                 CompositionLocalProvider(
-                    LocalContentColor provides navigationIconColor,
+                    LocalContentColor provides navigationIconContentColor,
                     content = navigationIcon
                 )
             }
             Box(Modifier.layoutId("title").padding(horizontal = TopAppBarHorizontalPadding)) {
                 ProvideTextStyle(value = titleTextStyle) {
                     CompositionLocalProvider(
-                        LocalContentColor provides titleColor.copy(alpha = titleAlpha),
+                        LocalContentColor provides titleContentColor.copy(alpha = titleAlpha),
                         content = title
                     )
                 }
             }
             Box(Modifier.layoutId("actionIcons").padding(end = TopAppBarHorizontalPadding)) {
                 CompositionLocalProvider(
-                    LocalContentColor provides actionIconsColor,
+                    LocalContentColor provides actionIconContentColor,
                     content = actions
                 )
             }
@@ -570,16 +901,16 @@
 private class AnimatingTopAppBarColors(
     private val containerColor: Color,
     private val scrolledContainerColor: Color,
-    navigationIconColor: Color,
-    titleColor: Color,
-    actionIconColor: Color
+    navigationIconContentColor: Color,
+    titleContentColor: Color,
+    actionIconContentColor: Color
 ) : TopAppBarColors {
 
     // In this TopAppBarColors implementation, the following colors never change their value as the
     // app bar scrolls.
-    private val navigationIconColorState: State<Color> = mutableStateOf(navigationIconColor)
-    private val titleColorState: State<Color> = mutableStateOf(titleColor)
-    private val actionIconColorState: State<Color> = mutableStateOf(actionIconColor)
+    private val navigationIconColorState: State<Color> = mutableStateOf(navigationIconContentColor)
+    private val titleColorState: State<Color> = mutableStateOf(titleContentColor)
+    private val actionIconColorState: State<Color> = mutableStateOf(actionIconContentColor)
 
     @Composable
     override fun containerColor(scrollFraction: Float): State<Color> {
@@ -598,20 +929,64 @@
     }
 
     @Composable
-    override fun navigationIconColor(scrollFraction: Float): State<Color> = navigationIconColorState
+    override fun navigationIconContentColor(scrollFraction: Float): State<Color> =
+        navigationIconColorState
 
     @Composable
-    override fun titleColor(scrollFraction: Float): State<Color> = titleColorState
+    override fun titleContentColor(scrollFraction: Float): State<Color> = titleColorState
 
     @Composable
-    override fun actionIconColor(scrollFraction: Float): State<Color> = actionIconColorState
+    override fun actionIconContentColor(scrollFraction: Float): State<Color> = actionIconColorState
 }
 
 /**
- * A [TopAppBarScrollBehavior] that only adjusts its content offset, without adjusting any
- * properties that affect the height of the top app bar.
+ * A [TopAppBarColors] implementation that interpolates the container color according to the top
+ * app bar scroll state percentage.
  *
- * @param canScroll a callback that can be used to determine whether scroll events are to be
+ * This default implementation does not interpolate the leading, headline, or trailing colors.
+ */
+@Stable
+private class InterpolatingTopAppBarColors(
+    private val containerColor: Color,
+    private val scrolledContainerColor: Color,
+    navigationIconContentColor: Color,
+    titleContentColor: Color,
+    actionIconContentColor: Color
+) : TopAppBarColors {
+
+    // In this TopAppBarColors implementation, the following colors never change their value as the
+    // app bar scrolls.
+    private val navigationIconColorState: State<Color> = mutableStateOf(navigationIconContentColor)
+    private val titleColorState: State<Color> = mutableStateOf(titleContentColor)
+    private val actionIconColorState: State<Color> = mutableStateOf(actionIconContentColor)
+
+    @Composable
+    override fun containerColor(scrollFraction: Float): State<Color> {
+        return rememberUpdatedState(
+            lerp(
+                containerColor,
+                scrolledContainerColor,
+                FastOutLinearInEasing.transform(scrollFraction)
+            )
+        )
+    }
+
+    @Composable
+    override fun navigationIconContentColor(scrollFraction: Float): State<Color> =
+        navigationIconColorState
+
+    @Composable
+    override fun titleContentColor(scrollFraction: Float): State<Color> = titleColorState
+
+    @Composable
+    override fun actionIconContentColor(scrollFraction: Float): State<Color> = actionIconColorState
+}
+
+/**
+ * Returns a [TopAppBarScrollBehavior] that only adjusts its content offset, without adjusting any
+ * properties that affect the height of a top app bar.
+ *
+ * @param canScroll a callback used to determine whether scroll events are to be
  * handled by this [PinnedScrollBehavior]
  */
 private class PinnedScrollBehavior(val canScroll: () -> Boolean = { true }) :
@@ -649,12 +1024,13 @@
 }
 
 /**
- * A [TopAppBarScrollBehavior] that adjusts its properties to affect the height of the top app bar.
+ * A [TopAppBarScrollBehavior] that adjusts its properties to affect the colors and height of a top
+ * app bar.
  *
- * A top-bar that is set up with this [TopAppBarScrollBehavior] will immediately collapse when the
- * scaffold's content is pulled up, and will immediately appear when the content is pulled down.
+ * A top app bar that is set up with this [TopAppBarScrollBehavior] will immediately collapse when
+ * the nested content is pulled up, and will immediately appear when the content is pulled down.
  *
- * @param canScroll a callback that can be used to determine whether scroll events are to be
+ * @param canScroll a callback used to determine whether scroll events are to be
  * handled by this [EnterAlwaysScrollBehavior]
  */
 private class EnterAlwaysScrollBehavior(val canScroll: () -> Boolean = { true }) :
@@ -678,7 +1054,7 @@
                 val newOffset = (offset + available.y)
                 val coerced = newOffset.coerceIn(minimumValue = offsetLimit, maximumValue = 0f)
                 return if (newOffset == coerced) {
-                    // Nothing coerced, meaning we're in the middle of top-bar collapse or
+                    // Nothing coerced, meaning we're in the middle of top app bar collapse or
                     // expand.
                     offset = coerced
                     available
@@ -710,6 +1086,154 @@
         }
 }
 
+/**
+ * A [TopAppBarScrollBehavior] that adjusts its properties to affect the colors and height of a top
+ * app bar.
+ *
+ * A top app bar that is set up with this [TopAppBarScrollBehavior] will immediately collapse when
+ * the nested content is pulled up, and will expand back the collapsed area when the content is
+ * pulled all the way down.
+ *
+ * @param decayAnimationSpec a [DecayAnimationSpec] that will be used by the top app bar motion
+ * when the user flings the content. Preferably, this should match the animation spec used by the
+ * scrollable content. See also [androidx.compose.animation.rememberSplineBasedDecay] for a
+ * default [DecayAnimationSpec] that can be used with this behavior.
+ * @param canScroll a callback used to determine whether scroll events are to be
+ * handled by this [ExitUntilCollapsedScrollBehavior]
+ */
+private class ExitUntilCollapsedScrollBehavior(
+    val decayAnimationSpec: DecayAnimationSpec<Float>,
+    val canScroll: () -> Boolean = { true }
+) : TopAppBarScrollBehavior {
+    override val scrollFraction: Float
+        get() = if (offsetLimit != 0f) offset / offsetLimit else 0f
+    override var offsetLimit by mutableStateOf(-Float.MAX_VALUE)
+    override var offset by mutableStateOf(0f)
+    override var contentOffset by mutableStateOf(0f)
+    override var nestedScrollConnection =
+        object : NestedScrollConnection {
+            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+                // Don't intercept if scrolling down.
+                if (!canScroll() || available.y > 0f) return Offset.Zero
+
+                val newOffset = (offset + available.y)
+                val coerced = newOffset.coerceIn(minimumValue = offsetLimit, maximumValue = 0f)
+                return if (newOffset == coerced) {
+                    // Nothing coerced, meaning we're in the middle of top app bar collapse or
+                    // expand.
+                    offset = coerced
+                    available
+                } else {
+                    Offset.Zero
+                }
+            }
+
+            override fun onPostScroll(
+                consumed: Offset,
+                available: Offset,
+                source: NestedScrollSource
+            ): Offset {
+                if (!canScroll()) return Offset.Zero
+                contentOffset += consumed.y
+
+                if (available.y < 0f || consumed.y < 0f) {
+                    // When scrolling up, just update the state's offset.
+                    val oldOffset = offset
+                    offset = (offset + consumed.y).coerceIn(
+                        minimumValue = offsetLimit,
+                        maximumValue = 0f
+                    )
+                    return Offset(0f, offset - oldOffset)
+                }
+
+                if (consumed.y == 0f && available.y > 0) {
+                    // Reset the total offset to zero when scrolling all the way down. This will
+                    // eliminate some float precision inaccuracies.
+                    contentOffset = 0f
+                }
+
+                if (available.y > 0f) {
+                    // Adjust the offset in case the consumed delta Y is less than what was recorded
+                    // as available delta Y in the pre-scroll.
+                    val oldOffset = offset
+                    offset = (offset + available.y).coerceIn(
+                        minimumValue = offsetLimit,
+                        maximumValue = 0f
+                    )
+                    return Offset(0f, offset - oldOffset)
+                }
+                return Offset.Zero
+            }
+
+            override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
+                val result = super.onPostFling(consumed, available)
+                // TODO(b/179417109): We get positive Velocity when flinging up while the top app
+                //  bar is changing its height. Track b/179417109 for a fix.
+                if ((available.y < 0f && contentOffset == 0f) ||
+                    (available.y > 0f && offset < 0f)
+                ) {
+                    return result +
+                        onTopBarFling(
+                            scrollBehavior = this@ExitUntilCollapsedScrollBehavior,
+                            initialVelocity = available.y,
+                            decayAnimationSpec = decayAnimationSpec,
+                            snap = true
+                        )
+                }
+                return result
+            }
+        }
+}
+
+private suspend fun onTopBarFling(
+    scrollBehavior: TopAppBarScrollBehavior,
+    initialVelocity: Float,
+    decayAnimationSpec: DecayAnimationSpec<Float>,
+    snap: Boolean
+): Velocity {
+    if (abs(initialVelocity) > 1f) {
+        var remainingVelocity = initialVelocity
+        var lastValue = 0f
+        AnimationState(
+            initialValue = 0f,
+            initialVelocity = initialVelocity,
+        )
+            .animateDecay(decayAnimationSpec) {
+                val delta = value - lastValue
+                val initialOffset = scrollBehavior.offset
+                scrollBehavior.offset =
+                    (initialOffset + delta).coerceIn(
+                        minimumValue = scrollBehavior.offsetLimit,
+                        maximumValue = 0f
+                    )
+                val consumed = abs(initialOffset - scrollBehavior.offset)
+                lastValue = value
+                remainingVelocity = this.velocity
+                // avoid rounding errors and stop if anything is unconsumed
+                if (abs(delta - consumed) > 0.5f) this.cancelAnimation()
+            }
+
+        if (snap &&
+            scrollBehavior.offset < 0 &&
+            scrollBehavior.offset > scrollBehavior.offsetLimit
+        ) {
+            AnimationState(initialValue = scrollBehavior.offset).animateTo(
+                // Snap the top app bar offset to completely collapse or completely expand according
+                // to the initial velocity direction.
+                if (initialVelocity > 0) 0f else scrollBehavior.offsetLimit,
+                animationSpec = tween(
+                    durationMillis = TopAppBarAnimationDurationMillis,
+                    easing = LinearOutSlowInEasing
+                )
+            ) { scrollBehavior.offset = value }
+        }
+        return Velocity(0f, remainingVelocity)
+    }
+    return Velocity.Zero
+}
+
+private val MediumTitleBottomPadding = 24.dp
+private val LargeTitleBottomPadding = 28.dp
 private val TopAppBarHorizontalPadding = 4.dp
 
 // A title inset when the App-Bar is a Medium or Large one. Also used to size a spacer when the
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Badge.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Badge.kt
new file mode 100644
index 0000000..2426b37
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Badge.kt
@@ -0,0 +1,183 @@
+/*
+ * 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.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.BoxScope
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.RowScope
+import androidx.compose.foundation.layout.defaultMinSize
+import androidx.compose.foundation.layout.padding
+import androidx.compose.material3.tokens.NavigationBar
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.layout.FirstBaseline
+import androidx.compose.ui.layout.LastBaseline
+import androidx.compose.ui.layout.Layout
+import androidx.compose.ui.layout.layoutId
+import androidx.compose.ui.unit.dp
+
+// TODO(b/197880751): Update spec link.
+/**
+ * A BadgeBox is used to decorate [content] with a [badge] that can contain dynamic information,
+ * such
+ * as the presence of a new notification or a number of pending requests. Badges can be icon only
+ * or contain short text.
+ *
+ * A common use case is to display a badge with navigation bar items.
+ * For more information, see [Navigation Bar](https://material.io/components/bottom-navigation#behavior)
+ *
+ * A simple icon with badge example looks like:
+ * @sample androidx.compose.material3.samples.NavigationBarItemWithBadge
+ *
+ * @param badge the badge to be displayed - typically a [Badge]
+ * @param modifier optional [Modifier] for this item
+ * @param content the anchor to which this badge will be positioned
+ *
+ */
+@Composable
+fun BadgedBox(
+    badge: @Composable BoxScope.() -> Unit,
+    modifier: Modifier = Modifier,
+    content: @Composable BoxScope.() -> Unit,
+) {
+    Layout(
+        {
+            Box(
+                modifier = Modifier.layoutId("anchor"),
+                contentAlignment = Alignment.Center,
+                content = content
+            )
+            Box(
+                modifier = Modifier.layoutId("badge"),
+                content = badge
+            )
+        },
+        modifier = modifier
+    ) { measurables, constraints ->
+
+        val badgePlaceable = measurables.first { it.layoutId == "badge" }.measure(
+            // Measure with loose constraints for height as we don't want the text to take up more
+            // space than it needs.
+            constraints.copy(minHeight = 0)
+        )
+
+        val anchorPlaceable = measurables.first { it.layoutId == "anchor" }.measure(constraints)
+
+        val firstBaseline = anchorPlaceable[FirstBaseline]
+        val lastBaseline = anchorPlaceable[LastBaseline]
+        val totalWidth = anchorPlaceable.width
+        val totalHeight = anchorPlaceable.height
+
+        layout(
+            totalWidth,
+            totalHeight,
+            // Provide custom baselines based only on the anchor content to avoid default baseline
+            // calculations from including by any badge content.
+            mapOf(
+                FirstBaseline to firstBaseline,
+                LastBaseline to lastBaseline
+            )
+        ) {
+            // Use the width of the badge to infer whether it has any content (based on radius used
+            // in [Badge]) and determine its horizontal offset.
+            val hasContent = badgePlaceable.width > (NavigationBar.BadgeSize.roundToPx())
+            val badgeHorizontalOffset =
+                if (hasContent) BadgeWithContentHorizontalOffset else BadgeOffset
+            val badgeVerticalOffset =
+                if (hasContent) BadgeWithContentVerticalOffset else BadgeOffset
+
+            anchorPlaceable.placeRelative(0, 0)
+            val badgeX = anchorPlaceable.width + badgeHorizontalOffset.roundToPx()
+            val badgeY = -badgePlaceable.height / 2 + badgeVerticalOffset.roundToPx()
+            badgePlaceable.placeRelative(badgeX, badgeY)
+        }
+    }
+}
+
+/**
+ * Badge is a component that can contain dynamic information, such as the presence of a new
+ * notification or a number of pending requests. Badges can be icon only or contain short text.
+ *
+ * See [BadgedBox] for a top level layout that will properly place the badge relative to content
+ * such as text or an icon.
+ *
+ * @param modifier optional [Modifier] for this item
+ * @param containerColor the background color for the badge
+ * @param contentColor the color of label text rendered in the badge
+ * @param content optional content to be rendered inside the badge
+ */
+@Composable
+fun Badge(
+    modifier: Modifier = Modifier,
+    containerColor: Color = MaterialTheme.colorScheme.fromToken(NavigationBar.BadgeColor),
+    contentColor: Color = contentColorFor(containerColor),
+    content: @Composable (RowScope.() -> Unit)? = null,
+) {
+    val size = if (content != null) NavigationBar.LargeBadgeSize else NavigationBar.BadgeSize
+    val shape = if (content != null) NavigationBar.LargeBadgeShape else NavigationBar.BadgeShape
+
+    // Draw badge container.
+    Row(
+        modifier = modifier
+            .defaultMinSize(minWidth = size, minHeight = size)
+            .background(
+                color = containerColor,
+                shape = shape
+            )
+            .clip(shape)
+            .then(
+                if (content != null)
+                    Modifier.padding(horizontal = BadgeWithContentHorizontalPadding) else Modifier),
+        verticalAlignment = Alignment.CenterVertically,
+        horizontalArrangement = Arrangement.Center
+    ) {
+        if (content != null) {
+            // Not using Surface composable because it blocks touch propagation behind it.
+            CompositionLocalProvider(
+                LocalContentColor provides contentColor
+            ) {
+                val style =
+                    MaterialTheme.typography.fromToken(NavigationBar.LargeBadgeLabelFontFamily)
+                ProvideTextStyle(
+                    value = style,
+                    content = { content() }
+                )
+            }
+        }
+    }
+}
+
+/*@VisibleForTesting*/
+// Leading and trailing text padding when a badge is displaying text that is too long to fit in
+// a circular badge, e.g. if badge number is greater than 9.
+internal val BadgeWithContentHorizontalPadding = 4.dp
+
+/*@VisibleForTesting*/
+// Horizontally align start/end of text badge 4dp from the top end corner of its anchor
+internal val BadgeWithContentHorizontalOffset = -4.dp
+internal val BadgeWithContentVerticalOffset = -4.dp
+
+/*@VisibleForTesting*/
+// Horizontally align start/end of icon only badge 0.dp from the end/start edge of anchor
+internal val BadgeOffset = 0.dp
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Button.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Button.kt
new file mode 100644
index 0000000..82fe7d0
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Button.kt
@@ -0,0 +1,970 @@
+/*
+ * 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.animation.core.Animatable
+import androidx.compose.animation.core.VectorConverter
+import androidx.compose.foundation.BorderStroke
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.interaction.FocusInteraction
+import androidx.compose.foundation.interaction.HoverInteraction
+import androidx.compose.foundation.interaction.Interaction
+import androidx.compose.foundation.interaction.InteractionSource
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.interaction.PressInteraction
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.RowScope
+import androidx.compose.foundation.layout.defaultMinSize
+import androidx.compose.foundation.layout.padding
+import androidx.compose.material.ripple.rememberRipple
+import androidx.compose.material3.tokens.ElevatedButton
+import androidx.compose.material3.tokens.FilledButton
+import androidx.compose.material3.tokens.FilledButtonTonal
+import androidx.compose.material3.tokens.OutlinedButton
+import androidx.compose.material3.tokens.TextButton
+import androidx.compose.material3.tokens.Typography
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.Immutable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.Stable
+import androidx.compose.runtime.State
+import androidx.compose.runtime.mutableStateListOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberUpdatedState
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.semantics.Role
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+
+import kotlinx.coroutines.flow.collect
+
+/**
+ * ![Filled button image](https://developer.android.com/images/reference/androidx/compose/material3/filled-button.png)
+ *
+ * A default Material button, which is also known as a Filled button. Buttons contain actions for
+ * your app.
+ *
+ * Filled buttons are high-emphasis buttons. Filled buttons have the most visual impact after the
+ * [FloatingActionButton], and should be used for important, final actions that complete a flow,
+ * like "Save", "Join now", or "Confirm".
+ *
+ * @sample androidx.compose.material3.samples.ButtonSample
+ * @sample androidx.compose.material3.samples.ButtonWithIconSample
+ *
+ * Choose the best button for an action based on the amount of emphasis it needs. The more important
+ * an action is, the higher emphasis its button should be.
+ *
+ * - See [OutlinedButton] for a medium-emphasis button with a border.
+ * - See [ElevatedButton] for an [OutlinedButton] with a shadow.
+ * - See [TextButton] for a low-emphasis button with no border.
+ * - See [FilledTonalButton] for a middle ground between [OutlinedButton] and [Button].
+ *
+ * The default text style for internal [Text] components will be set to [Typography.LabelLarge].
+ *
+ * @param onClick Will be called when the user clicks the button.
+ * @param modifier Modifier to be applied to the button.
+ * @param enabled Controls the enabled state of the button. When `false`, this button will not be
+ * clickable.
+ * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
+ * for this Button. You can create and pass in your own remembered [MutableInteractionSource] if you
+ * want to observe [Interaction]s and customize the appearance / behavior of this Button in
+ * different [Interaction]s.
+ * @param elevation [ButtonElevation] used to resolve the elevation for this button in different
+ * states. This controls the size of the shadow below the button. When the container color is
+ * [ColorScheme.surface], a higher elevation (surface blended with more primary) will result in a
+ * darker surface color in light theme and lighter color in dark theme.
+ * @param shape Defines the button's shape as well as its shadow.
+ * @param border Border to draw around the button. Pass `null` here for no border.
+ * @param colors [ButtonColors] that will be used to resolve the container and content color for
+ * this button in different states. See [ButtonDefaults.buttonColors].
+ * @param contentPadding The spacing values to apply internally between the container and the
+ * content.
+ */
+@Composable
+fun Button(
+    onClick: () -> Unit,
+    modifier: Modifier = Modifier,
+    enabled: Boolean = true,
+    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
+    elevation: ButtonElevation? = ButtonDefaults.buttonElevation(),
+    shape: Shape = FilledButton.ContainerShape,
+    border: BorderStroke? = null,
+    colors: ButtonColors = ButtonDefaults.buttonColors(),
+    contentPadding: PaddingValues = ButtonDefaults.ContentPadding,
+    content: @Composable RowScope.() -> Unit
+) {
+    val containerColor = colors.containerColor(enabled).value
+    val contentColor = colors.contentColor(enabled).value
+    val shadowElevation = elevation?.shadowElevation(enabled, interactionSource)?.value ?: 0.dp
+    val tonalElevation = elevation?.tonalElevation(enabled, interactionSource)?.value ?: 0.dp
+
+    // TODO(b/202880001): Apply shadow color from token (will not be possibly any time soon, if ever).
+    Surface(
+        modifier = modifier.minimumTouchTargetSize(),
+        shape = shape,
+        color = containerColor,
+        contentColor = contentColor,
+        shadowElevation = shadowElevation,
+        tonalElevation = tonalElevation,
+        border = border,
+    ) {
+        val clickAndSemanticsModifier =
+            Modifier.clickable(
+                interactionSource = interactionSource,
+                indication = rememberRipple(),
+                enabled = true,
+                onClickLabel = null,
+                role = Role.Button,
+                onClick = onClick
+            )
+        CompositionLocalProvider(LocalContentColor provides contentColor) {
+            ProvideTextStyle(value = Typography.LabelLarge) {
+                Row(
+                    Modifier.defaultMinSize(
+                        minWidth = ButtonDefaults.MinWidth,
+                        minHeight = ButtonDefaults.MinHeight
+                    )
+                        .then(clickAndSemanticsModifier)
+                        .padding(contentPadding),
+                    horizontalArrangement = Arrangement.Center,
+                    verticalAlignment = Alignment.CenterVertically,
+                    content = content
+                )
+            }
+        }
+    }
+}
+
+/**
+ * ![Elevated button image](https://developer.android.com/images/reference/androidx/compose/material3/elevated-button.png)
+ *
+ * A Material Elevated button. Buttons contain actions for your app.
+ *
+ * Elevated buttons are high-emphasis buttons that are essentially [FilledTonalButton]s with a
+ * shadow. To prevent shadow creep, only use them when absolutely necessary, such as when the button
+ * requires visual separation from patterned container.
+ *
+ * @sample androidx.compose.material3.samples.ElevatedButtonSample
+ *
+ * Choose the best button for an action based on the amount of emphasis it needs. The more important
+ * an action is, the higher emphasis its button should be.
+ *
+ * - See [Button] for a high-emphasis button without a shadow, also known as a filled button.
+ * - See [FilledTonalButton] for a middle ground between [OutlinedButton] and [Button].
+ * - See [OutlinedButton] for a medium-emphasis button with a border.
+ * - See [TextButton] for a low-emphasis button with no border.
+ *
+ * The default text style for internal [Text] components will be set to [Typography.LabelLarge].
+ *
+ * @param onClick Will be called when the user clicks the button.
+ * @param modifier Modifier to be applied to the button.
+ * @param enabled Controls the enabled state of the button. When `false`, this button will not be
+ * clickable.
+ * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
+ * for this Button. You can create and pass in your own remembered [MutableInteractionSource] if you
+ * want to observe [Interaction]s and customize the appearance / behavior of this Button in
+ * different [Interaction]s.
+ * @param elevation [ButtonElevation] used to resolve the elevation for this button in different
+ * states. This controls the size of the shadow below the button. When the container color is
+ * [ColorScheme.surface], a higher elevation (surface blended with more primary) will result in a
+ * darker surface color in light theme and lighter color in dark theme.
+ * [ButtonDefaults.elevatedButtonElevation].
+ * @param shape Defines the button's shape as well as its shadow.
+ * @param border Border to draw around the button. Pass `null` here for no border.
+ * @param colors [ButtonColors] that will be used to resolve the container and content color for
+ * this button in different states. See [ButtonDefaults.elevatedButtonColors].
+ * @param contentPadding The spacing values to apply internally between the container and the
+ * content.
+ */
+@Composable
+fun ElevatedButton(
+    onClick: () -> Unit,
+    modifier: Modifier = Modifier,
+    enabled: Boolean = true,
+    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
+    elevation: ButtonElevation? = ButtonDefaults.elevatedButtonElevation(),
+    shape: Shape = ElevatedButton.ContainerShape,
+    border: BorderStroke? = null,
+    colors: ButtonColors = ButtonDefaults.elevatedButtonColors(),
+    contentPadding: PaddingValues = ButtonDefaults.ContentPadding,
+    content: @Composable RowScope.() -> Unit
+) =
+    Button(
+        onClick = onClick,
+        modifier = modifier,
+        enabled = enabled,
+        interactionSource = interactionSource,
+        elevation = elevation,
+        shape = shape,
+        border = border,
+        colors = colors,
+        contentPadding = contentPadding,
+        content = content
+    )
+
+/**
+ * ![Filled tonal button image](https://developer.android.com/images/reference/androidx/compose/material3/filled-tonal-button.png)
+ *
+ * A Material Filled tonal button. Buttons contain actions for your app.
+ *
+ * Filled tonal buttons are medium-emphasis buttons that is an alternative middle ground between
+ * default [Button]s (filled) and [OutlinedButton]s. They can be used in contexts where
+ * lower-priority button requires slightly more emphasis than an outline would give, such as "Next"
+ * in an onboarding flow. Tonal buttons use the secondary color mapping.
+ *
+ * @sample androidx.compose.material3.samples.FilledTonalButtonSample
+ *
+ * Choose the best button for an action based on the amount of emphasis it needs. The more important
+ * an action is, the higher emphasis its button should be.
+ *
+ * - See [Button] for a high-emphasis button without a shadow, also known as a filled button.
+ * - See [ElevatedButton] for a [FilledTonalButton] with a shadow.
+ * - See [OutlinedButton] for a medium-emphasis button with a border.
+ * - See [TextButton] for a low-emphasis button with no border.
+ *
+ * The default text style for internal [Text] components will be set to [Typography.LabelLarge].
+ *
+ * @param onClick Will be called when the user clicks the button.
+ * @param modifier Modifier to be applied to the button.
+ * @param enabled Controls the enabled state of the button. When `false`, this button will not be
+ * clickable.
+ * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
+ * for this Button. You can create and pass in your own remembered [MutableInteractionSource] if you
+ * want to observe [Interaction]s and customize the appearance / behavior of this Button in
+ * different [Interaction]s.
+ * @param elevation [ButtonElevation] used to resolve the elevation for this button in different
+ * states. This controls the size of the shadow below the button. When the container color is
+ * [ColorScheme.surface], a higher elevation (surface blended with more primary) will result in a
+ * darker surface color in light theme and lighter color in dark theme.
+ * @param shape Defines the button's shape as well as its shadow.
+ * @param border Border to draw around the button. Pass `null` here for no border.
+ * @param colors [ButtonColors] that will be used to resolve the container and content color for
+ * this button in different states. See [ButtonDefaults.elevatedButtonColors].
+ * @param contentPadding The spacing values to apply internally between the container and the
+ * content.
+ */
+@Composable
+fun FilledTonalButton(
+    onClick: () -> Unit,
+    modifier: Modifier = Modifier,
+    enabled: Boolean = true,
+    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
+    elevation: ButtonElevation? = ButtonDefaults.filledTonalButtonElevation(),
+    shape: Shape = FilledButtonTonal.TonalContainerShape,
+    border: BorderStroke? = null,
+    colors: ButtonColors = ButtonDefaults.filledTonalButtonColors(),
+    contentPadding: PaddingValues = ButtonDefaults.ContentPadding,
+    content: @Composable RowScope.() -> Unit
+) =
+    Button(
+        onClick = onClick,
+        modifier = modifier,
+        enabled = enabled,
+        interactionSource = interactionSource,
+        elevation = elevation,
+        shape = shape,
+        border = border,
+        colors = colors,
+        contentPadding = contentPadding,
+        content = content
+    )
+
+/**
+ * ![Outlined button image](https://developer.android.com/images/reference/androidx/compose/material3/outlined-button.png)
+ *
+ * A Material Outlined button. Buttons contain actions for your app.
+ *
+ * Outlined buttons are medium-emphasis buttons. They contain actions that are important, but are
+ * not the primary action in an app. Outlined buttons pair well with [Button]s to indicate an
+ * alternative, secondary action.
+ *
+ * @sample androidx.compose.material3.samples.OutlinedButtonSample
+ *
+ * Choose the best button for an action based on the amount of emphasis it needs. The more important
+ * an action is, the higher emphasis its button should be.
+ *
+ * - See [Button] for a high-emphasis button without a shadow, also known as a filled button.
+ * - See [FilledTonalButton] for a middle ground between [OutlinedButton] and [Button].
+ * - See [OutlinedButton] for a medium-emphasis button with a border.
+ * - See [TextButton] for a low-emphasis button with no border.
+ *
+ * The default text style for internal [Text] components will be set to [Typography.LabelLarge].
+ *
+ * @param onClick Will be called when the user clicks the button.
+ * @param modifier Modifier to be applied to the button.
+ * @param enabled Controls the enabled state of the button. When `false`, this button will not be
+ * clickable.
+ * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
+ * for this Button. You can create and pass in your own remembered [MutableInteractionSource] if you
+ * want to observe [Interaction]s and customize the appearance / behavior of this Button in
+ * different [Interaction]s.
+ * @param elevation [ButtonElevation] used to resolve the elevation for this button in different
+ * states. This controls the size of the shadow below the button. When the container color is
+ * [ColorScheme.surface], a higher elevation (surface blended with more primary) will result in a
+ * darker surface color in light theme and lighter color in dark theme.
+ * @param shape Defines the button's shape as well as its shadow.
+ * @param border Border to draw around the button. Pass `null` here for no border.
+ * @param colors [ButtonColors] that will be used to resolve the container and content color for
+ * this button in different states. See [ButtonDefaults.elevatedButtonColors].
+ * @param contentPadding The spacing values to apply internally between the container and the
+ * content.
+ */
+@Composable
+fun OutlinedButton(
+    onClick: () -> Unit,
+    modifier: Modifier = Modifier,
+    enabled: Boolean = true,
+    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
+    elevation: ButtonElevation? = null,
+    shape: Shape = OutlinedButton.ContainerShape,
+    border: BorderStroke? = ButtonDefaults.outlinedButtonBorder,
+    colors: ButtonColors = ButtonDefaults.outlinedButtonColors(),
+    contentPadding: PaddingValues = ButtonDefaults.ContentPadding,
+    content: @Composable RowScope.() -> Unit
+) =
+    Button(
+        onClick = onClick,
+        modifier = modifier,
+        enabled = enabled,
+        interactionSource = interactionSource,
+        elevation = elevation,
+        shape = shape,
+        border = border,
+        colors = colors,
+        contentPadding = contentPadding,
+        content = content
+    )
+
+/**
+ * ![Text button image](https://developer.android.com/images/reference/androidx/compose/material3/text-button.png)
+ *
+ * A Material Text button. Buttons contain actions for your app.
+ *
+ * Text buttons are typically used for less-pronounced actions, including those located in dialogs
+ * and cards. In cards, text buttons help maintain an emphasis on card content. Text buttons are
+ * used for the lowest priority actions, especially when presenting multiple options.
+ *
+ * @sample androidx.compose.material3.samples.TextButtonSample
+ *
+ * Choose the best button for an action based on the amount of emphasis it needs. The more important
+ * an action is, the higher emphasis its button should be.
+ *
+ * - See [Button] for a high-emphasis button without a shadow, also known as a filled button.
+ * - See [ElevatedButton] for a [FilledTonalButton] with a shadow.
+ * - See [FilledTonalButton] for a middle ground between [OutlinedButton] and [Button].
+ * - See [OutlinedButton] for a medium-emphasis button with a border.
+ *
+ * The default text style for internal [Text] components will be set to [Typography.LabelLarge].
+ *
+ * @param onClick Will be called when the user clicks the button.
+ * @param modifier Modifier to be applied to the button.
+ * @param enabled Controls the enabled state of the button. When `false`, this button will not be
+ * clickable.
+ * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
+ * for this Button. You can create and pass in your own remembered [MutableInteractionSource] if you
+ * want to observe [Interaction]s and customize the appearance / behavior of this Button in
+ * different [Interaction]s.
+ * @param elevation [ButtonElevation] used to resolve the elevation for this button in different
+ * states. This controls the size of the shadow below the button. When the container color is
+ * [ColorScheme.surface], a higher elevation (surface blended with more primary) will result in a
+ * darker surface color in light theme and lighter color in dark theme. A TextButton typically has
+ * no elevation, and the default value is `null`. See [ElevatedButton] for a button with elevation.
+ * @param shape Defines the button's shape. A TextButton typically has no elevation or shadow, but
+ * if a non-zero or non-null elevation is passed in, then the shape also defines the bounds of the
+ * shadow.
+ * @param border Border to draw around the button.
+ * @param colors [ButtonColors] that will be used to resolve the container and content color for
+ * this button in different states. See [ButtonDefaults.textButtonColors].
+ * @param contentPadding The spacing values to apply internally between the container and the
+ * content.
+ */
+@Composable
+fun TextButton(
+    onClick: () -> Unit,
+    modifier: Modifier = Modifier,
+    enabled: Boolean = true,
+    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
+    elevation: ButtonElevation? = null,
+    shape: Shape = TextButton.ContainerShape,
+    border: BorderStroke? = null,
+    colors: ButtonColors = ButtonDefaults.textButtonColors(),
+    contentPadding: PaddingValues = ButtonDefaults.TextButtonContentPadding,
+    content: @Composable RowScope.() -> Unit
+) =
+    Button(
+        onClick = onClick,
+        modifier = modifier,
+        enabled = enabled,
+        interactionSource = interactionSource,
+        elevation = elevation,
+        shape = shape,
+        border = border,
+        colors = colors,
+        contentPadding = contentPadding,
+        content = content
+    )
+
+// TODO(b/201341237): Use token values for 0 elevation?
+// TODO(b/201341237): Use token values for null border?
+// TODO(b/201341237): Use token values for no color (transparent)?
+/**
+ * Contains the default values used by all 5 button types.
+ *
+ * Default values that apply to all buttons types are [MinWidth], [MinHeight], [IconSize], and
+ * [IconSpacing].
+ *
+ * A default value that applies only to [Button], [ElevatedButton], [FilledTonalButton], and
+ * [OutlinedButton] is [ContentPadding].
+ *
+ * Default values that apply only to [Button] are [buttonColors] and [buttonElevation].
+ * Default values that apply only to [ElevatedButton] are [elevatedButtonColors] and [elevatedButtonElevation].
+ * Default values that apply only to [FilledTonalButton] are [filledTonalButtonColors] and [filledTonalButtonElevation].
+ * A default value that applies only to [OutlinedButton] is [outlinedButtonColors].
+ * Default values that apply only to [TextButton] are [TextButtonContentPadding] and [textButtonColors].
+ */
+object ButtonDefaults {
+
+    // TODO(b/201344013): Make sure these values stay up to date until replaced with tokens.
+    private val ButtonHorizontalPadding = 24.dp
+
+    // TODO(b/202453316): There is no current vertical padding in the spec.
+    // Instead, the height is const 40dp, and the content is vertically center-aligned.
+    private val ButtonVerticalPadding = 8.dp
+
+    /**
+     * The default content padding used by [Button], [ElevatedButton], [FilledTonalButton], and
+     * [OutlinedButton] buttons.
+     *
+     * - See [TextButtonContentPadding] for content padding used by [TextButton].
+     */
+    // TODO(b/201343537): Use tokens.
+    val ContentPadding =
+        PaddingValues(
+            start = ButtonHorizontalPadding,
+            top = ButtonVerticalPadding,
+            end = ButtonHorizontalPadding,
+            bottom = ButtonVerticalPadding
+        )
+
+    // TODO(b/201344013): Make sure these values stay up to date until replaced with tokens.
+    private val TextButtonHorizontalPadding = 12.dp
+
+    /** The default content padding used by [TextButton] */
+    val TextButtonContentPadding =
+        PaddingValues(
+            start = TextButtonHorizontalPadding,
+            top = ContentPadding.calculateTopPadding(),
+            end = TextButtonHorizontalPadding,
+            bottom = ContentPadding.calculateBottomPadding()
+        )
+
+    /**
+     * The default min width applied for all buttons. Note that you can override it by applying
+     * Modifier.widthIn directly on the button composable.
+     */
+    // TODO(b/202453316): Make sure this value stays up to date until replaced with a token.
+    val MinWidth = 58.dp
+
+    /**
+     * The default min height applied for all buttons. Note that you can override it by applying
+     * Modifier.heightIn directly on the button composable.
+     */
+    // TODO(b/202453316): Make sure this value stays up to date until replaced with a token.
+    val MinHeight = 40.dp
+
+    /** The default size of the icon when used inside any button. */
+    // TODO(b/201344013): Make sure this value stays up to date until replaced with a token.
+    val IconSize = 18.dp
+
+    /**
+     * The default size of the spacing between an icon and a text when they used inside any button.
+     */
+    // TODO(b/201344013): Make sure this value stays up to date until replaced with a token.
+    val IconSpacing = 8.dp
+
+    /**
+     * Creates a [ButtonColors] that represents the default container and content colors used in a
+     * [Button].
+     *
+     * @param containerColor the container color of this [Button] when enabled.
+     * @param contentColor the content color of this [Button] when enabled.
+     * @param disabledContainerColor the container color of this [Button] when not enabled.
+     * @param disabledContentColor the content color of this [Button] when not enabled.
+     */
+    @Composable
+    fun buttonColors(
+        containerColor: Color = MaterialTheme.colorScheme.fromToken(FilledButton.ContainerColor),
+        contentColor: Color = MaterialTheme.colorScheme.fromToken(FilledButton.LabelTextColor),
+        disabledContainerColor: Color =
+            MaterialTheme.colorScheme
+                .fromToken(FilledButton.DisabledContainerColor)
+                .copy(alpha = FilledButton.DisabledContainerOpacity),
+        disabledContentColor: Color =
+            MaterialTheme.colorScheme
+                .fromToken(FilledButton.DisabledLabelTextColor)
+                .copy(alpha = FilledButton.DisabledLabelTextOpacity),
+    ): ButtonColors =
+        DefaultButtonColors(
+            containerColor = containerColor,
+            contentColor = contentColor,
+            disabledContainerColor = disabledContainerColor,
+            disabledContentColor = disabledContentColor
+        )
+
+    /**
+     * Creates a [ButtonColors] that represents the default container and content colors used in an
+     * [ElevatedButton].
+     *
+     * @param containerColor the container color of this [ElevatedButton] when enabled
+     * @param contentColor the content color of this [ElevatedButton] when enabled
+     * @param disabledContainerColor the container color of this [ElevatedButton] when not enabled
+     * @param disabledContentColor the content color of this [ElevatedButton] when not enabled
+     */
+    @Composable
+    fun elevatedButtonColors(
+        containerColor: Color = MaterialTheme.colorScheme.fromToken(ElevatedButton.ContainerColor),
+        contentColor: Color = MaterialTheme.colorScheme.fromToken(ElevatedButton.LabelTextColor),
+        disabledContainerColor: Color =
+            MaterialTheme.colorScheme
+                .fromToken(ElevatedButton.DisabledContainerColor)
+                .copy(alpha = ElevatedButton.DisabledContainerOpacity),
+        disabledContentColor: Color =
+            MaterialTheme.colorScheme
+                .fromToken(ElevatedButton.DisabledLabelTextColor)
+                .copy(alpha = ElevatedButton.DisabledLabelTextOpacity),
+    ): ButtonColors =
+        DefaultButtonColors(
+            containerColor = containerColor,
+            contentColor = contentColor,
+            disabledContainerColor = disabledContainerColor,
+            disabledContentColor = disabledContentColor
+        )
+
+    /**
+     * Creates a [ButtonColors] that represents the default container and content colors used in an
+     * [FilledTonalButton].
+     *
+     * @param containerColor the container color of this [FilledTonalButton] when enabled
+     * @param contentColor the content color of this [FilledTonalButton] when enabled
+     * @param disabledContainerColor the container color of this [FilledTonalButton] when not enabled
+     * @param disabledContentColor the content color of this [FilledTonalButton] when not enabled
+     */
+    @Composable
+    fun filledTonalButtonColors(
+        containerColor: Color =
+            MaterialTheme.colorScheme.fromToken(FilledButtonTonal.TonalContainerColor),
+        contentColor: Color =
+            MaterialTheme.colorScheme.fromToken(FilledButtonTonal.TonalLabelTextColor),
+        disabledContainerColor: Color =
+            MaterialTheme.colorScheme
+                .fromToken(FilledButtonTonal.TonalDisabledContainerColor)
+                .copy(alpha = FilledButtonTonal.TonalDisabledContainerOpacity),
+        disabledContentColor: Color =
+            MaterialTheme.colorScheme
+                .fromToken(FilledButtonTonal.TonalDisabledLabelTextColor)
+                .copy(alpha = FilledButtonTonal.TonalDisabledLabelTextOpacity),
+    ): ButtonColors =
+        DefaultButtonColors(
+            containerColor = containerColor,
+            contentColor = contentColor,
+            disabledContainerColor = disabledContainerColor,
+            disabledContentColor = disabledContentColor
+        )
+
+    /**
+     * Creates a [ButtonColors] that represents the default container and content colors used in an
+     * [OutlinedButton].
+     *
+     * @param containerColor the container color of this [OutlinedButton] when enabled
+     * @param contentColor the content color of this [OutlinedButton] when enabled
+     * @param disabledContainerColor the container color of this [OutlinedButton] when not enabled
+     * @param disabledContentColor the content color of this [OutlinedButton] when not enabled
+     */
+    @Composable
+    fun outlinedButtonColors(
+        containerColor: Color = Color.Transparent,
+        contentColor: Color = MaterialTheme.colorScheme.fromToken(OutlinedButton.LabelTextColor),
+        disabledContainerColor: Color = Color.Transparent,
+        disabledContentColor: Color =
+            MaterialTheme.colorScheme
+                .fromToken(OutlinedButton.DisabledLabelTextColor)
+                .copy(alpha = OutlinedButton.DisabledLabelTextOpacity),
+    ): ButtonColors =
+        DefaultButtonColors(
+            containerColor = containerColor,
+            contentColor = contentColor,
+            disabledContainerColor = disabledContainerColor,
+            disabledContentColor = disabledContentColor
+        )
+
+    /**
+     * Creates a [ButtonColors] that represents the default container and content colors used in a
+     * [TextButton].
+     *
+     * @param containerColor the container color of this [TextButton] when enabled
+     * @param contentColor the content color of this [TextButton] when enabled
+     * @param disabledContainerColor the container color of this [TextButton] when not enabled
+     * @param disabledContentColor the content color of this [TextButton] when not enabled
+     */
+    @Composable
+    fun textButtonColors(
+        containerColor: Color = Color.Transparent,
+        contentColor: Color = MaterialTheme.colorScheme.fromToken(TextButton.LabelTextColor),
+        disabledContainerColor: Color =
+            MaterialTheme.colorScheme
+                .fromToken(TextButton.DisabledContainerColor)
+                .copy(alpha = TextButton.DisabledContainerOpacity),
+        disabledContentColor: Color =
+            MaterialTheme.colorScheme
+                .fromToken(TextButton.DisabledLabelTextColor)
+                .copy(alpha = TextButton.DisabledLabelTextOpacity),
+    ): ButtonColors =
+        DefaultButtonColors(
+            containerColor = containerColor,
+            contentColor = contentColor,
+            disabledContainerColor = disabledContainerColor,
+            disabledContentColor = disabledContentColor
+        )
+
+    /**
+     * Creates a [ButtonElevation] that will animate between the provided values according to the
+     * Material specification for a [Button].
+     *
+     * @param defaultElevation the elevation used when the [Button] is enabled, and has no other
+     * [Interaction]s.
+     * @param pressedElevation the elevation used when this [Button] is enabled and pressed.
+     * @param focusedElevation the elevation used when the [Button] is enabled and focused.
+     * @param hoveredElevation the elevation used when the [Button] is enabled and hovered.
+     * @param disabledElevation the elevation used when the [Button] is not enabled.
+     */
+    @Composable
+    fun buttonElevation(
+        defaultElevation: Dp = FilledButton.ContainerElevation,
+        pressedElevation: Dp = FilledButton.PressedContainerElevation,
+        focusedElevation: Dp = FilledButton.FocusContainerElevation,
+        hoveredElevation: Dp = FilledButton.HoverContainerElevation,
+        disabledElevation: Dp = FilledButton.DisabledContainerElevation,
+    ): ButtonElevation {
+        return remember(
+            defaultElevation,
+            pressedElevation,
+            focusedElevation,
+            hoveredElevation,
+            disabledElevation
+        ) {
+            DefaultButtonElevation(
+                defaultElevation = defaultElevation,
+                pressedElevation = pressedElevation,
+                focusedElevation = focusedElevation,
+                hoveredElevation = hoveredElevation,
+                disabledElevation = disabledElevation,
+            )
+        }
+    }
+
+    /**
+     * Creates a [ButtonElevation] that will animate between the provided values according to the
+     * Material specification for a [ElevatedButton].
+     *
+     * @param defaultElevation the elevation used when the [ElevatedButton] is enabled, and has no
+     * other [Interaction]s.
+     * @param pressedElevation the elevation used when this [ElevatedButton] is enabled and pressed.
+     * @param focusedElevation the elevation used when the [ElevatedButton] is enabled and focused.
+     * @param hoveredElevation the elevation used when the [ElevatedButton] is enabled and hovered.
+     * @param disabledElevation the elevation used when the [ElevatedButton] is not enabled.
+     */
+    @Composable
+    fun elevatedButtonElevation(
+        defaultElevation: Dp = ElevatedButton.ContainerElevation,
+        pressedElevation: Dp = ElevatedButton.PressedContainerElevation,
+        focusedElevation: Dp = ElevatedButton.FocusContainerElevation,
+        hoveredElevation: Dp = ElevatedButton.HoverContainerElevation,
+        disabledElevation: Dp = ElevatedButton.DisabledContainerElevation
+    ): ButtonElevation {
+        return remember(
+            defaultElevation,
+            pressedElevation,
+            focusedElevation,
+            hoveredElevation,
+            disabledElevation
+        ) {
+            DefaultButtonElevation(
+                defaultElevation = defaultElevation,
+                pressedElevation = pressedElevation,
+                focusedElevation = focusedElevation,
+                hoveredElevation = hoveredElevation,
+                disabledElevation = disabledElevation
+            )
+        }
+    }
+
+    /**
+     * Creates a [ButtonElevation] that will animate between the provided values according to the
+     * Material specification for a [FilledTonalButton].
+     *
+     * @param defaultElevation the elevation used when the [FilledTonalButton] is enabled, and has no
+     * other [Interaction]s.
+     * @param pressedElevation the elevation used when this [FilledTonalButton] is enabled and
+     * pressed.
+     * @param focusedElevation the elevation used when the [FilledTonalButton] is enabled and focused.
+     * @param hoveredElevation the elevation used when the [FilledTonalButton] is enabled and hovered.
+     * @param disabledElevation the elevation used when the [FilledTonalButton] is not enabled.
+     */
+    @Composable
+    fun filledTonalButtonElevation(
+        defaultElevation: Dp = FilledButtonTonal.TonalContainerElevation,
+        pressedElevation: Dp = FilledButtonTonal.TonalPressedContainerElevation,
+        focusedElevation: Dp = FilledButtonTonal.TonalFocusContainerElevation,
+        hoveredElevation: Dp = FilledButtonTonal.TonalHoverContainerElevation,
+        disabledElevation: Dp = 0.dp
+    ): ButtonElevation {
+        return remember(
+            defaultElevation,
+            pressedElevation,
+            focusedElevation,
+            hoveredElevation,
+            disabledElevation
+        ) {
+            DefaultButtonElevation(
+                defaultElevation = defaultElevation,
+                pressedElevation = pressedElevation,
+                focusedElevation = focusedElevation,
+                hoveredElevation = hoveredElevation,
+                disabledElevation = disabledElevation
+            )
+        }
+    }
+
+    /** The default [BorderStroke] used by [OutlinedButton]. */
+    val outlinedButtonBorder: BorderStroke
+        @Composable
+        get() = BorderStroke(
+            width = OutlinedButton.OutlineWidth,
+            color = MaterialTheme.colorScheme.fromToken(OutlinedButton.OutlineColor)
+        )
+}
+
+/**
+ * Represents the elevation for a button in different states.
+ *
+ * - See [ButtonDefaults.buttonElevation] for the default elevation used in a [Button].
+ * - See [ButtonDefaults.elevatedButtonElevation] for the default elevation used in a
+ * [ElevatedButton].
+ */
+@Stable
+interface ButtonElevation {
+    /**
+     * Represents the tonal elevation used in a button, depending on [enabled] and
+     * [interactionSource]. This should typically be the same value as the [shadowElevation].
+     *
+     * Tonal elevation is used to apply a color shift to the surface to give the it higher emphasis.
+     * When surface's color is [ColorScheme.surface], a higher the elevation will result
+     * in a darker color in light theme and lighter color in dark theme.
+     *
+     * See [shadowElevation] which controls the elevation of the shadow drawn around the FAB.
+     *
+     * @param enabled whether the button is enabled
+     * @param interactionSource the [InteractionSource] for this button
+     */
+    // TODO(b/202954622): Align docs with [FloatingActionButtonElevation].
+    @Composable
+    fun tonalElevation(enabled: Boolean, interactionSource: InteractionSource): State<Dp>
+
+    /**
+     * Represents the shadow elevation used in a button, depending on [enabled] and
+     * [interactionSource]. This should typically be the same value as the [tonalElevation].
+     *
+     * Shadow elevation is used to apply a shadow around the surface to give it higher emphasis.
+     *
+     * See [tonalElevation] which controls the elevation with a color shift to the surface.
+     *
+     * @param enabled whether the button is enabled
+     * @param interactionSource the [InteractionSource] for this button
+     */
+    // TODO(b/202954622): Align docs with [FloatingActionButtonElevation].
+    @Composable
+    fun shadowElevation(enabled: Boolean, interactionSource: InteractionSource): State<Dp>
+}
+
+/**
+ * Represents the container and content colors used in a button in different states.
+ *
+ * - See [ButtonDefaults.buttonColors] for the default colors used in a [Button].
+ * - See [ButtonDefaults.elevatedButtonColors] for the default colors used in a [ElevatedButton].
+ * - See [ButtonDefaults.textButtonColors] for the default colors used in a [TextButton].
+ */
+@Stable
+interface ButtonColors {
+    /**
+     * Represents the container color for this button, depending on [enabled].
+     *
+     * @param enabled whether the button is enabled
+     */
+    @Composable
+    fun containerColor(enabled: Boolean): State<Color>
+
+    /**
+     * Represents the content color for this button, depending on [enabled].
+     *
+     * @param enabled whether the button is enabled
+     */
+    @Composable
+    fun contentColor(enabled: Boolean): State<Color>
+}
+
+/** Default [ButtonElevation] implementation. */
+@Stable
+private class DefaultButtonElevation(
+    private val defaultElevation: Dp,
+    private val pressedElevation: Dp,
+    private val focusedElevation: Dp,
+    private val hoveredElevation: Dp,
+    private val disabledElevation: Dp,
+) : ButtonElevation {
+    @Composable
+    override fun tonalElevation(enabled: Boolean, interactionSource: InteractionSource): State<Dp> {
+        return animateElevation(enabled = enabled, interactionSource = interactionSource)
+    }
+
+    @Composable
+    override fun shadowElevation(
+        enabled: Boolean,
+        interactionSource: InteractionSource
+    ): State<Dp> {
+        return animateElevation(enabled = enabled, interactionSource = interactionSource)
+    }
+
+    @Composable
+    private fun animateElevation(
+        enabled: Boolean,
+        interactionSource: InteractionSource
+    ): State<Dp> {
+        val interactions = remember { mutableStateListOf<Interaction>() }
+        LaunchedEffect(interactionSource) {
+            interactionSource.interactions.collect { interaction ->
+                when (interaction) {
+                    is HoverInteraction.Enter -> {
+                        interactions.add(interaction)
+                    }
+                    is HoverInteraction.Exit -> {
+                        interactions.remove(interaction.enter)
+                    }
+                    is FocusInteraction.Focus -> {
+                        interactions.add(interaction)
+                    }
+                    is FocusInteraction.Unfocus -> {
+                        interactions.remove(interaction.focus)
+                    }
+                    is PressInteraction.Press -> {
+                        interactions.add(interaction)
+                    }
+                    is PressInteraction.Release -> {
+                        interactions.remove(interaction.press)
+                    }
+                    is PressInteraction.Cancel -> {
+                        interactions.remove(interaction.press)
+                    }
+                }
+            }
+        }
+
+        val interaction = interactions.lastOrNull()
+
+        val target =
+            if (!enabled) {
+                disabledElevation
+            } else {
+                when (interaction) {
+                    is PressInteraction.Press -> pressedElevation
+                    is HoverInteraction.Enter -> hoveredElevation
+                    is FocusInteraction.Focus -> focusedElevation
+                    else -> defaultElevation
+                }
+            }
+
+        val animatable = remember { Animatable(target, Dp.VectorConverter) }
+
+        if (!enabled) {
+            // No transition when moving to a disabled state
+            LaunchedEffect(target) { animatable.snapTo(target) }
+        } else {
+            LaunchedEffect(target) {
+                val lastInteraction = when (animatable.targetValue) {
+                    pressedElevation -> PressInteraction.Press(Offset.Zero)
+                    hoveredElevation -> HoverInteraction.Enter()
+                    focusedElevation -> FocusInteraction.Focus()
+                    else -> null
+                }
+                animatable.animateElevation(
+                    from = lastInteraction,
+                    to = interaction,
+                    target = target
+                )
+            }
+        }
+
+        return animatable.asState()
+    }
+}
+
+/** Default [ButtonColors] implementation. */
+@Immutable
+private class DefaultButtonColors(
+    private val containerColor: Color,
+    private val contentColor: Color,
+    private val disabledContainerColor: Color,
+    private val disabledContentColor: Color,
+) : ButtonColors {
+    @Composable
+    override fun containerColor(enabled: Boolean): State<Color> {
+        return rememberUpdatedState(if (enabled) containerColor else disabledContainerColor)
+    }
+
+    @Composable
+    override fun contentColor(enabled: Boolean): State<Color> {
+        return rememberUpdatedState(if (enabled) contentColor else disabledContentColor)
+    }
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other == null || this::class != other::class) return false
+
+        other as DefaultButtonColors
+
+        if (containerColor != other.containerColor) return false
+        if (contentColor != other.contentColor) return false
+        if (disabledContainerColor != other.disabledContainerColor) return false
+        if (disabledContentColor != other.disabledContentColor) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = containerColor.hashCode()
+        result = 31 * result + contentColor.hashCode()
+        result = 31 * result + disabledContainerColor.hashCode()
+        result = 31 * result + disabledContentColor.hashCode()
+        return result
+    }
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Elevation.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Elevation.kt
new file mode 100644
index 0000000..b104e20
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Elevation.kt
@@ -0,0 +1,121 @@
+/*
+ * 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.animation.core.Animatable
+import androidx.compose.animation.core.AnimationSpec
+import androidx.compose.animation.core.CubicBezierEasing
+import androidx.compose.animation.core.Easing
+import androidx.compose.animation.core.FastOutSlowInEasing
+import androidx.compose.animation.core.TweenSpec
+import androidx.compose.foundation.interaction.DragInteraction
+import androidx.compose.foundation.interaction.FocusInteraction
+import androidx.compose.foundation.interaction.HoverInteraction
+import androidx.compose.foundation.interaction.Interaction
+import androidx.compose.foundation.interaction.PressInteraction
+import androidx.compose.ui.unit.Dp
+
+/**
+ * Animates the [Dp] value of [this] between [from] and [to] [Interaction]s, to [target]. The
+ * [AnimationSpec] used depends on the values for [from] and [to], see
+ * [ElevationDefaults.incomingAnimationSpecForInteraction] and
+ * [ElevationDefaults.outgoingAnimationSpecForInteraction] for more details.
+ *
+ * @param target the [Dp] target elevation for this component, corresponding to the elevation
+ * desired for the [to] state.
+ * @param from the previous [Interaction] that was used to calculate elevation. `null` if there
+ * was no previous [Interaction], such as when the component is in its default state.
+ * @param to the [Interaction] that this component is moving to, such as [PressInteraction.Press]
+ * when this component is being pressed. `null` if this component is moving back to its default
+ * state.
+ */
+internal suspend fun Animatable<Dp, *>.animateElevation(
+    target: Dp,
+    from: Interaction? = null,
+    to: Interaction? = null
+) {
+    val spec = when {
+        // Moving to a new state
+        to != null -> ElevationDefaults.incomingAnimationSpecForInteraction(to)
+        // Moving to default, from a previous state
+        from != null -> ElevationDefaults.outgoingAnimationSpecForInteraction(from)
+        // Loading the initial state, or moving back to the baseline state from a disabled /
+        // unknown state, so just snap to the final value.
+        else -> null
+    }
+    if (spec != null) animateTo(target, spec) else snapTo(target)
+}
+
+/**
+ * Contains default [AnimationSpec]s used for animating elevation between different [Interaction]s.
+ *
+ * Typically you should use [animateElevation] instead, which uses these [AnimationSpec]s
+ * internally. [animateElevation] in turn is used by the defaults for cards and buttons.
+ *
+ * @see animateElevation
+ */
+private object ElevationDefaults {
+    /**
+     * Returns the [AnimationSpec]s used when animating elevation to [interaction], either from a
+     * previous [Interaction], or from the default state. If [interaction] is unknown, then
+     * returns `null`.
+     *
+     * @param interaction the [Interaction] that is being animated to
+     */
+    fun incomingAnimationSpecForInteraction(interaction: Interaction): AnimationSpec<Dp>? {
+        return when (interaction) {
+            is PressInteraction.Press -> DefaultIncomingSpec
+            is DragInteraction.Start -> DefaultIncomingSpec
+            is HoverInteraction.Enter -> DefaultIncomingSpec
+            is FocusInteraction.Focus -> DefaultIncomingSpec
+            else -> null
+        }
+    }
+
+    /**
+     * Returns the [AnimationSpec]s used when animating elevation away from [interaction], to the
+     * default state. If [interaction] is unknown, then returns `null`.
+     *
+     * @param interaction the [Interaction] that is being animated away from
+     */
+    fun outgoingAnimationSpecForInteraction(interaction: Interaction): AnimationSpec<Dp>? {
+        return when (interaction) {
+            is PressInteraction.Press -> DefaultOutgoingSpec
+            is DragInteraction.Start -> DefaultOutgoingSpec
+            is HoverInteraction.Enter -> HoveredOutgoingSpec
+            is FocusInteraction.Focus -> DefaultOutgoingSpec
+            else -> null
+        }
+    }
+}
+
+private val OutgoingSpecEasing: Easing = CubicBezierEasing(0.40f, 0.00f, 0.60f, 1.00f)
+
+private val DefaultIncomingSpec = TweenSpec<Dp>(
+    durationMillis = 120,
+    easing = FastOutSlowInEasing
+)
+
+private val DefaultOutgoingSpec = TweenSpec<Dp>(
+    durationMillis = 150,
+    easing = OutgoingSpecEasing
+)
+
+private val HoveredOutgoingSpec = TweenSpec<Dp>(
+    durationMillis = 120,
+    easing = OutgoingSpecEasing
+)
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/FloatingActionButton.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/FloatingActionButton.kt
new file mode 100644
index 0000000..1b62597
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/FloatingActionButton.kt
@@ -0,0 +1,425 @@
+/*
+ * 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.animation.core.CubicBezierEasing
+import androidx.compose.animation.core.FastOutSlowInEasing
+import androidx.compose.animation.core.TweenSpec
+import androidx.compose.animation.core.animateDpAsState
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.interaction.Interaction
+import androidx.compose.foundation.interaction.InteractionSource
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.interaction.collectIsHoveredAsState
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.defaultMinSize
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.sizeIn
+import androidx.compose.foundation.layout.width
+import androidx.compose.material.ripple.rememberRipple
+import androidx.compose.material3.tokens.ExtendedFabPrimary
+import androidx.compose.material3.tokens.FabPrimary
+import androidx.compose.material3.tokens.FabPrimaryLarge
+import androidx.compose.material3.tokens.FabPrimarySmall
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.Stable
+import androidx.compose.runtime.State
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.semantics.Role
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.draw.shadow
+
+/**
+ * ![FAB image](https://developer.android.com/images/reference/androidx/compose/material3/fab.png)
+ *
+ * A floating action button (FAB) represents the primary action of a screen.
+ *
+ * @sample androidx.compose.material3.samples.FloatingActionButtonSample
+ *
+ * @param onClick callback invoked when this FAB is clicked
+ * @param modifier [Modifier] to be applied to this FAB.
+ * @param interactionSource the [MutableInteractionSource] representing the stream of
+ * [Interaction]s for this FAB. You can create and pass in your own remembered
+ * [MutableInteractionSource] if you want to observe [Interaction]s and customize the
+ * appearance / behavior of this FAB in different [Interaction]s.
+ * @param shape The [Shape] of this FAB
+ * @param containerColor The container color. Use [Color.Transparent] to have no color
+ * @param contentColor The preferred content color for content inside this FAB
+ * @param elevation [FloatingActionButtonElevation] used to resolve the elevation for this FAB
+ * in different states. This controls the size of the shadow below the FAB. When [containerColor]
+ * is [ColorScheme.surface], a higher elevation (surface blended with more primary) will result in
+ * a darker surface color in light theme and lighter color in dark theme.
+ * @param content the content of this FAB - this is typically an [Icon].
+ */
+@Composable
+fun FloatingActionButton(
+    onClick: () -> Unit,
+    modifier: Modifier = Modifier,
+    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
+    shape: Shape = FabPrimary.PrimaryContainerShape,
+    containerColor: Color = MaterialTheme.colorScheme.fromToken(FabPrimary.PrimaryContainerColor),
+    contentColor: Color = contentColorFor(containerColor),
+    elevation: FloatingActionButtonElevation = FloatingActionButtonDefaults.elevation(),
+    content: @Composable () -> Unit,
+) {
+    val shadowElevation = elevation.shadowElevation(interactionSource = interactionSource).value
+    val tonalElevation = elevation.tonalElevation(interactionSource = interactionSource).value
+    val clickAndSemanticsModifier = Modifier.clickable(
+        interactionSource = interactionSource,
+        indication = rememberRipple(),
+        enabled = true,
+        onClickLabel = null,
+        role = Role.Button,
+        onClick = onClick
+    )
+    Surface(
+        modifier = modifier
+            .minimumTouchTargetSize()
+            .shadow(
+                elevation = shadowElevation,
+                shape = shape,
+            ),
+        shape = shape,
+        color = containerColor,
+        contentColor = contentColor,
+        tonalElevation = tonalElevation,
+    ) {
+        CompositionLocalProvider(LocalContentColor provides contentColor) {
+            ProvideTextStyle(MaterialTheme.typography.labelLarge) {
+                Box(
+                    modifier = Modifier
+                        .defaultMinSize(
+                            minWidth = FabPrimary.PrimaryContainerWidth,
+                            minHeight = FabPrimary.PrimaryContainerHeight,
+                        )
+                        .then(clickAndSemanticsModifier),
+                    contentAlignment = Alignment.Center
+                ) { content() }
+            }
+        }
+    }
+}
+
+/**
+ * ![Small FAB image](https://developer.android.com/images/reference/androidx/compose/material3/small-fab.png)
+ *
+ * A small floating action button.
+ *
+ * @sample androidx.compose.material3.samples.SmallFloatingActionButtonSample
+ *
+ * @param onClick callback invoked when this FAB is clicked
+ * @param modifier [Modifier] to be applied to this FAB.
+ * @param interactionSource the [MutableInteractionSource] representing the stream of
+ * [Interaction]s for this FAB. You can create and pass in your own remembered
+ * [MutableInteractionSource] if you want to observe [Interaction]s and customize the
+ * appearance / behavior of this FAB in different [Interaction]s.
+ * @param shape The [Shape] of this FAB
+ * @param containerColor The container color. Use [Color.Transparent] to have no color
+ * @param contentColor The preferred content color for content inside this FAB
+ * @param elevation [FloatingActionButtonElevation] used to resolve the elevation for this FAB
+ * in different states. This controls the size of the shadow below the FAB. When [containerColor]
+ * is [ColorScheme.surface], a higher elevation (surface blended with more primary) will result in
+ * a darker surface color in light theme and lighter color in dark theme.
+ * @param content the content of this FAB - this is typically an [Icon].
+ */
+@Composable
+fun SmallFloatingActionButton(
+    onClick: () -> Unit,
+    modifier: Modifier = Modifier,
+    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
+    shape: Shape = FabPrimarySmall.PrimarySmallContainerShape,
+    containerColor: Color = MaterialTheme.colorScheme.fromToken(FabPrimary.PrimaryContainerColor),
+    contentColor: Color = contentColorFor(containerColor),
+    elevation: FloatingActionButtonElevation = FloatingActionButtonDefaults.elevation(),
+    content: @Composable () -> Unit,
+) {
+    FloatingActionButton(
+        onClick = onClick,
+        modifier = modifier.sizeIn(
+            minWidth = FabPrimarySmall.PrimarySmallContainerWidth,
+            minHeight = FabPrimarySmall.PrimarySmallContainerHeight,
+        ),
+        interactionSource = interactionSource,
+        shape = shape,
+        containerColor = containerColor,
+        contentColor = contentColor,
+        elevation = elevation,
+        content = content,
+    )
+}
+
+/**
+ * ![Large FAB image](https://developer.android.com/images/reference/androidx/compose/material3/large-fab.png)
+ *
+ *  A large circular floating action button.
+ *
+ * @sample androidx.compose.material3.samples.LargeFloatingActionButtonSample
+ *
+ * @param onClick callback invoked when this FAB is clicked
+ * @param modifier [Modifier] to be applied to this FAB.
+ * @param interactionSource the [MutableInteractionSource] representing the stream of
+ * [Interaction]s for this FAB. You can create and pass in your own remembered
+ * [MutableInteractionSource] if you want to observe [Interaction]s and customize the
+ * appearance / behavior of this FAB in different [Interaction]s.
+ * @param shape The [Shape] of this FAB
+ * @param containerColor The container color. Use [Color.Transparent] to have no color
+ * @param contentColor The preferred content color for content inside this FAB
+ * @param elevation [FloatingActionButtonElevation] used to resolve the elevation for this FAB
+ * in different states. This controls the size of the shadow below the FAB. When [containerColor]
+ * is [ColorScheme.surface], a higher elevation (surface blended with more primary) will result in
+ * a darker surface color in light theme and lighter color in dark theme.
+ * @param content the content of this FAB - this is typically an [Icon].
+ */
+@Composable
+fun LargeFloatingActionButton(
+    onClick: () -> Unit,
+    modifier: Modifier = Modifier,
+    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
+    shape: Shape = FabPrimaryLarge.PrimaryLargeContainerShape,
+    containerColor: Color = MaterialTheme.colorScheme.fromToken(
+        FabPrimaryLarge.PrimaryLargeContainerColor
+    ),
+    contentColor: Color = contentColorFor(containerColor),
+    elevation: FloatingActionButtonElevation = FloatingActionButtonDefaults.elevation(),
+    content: @Composable () -> Unit,
+) {
+    FloatingActionButton(
+        onClick = onClick,
+        modifier = modifier.sizeIn(
+            minWidth = FabPrimaryLarge.PrimaryLargeContainerWidth,
+            minHeight = FabPrimaryLarge.PrimaryLargeContainerHeight,
+        ),
+        interactionSource = interactionSource,
+        shape = shape,
+        containerColor = containerColor,
+        contentColor = contentColor,
+        elevation = elevation,
+        content = content,
+    )
+}
+
+/**
+ * ![Extended FAB image](https://developer.android.com/images/reference/androidx/compose/material3/extended-fab.png)
+ *
+ * The extended FAB is wider than a regular FAB, and it includes a text label.
+ *
+ * @sample androidx.compose.material3.samples.ExtendedFloatingActionButtonSample
+ *
+ * @param text Text label displayed inside this FAB
+ * @param onClick callback invoked when this FAB is clicked
+ * @param modifier [Modifier] to be applied to this FAB
+ * @param icon Optional icon for this FAB, typically this will be a
+ * [Icon].
+ * @param interactionSource the [MutableInteractionSource] representing the stream of
+ * [Interaction]s for this FAB. You can create and pass in your own remembered
+ * [MutableInteractionSource] if you want to observe [Interaction]s and customize the
+ * appearance / behavior of this FAB in different [Interaction]s.
+ * @param shape The [Shape] of this FAB
+ * @param containerColor The container color. Use [Color.Transparent] to have no color
+ * @param contentColor The preferred content color for content inside this FAB
+ * @param elevation [FloatingActionButtonElevation] used to resolve the elevation for this FAB
+ * in different states. This controls the size of the shadow below the FAB. When [containerColor]
+ * is [ColorScheme.surface], a higher elevation (surface blended with more primary) will result in
+ * a darker surface color in light theme and lighter color in dark theme.
+ */
+@Composable
+fun ExtendedFloatingActionButton(
+    text: @Composable () -> Unit,
+    onClick: () -> Unit,
+    modifier: Modifier = Modifier,
+    icon: @Composable (() -> Unit)? = null,
+    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
+    shape: Shape = ExtendedFabPrimary.PrimaryContainerShape,
+    containerColor: Color = MaterialTheme.colorScheme.fromToken(
+        ExtendedFabPrimary.PrimaryContainerColor
+    ),
+    contentColor: Color = contentColorFor(containerColor),
+    elevation: FloatingActionButtonElevation = FloatingActionButtonDefaults.elevation(),
+) {
+    FloatingActionButton(
+        modifier = modifier.sizeIn(
+            minWidth = 80.dp,
+            minHeight = ExtendedFabPrimary.PrimaryContainerHeight,
+        ),
+        onClick = onClick,
+        interactionSource = interactionSource,
+        shape = shape,
+        containerColor = containerColor,
+        contentColor = contentColor,
+        elevation = elevation,
+    ) {
+        val startPadding = if (icon == null) {
+            ExtendedFabTextPadding
+        } else {
+            ExtendedFabPrimary.PrimaryIconSize / 2
+        }
+        Row(
+            modifier = Modifier.padding(
+                start = startPadding,
+                end = ExtendedFabTextPadding
+            ),
+            verticalAlignment = Alignment.CenterVertically
+        ) {
+            if (icon != null) {
+                icon()
+                Spacer(Modifier.width(ExtendedFabIconPadding))
+            }
+            ProvideTextStyle(
+                value = MaterialTheme.typography.fromToken(ExtendedFabPrimary.PrimaryLabelTextFont),
+                content = text,
+            )
+        }
+    }
+}
+
+/**
+ * Represents the tonal and shadow elevation for a floating action button in different states.
+ *
+ * See [FloatingActionButtonDefaults.elevation] for the default elevation used in a
+ * [FloatingActionButton] and [ExtendedFloatingActionButton].
+ */
+@Stable
+interface FloatingActionButtonElevation {
+    /**
+     * Represents the tonal elevation used in a floating action button, depending on
+     * [interactionSource]. This should typically be the same value as the [shadowElevation].
+     *
+     * Tonal elevation is used to apply a color shift to the surface to give the it higher emphasis.
+     * When surface's color is [ColorScheme.surface], a higher the elevation will result
+     * in a darker color in light theme and lighter color in dark theme.
+     *
+     * See [shadowElevation] which controls the elevation of the shadow drawn around the FAB.
+     *
+     * @param interactionSource the [InteractionSource] for this floating action button
+     */
+    @Composable
+    fun tonalElevation(interactionSource: InteractionSource): State<Dp>
+
+    /**
+     * Represents the shadow elevation used in a floating action button, depending on
+     * [interactionSource]. This should typically be the same value as the [tonalElevation].
+     *
+     * Shadow elevation is used to apply a shadow around the surface to give it higher emphasis.
+     *
+     * See [tonalElevation] which controls the elevation with a color shift to the surface.
+     *
+     * @param interactionSource the [InteractionSource] for this floating action button
+     */
+    @Composable
+    fun shadowElevation(interactionSource: InteractionSource): State<Dp>
+}
+
+/**
+ * Contains the default values used by [FloatingActionButton]
+ */
+object FloatingActionButtonDefaults {
+    /**
+     * The recommended size of the icon inside a [LargeFloatingActionButton].
+     */
+    val LargeIconSize = FabPrimaryLarge.PrimaryLargeIconSize
+
+    /**
+     * Creates a [FloatingActionButtonElevation] that represents the elevation of a
+     * [FloatingActionButton] in different states. For use cases in which a less prominent
+     * [FloatingActionButton] is possible consider the [loweredElevation].
+     *
+     * @param defaultElevation the elevation used when the [FloatingActionButton] is not hovered
+     * @param hoveredElevation the elevation used when the [FloatingActionButton] is hovered
+     */
+    @Composable
+    fun elevation(
+        defaultElevation: Dp = FabPrimary.PrimaryContainerElevation,
+        hoveredElevation: Dp = FabPrimary.PrimaryHoverContainerElevation,
+    ): FloatingActionButtonElevation {
+        return remember(defaultElevation, hoveredElevation) {
+            DefaultFloatingActionButtonElevation(
+                defaultElevation = defaultElevation,
+                hoveredElevation = hoveredElevation,
+            )
+        }
+    }
+
+    /**
+     * Use this to create a [FloatingActionButton] with a lowered elevation for less emphasis. Use
+     * [elevation] to get a normal [FloatingActionButton].
+     *
+     * @param defaultElevation the elevation used when the [FloatingActionButton] is not hovered
+     * @param hoveredElevation the elevation used when the [FloatingActionButton] is hovered
+     */
+    @Composable
+    fun loweredElevation(
+        defaultElevation: Dp = FabPrimary.PrimaryLoweredContainerElevation,
+        hoveredElevation: Dp = FabPrimary.PrimaryLoweredHoverContainerElevation,
+    ): FloatingActionButtonElevation {
+        return remember(defaultElevation, hoveredElevation) {
+            DefaultFloatingActionButtonElevation(
+                defaultElevation = defaultElevation,
+                hoveredElevation = hoveredElevation,
+            )
+        }
+    }
+}
+
+/**
+ * Default [FloatingActionButtonElevation] implementation.
+ */
+@Stable
+private class DefaultFloatingActionButtonElevation(
+    private val defaultElevation: Dp,
+    private val hoveredElevation: Dp,
+) : FloatingActionButtonElevation {
+    @Composable
+    override fun shadowElevation(interactionSource: InteractionSource): State<Dp> {
+        return animateElevation(interactionSource = interactionSource)
+    }
+
+    @Composable
+    override fun tonalElevation(interactionSource: InteractionSource): State<Dp> {
+        return animateElevation(interactionSource = interactionSource)
+    }
+
+    @Composable
+    private fun animateElevation(interactionSource: InteractionSource): State<Dp> {
+        val isHovered by interactionSource.collectIsHoveredAsState()
+        val targetElevation = if (isHovered) hoveredElevation else defaultElevation
+        val animationSpec = if (isHovered) IncomingSpec else OutgoingSpec
+        return animateDpAsState(targetElevation, animationSpec)
+    }
+}
+
+private val IncomingSpec = TweenSpec<Dp>(
+    durationMillis = 120,
+    easing = FastOutSlowInEasing
+)
+
+private val OutgoingSpec = TweenSpec<Dp>(
+    durationMillis = 120,
+    easing = CubicBezierEasing(0.40f, 0.00f, 0.60f, 1.00f)
+)
+
+private val ExtendedFabIconPadding = 12.dp
+
+private val ExtendedFabTextPadding = 20.dp
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt
new file mode 100644
index 0000000..d27bb15
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt
@@ -0,0 +1,496 @@
+/*
+ * 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.animation.animateColorAsState
+import androidx.compose.animation.core.animateFloatAsState
+import androidx.compose.animation.core.tween
+import androidx.compose.foundation.background
+import androidx.compose.foundation.interaction.Interaction
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.RowScope
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.selection.selectable
+import androidx.compose.foundation.selection.selectableGroup
+import androidx.compose.material.ripple.rememberRipple
+import androidx.compose.material3.tokens.NavigationBar
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.Stable
+import androidx.compose.runtime.State
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.alpha
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.layout.LastBaseline
+import androidx.compose.ui.layout.Layout
+import androidx.compose.ui.layout.MeasureResult
+import androidx.compose.ui.layout.MeasureScope
+import androidx.compose.ui.layout.Placeable
+import androidx.compose.ui.layout.layoutId
+import androidx.compose.ui.semantics.Role
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+import kotlin.math.roundToInt
+
+/**
+ * ![Navigation bar image](https://developer.android.com/images/reference/androidx/compose/material3/navigation-bar.png)
+ *
+ * Material Design bottom navigation bar.
+ *
+ * A bottom navigation bar allows switching between primary destinations in an app.
+ *
+ * [NavigationBar] should contain three to five [NavigationBarItem]s, each representing a singular
+ * destination.
+ *
+ * A simple example looks like:
+ * @sample androidx.compose.material3.samples.NavigationBarSample
+ *
+ * See [NavigationBarItem] for configuration specific to each item, and not the overall
+ * [NavigationBar] component.
+ *
+ * @param modifier optional [Modifier] for this NavigationBar
+ * @param containerColor the container color for this NavigationBar
+ * @param contentColor the preferred content color provided by this NavigationBar to its children.
+ * Defaults to either the matching content color for [containerColor], or if [containerColor] is not
+ * a color from the theme, this will keep the same value set above this NavigationBar.
+ * @param tonalElevation When [containerColor] is [ColorScheme.surface], a higher tonal elevation
+ * value will result in a darker color in light theme and lighter color in dark theme. See also:
+ * [Surface].
+ * @param content destinations inside this NavigationBar. This should contain multiple
+ * [NavigationBarItem]s
+ */
+@Composable
+fun NavigationBar(
+    modifier: Modifier = Modifier,
+    containerColor: Color = MaterialTheme.colorScheme.fromToken(NavigationBar.ContainerColor),
+    contentColor: Color = MaterialTheme.colorScheme.contentColorFor(containerColor),
+    tonalElevation: Dp = NavigationBar.ContainerElevation,
+    content: @Composable RowScope.() -> Unit
+) {
+    Surface(
+        color = containerColor,
+        contentColor = contentColor,
+        tonalElevation = tonalElevation,
+        modifier = modifier
+    ) {
+        Row(
+            modifier = Modifier.fillMaxWidth().height(NavigationBarHeight).selectableGroup(),
+            horizontalArrangement = Arrangement.SpaceBetween,
+            content = content
+        )
+    }
+}
+
+/**
+ * Material Design navigation bar item.
+ *
+ * The recommended configuration for a [NavigationBarItem] depends on how many items there are
+ * inside a [NavigationBar]:
+ *
+ * - Three destinations: Display icons and text labels for all destinations.
+ * - Four destinations: Active destinations display an icon and text label. Inactive destinations
+ * display icons, and text labels are recommended.
+ * - Five destinations: Active destinations display an icon and text label. Inactive destinations
+ * use icons, and use text labels if space permits.
+ *
+ * A [NavigationBarItem] always shows text labels (if it exists) when selected. Showing text
+ * labels if not selected is controlled by [alwaysShowLabel].
+ *
+ * @param selected whether this item is selected
+ * @param onClick the callback to be invoked when this item is selected
+ * @param icon icon for this item, typically this will be an [Icon]
+ * @param modifier optional [Modifier] for this item
+ * @param enabled controls the enabled state of this item. When `false`, this item will not be
+ * clickable and will appear disabled to accessibility services.
+ * @param label optional text label for this item
+ * @param alwaysShowLabel whether to always show the label for this item. If false, the label will
+ * only be shown when this item is selected.
+ * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
+ * for this NavigationBarItem. You can create and pass in your own remembered
+ * [MutableInteractionSource] if you want to observe [Interaction]s and customize the appearance /
+ * behavior of this NavigationBarItem in different [Interaction]s.
+ * @param colors the various colors used in elements of this item
+ */
+@Composable
+fun RowScope.NavigationBarItem(
+    selected: Boolean,
+    onClick: () -> Unit,
+    icon: @Composable () -> Unit,
+    modifier: Modifier = Modifier,
+    enabled: Boolean = true,
+    label: @Composable (() -> Unit)? = null,
+    alwaysShowLabel: Boolean = true,
+    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
+    colors: NavigationBarItemColors = NavigationBarItemDefaults.colors()
+) {
+    val styledIcon = @Composable {
+        val iconColor by colors.iconColor(selected = selected)
+        CompositionLocalProvider(LocalContentColor provides iconColor, content = icon)
+    }
+
+    val styledLabel: @Composable (() -> Unit)? = label?.let {
+        @Composable {
+            val style = MaterialTheme.typography.fromToken(NavigationBar.LabelTextFont)
+            val textColor by colors.textColor(selected = selected)
+            CompositionLocalProvider(LocalContentColor provides textColor) {
+                ProvideTextStyle(style, content = label)
+            }
+        }
+    }
+
+    Box(
+        modifier
+            .selectable(
+                selected = selected,
+                onClick = onClick,
+                enabled = enabled,
+                role = Role.Tab,
+                interactionSource = interactionSource,
+                indication = rememberRipple(),
+            )
+            .weight(1f),
+        contentAlignment = Alignment.Center
+    ) {
+        val animationProgress: Float by animateFloatAsState(
+            targetValue = if (selected) 1f else 0f,
+            animationSpec = tween(ItemAnimationDurationMillis)
+        )
+
+        val indicator = @Composable {
+            Box(
+                Modifier.layoutId(IndicatorLayoutIdTag)
+                    .background(
+                        color = colors.indicatorColor.copy(alpha = animationProgress),
+                        shape = IndicatorShape
+                    )
+            )
+        }
+
+        NavigationBarItemBaselineLayout(
+            indicator = indicator,
+            icon = styledIcon,
+            label = styledLabel,
+            alwaysShowLabel = alwaysShowLabel,
+            animationProgress = animationProgress
+        )
+    }
+}
+
+/** Defaults used in [NavigationBarItem]. */
+object NavigationBarItemDefaults {
+    /**
+     * Creates a [NavigationBarItemColors] with the provided colors according to the Material
+     * specification.
+     *
+     * @param selectedIconColor the color to use for the icon when the item is selected.
+     * @param unselectedIconColor the color to use for the icon when the item is unselected.
+     * @param selectedTextColor the color to use for the text label when the item is selected.
+     * @param unselectedTextColor the color to use for the text label when the item is unselected.
+     * @param indicatorColor the color to use for the indicator when the item is selected.
+     * @return the resulting [NavigationBarItemColors] used for [NavigationBarItem]
+     */
+    @Composable
+    fun colors(
+        selectedIconColor: Color =
+            MaterialTheme.colorScheme.fromToken(NavigationBar.ActiveIconColor),
+        unselectedIconColor: Color =
+            MaterialTheme.colorScheme.fromToken(NavigationBar.InactiveIconColor),
+        selectedTextColor: Color =
+            MaterialTheme.colorScheme.fromToken(NavigationBar.ActiveLabelTextColor),
+        unselectedTextColor: Color =
+            MaterialTheme.colorScheme.fromToken(NavigationBar.InactiveLabelTextColor),
+        indicatorColor: Color =
+            MaterialTheme.colorScheme.fromToken(NavigationBar.ActiveIndicatorColor),
+    ): NavigationBarItemColors = remember(
+        selectedIconColor,
+        unselectedIconColor,
+        selectedTextColor,
+        unselectedTextColor,
+        indicatorColor
+    ) {
+        DefaultNavigationBarItemColors(
+            selectedIconColor = selectedIconColor,
+            unselectedIconColor = unselectedIconColor,
+            selectedTextColor = selectedTextColor,
+            unselectedTextColor = unselectedTextColor,
+            selectedIndicatorColor = indicatorColor,
+        )
+    }
+}
+
+/** Represents the colors of the various elements of a navigation item. */
+@Stable
+interface NavigationBarItemColors {
+    /**
+     * Represents the icon color for this item, depending on whether it is [selected].
+     *
+     * @param selected whether the item is selected
+     */
+    @Composable
+    fun iconColor(selected: Boolean): State<Color>
+
+    /**
+     * Represents the text color for this item, depending on whether it is [selected].
+     *
+     * @param selected whether the item is selected
+     */
+    @Composable
+    fun textColor(selected: Boolean): State<Color>
+
+    /** Represents the color of the indicator used for selected items. */
+    val indicatorColor: Color
+        @Composable get
+}
+
+@Stable
+private class DefaultNavigationBarItemColors(
+    private val selectedIconColor: Color,
+    private val unselectedIconColor: Color,
+    private val selectedTextColor: Color,
+    private val unselectedTextColor: Color,
+    private val selectedIndicatorColor: Color,
+) : NavigationBarItemColors {
+    @Composable
+    override fun iconColor(selected: Boolean): State<Color> {
+        return animateColorAsState(
+            targetValue = if (selected) selectedIconColor else unselectedIconColor,
+            animationSpec = tween(ItemAnimationDurationMillis)
+        )
+    }
+
+    @Composable
+    override fun textColor(selected: Boolean): State<Color> {
+        return animateColorAsState(
+            targetValue = if (selected) selectedTextColor else unselectedTextColor,
+            animationSpec = tween(ItemAnimationDurationMillis)
+        )
+    }
+
+    override val indicatorColor: Color
+        @Composable
+        get() = selectedIndicatorColor
+}
+
+/**
+ * Base layout for a [NavigationBarItem].
+ *
+ * @param indicator indicator for this item when it is selected
+ * @param icon icon for this item
+ * @param label text label for this item
+ * @param alwaysShowLabel whether to always show the label for this item. If false, the label will
+ * only be shown when this item is selected.
+ * @param animationProgress progress of the animation, where 0 represents the unselected state of
+ * this item and 1 represents the selected state. This value controls other values such as indicator
+ * size, icon and label positions, etc.
+ */
+@Composable
+private fun NavigationBarItemBaselineLayout(
+    indicator: @Composable () -> Unit,
+    icon: @Composable () -> Unit,
+    label: @Composable (() -> Unit)?,
+    alwaysShowLabel: Boolean,
+    animationProgress: Float,
+) {
+    Layout({
+        if (animationProgress > 0) {
+            indicator()
+        }
+
+        Box(Modifier.layoutId(IconLayoutIdTag)) { icon() }
+
+        if (label != null) {
+            Box(
+                Modifier.layoutId(LabelLayoutIdTag)
+                    .alpha(if (alwaysShowLabel) 1f else animationProgress)
+                    .padding(horizontal = NavigationBarItemHorizontalPadding)
+            ) { label() }
+        }
+    }) { measurables, constraints ->
+        val iconPlaceable =
+            measurables.first { it.layoutId == IconLayoutIdTag }.measure(constraints)
+
+        val totalIndicatorWidth = iconPlaceable.width + (IndicatorHorizontalPadding * 2).roundToPx()
+        val animatedIndicatorWidth = (totalIndicatorWidth * animationProgress).roundToInt()
+        val indicatorHeight = iconPlaceable.height + (IndicatorVerticalPadding * 2).roundToPx()
+        val indicatorPlaceable =
+            measurables
+                .firstOrNull { it.layoutId == IndicatorLayoutIdTag }
+                ?.measure(
+                    Constraints.fixed(
+                        width = animatedIndicatorWidth,
+                        height = indicatorHeight
+                    )
+                )
+
+        val labelPlaceable =
+            label?.let {
+                measurables
+                    .first { it.layoutId == LabelLayoutIdTag }
+                    .measure(
+                        // Measure with loose constraints for height as we don't want the label to take up more
+                        // space than it needs
+                        constraints.copy(minHeight = 0)
+                    )
+            }
+
+        if (label == null) {
+            placeIcon(iconPlaceable, indicatorPlaceable, constraints)
+        } else {
+            placeLabelAndIcon(
+                labelPlaceable!!,
+                iconPlaceable,
+                indicatorPlaceable,
+                constraints,
+                alwaysShowLabel,
+                animationProgress
+            )
+        }
+    }
+}
+
+/**
+ * Places the provided [iconPlaceable], and possibly [indicatorPlaceable] if it exists, in the
+ * center of the provided [constraints].
+ */
+private fun MeasureScope.placeIcon(
+    iconPlaceable: Placeable,
+    indicatorPlaceable: Placeable?,
+    constraints: Constraints
+): MeasureResult {
+    val width = constraints.maxWidth
+    val height = constraints.maxHeight
+
+    val iconX = (width - iconPlaceable.width) / 2
+    val iconY = (height - iconPlaceable.height) / 2
+
+    return layout(width, height) {
+        indicatorPlaceable?.let {
+            val indicatorX = (width - it.width) / 2
+            val indicatorY = (height - it.height) / 2
+            it.placeRelative(indicatorX, indicatorY)
+        }
+        iconPlaceable.placeRelative(iconX, iconY)
+    }
+}
+
+/**
+ * Places the provided [labelPlaceable], [iconPlaceable], and [indicatorPlaceable] in the correct
+ * position, depending on [alwaysShowLabel] and [animationProgress].
+ *
+ * When [alwaysShowLabel] is true, the positions do not move. The [iconPlaceable] will be placed
+ * near the top of the item and the [labelPlaceable] will be placed near the bottom, according to
+ * the spec.
+ *
+ * When [animationProgress] is 1 (representing the selected state), the positions will be the same
+ * as above.
+ *
+ * Otherwise, when [animationProgress] is 0, [iconPlaceable] will be placed in the center, like in
+ * [placeIcon], and [labelPlaceable] will not be shown.
+ *
+ * When [animationProgress] is animating between these values, [iconPlaceable] and [labelPlaceable]
+ * will be placed at a corresponding interpolated position.
+ *
+ * [indicatorPlaceable] will always be placed in such a way that it shares the same center as
+ * [iconPlaceable].
+ *
+ * @param labelPlaceable text label placeable inside this item
+ * @param iconPlaceable icon placeable inside this item
+ * @param indicatorPlaceable indicator placeable inside this item, if it exists
+ * @param constraints constraints of the item
+ * @param alwaysShowLabel whether to always show the label for this item. If true, icon and label
+ * positions will not change. If false, positions transition between 'centered icon with no label'
+ * and 'top aligned icon with label'.
+ * @param animationProgress progress of the animation, where 0 represents the unselected state of
+ * this item and 1 represents the selected state. Values between 0 and 1 interpolate positions of
+ * the icon and label.
+ */
+private fun MeasureScope.placeLabelAndIcon(
+    labelPlaceable: Placeable,
+    iconPlaceable: Placeable,
+    indicatorPlaceable: Placeable?,
+    constraints: Constraints,
+    alwaysShowLabel: Boolean,
+    animationProgress: Float,
+): MeasureResult {
+    val height = constraints.maxHeight
+
+    val baseline = labelPlaceable[LastBaseline]
+    // Label should be `ItemVerticalPadding` from the bottom
+    val labelY = height - baseline - NavigationBarItemVerticalPadding.roundToPx()
+
+    // Icon (when selected) should be `ItemVerticalPadding` from the top
+    val selectedIconY = NavigationBarItemVerticalPadding.roundToPx()
+    val unselectedIconY =
+        if (alwaysShowLabel) selectedIconY else (height - iconPlaceable.height) / 2
+
+    // How far the icon needs to move between unselected and selected states.
+    val iconDistance = unselectedIconY - selectedIconY
+
+    // The interpolated fraction of iconDistance that all placeables need to move based on
+    // animationProgress.
+    val offset = (iconDistance * (1 - animationProgress)).roundToInt()
+
+    val containerWidth = constraints.maxWidth
+
+    val labelX = (containerWidth - labelPlaceable.width) / 2
+    val iconX = (containerWidth - iconPlaceable.width) / 2
+
+    return layout(containerWidth, height) {
+        indicatorPlaceable?.let {
+            val indicatorX = (containerWidth - it.width) / 2
+            val indicatorY = selectedIconY - IndicatorVerticalPadding.roundToPx()
+            it.placeRelative(indicatorX, indicatorY + offset)
+        }
+        if (alwaysShowLabel || animationProgress != 0f) {
+            labelPlaceable.placeRelative(labelX, labelY + offset)
+        }
+        iconPlaceable.placeRelative(iconX, selectedIconY + offset)
+    }
+}
+
+private const val IndicatorLayoutIdTag: String = "indicator"
+
+private const val IconLayoutIdTag: String = "icon"
+
+private const val LabelLayoutIdTag: String = "label"
+
+private val NavigationBarHeight: Dp = NavigationBar.ContainerHeight
+
+private const val ItemAnimationDurationMillis: Int = 100
+
+private val NavigationBarItemHorizontalPadding: Dp = 4.dp
+
+/*@VisibleForTesting*/
+internal val NavigationBarItemVerticalPadding: Dp = 16.dp
+
+private val IndicatorShape: Shape = NavigationBar.ActiveIndicatorShape
+
+private val IndicatorHorizontalPadding: Dp =
+    (NavigationBar.ActiveIndicatorWidth - NavigationBar.IconSize) / 2
+
+private val IndicatorVerticalPadding: Dp =
+    (NavigationBar.ActiveIndicatorHeight - NavigationBar.IconSize) / 2
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationDrawer.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationDrawer.kt
new file mode 100644
index 0000000..901d3c7
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationDrawer.kt
@@ -0,0 +1,390 @@
+/*
+ * 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.animation.core.AnimationSpec
+import androidx.compose.animation.core.TweenSpec
+import androidx.compose.foundation.Canvas
+import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.foundation.gestures.detectTapGestures
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.BoxWithConstraints
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.ColumnScope
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.offset
+import androidx.compose.foundation.layout.sizeIn
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material3.tokens.NavigationDrawer
+import androidx.compose.material3.tokens.Palette
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Stable
+import androidx.compose.runtime.State
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.runtime.saveable.Saver
+import androidx.compose.runtime.saveable.rememberSaveable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.input.pointer.pointerInput
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalLayoutDirection
+import androidx.compose.ui.semantics.contentDescription
+import androidx.compose.ui.semantics.dismiss
+import androidx.compose.ui.semantics.onClick
+import androidx.compose.ui.semantics.paneTitle
+import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.IntOffset
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.dp
+import kotlinx.coroutines.CancellationException
+import kotlinx.coroutines.launch
+import kotlin.math.roundToInt
+
+/**
+ * Possible values of [DrawerState].
+ */
+@ExperimentalMaterial3Api
+enum class DrawerValue {
+    /**
+     * The state of the drawer when it is closed.
+     */
+    Closed,
+
+    /**
+     * The state of the drawer when it is open.
+     */
+    Open
+}
+
+/**
+ * State of the [NavigationDrawer] composable.
+ *
+ * @param initialValue The initial value of the state.
+ * @param confirmStateChange Optional callback invoked to confirm or veto a pending state change.
+ */
+@Suppress("NotCloseable")
+@ExperimentalMaterial3Api
+@Stable
+class DrawerState(
+    initialValue: DrawerValue,
+    confirmStateChange: (DrawerValue) -> Boolean = { true }
+) {
+
+    internal val swipeableState = SwipeableState(
+        initialValue = initialValue,
+        animationSpec = AnimationSpec,
+        confirmStateChange = confirmStateChange
+    )
+
+    /**
+     * Whether the drawer is open.
+     */
+    val isOpen: Boolean
+        get() = currentValue == DrawerValue.Open
+
+    /**
+     * Whether the drawer is closed.
+     */
+    val isClosed: Boolean
+        get() = currentValue == DrawerValue.Closed
+
+    /**
+     * The current value of the state.
+     *
+     * If no swipe or animation is in progress, this corresponds to the start the drawer
+     * currently in. If a swipe or an animation is in progress, this corresponds the state drawer
+     * was in before the swipe or animation started.
+     */
+    val currentValue: DrawerValue
+        get() {
+            return swipeableState.currentValue
+        }
+
+    /**
+     * Whether the state is currently animating.
+     */
+    val isAnimationRunning: Boolean
+        get() {
+            return swipeableState.isAnimationRunning
+        }
+
+    /**
+     * Open the drawer with animation and suspend until it if fully opened or animation has been
+     * cancelled. This method will throw [CancellationException] if the animation is
+     * interrupted
+     *
+     * @return the reason the open animation ended
+     */
+    suspend fun open() = animateTo(DrawerValue.Open, AnimationSpec)
+
+    /**
+     * Close the drawer with animation and suspend until it if fully closed or animation has been
+     * cancelled. This method will throw [CancellationException] if the animation is
+     * interrupted
+     *
+     * @return the reason the close animation ended
+     */
+    suspend fun close() = animateTo(DrawerValue.Closed, AnimationSpec)
+
+    /**
+     * Set the state of the drawer with specific animation
+     *
+     * @param targetValue The new value to animate to.
+     * @param anim The animation that will be used to animate to the new value.
+     */
+    @ExperimentalMaterial3Api
+    suspend fun animateTo(targetValue: DrawerValue, anim: AnimationSpec<Float>) {
+        swipeableState.animateTo(targetValue, anim)
+    }
+
+    /**
+     * Set the state without any animation and suspend until it's set
+     *
+     * @param targetValue The new target value
+     */
+    @ExperimentalMaterial3Api
+    suspend fun snapTo(targetValue: DrawerValue) {
+        swipeableState.snapTo(targetValue)
+    }
+
+    /**
+     * The target value of the drawer state.
+     *
+     * If a swipe is in progress, this is the value that the Drawer would animate to if the
+     * swipe finishes. If an animation is running, this is the target value of that animation.
+     * Finally, if no swipe or animation is in progress, this is the same as the [currentValue].
+     */
+    @Suppress("EXPERIMENTAL_ANNOTATION_ON_WRONG_TARGET")
+    @ExperimentalMaterial3Api
+    @get:ExperimentalMaterial3Api
+    val targetValue: DrawerValue
+        get() = swipeableState.targetValue
+
+    /**
+     * The current position (in pixels) of the drawer sheet.
+     */
+    @Suppress("EXPERIMENTAL_ANNOTATION_ON_WRONG_TARGET")
+    @ExperimentalMaterial3Api
+    @get:ExperimentalMaterial3Api
+    val offset: State<Float>
+        get() = swipeableState.offset
+
+    companion object {
+        /**
+         * The default [Saver] implementation for [DrawerState].
+         */
+        fun Saver(confirmStateChange: (DrawerValue) -> Boolean) =
+            Saver<DrawerState, DrawerValue>(
+                save = { it.currentValue },
+                restore = { DrawerState(it, confirmStateChange) }
+            )
+    }
+}
+
+/**
+ * Create and [remember] a [DrawerState].
+ *
+ * @param initialValue The initial value of the state.
+ * @param confirmStateChange Optional callback invoked to confirm or veto a pending state change.
+ */
+@Composable
+@ExperimentalMaterial3Api
+fun rememberDrawerState(
+    initialValue: DrawerValue,
+    confirmStateChange: (DrawerValue) -> Boolean = { true }
+): DrawerState {
+    return rememberSaveable(saver = DrawerState.Saver(confirmStateChange)) {
+        DrawerState(initialValue, confirmStateChange)
+    }
+}
+
+/**
+ * ![Navigation drawer image](https://developer.android.com/images/reference/androidx/compose/material3/navigation-drawer.png)
+ *
+ * Material Design navigation drawer.
+ *
+ * Modal navigation drawers block interaction with the rest of an app’s content with a scrim.
+ * They are elevated above most of the app’s UI and don’t affect the screen’s layout grid.
+ *
+ * @sample androidx.compose.material3.samples.NavigationDrawerSample
+ *
+ * @param drawerContent composable that represents content inside the drawer
+ * @param modifier optional modifier for the drawer
+ * @param drawerState state of the drawer
+ * @param gesturesEnabled whether or not drawer can be interacted by gestures
+ * @param drawerShape shape of the drawer sheet
+ * @param drawerTonalElevation Affects the alpha of the color overlay applied on the container color
+ * of the drawer sheet.
+ * @param drawerContainerColor container color to be used for the drawer sheet
+ * @param drawerContentColor color of the content to use inside the drawer sheet. Defaults to
+ * either the matching content color for [drawerContainerColor], or, if it is not a color from
+ * the theme, this will keep the same value set above this Surface.
+ * @param scrimColor color of the scrim that obscures content when the drawer is open
+ * @param content content of the rest of the UI
+ *
+ * @throws IllegalStateException when parent has [Float.POSITIVE_INFINITY] width
+ */
+@Composable
+@ExperimentalMaterial3Api
+fun NavigationDrawer(
+    drawerContent: @Composable ColumnScope.() -> Unit,
+    modifier: Modifier = Modifier,
+    drawerState: DrawerState = rememberDrawerState(DrawerValue.Closed),
+    gesturesEnabled: Boolean = true,
+    drawerShape: Shape = RoundedCornerShape(0.dp, 16.dp, 16.dp, 0.dp),
+    drawerTonalElevation: Dp = DrawerDefaults.Elevation,
+    drawerContainerColor: Color =
+        MaterialTheme.colorScheme.fromToken(NavigationDrawer.ContainerColor),
+    drawerContentColor: Color = contentColorFor(drawerContainerColor),
+    scrimColor: Color = DrawerDefaults.scrimColor,
+    content: @Composable () -> Unit
+) {
+    val scope = rememberCoroutineScope()
+    BoxWithConstraints(modifier.fillMaxSize()) {
+        val navigationDrawerConstraints = constraints
+        // TODO : think about Infinite max bounds case
+        if (!navigationDrawerConstraints.hasBoundedWidth) {
+            throw IllegalStateException("Drawer shouldn't have infinite width")
+        }
+
+        val minValue = -navigationDrawerConstraints.maxWidth.toFloat()
+        val maxValue = 0f
+
+        val anchors = mapOf(minValue to DrawerValue.Closed, maxValue to DrawerValue.Open)
+        val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
+        Box(
+            Modifier.swipeable(
+                state = drawerState.swipeableState,
+                anchors = anchors,
+                thresholds = { _, _ -> FractionalThreshold(0.5f) },
+                orientation = Orientation.Horizontal,
+                enabled = gesturesEnabled,
+                reverseDirection = isRtl,
+                velocityThreshold = DrawerVelocityThreshold,
+                resistance = null
+            )
+        ) {
+            Box {
+                content()
+            }
+            Scrim(
+                open = drawerState.isOpen,
+                onClose = {
+                    if (
+                        gesturesEnabled &&
+                        drawerState.swipeableState.confirmStateChange(DrawerValue.Closed)
+                    ) {
+                        scope.launch { drawerState.close() }
+                    }
+                },
+                fraction = {
+                    calculateFraction(minValue, maxValue, drawerState.offset.value)
+                },
+                color = scrimColor
+            )
+            val navigationMenu = getString(Strings.NavigationMenu)
+            Surface(
+                modifier = with(LocalDensity.current) {
+                    Modifier
+                        .sizeIn(
+                            minWidth = navigationDrawerConstraints.minWidth.toDp(),
+                            minHeight = navigationDrawerConstraints.minHeight.toDp(),
+                            maxWidth = NavigationDrawer.ContainerWidth,
+                            maxHeight = navigationDrawerConstraints.maxHeight.toDp()
+                        )
+                }
+                    .offset { IntOffset(drawerState.offset.value.roundToInt(), 0) }
+                    .semantics {
+                        paneTitle = navigationMenu
+                        if (drawerState.isOpen) {
+                            dismiss {
+                                if (
+                                    drawerState.swipeableState
+                                        .confirmStateChange(DrawerValue.Closed)
+                                ) {
+                                    scope.launch { drawerState.close() }
+                                }; true
+                            }
+                        }
+                    },
+                shape = drawerShape,
+                color = drawerContainerColor,
+                contentColor = drawerContentColor,
+                tonalElevation = drawerTonalElevation
+            ) {
+                Column(Modifier.fillMaxSize(), content = drawerContent)
+            }
+        }
+    }
+}
+
+/**
+ * Object to hold default values for [NavigationDrawer]
+ */
+@ExperimentalMaterial3Api
+object DrawerDefaults {
+
+    /**
+     * Default Elevation for drawer sheet as specified in material specs
+     */
+    val Elevation = NavigationDrawer.ModalContainerElevation
+
+    val scrimColor: Color
+        @Composable
+        get() = Palette.NeutralVariant0.copy(alpha = NavigationDrawer.ScrimOpacity)
+}
+
+private fun calculateFraction(a: Float, b: Float, pos: Float) =
+    ((pos - a) / (b - a)).coerceIn(0f, 1f)
+
+@Composable
+private fun Scrim(
+    open: Boolean,
+    onClose: () -> Unit,
+    fraction: () -> Float,
+    color: Color
+) {
+    val closeDrawer = getString(Strings.CloseDrawer)
+    val dismissDrawer = if (open) {
+        Modifier
+            .pointerInput(onClose) { detectTapGestures { onClose() } }
+            .semantics(mergeDescendants = true) {
+                contentDescription = closeDrawer
+                onClick { onClose(); true }
+            }
+    } else {
+        Modifier
+    }
+
+    Canvas(
+        Modifier
+            .fillMaxSize()
+            .then(dismissDrawer)
+    ) {
+        drawRect(color, alpha = fraction())
+    }
+}
+
+private val EndDrawerPadding = 56.dp
+private val DrawerVelocityThreshold = 400.dp
+
+// TODO: b/177571613 this should be a proper decay settling
+// this is taken from the DrawerLayout's DragViewHelper as a min duration.
+private val AnimationSpec = TweenSpec<Float>(durationMillis = 256)
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt
new file mode 100644
index 0000000..6de4cf6
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt
@@ -0,0 +1,524 @@
+/*
+ * 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.animation.animateColorAsState
+import androidx.compose.animation.core.animateFloatAsState
+import androidx.compose.animation.core.tween
+import androidx.compose.foundation.background
+import androidx.compose.foundation.interaction.Interaction
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.ColumnScope
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.selection.selectable
+import androidx.compose.foundation.selection.selectableGroup
+import androidx.compose.material.ripple.rememberRipple
+import androidx.compose.material3.tokens.NavigationRail
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.Stable
+import androidx.compose.runtime.State
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.alpha
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.layout.Layout
+import androidx.compose.ui.layout.MeasureResult
+import androidx.compose.ui.layout.MeasureScope
+import androidx.compose.ui.layout.Placeable
+import androidx.compose.ui.layout.layoutId
+import androidx.compose.ui.semantics.Role
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+import kotlin.math.roundToInt
+
+/**
+ * ![Navigation rail image](https://developer.android.com/images/reference/androidx/compose/material3/navigation-rail.png)
+ *
+ * Material Design navigation rail.
+ *
+ * [NavigationRail] is a side navigation component that allows movement between primary destinations
+ * in an app. The navigation rail should be used to display three to seven app destinations and,
+ * optionally, a Floating Action Button or a logo header. Each destination is typically represented
+ * by an icon and an optional text label.
+ *
+ * [NavigationRail] should contain multiple [NavigationRailItem]s, each representing a singular
+ * destination.
+ *
+ * A simple example looks like:
+ * @sample androidx.compose.material3.samples.NavigationRailSample
+ *
+ * See [NavigationRailItem] for configuration specific to each item, and not the overall
+ * NavigationRail component.
+ *
+ * @param modifier optional [Modifier] for this NavigationRail
+ * @param containerColor the container color for this NavigationRail
+ * @param contentColor the preferred content color provided by this NavigationRail to its children.
+ * Defaults to either the matching content color for [containerColor], or if [containerColor] is not
+ * a color from the theme, this will keep the same value set above this NavigationRail
+ * @param header optional header that may hold a Floating Action Button or a logo
+ * @param content destinations inside this NavigationRail. This should contain multiple
+ * [NavigationRailItem]s
+ */
+@Composable
+fun NavigationRail(
+    modifier: Modifier = Modifier,
+    containerColor: Color = MaterialTheme.colorScheme.fromToken(NavigationRail.ContainerColor),
+    contentColor: Color = contentColorFor(containerColor),
+    header: @Composable (ColumnScope.() -> Unit)? = null,
+    content: @Composable ColumnScope.() -> Unit
+) {
+    Surface(
+        color = containerColor,
+        contentColor = contentColor,
+        modifier = modifier,
+    ) {
+        Column(
+            Modifier.fillMaxHeight()
+                .width(NavigationRail.ContainerWidth)
+                .padding(vertical = NavigationRailVerticalPadding)
+                .selectableGroup(),
+            horizontalAlignment = Alignment.CenterHorizontally,
+            verticalArrangement = Arrangement.spacedBy(NavigationRailVerticalPadding)
+        ) {
+            if (header != null) {
+                header()
+                Spacer(Modifier.height(NavigationRailHeaderPadding))
+            }
+            content()
+        }
+    }
+}
+
+/**
+ * Material Design navigation rail item.
+ *
+ * A [NavigationRailItem] represents a destination within a [NavigationRail].
+ *
+ * The text label is always shown (if it exists) when selected. Showing text labels if not selected
+ * is controlled by [alwaysShowLabel].
+ *
+ * @param selected whether this item is selected
+ * @param onClick the callback to be invoked when this item is selected
+ * @param icon icon for this item, typically an [Icon]
+ * @param modifier optional [Modifier] for this item
+ * @param enabled controls the enabled state of this item. When false, this item will not be
+ * clickable and will appear disabled to accessibility services
+ * @param label optional text label for this item
+ * @param alwaysShowLabel whether to always show the label for this item. If false, the label will
+ * only be shown when this item is selected.
+ * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
+ * for this NavigationRailItem. You can create and pass in your own remembered
+ * [MutableInteractionSource] if you want to observe [Interaction]s and customize the appearance /
+ * behavior of this NavigationRailItem in different [Interaction]s.
+ * @param colors the various colors used in elements of this item
+ */
+@Composable
+fun NavigationRailItem(
+    selected: Boolean,
+    onClick: () -> Unit,
+    icon: @Composable () -> Unit,
+    modifier: Modifier = Modifier,
+    enabled: Boolean = true,
+    label: @Composable (() -> Unit)? = null,
+    alwaysShowLabel: Boolean = true,
+    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
+    colors: NavigationRailItemColors = NavigationRailItemDefaults.colors(),
+) {
+    val styledIcon = @Composable {
+        val iconColor by colors.iconColor(selected = selected)
+        CompositionLocalProvider(LocalContentColor provides iconColor, content = icon)
+    }
+
+    val styledLabel: @Composable (() -> Unit)? = label?.let {
+        @Composable {
+            val style = MaterialTheme.typography.fromToken(NavigationRail.LabelTextFont)
+            val textColor by colors.textColor(selected = selected)
+            CompositionLocalProvider(LocalContentColor provides textColor) {
+                ProvideTextStyle(style, content = label)
+            }
+        }
+    }
+
+    Box(
+        modifier
+            .selectable(
+                selected = selected,
+                onClick = onClick,
+                enabled = enabled,
+                role = Role.Tab,
+                interactionSource = interactionSource,
+                indication = rememberRipple(),
+            )
+            .size(width = NavigationRailItemWidth, height = NavigationRailItemHeight),
+        contentAlignment = Alignment.Center
+    ) {
+        val animationProgress: Float by animateFloatAsState(
+            targetValue = if (selected) 1f else 0f,
+            animationSpec = tween(ItemAnimationDurationMillis)
+        )
+
+        val indicator = @Composable {
+            Box(
+                Modifier.layoutId(IndicatorLayoutIdTag)
+                    .background(
+                        color = colors.indicatorColor.copy(alpha = animationProgress),
+                        shape = if (label != null) {
+                            NavigationRail.ActiveIndicatorShape
+                        } else {
+                            NavigationRail.NoLabelActiveIndicatorShape
+                        }
+                    )
+            )
+        }
+
+        NavigationRailItemBaselineLayout(
+            indicator = indicator,
+            icon = styledIcon,
+            label = styledLabel,
+            alwaysShowLabel = alwaysShowLabel,
+            animationProgress = animationProgress,
+        )
+    }
+}
+
+/** Defaults used in [NavigationRailItem]. */
+object NavigationRailItemDefaults {
+    /**
+     * Creates a [NavigationRailItemColors] with the provided colors according to the Material
+     * specification.
+     *
+     * @param selectedIconColor the color to use for the icon when the item is selected.
+     * @param unselectedIconColor the color to use for the icon when the item is unselected.
+     * @param selectedTextColor the color to use for the text label when the item is selected.
+     * @param unselectedTextColor the color to use for the text label when the item is unselected.
+     * @param indicatorColor the color to use for the indicator when the item is selected.
+     * @return the resulting [NavigationRailItemColors] used for [NavigationRailItem]
+     */
+    @Composable
+    fun colors(
+        selectedIconColor: Color =
+            MaterialTheme.colorScheme.fromToken(NavigationRail.ActiveIconColor),
+        unselectedIconColor: Color =
+            MaterialTheme.colorScheme.fromToken(NavigationRail.InactiveIconColor),
+        selectedTextColor: Color =
+            MaterialTheme.colorScheme.fromToken(NavigationRail.ActiveLabelTextColor),
+        unselectedTextColor: Color =
+            MaterialTheme.colorScheme.fromToken(NavigationRail.InactiveLabelTextColor),
+        indicatorColor: Color =
+            MaterialTheme.colorScheme.fromToken(NavigationRail.ActiveIndicatorColor),
+    ): NavigationRailItemColors = remember(
+        selectedIconColor,
+        unselectedIconColor,
+        selectedTextColor,
+        unselectedTextColor,
+        indicatorColor
+    ) {
+        DefaultNavigationRailItemColors(
+            selectedIconColor = selectedIconColor,
+            unselectedIconColor = unselectedIconColor,
+            selectedTextColor = selectedTextColor,
+            unselectedTextColor = unselectedTextColor,
+            selectedIndicatorColor = indicatorColor,
+        )
+    }
+}
+
+/** Represents the colors of the various elements of a navigation item. */
+@Stable
+interface NavigationRailItemColors {
+    /**
+     * Represents the icon color for this item, depending on whether it is [selected].
+     *
+     * @param selected whether the item is selected
+     */
+    @Composable
+    fun iconColor(selected: Boolean): State<Color>
+
+    /**
+     * Represents the text color for this item, depending on whether it is [selected].
+     *
+     * @param selected whether the item is selected
+     */
+    @Composable
+    fun textColor(selected: Boolean): State<Color>
+
+    /** Represents the color of the indicator used for selected items. */
+    val indicatorColor: Color
+        @Composable get
+}
+
+@Stable
+private class DefaultNavigationRailItemColors(
+    private val selectedIconColor: Color,
+    private val unselectedIconColor: Color,
+    private val selectedTextColor: Color,
+    private val unselectedTextColor: Color,
+    private val selectedIndicatorColor: Color,
+) : NavigationRailItemColors {
+    @Composable
+    override fun iconColor(selected: Boolean): State<Color> {
+        return animateColorAsState(
+            targetValue = if (selected) selectedIconColor else unselectedIconColor,
+            animationSpec = tween(ItemAnimationDurationMillis)
+        )
+    }
+
+    @Composable
+    override fun textColor(selected: Boolean): State<Color> {
+        return animateColorAsState(
+            targetValue = if (selected) selectedTextColor else unselectedTextColor,
+            animationSpec = tween(ItemAnimationDurationMillis)
+        )
+    }
+
+    override val indicatorColor: Color
+        @Composable
+        get() = selectedIndicatorColor
+}
+
+/**
+ * Base layout for a [NavigationRailItem].
+ *
+ * @param indicator indicator for this item when it is selected
+ * @param icon icon for this item
+ * @param label text label for this item
+ * @param alwaysShowLabel whether to always show the label for this item. If false, the label will
+ * only be shown when this item is selected.
+ * @param animationProgress progress of the animation, where 0 represents the unselected state of
+ * this item and 1 represents the selected state. This value controls other values such as indicator
+ * size, icon and label positions, etc.
+ */
+@Composable
+private fun NavigationRailItemBaselineLayout(
+    indicator: @Composable () -> Unit,
+    icon: @Composable () -> Unit,
+    label: @Composable (() -> Unit)?,
+    alwaysShowLabel: Boolean,
+    animationProgress: Float,
+) {
+    Layout({
+        if (animationProgress > 0) {
+            indicator()
+        }
+
+        Box(Modifier.layoutId(IconLayoutIdTag)) { icon() }
+
+        if (label != null) {
+            Box(
+                Modifier.layoutId(LabelLayoutIdTag)
+                    .alpha(if (alwaysShowLabel) 1f else animationProgress)
+            ) { label() }
+        }
+    }) { measurables, constraints ->
+        val iconPlaceable =
+            measurables.first { it.layoutId == IconLayoutIdTag }.measure(constraints)
+
+        val totalIndicatorWidth = iconPlaceable.width + (IndicatorHorizontalPadding * 2).roundToPx()
+        val animatedIndicatorWidth = (totalIndicatorWidth * animationProgress).roundToInt()
+        val indicatorVerticalPadding = if (label == null) {
+            IndicatorVerticalPaddingNoLabel
+        } else {
+            IndicatorVerticalPaddingWithLabel
+        }
+        val indicatorHeight = iconPlaceable.height + (indicatorVerticalPadding * 2).roundToPx()
+
+        val indicatorPlaceable =
+            measurables
+                .firstOrNull { it.layoutId == IndicatorLayoutIdTag }
+                ?.measure(
+                    Constraints.fixed(
+                        width = animatedIndicatorWidth,
+                        height = indicatorHeight
+                    )
+                )
+
+        val labelPlaceable =
+            label?.let {
+                measurables
+                    .first { it.layoutId == LabelLayoutIdTag }
+                    .measure(
+                        // Measure with loose constraints for height as we don't want the label to
+                        // take up more space than it needs
+                        constraints.copy(minHeight = 0)
+                    )
+            }
+
+        if (label == null) {
+            placeIcon(iconPlaceable, indicatorPlaceable, constraints)
+        } else {
+            placeLabelAndIcon(
+                labelPlaceable!!,
+                iconPlaceable,
+                indicatorPlaceable,
+                constraints,
+                alwaysShowLabel,
+                animationProgress,
+            )
+        }
+    }
+}
+
+/**
+ * Places the provided [iconPlaceable], and possibly [indicatorPlaceable] if it exists, in the
+ * center of the provided [constraints].
+ */
+private fun MeasureScope.placeIcon(
+    iconPlaceable: Placeable,
+    indicatorPlaceable: Placeable?,
+    constraints: Constraints,
+): MeasureResult {
+    val width = constraints.maxWidth
+    val height = constraints.maxHeight
+
+    val iconX = (width - iconPlaceable.width) / 2
+    val iconY = (height - iconPlaceable.height) / 2
+
+    return layout(width, height) {
+        indicatorPlaceable?.let {
+            val indicatorX = (width - it.width) / 2
+            val indicatorY = (height - it.height) / 2
+            it.placeRelative(indicatorX, indicatorY)
+        }
+        iconPlaceable.placeRelative(iconX, iconY)
+    }
+}
+
+/**
+ * Places the provided [labelPlaceable], [iconPlaceable], and [indicatorPlaceable] in the correct
+ * position, depending on [alwaysShowLabel] and [animationProgress].
+ *
+ * When [alwaysShowLabel] is true, the positions do not move. The [iconPlaceable] will be placed
+ * near the top of the item and the [labelPlaceable] will be placed near the bottom, according to
+ * the spec.
+ *
+ * When [animationProgress] is 1 (representing the selected state), the positions will be the same
+ * as above.
+ *
+ * Otherwise, when [animationProgress] is 0, [iconPlaceable] will be placed in the center, like in
+ * [placeIcon], and [labelPlaceable] will not be shown.
+ *
+ * When [animationProgress] is animating between these values, [iconPlaceable] and [labelPlaceable]
+ * will be placed at a corresponding interpolated position.
+ *
+ * [indicatorPlaceable] will always be placed in such a way that it shares the same center as
+ * [iconPlaceable].
+ *
+ * @param labelPlaceable text label placeable inside this item
+ * @param iconPlaceable icon placeable inside this item
+ * @param indicatorPlaceable indicator placeable inside this item, if it exists
+ * @param constraints constraints of the item
+ * @param alwaysShowLabel whether to always show the label for this item. If true, icon and label
+ * positions will not change. If false, positions transition between 'centered icon with no label'
+ * and 'top aligned icon with label'.
+ * @param animationProgress progress of the animation, where 0 represents the unselected state of
+ * this item and 1 represents the selected state. Values between 0 and 1 interpolate positions of
+ * the icon and label.
+ */
+private fun MeasureScope.placeLabelAndIcon(
+    labelPlaceable: Placeable,
+    iconPlaceable: Placeable,
+    indicatorPlaceable: Placeable?,
+    constraints: Constraints,
+    alwaysShowLabel: Boolean,
+    animationProgress: Float,
+): MeasureResult {
+    val height = constraints.maxHeight
+
+    // Label should be `ItemVerticalPadding` from the bottom
+    val labelY = height - labelPlaceable.height - NavigationRailItemVerticalPadding.roundToPx()
+
+    // Icon (when selected) should be `ItemVerticalPadding` from the top
+    val selectedIconY = NavigationRailItemVerticalPadding.roundToPx()
+    val unselectedIconY =
+        if (alwaysShowLabel) selectedIconY else (height - iconPlaceable.height) / 2
+
+    // How far the icon needs to move between unselected and selected states
+    val iconDistance = unselectedIconY - selectedIconY
+
+    // The interpolated fraction of iconDistance that all placeables need to move based on
+    // animationProgress, since the icon is higher in the selected state.
+    val offset = (iconDistance * (1 - animationProgress)).roundToInt()
+
+    val width = constraints.maxWidth
+    val labelX = (width - labelPlaceable.width) / 2
+    val iconX = (width - iconPlaceable.width) / 2
+
+    return layout(width, height) {
+        indicatorPlaceable?.let {
+            val indicatorX = (width - it.width) / 2
+            val indicatorY = selectedIconY - IndicatorVerticalPaddingWithLabel.roundToPx()
+            it.placeRelative(indicatorX, indicatorY + offset)
+        }
+        if (alwaysShowLabel || animationProgress != 0f) {
+            labelPlaceable.placeRelative(labelX, labelY + offset)
+        }
+        iconPlaceable.placeRelative(iconX, selectedIconY + offset)
+    }
+}
+
+private const val IndicatorLayoutIdTag: String = "indicator"
+
+private const val IconLayoutIdTag: String = "icon"
+
+private const val LabelLayoutIdTag: String = "label"
+
+/**
+ * Vertical padding between the contents of the [NavigationRail] and its top/bottom, and internally
+ * between items.
+ */
+private val NavigationRailVerticalPadding: Dp = 4.dp
+
+/**
+ * Padding at the bottom of the [NavigationRail]'s header. This padding will only be added when the
+ * header is not null.
+ */
+private val NavigationRailHeaderPadding: Dp = 8.dp
+
+private const val ItemAnimationDurationMillis: Int = 150
+
+/*@VisibleForTesting*/
+/** Width of an individual [NavigationRailItem]. */
+internal val NavigationRailItemWidth: Dp = NavigationRail.ContainerWidth
+
+/*@VisibleForTesting*/
+/** Height of an individual [NavigationRailItem]. */
+internal val NavigationRailItemHeight: Dp = NavigationRail.NoLabelActiveIndicatorHeight
+
+/*@VisibleForTesting*/
+/** Vertical padding between the contents of a [NavigationRailItem] and its top/bottom. */
+internal val NavigationRailItemVerticalPadding: Dp = 4.dp
+
+private val IndicatorHorizontalPadding: Dp =
+    (NavigationRail.ActiveIndicatorWidth - NavigationRail.IconSize) / 2
+
+private val IndicatorVerticalPaddingWithLabel: Dp =
+    (NavigationRail.ActiveIndicatorHeight - NavigationRail.IconSize) / 2
+
+private val IndicatorVerticalPaddingNoLabel: Dp =
+    (NavigationRail.NoLabelActiveIndicatorHeight - NavigationRail.IconSize) / 2
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt
index ddc8b6f..8609e2f 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt
@@ -16,14 +16,21 @@
 
 package androidx.compose.material3
 
+import androidx.compose.foundation.layout.ColumnScope
 import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material3.tokens.NavigationDrawer
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.Immutable
+import androidx.compose.runtime.Stable
+import androidx.compose.runtime.remember
 import androidx.compose.runtime.staticCompositionLocalOf
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.Shape
 import androidx.compose.ui.layout.SubcomposeLayout
+import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.LayoutDirection
 import androidx.compose.ui.unit.dp
 
@@ -37,12 +44,25 @@
  * components will work together correctly.
  *
  * @param modifier optional Modifier for the root of the [Scaffold]
+ * @param scaffoldState state of this scaffold widget. It contains the state of the screen, e.g.
+ * variables to provide manual control over the drawer behavior, sizes of components, etc
  * @param topBar top app bar of the screen. Consider using [SmallTopAppBar].
  * @param bottomBar bottom bar of the screen. Consider using [NavigationBar].
  * @param floatingActionButton Main action button of your screen. Consider using
  * [FloatingActionButton] for this slot.
  * @param floatingActionButtonPosition position of the FAB on the screen. See [FabPosition] for
  * possible options available.
+ * @param drawerContent content of the Drawer sheet that can be pulled from the left side (right
+ * for RTL).
+ * @param drawerGesturesEnabled whether or not drawer (if set) can be interacted with via gestures
+ * @param drawerShape shape of the drawer sheet (if set)
+ * @param drawerTonalElevation Affects the alpha of the color overlay applied on the container color
+ * of the drawer sheet.
+ * @param drawerContainerColor container color to be used for the drawer sheet
+ * @param drawerContentColor color of the content to use inside the drawer sheet. Defaults to
+ * either the matching content color for [drawerContainerColor], or, if it is not a color from
+ * the theme, this will keep the same value set above this Surface.
+ * @param drawerScrimColor color of the scrim that obscures content when the drawer is open
  * @param containerColor background of the scaffold body
  * @param contentColor color of the content in scaffold body. Defaults to either the matching
  * content color for [containerColor], or, if it is not a color from the theme, this will keep
@@ -58,10 +78,19 @@
 @Composable
 fun Scaffold(
     modifier: Modifier = Modifier,
+    scaffoldState: ScaffoldState = rememberScaffoldState(),
     topBar: @Composable () -> Unit = {},
     bottomBar: @Composable () -> Unit = {},
     floatingActionButton: @Composable () -> Unit = {},
     floatingActionButtonPosition: FabPosition = FabPosition.End,
+    drawerContent: @Composable (ColumnScope.() -> Unit)? = null,
+    drawerGesturesEnabled: Boolean = true,
+    drawerShape: Shape = RoundedCornerShape(16.dp),
+    drawerTonalElevation: Dp = DrawerDefaults.Elevation,
+    drawerContainerColor: Color =
+        MaterialTheme.colorScheme.fromToken(NavigationDrawer.ContainerColor),
+    drawerContentColor: Color = contentColorFor(drawerContainerColor),
+    drawerScrimColor: Color = DrawerDefaults.scrimColor,
     containerColor: Color = MaterialTheme.colorScheme.background,
     contentColor: Color = contentColorFor(containerColor),
     content: @Composable (PaddingValues) -> Unit
@@ -78,8 +107,22 @@
         }
     }
 
-    // TODO(b/196872589): Add drawer support.
-    child(modifier)
+    if (drawerContent != null) {
+        NavigationDrawer(
+            modifier = modifier,
+            drawerState = scaffoldState.drawerState,
+            gesturesEnabled = drawerGesturesEnabled,
+            drawerContent = drawerContent,
+            drawerShape = drawerShape,
+            drawerTonalElevation = drawerTonalElevation,
+            drawerContainerColor = drawerContainerColor,
+            drawerContentColor = drawerContentColor,
+            scrimColor = drawerScrimColor,
+            content = { child(Modifier) }
+        )
+    } else {
+        child(modifier)
+    }
 }
 
 /**
@@ -191,6 +234,33 @@
 }
 
 /**
+ * State for [Scaffold] composable component.
+ *
+ * Contains basic screen state, e.g. Drawer configuration, as well as sizes of components after
+ * layout has happened
+ *
+ * @param drawerState the drawer state
+ */
+@Stable
+@ExperimentalMaterial3Api
+class ScaffoldState(
+    val drawerState: DrawerState,
+)
+
+/**
+ * Creates a [ScaffoldState] with the default animation clock and memoizes it.
+ *
+ * @param drawerState the drawer state
+ */
+@ExperimentalMaterial3Api
+@Composable
+fun rememberScaffoldState(
+    drawerState: DrawerState = rememberDrawerState(DrawerValue.Closed),
+): ScaffoldState = remember {
+    ScaffoldState(drawerState)
+}
+
+/**
  * The possible positions for a [FloatingActionButton] attached to a [Scaffold].
  */
 // TODO(b/200553810): Mark as experimental
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Strings.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Strings.kt
new file mode 100644
index 0000000..07e381a
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Strings.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.compose.material3
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Immutable
+
+@Suppress("INLINE_CLASS_DEPRECATED")
+@Immutable
+internal inline class Strings private constructor(@Suppress("unused") private val value: Int) {
+    companion object {
+        val NavigationMenu = Strings(0)
+        val CloseDrawer = Strings(1)
+        val CloseSheet = Strings(2)
+        val DefaultErrorMessage = Strings(3)
+        val ExposedDropdownMenu = Strings(4)
+    }
+}
+
+@Composable
+internal expect fun getString(string: Strings): String
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Surface.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Surface.kt
index d2b90c1..6140717 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Surface.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Surface.kt
@@ -87,9 +87,8 @@
  * @param contentColor The preferred content color provided by this Surface to its children.
  * Defaults to either the matching content color for [color], or if [color] is not a color from the
  * theme, this will keep the same value set above this Surface.
- * @param tonalElevation When [color] is [ColorScheme.surface], a higher the elevation (surface
- * blended with more primary) will result in a darker surface color in light theme and lighter color
- * in dark theme.
+ * @param tonalElevation When [color] is [ColorScheme.surface], a higher the elevation will result
+ * in a darker color in light theme and lighter color in dark theme.
  * @param shadowElevation The size of the shadow below the surface. To prevent shadow creep, only
  * apply shadow elevation when absolutely necessary, such as when the surface requires visual
  * separation from a patterned background. Note that It will not affect z index of the Surface.
@@ -172,9 +171,8 @@
  * Defaults to either the matching content color for [color], or if [color] is not a color from the
  * theme, this will keep the same value set above this Surface.
  * @param border Optional border to draw on top of the surface
- * @param tonalElevation When [color] is [ColorScheme.surface], a higher the elevation (surface
- * blended with more primary) will result in a darker surface color in light theme and lighter color
- * in dark theme.
+ * @param tonalElevation When [color] is [ColorScheme.surface], a higher the elevation will result
+ * in a darker color in light theme and lighter color in dark theme.
  * @param shadowElevation The size of the shadow below the surface. Note that It will not affect z index
  * of the Surface. If you want to change the drawing order you can use `Modifier.zIndex`.
  * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Swipeable.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Swipeable.kt
new file mode 100644
index 0000000..1090fd0
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Swipeable.kt
@@ -0,0 +1,885 @@
+/*
+ * 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.animation.core.Animatable
+import androidx.compose.animation.core.AnimationSpec
+import androidx.compose.animation.core.SpringSpec
+import androidx.compose.foundation.gestures.DraggableState
+import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.foundation.gestures.draggable
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.material3.SwipeableDefaults.AnimationSpec
+import androidx.compose.material3.SwipeableDefaults.StandardResistanceFactor
+import androidx.compose.material3.SwipeableDefaults.VelocityThreshold
+import androidx.compose.material3.SwipeableDefaults.resistanceConfig
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.DisposableEffect
+import androidx.compose.runtime.Immutable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.Stable
+import androidx.compose.runtime.State
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.saveable.Saver
+import androidx.compose.runtime.saveable.rememberSaveable
+import androidx.compose.runtime.setValue
+import androidx.compose.runtime.snapshotFlow
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.composed
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
+import androidx.compose.ui.input.nestedscroll.NestedScrollSource
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.debugInspectorInfo
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.Velocity
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.lerp
+import kotlinx.coroutines.CancellationException
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.collect
+import kotlinx.coroutines.flow.filter
+import kotlinx.coroutines.flow.take
+import kotlinx.coroutines.launch
+import kotlin.math.PI
+import kotlin.math.abs
+import kotlin.math.sign
+import kotlin.math.sin
+
+/**
+ * State of the [swipeable] modifier.
+ *
+ * This contains necessary information about any ongoing swipe or animation and provides methods
+ * to change the state either immediately or by starting an animation. To create and remember a
+ * [SwipeableState] with the default animation clock, use [rememberSwipeableState].
+ *
+ * @param initialValue The initial value of the state.
+ * @param animationSpec The default animation that will be used to animate to a new state.
+ * @param confirmStateChange Optional callback invoked to confirm or veto a pending state change.
+ */
+@Stable
+@ExperimentalMaterial3Api
+internal open class SwipeableState<T>(
+    initialValue: T,
+    internal val animationSpec: AnimationSpec<Float> = AnimationSpec,
+    internal val confirmStateChange: (newValue: T) -> Boolean = { true }
+) {
+    /**
+     * The current value of the state.
+     *
+     * If no swipe or animation is in progress, this corresponds to the anchor at which the
+     * [swipeable] is currently settled. If a swipe or animation is in progress, this corresponds
+     * the last anchor at which the [swipeable] was settled before the swipe or animation started.
+     */
+    var currentValue: T by mutableStateOf(initialValue)
+        private set
+
+    /**
+     * Whether the state is currently animating.
+     */
+    var isAnimationRunning: Boolean by mutableStateOf(false)
+        private set
+
+    /**
+     * The current position (in pixels) of the [swipeable].
+     *
+     * You should use this state to offset your content accordingly. The recommended way is to
+     * use `Modifier.offsetPx`. This includes the resistance by default, if resistance is enabled.
+     */
+    val offset: State<Float> get() = offsetState
+
+    /**
+     * The amount by which the [swipeable] has been swiped past its bounds.
+     */
+    val overflow: State<Float> get() = overflowState
+
+    // Use `Float.NaN` as a placeholder while the state is uninitialised.
+    private val offsetState = mutableStateOf(0f)
+    private val overflowState = mutableStateOf(0f)
+
+    // the source of truth for the "real"(non ui) position
+    // basically position in bounds + overflow
+    private val absoluteOffset = mutableStateOf(0f)
+
+    // current animation target, if animating, otherwise null
+    private val animationTarget = mutableStateOf<Float?>(null)
+
+    internal var anchors by mutableStateOf(emptyMap<Float, T>())
+
+    private val latestNonEmptyAnchorsFlow: Flow<Map<Float, T>> =
+        snapshotFlow { anchors }
+            .filter { it.isNotEmpty() }
+            .take(1)
+
+    internal var minBound = Float.NEGATIVE_INFINITY
+    internal var maxBound = Float.POSITIVE_INFINITY
+
+    internal fun ensureInit(newAnchors: Map<Float, T>) {
+        if (anchors.isEmpty()) {
+            // need to do initial synchronization synchronously :(
+            val initialOffset = newAnchors.getOffset(currentValue)
+            requireNotNull(initialOffset) {
+                "The initial value must have an associated anchor."
+            }
+            offsetState.value = initialOffset
+            absoluteOffset.value = initialOffset
+        }
+    }
+
+    internal suspend fun processNewAnchors(
+        oldAnchors: Map<Float, T>,
+        newAnchors: Map<Float, T>
+    ) {
+        if (oldAnchors.isEmpty()) {
+            // If this is the first time that we receive anchors, then we need to initialise
+            // the state so we snap to the offset associated to the initial value.
+            minBound = newAnchors.keys.minOrNull()!!
+            maxBound = newAnchors.keys.maxOrNull()!!
+            val initialOffset = newAnchors.getOffset(currentValue)
+            requireNotNull(initialOffset) {
+                "The initial value must have an associated anchor."
+            }
+            snapInternalToOffset(initialOffset)
+        } else if (newAnchors != oldAnchors) {
+            // If we have received new anchors, then the offset of the current value might
+            // have changed, so we need to animate to the new offset. If the current value
+            // has been removed from the anchors then we animate to the closest anchor
+            // instead. Note that this stops any ongoing animation.
+            minBound = Float.NEGATIVE_INFINITY
+            maxBound = Float.POSITIVE_INFINITY
+            val animationTargetValue = animationTarget.value
+            // if we're in the animation already, let's find it a new home
+            val targetOffset = if (animationTargetValue != null) {
+                // first, try to map old state to the new state
+                val oldState = oldAnchors[animationTargetValue]
+                val newState = newAnchors.getOffset(oldState)
+                // return new state if exists, or find the closes one among new anchors
+                newState ?: newAnchors.keys.minByOrNull { abs(it - animationTargetValue) }!!
+            } else {
+                // we're not animating, proceed by finding the new anchors for an old value
+                val actualOldValue = oldAnchors[offset.value]
+                val value = if (actualOldValue == currentValue) currentValue else actualOldValue
+                newAnchors.getOffset(value) ?: newAnchors
+                    .keys.minByOrNull { abs(it - offset.value) }!!
+            }
+            try {
+                animateInternalToOffset(targetOffset, animationSpec)
+            } catch (c: CancellationException) {
+                // If the animation was interrupted for any reason, snap as a last resort.
+                snapInternalToOffset(targetOffset)
+            } finally {
+                currentValue = newAnchors.getValue(targetOffset)
+                minBound = newAnchors.keys.minOrNull()!!
+                maxBound = newAnchors.keys.maxOrNull()!!
+            }
+        }
+    }
+
+    internal var thresholds: (Float, Float) -> Float by mutableStateOf({ _, _ -> 0f })
+
+    internal var velocityThreshold by mutableStateOf(0f)
+
+    internal var resistance: ResistanceConfig? by mutableStateOf(null)
+
+    internal val draggableState = DraggableState {
+        val newAbsolute = absoluteOffset.value + it
+        val clamped = newAbsolute.coerceIn(minBound, maxBound)
+        val overflow = newAbsolute - clamped
+        val resistanceDelta = resistance?.computeResistance(overflow) ?: 0f
+        offsetState.value = clamped + resistanceDelta
+        overflowState.value = overflow
+        absoluteOffset.value = newAbsolute
+    }
+
+    private suspend fun snapInternalToOffset(target: Float) {
+        draggableState.drag {
+            dragBy(target - absoluteOffset.value)
+        }
+    }
+
+    private suspend fun animateInternalToOffset(target: Float, spec: AnimationSpec<Float>) {
+        draggableState.drag {
+            var prevValue = absoluteOffset.value
+            animationTarget.value = target
+            isAnimationRunning = true
+            try {
+                Animatable(prevValue).animateTo(target, spec) {
+                    dragBy(this.value - prevValue)
+                    prevValue = this.value
+                }
+            } finally {
+                animationTarget.value = null
+                isAnimationRunning = false
+            }
+        }
+    }
+
+    /**
+     * The target value of the state.
+     *
+     * If a swipe is in progress, this is the value that the [swipeable] would animate to if the
+     * swipe finished. If an animation is running, this is the target value of that animation.
+     * Finally, if no swipe or animation is in progress, this is the same as the [currentValue].
+     */
+    @ExperimentalMaterial3Api
+    internal val targetValue: T
+        get() {
+            // TODO(calintat): Track current velocity (b/149549482) and use that here.
+            val target = animationTarget.value ?: computeTarget(
+                offset = offset.value,
+                lastValue = anchors.getOffset(currentValue) ?: offset.value,
+                anchors = anchors.keys,
+                thresholds = thresholds,
+                velocity = 0f,
+                velocityThreshold = Float.POSITIVE_INFINITY
+            )
+            return anchors[target] ?: currentValue
+        }
+
+    /**
+     * Information about the ongoing swipe or animation, if any. See [SwipeProgress] for details.
+     *
+     * If no swipe or animation is in progress, this returns `SwipeProgress(value, value, 1f)`.
+     */
+    @ExperimentalMaterial3Api
+    internal val progress: SwipeProgress<T>
+        get() {
+            val bounds = findBounds(offset.value, anchors.keys)
+            val from: T
+            val to: T
+            val fraction: Float
+            when (bounds.size) {
+                0 -> {
+                    from = currentValue
+                    to = currentValue
+                    fraction = 1f
+                }
+                1 -> {
+                    from = anchors.getValue(bounds[0])
+                    to = anchors.getValue(bounds[0])
+                    fraction = 1f
+                }
+                else -> {
+                    val (a, b) =
+                        if (direction > 0f) {
+                            bounds[0] to bounds[1]
+                        } else {
+                            bounds[1] to bounds[0]
+                        }
+                    from = anchors.getValue(a)
+                    to = anchors.getValue(b)
+                    fraction = (offset.value - a) / (b - a)
+                }
+            }
+            return SwipeProgress(from, to, fraction)
+        }
+
+    /**
+     * The direction in which the [swipeable] is moving, relative to the current [currentValue].
+     *
+     * This will be either 1f if it is is moving from left to right or top to bottom, -1f if it is
+     * moving from right to left or bottom to top, or 0f if no swipe or animation is in progress.
+     */
+    @ExperimentalMaterial3Api
+    internal val direction: Float
+        get() = anchors.getOffset(currentValue)?.let { sign(offset.value - it) } ?: 0f
+
+    /**
+     * Set the state without any animation and suspend until it's set
+     *
+     * @param targetValue The new target value to set [currentValue] to.
+     */
+    @ExperimentalMaterial3Api
+    internal suspend fun snapTo(targetValue: T) {
+        latestNonEmptyAnchorsFlow.collect { anchors ->
+            val targetOffset = anchors.getOffset(targetValue)
+            requireNotNull(targetOffset) {
+                "The target value must have an associated anchor."
+            }
+            snapInternalToOffset(targetOffset)
+            currentValue = targetValue
+        }
+    }
+
+    /**
+     * Set the state to the target value by starting an animation.
+     *
+     * @param targetValue The new value to animate to.
+     * @param anim The animation that will be used to animate to the new value.
+     */
+    @ExperimentalMaterial3Api
+    internal suspend fun animateTo(targetValue: T, anim: AnimationSpec<Float> = animationSpec) {
+        latestNonEmptyAnchorsFlow.collect { anchors ->
+            try {
+                val targetOffset = anchors.getOffset(targetValue)
+                requireNotNull(targetOffset) {
+                    "The target value must have an associated anchor."
+                }
+                animateInternalToOffset(targetOffset, anim)
+            } finally {
+                val endOffset = absoluteOffset.value
+                val endValue = anchors
+                    // fighting rounding error once again, anchor should be as close as 0.5 pixels
+                    .filterKeys { anchorOffset -> abs(anchorOffset - endOffset) < 0.5f }
+                    .values.firstOrNull() ?: currentValue
+                currentValue = endValue
+            }
+        }
+    }
+
+    /**
+     * Perform fling with settling to one of the anchors which is determined by the given
+     * [velocity]. Fling with settling [swipeable] will always consume all the velocity provided
+     * since it will settle at the anchor.
+     *
+     * In general cases, [swipeable] flings by itself when being swiped. This method is to be
+     * used for nested scroll logic that wraps the [swipeable]. In nested scroll developer may
+     * want to trigger settling fling when the child scroll container reaches the bound.
+     *
+     * @param velocity velocity to fling and settle with
+     *
+     * @return the reason fling ended
+     */
+    internal suspend fun performFling(velocity: Float) {
+        latestNonEmptyAnchorsFlow.collect { anchors ->
+            val lastAnchor = anchors.getOffset(currentValue)!!
+            val targetValue = computeTarget(
+                offset = offset.value,
+                lastValue = lastAnchor,
+                anchors = anchors.keys,
+                thresholds = thresholds,
+                velocity = velocity,
+                velocityThreshold = velocityThreshold
+            )
+            val targetState = anchors[targetValue]
+            if (targetState != null && confirmStateChange(targetState)) animateTo(targetState)
+            // If the user vetoed the state change, rollback to the previous state.
+            else animateInternalToOffset(lastAnchor, animationSpec)
+        }
+    }
+
+    /**
+     * Force [swipeable] to consume drag delta provided from outside of the regular [swipeable]
+     * gesture flow.
+     *
+     * Note: This method performs generic drag and it won't settle to any particular anchor, *
+     * leaving swipeable in between anchors. When done dragging, [performFling] must be
+     * called as well to ensure swipeable will settle at the anchor.
+     *
+     * In general cases, [swipeable] drags by itself when being swiped. This method is to be
+     * used for nested scroll logic that wraps the [swipeable]. In nested scroll developer may
+     * want to force drag when the child scroll container reaches the bound.
+     *
+     * @param delta delta in pixels to drag by
+     *
+     * @return the amount of [delta] consumed
+     */
+    internal fun performDrag(delta: Float): Float {
+        val potentiallyConsumed = absoluteOffset.value + delta
+        val clamped = potentiallyConsumed.coerceIn(minBound, maxBound)
+        val deltaToConsume = clamped - absoluteOffset.value
+        if (abs(deltaToConsume) > 0) {
+            draggableState.dispatchRawDelta(deltaToConsume)
+        }
+        return deltaToConsume
+    }
+
+    companion object {
+        /**
+         * The default [Saver] implementation for [SwipeableState].
+         */
+        fun <T : Any> Saver(
+            animationSpec: AnimationSpec<Float>,
+            confirmStateChange: (T) -> Boolean
+        ) = Saver<SwipeableState<T>, T>(
+            save = { it.currentValue },
+            restore = { SwipeableState(it, animationSpec, confirmStateChange) }
+        )
+    }
+}
+
+/**
+ * Collects information about the ongoing swipe or animation in [swipeable].
+ *
+ * To access this information, use [SwipeableState.progress].
+ *
+ * @param from The state corresponding to the anchor we are moving away from.
+ * @param to The state corresponding to the anchor we are moving towards.
+ * @param fraction The fraction that the current position represents between [from] and [to].
+ * Must be between `0` and `1`.
+ */
+@Immutable
+@ExperimentalMaterial3Api
+internal class SwipeProgress<T>(
+    val from: T,
+    val to: T,
+    /*@FloatRange(from = 0.0, to = 1.0)*/
+    val fraction: Float
+) {
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other !is SwipeProgress<*>) return false
+
+        if (from != other.from) return false
+        if (to != other.to) return false
+        if (fraction != other.fraction) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = from?.hashCode() ?: 0
+        result = 31 * result + (to?.hashCode() ?: 0)
+        result = 31 * result + fraction.hashCode()
+        return result
+    }
+
+    override fun toString(): String {
+        return "SwipeProgress(from=$from, to=$to, fraction=$fraction)"
+    }
+}
+
+/**
+ * Create and [remember] a [SwipeableState] with the default animation clock.
+ *
+ * @param initialValue The initial value of the state.
+ * @param animationSpec The default animation that will be used to animate to a new state.
+ * @param confirmStateChange Optional callback invoked to confirm or veto a pending state change.
+ */
+@Composable
+@ExperimentalMaterial3Api
+internal fun <T : Any> rememberSwipeableState(
+    initialValue: T,
+    animationSpec: AnimationSpec<Float> = AnimationSpec,
+    confirmStateChange: (newValue: T) -> Boolean = { true }
+): SwipeableState<T> {
+    return rememberSaveable(
+        saver = SwipeableState.Saver(
+            animationSpec = animationSpec,
+            confirmStateChange = confirmStateChange
+        )
+    ) {
+        SwipeableState(
+            initialValue = initialValue,
+            animationSpec = animationSpec,
+            confirmStateChange = confirmStateChange
+        )
+    }
+}
+
+/**
+ * Create and [remember] a [SwipeableState] which is kept in sync with another state, i.e.:
+ *  1. Whenever the [value] changes, the [SwipeableState] will be animated to that new value.
+ *  2. Whenever the value of the [SwipeableState] changes (e.g. after a swipe), the owner of the
+ *  [value] will be notified to update their state to the new value of the [SwipeableState] by
+ *  invoking [onValueChange]. If the owner does not update their state to the provided value for
+ *  some reason, then the [SwipeableState] will perform a rollback to the previous, correct value.
+ */
+@Composable
+@ExperimentalMaterial3Api
+internal fun <T : Any> rememberSwipeableStateFor(
+    value: T,
+    onValueChange: (T) -> Unit,
+    animationSpec: AnimationSpec<Float> = AnimationSpec
+): SwipeableState<T> {
+    val swipeableState = remember {
+        SwipeableState(
+            initialValue = value,
+            animationSpec = animationSpec,
+            confirmStateChange = { true }
+        )
+    }
+    val forceAnimationCheck = remember { mutableStateOf(false) }
+    LaunchedEffect(value, forceAnimationCheck.value) {
+        if (value != swipeableState.currentValue) {
+            swipeableState.animateTo(value)
+        }
+    }
+    DisposableEffect(swipeableState.currentValue) {
+        if (value != swipeableState.currentValue) {
+            onValueChange(swipeableState.currentValue)
+            forceAnimationCheck.value = !forceAnimationCheck.value
+        }
+        onDispose { }
+    }
+    return swipeableState
+}
+
+/**
+ * Enable swipe gestures between a set of predefined states.
+ *
+ * To use this, you must provide a map of anchors (in pixels) to states (of type [T]).
+ * Note that this map cannot be empty and cannot have two anchors mapped to the same state.
+ *
+ * When a swipe is detected, the offset of the [SwipeableState] will be updated with the swipe
+ * delta. You should use this offset to move your content accordingly (see `Modifier.offsetPx`).
+ * When the swipe ends, the offset will be animated to one of the anchors and when that anchor is
+ * reached, the value of the [SwipeableState] will also be updated to the state corresponding to
+ * the new anchor. The target anchor is calculated based on the provided positional [thresholds].
+ *
+ * Swiping is constrained between the minimum and maximum anchors. If the user attempts to swipe
+ * past these bounds, a resistance effect will be applied by default. The amount of resistance at
+ * each edge is specified by the [resistance] config. To disable all resistance, set it to `null`.
+ *
+ * @param T The type of the state.
+ * @param state The state of the [swipeable].
+ * @param anchors Pairs of anchors and states, used to map anchors to states and vice versa.
+ * @param thresholds Specifies where the thresholds between the states are. The thresholds will be
+ * used to determine which state to animate to when swiping stops. This is represented as a lambda
+ * that takes two states and returns the threshold between them in the form of a [ThresholdConfig].
+ * Note that the order of the states corresponds to the swipe direction.
+ * @param orientation The orientation in which the [swipeable] can be swiped.
+ * @param enabled Whether this [swipeable] is enabled and should react to the user's input.
+ * @param reverseDirection Whether to reverse the direction of the swipe, so a top to bottom
+ * swipe will behave like bottom to top, and a left to right swipe will behave like right to left.
+ * @param interactionSource Optional [MutableInteractionSource] that will passed on to
+ * the internal [Modifier.draggable].
+ * @param resistance Controls how much resistance will be applied when swiping past the bounds.
+ * @param velocityThreshold The threshold (in dp per second) that the end velocity has to exceed
+ * in order to animate to the next state, even if the positional [thresholds] have not been reached.
+ */
+@ExperimentalMaterial3Api
+internal fun <T> Modifier.swipeable(
+    state: SwipeableState<T>,
+    anchors: Map<Float, T>,
+    orientation: Orientation,
+    enabled: Boolean = true,
+    reverseDirection: Boolean = false,
+    interactionSource: MutableInteractionSource? = null,
+    thresholds: (from: T, to: T) -> ThresholdConfig = { _, _ -> FixedThreshold(56.dp) },
+    resistance: ResistanceConfig? = resistanceConfig(anchors.keys),
+    velocityThreshold: Dp = VelocityThreshold
+) = composed(
+    inspectorInfo = debugInspectorInfo {
+        name = "swipeable"
+        properties["state"] = state
+        properties["anchors"] = anchors
+        properties["orientation"] = orientation
+        properties["enabled"] = enabled
+        properties["reverseDirection"] = reverseDirection
+        properties["interactionSource"] = interactionSource
+        properties["thresholds"] = thresholds
+        properties["resistance"] = resistance
+        properties["velocityThreshold"] = velocityThreshold
+    }
+) {
+    require(anchors.isNotEmpty()) {
+        "You must have at least one anchor."
+    }
+    require(anchors.values.distinct().count() == anchors.size) {
+        "You cannot have two anchors mapped to the same state."
+    }
+    val density = LocalDensity.current
+    state.ensureInit(anchors)
+    LaunchedEffect(anchors, state) {
+        val oldAnchors = state.anchors
+        state.anchors = anchors
+        state.resistance = resistance
+        state.thresholds = { a, b ->
+            val from = anchors.getValue(a)
+            val to = anchors.getValue(b)
+            with(thresholds(from, to)) { density.computeThreshold(a, b) }
+        }
+        with(density) {
+            state.velocityThreshold = velocityThreshold.toPx()
+        }
+        state.processNewAnchors(oldAnchors, anchors)
+    }
+
+    Modifier.draggable(
+        orientation = orientation,
+        enabled = enabled,
+        reverseDirection = reverseDirection,
+        interactionSource = interactionSource,
+        startDragImmediately = state.isAnimationRunning,
+        onDragStopped = { velocity -> launch { state.performFling(velocity) } },
+        state = state.draggableState
+    )
+}
+
+/**
+ * Interface to compute a threshold between two anchors/states in a [swipeable].
+ *
+ * To define a [ThresholdConfig], consider using [FixedThreshold] and [FractionalThreshold].
+ */
+@Stable
+@ExperimentalMaterial3Api
+internal interface ThresholdConfig {
+    /**
+     * Compute the value of the threshold (in pixels), once the values of the anchors are known.
+     */
+    fun Density.computeThreshold(fromValue: Float, toValue: Float): Float
+}
+
+/**
+ * A fixed threshold will be at an [offset] away from the first anchor.
+ *
+ * @param offset The offset (in dp) that the threshold will be at.
+ */
+@Immutable
+@ExperimentalMaterial3Api
+internal data class FixedThreshold(private val offset: Dp) : ThresholdConfig {
+    override fun Density.computeThreshold(fromValue: Float, toValue: Float): Float {
+        return fromValue + offset.toPx() * sign(toValue - fromValue)
+    }
+}
+
+/**
+ * A fractional threshold will be at a [fraction] of the way between the two anchors.
+ *
+ * @param fraction The fraction (between 0 and 1) that the threshold will be at.
+ */
+@Immutable
+@ExperimentalMaterial3Api
+internal data class FractionalThreshold(
+    /*@FloatRange(from = 0.0, to = 1.0)*/
+    private val fraction: Float
+) : ThresholdConfig {
+    override fun Density.computeThreshold(fromValue: Float, toValue: Float): Float {
+        return lerp(fromValue, toValue, fraction)
+    }
+}
+
+/**
+ * Specifies how resistance is calculated in [swipeable].
+ *
+ * There are two things needed to calculate resistance: the resistance basis determines how much
+ * overflow will be consumed to achieve maximum resistance, and the resistance factor determines
+ * the amount of resistance (the larger the resistance factor, the stronger the resistance).
+ *
+ * The resistance basis is usually either the size of the component which [swipeable] is applied
+ * to, or the distance between the minimum and maximum anchors. For a constructor in which the
+ * resistance basis defaults to the latter, consider using [resistanceConfig].
+ *
+ * You may specify different resistance factors for each bound. Consider using one of the default
+ * resistance factors in [SwipeableDefaults]: `StandardResistanceFactor` to convey that the user
+ * has run out of things to see, and `StiffResistanceFactor` to convey that the user cannot swipe
+ * this right now. Also, you can set either factor to 0 to disable resistance at that bound.
+ *
+ * @param basis Specifies the maximum amount of overflow that will be consumed. Must be positive.
+ * @param factorAtMin The factor by which to scale the resistance at the minimum bound.
+ * Must not be negative.
+ * @param factorAtMax The factor by which to scale the resistance at the maximum bound.
+ * Must not be negative.
+ */
+@Immutable
+internal class ResistanceConfig(
+    /*@FloatRange(from = 0.0, fromInclusive = false)*/
+    val basis: Float,
+    /*@FloatRange(from = 0.0)*/
+    val factorAtMin: Float = StandardResistanceFactor,
+    /*@FloatRange(from = 0.0)*/
+    val factorAtMax: Float = StandardResistanceFactor
+) {
+    fun computeResistance(overflow: Float): Float {
+        val factor = if (overflow < 0) factorAtMin else factorAtMax
+        if (factor == 0f) return 0f
+        val progress = (overflow / basis).coerceIn(-1f, 1f)
+        return basis / factor * sin(progress * PI.toFloat() / 2)
+    }
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other !is ResistanceConfig) return false
+
+        if (basis != other.basis) return false
+        if (factorAtMin != other.factorAtMin) return false
+        if (factorAtMax != other.factorAtMax) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = basis.hashCode()
+        result = 31 * result + factorAtMin.hashCode()
+        result = 31 * result + factorAtMax.hashCode()
+        return result
+    }
+
+    override fun toString(): String {
+        return "ResistanceConfig(basis=$basis, factorAtMin=$factorAtMin, factorAtMax=$factorAtMax)"
+    }
+}
+
+/**
+ *  Given an offset x and a set of anchors, return a list of anchors:
+ *   1. [ ] if the set of anchors is empty,
+ *   2. [ x' ] if x is equal to one of the anchors, accounting for a small rounding error, where x'
+ *      is x rounded to the exact value of the matching anchor,
+ *   3. [ min ] if min is the minimum anchor and x < min,
+ *   4. [ max ] if max is the maximum anchor and x > max, or
+ *   5. [ a , b ] if a and b are anchors such that a < x < b and b - a is minimal.
+ */
+private fun findBounds(
+    offset: Float,
+    anchors: Set<Float>
+): List<Float> {
+    // Find the anchors the target lies between with a little bit of rounding error.
+    val a = anchors.filter { it <= offset + 0.001 }.maxOrNull()
+    val b = anchors.filter { it >= offset - 0.001 }.minOrNull()
+
+    return when {
+        a == null ->
+            // case 1 or 3
+            listOfNotNull(b)
+        b == null ->
+            // case 4
+            listOf(a)
+        a == b ->
+            // case 2
+            // Can't return offset itself here since it might not be exactly equal
+            // to the anchor, despite being considered an exact match.
+            listOf(a)
+        else ->
+            // case 5
+            listOf(a, b)
+    }
+}
+
+private fun computeTarget(
+    offset: Float,
+    lastValue: Float,
+    anchors: Set<Float>,
+    thresholds: (Float, Float) -> Float,
+    velocity: Float,
+    velocityThreshold: Float
+): Float {
+    val bounds = findBounds(offset, anchors)
+    return when (bounds.size) {
+        0 -> lastValue
+        1 -> bounds[0]
+        else -> {
+            val lower = bounds[0]
+            val upper = bounds[1]
+            if (lastValue <= offset) {
+                // Swiping from lower to upper (positive).
+                if (velocity >= velocityThreshold) {
+                    return upper
+                } else {
+                    val threshold = thresholds(lower, upper)
+                    if (offset < threshold) lower else upper
+                }
+            } else {
+                // Swiping from upper to lower (negative).
+                if (velocity <= -velocityThreshold) {
+                    return lower
+                } else {
+                    val threshold = thresholds(upper, lower)
+                    if (offset > threshold) upper else lower
+                }
+            }
+        }
+    }
+}
+
+private fun <T> Map<Float, T>.getOffset(state: T): Float? {
+    return entries.firstOrNull { it.value == state }?.key
+}
+
+/**
+ * Contains useful defaults for [swipeable] and [SwipeableState].
+ */
+internal object SwipeableDefaults {
+    /**
+     * The default animation used by [SwipeableState].
+     */
+    internal val AnimationSpec = SpringSpec<Float>()
+
+    /**
+     * The default velocity threshold (1.8 dp per millisecond) used by [swipeable].
+     */
+    internal val VelocityThreshold = 125.dp
+
+    /**
+     * A stiff resistance factor which indicates that swiping isn't available right now.
+     */
+    const val StiffResistanceFactor = 20f
+
+    /**
+     * A standard resistance factor which indicates that the user has run out of things to see.
+     */
+    const val StandardResistanceFactor = 10f
+
+    /**
+     * The default resistance config used by [swipeable].
+     *
+     * This returns `null` if there is one anchor. If there are at least two anchors, it returns
+     * a [ResistanceConfig] with the resistance basis equal to the distance between the two bounds.
+     */
+    internal fun resistanceConfig(
+        anchors: Set<Float>,
+        factorAtMin: Float = StandardResistanceFactor,
+        factorAtMax: Float = StandardResistanceFactor
+    ): ResistanceConfig? {
+        return if (anchors.size <= 1) {
+            null
+        } else {
+            val basis = anchors.maxOrNull()!! - anchors.minOrNull()!!
+            ResistanceConfig(basis, factorAtMin, factorAtMax)
+        }
+    }
+}
+
+// temp default nested scroll connection for swipeables which desire as an opt in
+// revisit in b/174756744 as all types will have their own specific connection probably
+@ExperimentalMaterial3Api
+internal val <T> SwipeableState<T>.PreUpPostDownNestedScrollConnection: NestedScrollConnection
+    get() = object : NestedScrollConnection {
+        override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
+            val delta = available.toFloat()
+            return if (delta < 0 && source == NestedScrollSource.Drag) {
+                performDrag(delta).toOffset()
+            } else {
+                Offset.Zero
+            }
+        }
+
+        override fun onPostScroll(
+            consumed: Offset,
+            available: Offset,
+            source: NestedScrollSource
+        ): Offset {
+            return if (source == NestedScrollSource.Drag) {
+                performDrag(available.toFloat()).toOffset()
+            } else {
+                Offset.Zero
+            }
+        }
+
+        override suspend fun onPreFling(available: Velocity): Velocity {
+            val toFling = Offset(available.x, available.y).toFloat()
+            return if (toFling < 0 && offset.value > minBound) {
+                performFling(velocity = toFling)
+                // since we go to the anchor with tween settling, consume all for the best UX
+                available
+            } else {
+                Velocity.Zero
+            }
+        }
+
+        override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
+            performFling(velocity = Offset(available.x, available.y).toFloat())
+            return available
+        }
+
+        private fun Float.toOffset(): Offset = Offset(0f, this)
+
+        private fun Offset.toFloat(): Float = this.y
+    }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/compose-material-3-documentation.md b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/compose-material-3-documentation.md
new file mode 100644
index 0000000..bc5301f
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/compose-material-3-documentation.md
@@ -0,0 +1,60 @@
+# Module root
+
+Compose Material 3
+
+# Package androidx.compose.material3
+
+Build Jetpack Compose UIs with <a href="https://m3.material.io" class="external" target="_blank">Material Design 3</a>, the next evolution of Material Design. Material 3 includes updated theming and components and Material You personalization features like dynamic color, and is designed to be cohesive with the new Android 12 visual style and system UI.
+
+![Material You image](https://developer.android.com/images/reference/androidx/compose/material3/material-you.png)
+
+In this page, you'll find documentation for types, properties, and functions available in the `androidx.compose.material3` package.
+
+For more information, check out the <a href="https://developer.android.com/jetpack/compose/themes/material#material3" class="external" target="_blank">Material Design 3 and Material You</a> section in the Material Theming in Compose guide.
+
+## Overview
+
+### Theming
+
+Material 3 makes brand expression in an interface simpler and more beautiful than ever before, with <a href="https://m3.material.io/styles/color/overview" class="external" target="_blank">color</a> and <a href="https://m3.material.io/styles/typography/overview" class="external" target="_blank">typography</a> theming.
+
+|      | **APIs** | **Description** |
+| ---- | -------- | --------------- |
+| **Material Theming** | [MaterialTheme] | M3 theme |
+| **Color scheme** | [ColorScheme] | M3 color scheme |
+| **Dynamic color** | [dynamicLightColorScheme] | Dynamic light color scheme |
+|  | [dynamicDarkColorScheme] | Dynamic dark color scheme |
+| **Typography** | [Typography] | M3 type scale |
+
+### Components
+
+Material 3 Components are interactive building blocks for creating a user interface.
+
+|      | **APIs** | **Description** |
+| ---- | -------- | --------------- |
+| **Buttons** | [Button] | M3 filled button |
+|  | [ElevatedButton] | M3 elevated button |
+|  | [FilledTonalButton] | M3 filled tonal button |
+|  | [OutlinedButton] | M3 outlined button |
+|  | [TextButton] | M3 text button |
+| **FAB** | [FloatingActionButton] | M3 FAB |
+|  | [SmallFloatingActionButton] | M3 small FAB |
+|  | [LargeFloatingActionButton] | M3 large FAB |
+| **Extended FAB** | [ExtendedFloatingActionButton] | M3 extended FAB |
+| **Dialogs** | [AlertDialog] | M3 basic dialog |
+| **Navigation bar** | [NavigationBar] | M3 navigation bar |
+| **Navigation drawer** | [ModalDrawer] | M3 navigation drawer |
+| **Navigation rail** | [NavigationRail] | M3 navigation rail |
+| **Top app bar** | [SmallTopAppBar] | M3 small top app bar |
+|  | [CenterAlignedTopAppBar] | M3 center-aligned top app bar |
+|  | [MediumTopAppBar] | M3 medium top app bar |
+|  | [LargeTopAppBar] | M3 large top app bar |
+
+### Surfaces and layout
+
+Material 3 defines the qualities that can be expressed by UI regions, surfaces, and components.
+
+|      | **APIs** | **Description** |
+| ---- | -------- | --------------- |
+| **Surfaces** | [Surface] | M3 surface |
+| **Layout** | [Scaffold] | Basic M3 visual layout structure |
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/compose-material-documentation.md b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/compose-material-documentation.md
deleted file mode 100644
index e2972ed..0000000
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/compose-material-documentation.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# Module root
-
-Compose Material3
-
-# Package androidx.compose.material3
-
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ExtendedFabPrimary.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ExtendedFabPrimary.kt
new file mode 100644
index 0000000..f1f3ac2
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ExtendedFabPrimary.kt
@@ -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.
+ */
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+package androidx.compose.material3.tokens
+
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.ui.unit.dp
+
+internal object ExtendedFabPrimary {
+    val PrimaryContainerColor = ColorSchemeKey.PrimaryContainer
+    val PrimaryContainerElevation = Elevation.Level3
+    val PrimaryContainerHeight = 56.0.dp
+    val PrimaryContainerShape = RoundedCornerShape(16.0.dp)
+    val PrimaryFocusContainerElevation = Elevation.Level3
+    val PrimaryFocusIconColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimaryFocusLabelTextColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimaryFocusStateLayerColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimaryHoverContainerElevation = Elevation.Level4
+    val PrimaryHoverIconColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimaryHoverLabelTextColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimaryHoverStateLayerColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimaryIconColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimaryIconSize = 24.0.dp
+    val PrimaryLabelTextColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimaryLabelTextFont = TypographyKey.LabelLarge
+    val PrimaryLoweredContainerElevation = Elevation.Level1
+    val PrimaryLoweredFocusContainerElevation = Elevation.Level1
+    val PrimaryLoweredHoverContainerElevation = Elevation.Level2
+    val PrimaryLoweredPressedContainerElevation = Elevation.Level1
+    val PrimaryPressedContainerElevation = Elevation.Level3
+    val PrimaryPressedIconColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimaryPressedLabelTextColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimaryPressedStateLayerColor = ColorSchemeKey.OnPrimaryContainer
+}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FabPrimary.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FabPrimary.kt
new file mode 100644
index 0000000..887e6a7
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FabPrimary.kt
@@ -0,0 +1,44 @@
+/*
+ * 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.
+ */
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+package androidx.compose.material3.tokens
+
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.ui.unit.dp
+
+internal object FabPrimary {
+    val PrimaryContainerColor = ColorSchemeKey.PrimaryContainer
+    val PrimaryContainerElevation = Elevation.Level3
+    val PrimaryContainerHeight = 56.0.dp
+    val PrimaryContainerShape = RoundedCornerShape(16.0.dp)
+    val PrimaryContainerWidth = 56.0.dp
+    val PrimaryFocusContainerElevation = Elevation.Level3
+    val PrimaryFocusIconColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimaryFocusStateLayerColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimaryHoverContainerElevation = Elevation.Level4
+    val PrimaryHoverIconColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimaryHoverStateLayerColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimaryIconColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimaryIconSize = 24.0.dp
+    val PrimaryLoweredContainerElevation = Elevation.Level1
+    val PrimaryLoweredFocusContainerElevation = Elevation.Level1
+    val PrimaryLoweredHoverContainerElevation = Elevation.Level2
+    val PrimaryLoweredPressedContainerElevation = Elevation.Level1
+    val PrimaryPressedContainerElevation = Elevation.Level3
+    val PrimaryPressedIconColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimaryPressedStateLayerColor = ColorSchemeKey.OnPrimaryContainer
+}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FabPrimaryLarge.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FabPrimaryLarge.kt
new file mode 100644
index 0000000..ad17a0b
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FabPrimaryLarge.kt
@@ -0,0 +1,44 @@
+/*
+ * 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.
+ */
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+package androidx.compose.material3.tokens
+
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.ui.unit.dp
+
+internal object FabPrimaryLarge {
+    val PrimaryLargeContainerColor = ColorSchemeKey.PrimaryContainer
+    val PrimaryLargeContainerElevation = Elevation.Level3
+    val PrimaryLargeContainerHeight = 96.0.dp
+    val PrimaryLargeContainerShape = RoundedCornerShape(28.0.dp)
+    val PrimaryLargeContainerWidth = 96.0.dp
+    val PrimaryLargeFocusContainerElevation = Elevation.Level3
+    val PrimaryLargeFocusIconColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimaryLargeFocusStateLayerColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimaryLargeHoverContainerElevation = Elevation.Level4
+    val PrimaryLargeHoverIconColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimaryLargeHoverStateLayerColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimaryLargeIconColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimaryLargeIconSize = 36.0.dp
+    val PrimaryLargeLoweredContainerElevation = Elevation.Level1
+    val PrimaryLargeLoweredFocusContainerElevation = Elevation.Level1
+    val PrimaryLargeLoweredHoverContainerElevation = Elevation.Level2
+    val PrimaryLargeLoweredPressedContainerElevation = Elevation.Level1
+    val PrimaryLargePressedContainerElevation = Elevation.Level3
+    val PrimaryLargePressedIconColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimaryLargePressedStateLayerColor = ColorSchemeKey.OnPrimaryContainer
+}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FabPrimarySmall.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FabPrimarySmall.kt
new file mode 100644
index 0000000..d8159dd9
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FabPrimarySmall.kt
@@ -0,0 +1,44 @@
+/*
+ * 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.
+ */
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+package androidx.compose.material3.tokens
+
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.ui.unit.dp
+
+internal object FabPrimarySmall {
+    val PrimarySmallContainerColor = ColorSchemeKey.PrimaryContainer
+    val PrimarySmallContainerElevation = Elevation.Level3
+    val PrimarySmallContainerHeight = 40.0.dp
+    val PrimarySmallContainerShape = RoundedCornerShape(12.0.dp)
+    val PrimarySmallContainerWidth = 40.0.dp
+    val PrimarySmallFocusContainerElevation = Elevation.Level3
+    val PrimarySmallFocusIconColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimarySmallFocusStateLayerColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimarySmallHoverContainerElevation = Elevation.Level4
+    val PrimarySmallHoverIconColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimarySmallHoverStateLayerColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimarySmallIconColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimarySmallIconSize = 24.0.dp
+    val PrimarySmallLoweredContainerElevation = Elevation.Level1
+    val PrimarySmallLoweredFocusContainerElevation = Elevation.Level1
+    val PrimarySmallLoweredHoverContainerElevation = Elevation.Level2
+    val PrimarySmallLoweredPressedContainerElevation = Elevation.Level1
+    val PrimarySmallPressedContainerElevation = Elevation.Level3
+    val PrimarySmallPressedIconColor = ColorSchemeKey.OnPrimaryContainer
+    val PrimarySmallPressedStateLayerColor = ColorSchemeKey.OnPrimaryContainer
+}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/NavigationDrawer.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/NavigationDrawer.kt
new file mode 100644
index 0000000..cce5fb7
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/NavigationDrawer.kt
@@ -0,0 +1,63 @@
+/*
+ * 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.
+ */
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+package androidx.compose.material3.tokens
+
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.ui.unit.dp
+
+internal object NavigationDrawer {
+    val ActiveFocusIconColor = ColorSchemeKey.OnSecondaryContainer
+    val ActiveFocusLabelTextColor = ColorSchemeKey.OnSecondaryContainer
+    val ActiveFocusStateLayerColor = ColorSchemeKey.OnSecondaryContainer
+    val ActiveHoverIconColor = ColorSchemeKey.OnSecondaryContainer
+    val ActiveHoverLabelTextColor = ColorSchemeKey.OnSecondaryContainer
+    val ActiveHoverStateLayerColor = ColorSchemeKey.OnSecondaryContainer
+    val ActiveIconColor = ColorSchemeKey.OnSecondaryContainer
+    val ActiveIndicatorColor = ColorSchemeKey.SecondaryContainer
+    val ActiveIndicatorHeight = 56.0.dp
+    val ActiveIndicatorShape = RoundedCornerShape(28.0.dp)
+    val ActiveIndicatorWidth = 336.0.dp
+    val ActiveLabelTextColor = ColorSchemeKey.OnSecondaryContainer
+    val ActivePressedIconColor = ColorSchemeKey.OnSecondaryContainer
+    val ActivePressedLabelTextColor = ColorSchemeKey.OnSecondaryContainer
+    val ActivePressedStateLayerColor = ColorSchemeKey.OnSecondaryContainer
+    val ContainerColor = ColorSchemeKey.Surface
+    const val ContainerHeightPercent = 100.0f
+    val ContainerWidth = 360.0.dp
+    val DividerColor = ColorSchemeKey.Outline
+    val HeadlineColor = ColorSchemeKey.OnSurfaceVariant
+    val HeadlineFont = TypographyKey.TitleSmall
+    val IconSize = 24.0.dp
+    val InactiveFocusIconColor = ColorSchemeKey.OnSurface
+    val InactiveFocusLabelTextColor = ColorSchemeKey.OnSurface
+    val InactiveFocusStateLayerColor = ColorSchemeKey.OnSurface
+    val InactiveHoverIconColor = ColorSchemeKey.OnSurface
+    val InactiveHoverLabelTextColor = ColorSchemeKey.OnSurface
+    val InactiveHoverStateLayerColor = ColorSchemeKey.OnSurface
+    val InactiveIconColor = ColorSchemeKey.OnSurfaceVariant
+    val InactiveLabelTextColor = ColorSchemeKey.OnSurfaceVariant
+    val InactivePressedIconColor = ColorSchemeKey.OnSurface
+    val InactivePressedLabelTextColor = ColorSchemeKey.OnSurface
+    val InactivePressedStateLayerColor = ColorSchemeKey.OnSecondaryContainer
+    val LabelTextFont = TypographyKey.LabelLarge
+    val LargeBadgeLabelColor = ColorSchemeKey.OnSurfaceVariant
+    val LargeBadgeLabelFont = TypographyKey.LabelLarge
+    val ModalContainerElevation = Elevation.Level1
+    const val ScrimOpacity = 0.4f
+    val StandardContainerElevation = Elevation.Level0
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopAccessibilityManager.kt b/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material/Strings.desktop.kt
similarity index 60%
copy from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopAccessibilityManager.kt
copy to compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material/Strings.desktop.kt
index c007938..8acb9f1 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopAccessibilityManager.kt
+++ b/compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material/Strings.desktop.kt
@@ -14,15 +14,17 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.platform
+package androidx.compose.material3
 
-internal class DesktopAccessibilityManager : AccessibilityManager {
-    override fun calculateRecommendedTimeoutMillis(
-        originalTimeoutMillis: Long,
-        containsIcons: Boolean,
-        containsText: Boolean,
-        containsControls: Boolean
-    ): Long {
-        return originalTimeoutMillis
+import androidx.compose.runtime.Composable
+
+@Composable
+internal actual fun getString(string: Strings): String {
+    return when (string) {
+        Strings.NavigationMenu -> "Navigation menu"
+        Strings.CloseDrawer -> "Close navigation menu"
+        Strings.CloseSheet -> "Close sheet"
+        Strings.DefaultErrorMessage -> "Invalid input"
+        else -> ""
     }
-}
+}
\ No newline at end of file
diff --git a/compose/runtime/runtime-livedata/api/1.1.0-beta02.txt b/compose/runtime/runtime-livedata/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..e004a29
--- /dev/null
+++ b/compose/runtime/runtime-livedata/api/1.1.0-beta02.txt
@@ -0,0 +1,10 @@
+// Signature format: 4.0
+package androidx.compose.runtime.livedata {
+
+  public final class LiveDataAdapterKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> observeAsState(androidx.lifecycle.LiveData<T>);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> observeAsState(androidx.lifecycle.LiveData<T>, R? initial);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-livedata/api/public_plus_experimental_1.1.0-beta02.txt b/compose/runtime/runtime-livedata/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..e004a29
--- /dev/null
+++ b/compose/runtime/runtime-livedata/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,10 @@
+// Signature format: 4.0
+package androidx.compose.runtime.livedata {
+
+  public final class LiveDataAdapterKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> observeAsState(androidx.lifecycle.LiveData<T>);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> observeAsState(androidx.lifecycle.LiveData<T>, R? initial);
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/runtime/runtime-livedata/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to compose/runtime/runtime-livedata/api/res-1.1.0-beta02.txt
diff --git a/compose/runtime/runtime-livedata/api/restricted_1.1.0-beta02.txt b/compose/runtime/runtime-livedata/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..e004a29
--- /dev/null
+++ b/compose/runtime/runtime-livedata/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,10 @@
+// Signature format: 4.0
+package androidx.compose.runtime.livedata {
+
+  public final class LiveDataAdapterKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> observeAsState(androidx.lifecycle.LiveData<T>);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> observeAsState(androidx.lifecycle.LiveData<T>, R? initial);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-rxjava2/api/1.1.0-beta02.txt b/compose/runtime/runtime-rxjava2/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..fb30f38
--- /dev/null
+++ b/compose/runtime/runtime-rxjava2/api/1.1.0-beta02.txt
@@ -0,0 +1,13 @@
+// Signature format: 4.0
+package androidx.compose.runtime.rxjava2 {
+
+  public final class RxJava2AdapterKt {
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Observable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Flowable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Single<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Maybe<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> subscribeAsState(io.reactivex.Completable);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-rxjava2/api/public_plus_experimental_1.1.0-beta02.txt b/compose/runtime/runtime-rxjava2/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..fb30f38
--- /dev/null
+++ b/compose/runtime/runtime-rxjava2/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,13 @@
+// Signature format: 4.0
+package androidx.compose.runtime.rxjava2 {
+
+  public final class RxJava2AdapterKt {
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Observable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Flowable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Single<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Maybe<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> subscribeAsState(io.reactivex.Completable);
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/runtime/runtime-rxjava2/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to compose/runtime/runtime-rxjava2/api/res-1.1.0-beta02.txt
diff --git a/compose/runtime/runtime-rxjava2/api/restricted_1.1.0-beta02.txt b/compose/runtime/runtime-rxjava2/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..fb30f38
--- /dev/null
+++ b/compose/runtime/runtime-rxjava2/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,13 @@
+// Signature format: 4.0
+package androidx.compose.runtime.rxjava2 {
+
+  public final class RxJava2AdapterKt {
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Observable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Flowable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Single<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.Maybe<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> subscribeAsState(io.reactivex.Completable);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-rxjava3/api/1.1.0-beta02.txt b/compose/runtime/runtime-rxjava3/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..1930cc8
--- /dev/null
+++ b/compose/runtime/runtime-rxjava3/api/1.1.0-beta02.txt
@@ -0,0 +1,13 @@
+// Signature format: 4.0
+package androidx.compose.runtime.rxjava3 {
+
+  public final class RxJava3AdapterKt {
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Observable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Flowable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Single<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Maybe<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> subscribeAsState(io.reactivex.rxjava3.core.Completable);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-rxjava3/api/public_plus_experimental_1.1.0-beta02.txt b/compose/runtime/runtime-rxjava3/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..1930cc8
--- /dev/null
+++ b/compose/runtime/runtime-rxjava3/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,13 @@
+// Signature format: 4.0
+package androidx.compose.runtime.rxjava3 {
+
+  public final class RxJava3AdapterKt {
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Observable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Flowable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Single<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Maybe<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> subscribeAsState(io.reactivex.rxjava3.core.Completable);
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/runtime/runtime-rxjava3/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to compose/runtime/runtime-rxjava3/api/res-1.1.0-beta02.txt
diff --git a/compose/runtime/runtime-rxjava3/api/restricted_1.1.0-beta02.txt b/compose/runtime/runtime-rxjava3/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..1930cc8
--- /dev/null
+++ b/compose/runtime/runtime-rxjava3/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,13 @@
+// Signature format: 4.0
+package androidx.compose.runtime.rxjava3 {
+
+  public final class RxJava3AdapterKt {
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Observable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Flowable<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Single<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static <R, T extends R> androidx.compose.runtime.State<R> subscribeAsState(io.reactivex.rxjava3.core.Maybe<T>, R? initial);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<java.lang.Boolean> subscribeAsState(io.reactivex.rxjava3.core.Completable);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-saveable/api/1.1.0-beta02.txt b/compose/runtime/runtime-saveable/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..ce5d51b
--- /dev/null
+++ b/compose/runtime/runtime-saveable/api/1.1.0-beta02.txt
@@ -0,0 +1,58 @@
+// Signature format: 4.0
+package androidx.compose.runtime.saveable {
+
+  public final class ListSaverKt {
+    method public static <Original, Saveable> androidx.compose.runtime.saveable.Saver<Original,java.lang.Object> listSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super Original,? extends java.util.List<? extends Saveable>> save, kotlin.jvm.functions.Function1<? super java.util.List<? extends Saveable>,? extends Original> restore);
+  }
+
+  public final class MapSaverKt {
+    method public static <T> androidx.compose.runtime.saveable.Saver<T,java.lang.Object> mapSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super T,? extends java.util.Map<java.lang.String,?>> save, kotlin.jvm.functions.Function1<? super java.util.Map<java.lang.String,?>,? extends T> restore);
+  }
+
+  public final class RememberSaveableKt {
+    method @androidx.compose.runtime.Composable public static <T> T rememberSaveable(Object![]? inputs, optional androidx.compose.runtime.saveable.Saver<T,?> saver, optional String? key, kotlin.jvm.functions.Function0<? extends T> init);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.MutableState<T> rememberSaveable(Object![]? inputs, androidx.compose.runtime.saveable.Saver<T,?> stateSaver, optional String? key, kotlin.jvm.functions.Function0<? extends androidx.compose.runtime.MutableState<T>> init);
+  }
+
+  public interface SaveableStateHolder {
+    method @androidx.compose.runtime.Composable public void SaveableStateProvider(Object key, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public void removeState(Object key);
+  }
+
+  public final class SaveableStateHolderKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.saveable.SaveableStateHolder rememberSaveableStateHolder();
+  }
+
+  public interface SaveableStateRegistry {
+    method public boolean canBeSaved(Object value);
+    method public Object? consumeRestored(String key);
+    method public java.util.Map<java.lang.String,java.util.List<java.lang.Object>> performSave();
+    method public androidx.compose.runtime.saveable.SaveableStateRegistry.Entry registerProvider(String key, kotlin.jvm.functions.Function0<?> valueProvider);
+  }
+
+  public static interface SaveableStateRegistry.Entry {
+    method public void unregister();
+  }
+
+  public final class SaveableStateRegistryKt {
+    method public static androidx.compose.runtime.saveable.SaveableStateRegistry SaveableStateRegistry(java.util.Map<java.lang.String,? extends java.util.List<?>>? restoredValues, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> canBeSaved);
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> getLocalSaveableStateRegistry();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> LocalSaveableStateRegistry;
+  }
+
+  public interface Saver<Original, Saveable> {
+    method public Original? restore(Saveable value);
+    method public Saveable? save(androidx.compose.runtime.saveable.SaverScope, Original? value);
+  }
+
+  public final class SaverKt {
+    method public static <Original, Saveable> androidx.compose.runtime.saveable.Saver<Original,Saveable> Saver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super Original,? extends Saveable> save, kotlin.jvm.functions.Function1<? super Saveable,? extends Original> restore);
+    method public static <T> androidx.compose.runtime.saveable.Saver<T,java.lang.Object> autoSaver();
+  }
+
+  public fun interface SaverScope {
+    method public boolean canBeSaved(Object value);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-saveable/api/current.txt b/compose/runtime/runtime-saveable/api/current.txt
index 9622306..ce5d51b 100644
--- a/compose/runtime/runtime-saveable/api/current.txt
+++ b/compose/runtime/runtime-saveable/api/current.txt
@@ -37,6 +37,7 @@
   public final class SaveableStateRegistryKt {
     method public static androidx.compose.runtime.saveable.SaveableStateRegistry SaveableStateRegistry(java.util.Map<java.lang.String,? extends java.util.List<?>>? restoredValues, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> canBeSaved);
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> getLocalSaveableStateRegistry();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> LocalSaveableStateRegistry;
   }
 
   public interface Saver<Original, Saveable> {
diff --git a/compose/runtime/runtime-saveable/api/public_plus_experimental_1.1.0-beta02.txt b/compose/runtime/runtime-saveable/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..ce5d51b
--- /dev/null
+++ b/compose/runtime/runtime-saveable/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,58 @@
+// Signature format: 4.0
+package androidx.compose.runtime.saveable {
+
+  public final class ListSaverKt {
+    method public static <Original, Saveable> androidx.compose.runtime.saveable.Saver<Original,java.lang.Object> listSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super Original,? extends java.util.List<? extends Saveable>> save, kotlin.jvm.functions.Function1<? super java.util.List<? extends Saveable>,? extends Original> restore);
+  }
+
+  public final class MapSaverKt {
+    method public static <T> androidx.compose.runtime.saveable.Saver<T,java.lang.Object> mapSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super T,? extends java.util.Map<java.lang.String,?>> save, kotlin.jvm.functions.Function1<? super java.util.Map<java.lang.String,?>,? extends T> restore);
+  }
+
+  public final class RememberSaveableKt {
+    method @androidx.compose.runtime.Composable public static <T> T rememberSaveable(Object![]? inputs, optional androidx.compose.runtime.saveable.Saver<T,?> saver, optional String? key, kotlin.jvm.functions.Function0<? extends T> init);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.MutableState<T> rememberSaveable(Object![]? inputs, androidx.compose.runtime.saveable.Saver<T,?> stateSaver, optional String? key, kotlin.jvm.functions.Function0<? extends androidx.compose.runtime.MutableState<T>> init);
+  }
+
+  public interface SaveableStateHolder {
+    method @androidx.compose.runtime.Composable public void SaveableStateProvider(Object key, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public void removeState(Object key);
+  }
+
+  public final class SaveableStateHolderKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.saveable.SaveableStateHolder rememberSaveableStateHolder();
+  }
+
+  public interface SaveableStateRegistry {
+    method public boolean canBeSaved(Object value);
+    method public Object? consumeRestored(String key);
+    method public java.util.Map<java.lang.String,java.util.List<java.lang.Object>> performSave();
+    method public androidx.compose.runtime.saveable.SaveableStateRegistry.Entry registerProvider(String key, kotlin.jvm.functions.Function0<?> valueProvider);
+  }
+
+  public static interface SaveableStateRegistry.Entry {
+    method public void unregister();
+  }
+
+  public final class SaveableStateRegistryKt {
+    method public static androidx.compose.runtime.saveable.SaveableStateRegistry SaveableStateRegistry(java.util.Map<java.lang.String,? extends java.util.List<?>>? restoredValues, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> canBeSaved);
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> getLocalSaveableStateRegistry();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> LocalSaveableStateRegistry;
+  }
+
+  public interface Saver<Original, Saveable> {
+    method public Original? restore(Saveable value);
+    method public Saveable? save(androidx.compose.runtime.saveable.SaverScope, Original? value);
+  }
+
+  public final class SaverKt {
+    method public static <Original, Saveable> androidx.compose.runtime.saveable.Saver<Original,Saveable> Saver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super Original,? extends Saveable> save, kotlin.jvm.functions.Function1<? super Saveable,? extends Original> restore);
+    method public static <T> androidx.compose.runtime.saveable.Saver<T,java.lang.Object> autoSaver();
+  }
+
+  public fun interface SaverScope {
+    method public boolean canBeSaved(Object value);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-saveable/api/public_plus_experimental_current.txt b/compose/runtime/runtime-saveable/api/public_plus_experimental_current.txt
index 9622306..ce5d51b 100644
--- a/compose/runtime/runtime-saveable/api/public_plus_experimental_current.txt
+++ b/compose/runtime/runtime-saveable/api/public_plus_experimental_current.txt
@@ -37,6 +37,7 @@
   public final class SaveableStateRegistryKt {
     method public static androidx.compose.runtime.saveable.SaveableStateRegistry SaveableStateRegistry(java.util.Map<java.lang.String,? extends java.util.List<?>>? restoredValues, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> canBeSaved);
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> getLocalSaveableStateRegistry();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> LocalSaveableStateRegistry;
   }
 
   public interface Saver<Original, Saveable> {
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/runtime/runtime-saveable/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to compose/runtime/runtime-saveable/api/res-1.1.0-beta02.txt
diff --git a/compose/runtime/runtime-saveable/api/restricted_1.1.0-beta02.txt b/compose/runtime/runtime-saveable/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..ce5d51b
--- /dev/null
+++ b/compose/runtime/runtime-saveable/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,58 @@
+// Signature format: 4.0
+package androidx.compose.runtime.saveable {
+
+  public final class ListSaverKt {
+    method public static <Original, Saveable> androidx.compose.runtime.saveable.Saver<Original,java.lang.Object> listSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super Original,? extends java.util.List<? extends Saveable>> save, kotlin.jvm.functions.Function1<? super java.util.List<? extends Saveable>,? extends Original> restore);
+  }
+
+  public final class MapSaverKt {
+    method public static <T> androidx.compose.runtime.saveable.Saver<T,java.lang.Object> mapSaver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super T,? extends java.util.Map<java.lang.String,?>> save, kotlin.jvm.functions.Function1<? super java.util.Map<java.lang.String,?>,? extends T> restore);
+  }
+
+  public final class RememberSaveableKt {
+    method @androidx.compose.runtime.Composable public static <T> T rememberSaveable(Object![]? inputs, optional androidx.compose.runtime.saveable.Saver<T,?> saver, optional String? key, kotlin.jvm.functions.Function0<? extends T> init);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.MutableState<T> rememberSaveable(Object![]? inputs, androidx.compose.runtime.saveable.Saver<T,?> stateSaver, optional String? key, kotlin.jvm.functions.Function0<? extends androidx.compose.runtime.MutableState<T>> init);
+  }
+
+  public interface SaveableStateHolder {
+    method @androidx.compose.runtime.Composable public void SaveableStateProvider(Object key, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public void removeState(Object key);
+  }
+
+  public final class SaveableStateHolderKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.saveable.SaveableStateHolder rememberSaveableStateHolder();
+  }
+
+  public interface SaveableStateRegistry {
+    method public boolean canBeSaved(Object value);
+    method public Object? consumeRestored(String key);
+    method public java.util.Map<java.lang.String,java.util.List<java.lang.Object>> performSave();
+    method public androidx.compose.runtime.saveable.SaveableStateRegistry.Entry registerProvider(String key, kotlin.jvm.functions.Function0<?> valueProvider);
+  }
+
+  public static interface SaveableStateRegistry.Entry {
+    method public void unregister();
+  }
+
+  public final class SaveableStateRegistryKt {
+    method public static androidx.compose.runtime.saveable.SaveableStateRegistry SaveableStateRegistry(java.util.Map<java.lang.String,? extends java.util.List<?>>? restoredValues, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> canBeSaved);
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> getLocalSaveableStateRegistry();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> LocalSaveableStateRegistry;
+  }
+
+  public interface Saver<Original, Saveable> {
+    method public Original? restore(Saveable value);
+    method public Saveable? save(androidx.compose.runtime.saveable.SaverScope, Original? value);
+  }
+
+  public final class SaverKt {
+    method public static <Original, Saveable> androidx.compose.runtime.saveable.Saver<Original,Saveable> Saver(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.saveable.SaverScope,? super Original,? extends Saveable> save, kotlin.jvm.functions.Function1<? super Saveable,? extends Original> restore);
+    method public static <T> androidx.compose.runtime.saveable.Saver<T,java.lang.Object> autoSaver();
+  }
+
+  public fun interface SaverScope {
+    method public boolean canBeSaved(Object value);
+  }
+
+}
+
diff --git a/compose/runtime/runtime-saveable/api/restricted_current.txt b/compose/runtime/runtime-saveable/api/restricted_current.txt
index 9622306..ce5d51b 100644
--- a/compose/runtime/runtime-saveable/api/restricted_current.txt
+++ b/compose/runtime/runtime-saveable/api/restricted_current.txt
@@ -37,6 +37,7 @@
   public final class SaveableStateRegistryKt {
     method public static androidx.compose.runtime.saveable.SaveableStateRegistry SaveableStateRegistry(java.util.Map<java.lang.String,? extends java.util.List<?>>? restoredValues, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> canBeSaved);
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> getLocalSaveableStateRegistry();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.runtime.saveable.SaveableStateRegistry> LocalSaveableStateRegistry;
   }
 
   public interface Saver<Original, Saveable> {
diff --git a/compose/runtime/runtime/api/1.1.0-beta02.txt b/compose/runtime/runtime/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..d67558a
--- /dev/null
+++ b/compose/runtime/runtime/api/1.1.0-beta02.txt
@@ -0,0 +1,900 @@
+// Signature format: 4.0
+package androidx.compose.runtime {
+
+  public abstract class AbstractApplier<T> implements androidx.compose.runtime.Applier<T> {
+    ctor public AbstractApplier(T? root);
+    method public final void clear();
+    method public void down(T? node);
+    method public T! getCurrent();
+    method public final T! getRoot();
+    method protected final void move(java.util.List<T>, int from, int to, int count);
+    method protected abstract void onClear();
+    method protected final void remove(java.util.List<T>, int index, int count);
+    method protected void setCurrent(T! current);
+    method public void up();
+    property public T! current;
+    property public final T! root;
+  }
+
+  public final class ActualAndroid_androidKt {
+    method @Deprecated public static androidx.compose.runtime.MonotonicFrameClock getDefaultMonotonicFrameClock();
+    property @Deprecated public static final androidx.compose.runtime.MonotonicFrameClock DefaultMonotonicFrameClock;
+  }
+
+  public final class ActualJvm_jvmKt {
+  }
+
+  public interface Applier<N> {
+    method public void clear();
+    method public void down(N? node);
+    method public N! getCurrent();
+    method public void insertBottomUp(int index, N? instance);
+    method public void insertTopDown(int index, N? instance);
+    method public void move(int from, int to, int count);
+    method public default void onBeginChanges();
+    method public default void onEndChanges();
+    method public void remove(int index, int count);
+    method public void up();
+    property public abstract N! current;
+  }
+
+  public final class BitwiseOperatorsKt {
+  }
+
+  public final class BroadcastFrameClock implements androidx.compose.runtime.MonotonicFrameClock {
+    ctor public BroadcastFrameClock(optional kotlin.jvm.functions.Function0<kotlin.Unit>? onNewAwaiters);
+    method public void cancel(optional java.util.concurrent.CancellationException cancellationException);
+    method public boolean getHasAwaiters();
+    method public void sendFrame(long timeNanos);
+    method public suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+    property public final boolean hasAwaiters;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface Composable {
+  }
+
+  public final class ComposablesKt {
+    method @androidx.compose.runtime.Composable public static inline <T extends java.lang.Object, reified E extends androidx.compose.runtime.Applier<?>> void ComposeNode(kotlin.jvm.functions.Function0<? extends T> factory, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,? extends kotlin.Unit> update);
+    method @androidx.compose.runtime.Composable public static inline <T extends java.lang.Object, reified E extends androidx.compose.runtime.Applier<?>> void ComposeNode(kotlin.jvm.functions.Function0<? extends T> factory, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,? extends kotlin.Unit> update, kotlin.jvm.functions.Function0<? extends kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ExplicitGroupsComposable public static inline <T, reified E extends androidx.compose.runtime.Applier<?>> void ComposeNode(kotlin.jvm.functions.Function0<? extends T> factory, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,? extends kotlin.Unit> update, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.SkippableUpdater<T>,? extends kotlin.Unit> skippableUpdate, kotlin.jvm.functions.Function0<? extends kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static inline <T extends java.lang.Object, reified E extends androidx.compose.runtime.Applier<?>> void ReusableComposeNode(kotlin.jvm.functions.Function0<? extends T> factory, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,? extends kotlin.Unit> update);
+    method @androidx.compose.runtime.Composable public static inline <T extends java.lang.Object, reified E extends androidx.compose.runtime.Applier<?>> void ReusableComposeNode(kotlin.jvm.functions.Function0<? extends T> factory, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,? extends kotlin.Unit> update, kotlin.jvm.functions.Function0<? extends kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ExplicitGroupsComposable public static inline <T, reified E extends androidx.compose.runtime.Applier<?>> void ReusableComposeNode(kotlin.jvm.functions.Function0<? extends T> factory, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,? extends kotlin.Unit> update, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.SkippableUpdater<T>,? extends kotlin.Unit> skippableUpdate, kotlin.jvm.functions.Function0<? extends kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static inline void ReusableContent(Object? key, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static androidx.compose.runtime.Composer getCurrentComposer();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ExplicitGroupsComposable public static int getCurrentCompositeKeyHash();
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.CompositionLocalContext getCurrentCompositionLocalContext();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static androidx.compose.runtime.RecomposeScope getCurrentRecomposeScope();
+    method @androidx.compose.runtime.Composable public static inline <T> T! key(Object![]? keys, kotlin.jvm.functions.Function0<? extends T> block);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object? key1, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object? key1, Object? key2, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object![]? keys, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.CompositionContext rememberCompositionContext();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static final androidx.compose.runtime.Composer currentComposer;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ExplicitGroupsComposable public static final int currentCompositeKeyHash;
+    property @androidx.compose.runtime.Composable public static final androidx.compose.runtime.CompositionLocalContext currentCompositionLocalContext;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static final androidx.compose.runtime.RecomposeScope currentRecomposeScope;
+  }
+
+  @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ComposeCompilerApi {
+  }
+
+  public interface Composer {
+    method @androidx.compose.runtime.ComposeCompilerApi public <V, T> void apply(V? value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+    method @androidx.compose.runtime.ComposeCompilerApi public boolean changed(Object? value);
+    method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(boolean value);
+    method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(char value);
+    method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(byte value);
+    method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(short value);
+    method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(int value);
+    method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(float value);
+    method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(long value);
+    method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(double value);
+    method public void collectParameterInformation();
+    method @androidx.compose.runtime.ComposeCompilerApi public <T> void createNode(kotlin.jvm.functions.Function0<? extends T> factory);
+    method @androidx.compose.runtime.ComposeCompilerApi public void disableReusing();
+    method @androidx.compose.runtime.ComposeCompilerApi public void enableReusing();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endDefaults();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endMovableGroup();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endNode();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endReplaceableGroup();
+    method @androidx.compose.runtime.ComposeCompilerApi public androidx.compose.runtime.ScopeUpdateScope? endRestartGroup();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endReusableGroup();
+    method public androidx.compose.runtime.Applier<?> getApplier();
+    method @org.jetbrains.annotations.TestOnly public kotlin.coroutines.CoroutineContext getApplyCoroutineContext();
+    method @org.jetbrains.annotations.TestOnly public androidx.compose.runtime.ControlledComposition getComposition();
+    method public androidx.compose.runtime.tooling.CompositionData getCompositionData();
+    method public int getCompoundKeyHash();
+    method public boolean getDefaultsInvalid();
+    method public boolean getInserting();
+    method public androidx.compose.runtime.RecomposeScope? getRecomposeScope();
+    method public boolean getSkipping();
+    method @androidx.compose.runtime.ComposeCompilerApi public Object joinKey(Object? left, Object? right);
+    method @androidx.compose.runtime.ComposeCompilerApi public Object? rememberedValue();
+    method @androidx.compose.runtime.ComposeCompilerApi public void skipCurrentGroup();
+    method @androidx.compose.runtime.ComposeCompilerApi public void skipToGroupEnd();
+    method public void sourceInformation(String sourceInformation);
+    method public void sourceInformationMarkerEnd();
+    method public void sourceInformationMarkerStart(int key, String sourceInformation);
+    method @androidx.compose.runtime.ComposeCompilerApi public void startDefaults();
+    method @androidx.compose.runtime.ComposeCompilerApi public void startMovableGroup(int key, Object? dataKey);
+    method @androidx.compose.runtime.ComposeCompilerApi public void startNode();
+    method @androidx.compose.runtime.ComposeCompilerApi public void startReplaceableGroup(int key);
+    method @androidx.compose.runtime.ComposeCompilerApi public androidx.compose.runtime.Composer startRestartGroup(int key);
+    method @androidx.compose.runtime.ComposeCompilerApi public void startReusableGroup(int key, Object? dataKey);
+    method @androidx.compose.runtime.ComposeCompilerApi public void startReusableNode();
+    method @androidx.compose.runtime.ComposeCompilerApi public void updateRememberedValue(Object? value);
+    method @androidx.compose.runtime.ComposeCompilerApi public void useNode();
+    property public abstract androidx.compose.runtime.Applier<?> applier;
+    property @org.jetbrains.annotations.TestOnly public abstract kotlin.coroutines.CoroutineContext applyCoroutineContext;
+    property @org.jetbrains.annotations.TestOnly public abstract androidx.compose.runtime.ControlledComposition composition;
+    property public abstract androidx.compose.runtime.tooling.CompositionData compositionData;
+    property public abstract int compoundKeyHash;
+    property public abstract boolean defaultsInvalid;
+    property public abstract boolean inserting;
+    property public abstract androidx.compose.runtime.RecomposeScope? recomposeScope;
+    property public abstract boolean skipping;
+    field public static final androidx.compose.runtime.Composer.Companion Companion;
+  }
+
+  public static final class Composer.Companion {
+    method public Object getEmpty();
+    property public final Object Empty;
+  }
+
+  public final class ComposerKt {
+    method @androidx.compose.runtime.ComposeCompilerApi public static inline <T> T! cache(androidx.compose.runtime.Composer, boolean invalid, kotlin.jvm.functions.Function0<? extends T> block);
+    method @androidx.compose.runtime.ComposeCompilerApi public static void sourceInformation(androidx.compose.runtime.Composer composer, String sourceInformation);
+    method @androidx.compose.runtime.ComposeCompilerApi public static void sourceInformationMarkerEnd(androidx.compose.runtime.Composer composer);
+    method @androidx.compose.runtime.ComposeCompilerApi public static void sourceInformationMarkerStart(androidx.compose.runtime.Composer composer, int key, String sourceInformation);
+  }
+
+  public interface Composition {
+    method public void dispose();
+    method public boolean getHasInvalidations();
+    method public boolean isDisposed();
+    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    property public abstract boolean hasInvalidations;
+    property public abstract boolean isDisposed;
+  }
+
+  public abstract class CompositionContext {
+  }
+
+  public final class CompositionContextKt {
+  }
+
+  public final class CompositionKt {
+    method public static androidx.compose.runtime.Composition Composition(androidx.compose.runtime.Applier<?> applier, androidx.compose.runtime.CompositionContext parent);
+    method @org.jetbrains.annotations.TestOnly public static androidx.compose.runtime.ControlledComposition ControlledComposition(androidx.compose.runtime.Applier<?> applier, androidx.compose.runtime.CompositionContext parent);
+  }
+
+  @androidx.compose.runtime.Stable public abstract sealed class CompositionLocal<T> {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! getCurrent();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! current;
+  }
+
+  @androidx.compose.runtime.Stable public final class CompositionLocalContext {
+  }
+
+  public final class CompositionLocalKt {
+    method @androidx.compose.runtime.Composable public static void CompositionLocalProvider(androidx.compose.runtime.ProvidedValue<?>![] values, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void CompositionLocalProvider(androidx.compose.runtime.CompositionLocalContext context, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> compositionLocalOf(optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy, kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+    method public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> staticCompositionLocalOf(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+  }
+
+  public interface ControlledComposition extends androidx.compose.runtime.Composition {
+    method public void applyChanges();
+    method public void composeContent(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public boolean getHasPendingChanges();
+    method public void invalidateAll();
+    method public boolean isComposing();
+    method public boolean observesAnyOf(java.util.Set<?> values);
+    method public void prepareCompose(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public boolean recompose();
+    method public void recordModificationsOf(java.util.Set<?> values);
+    method public void recordReadOf(Object value);
+    method public void recordWriteOf(Object value);
+    property public abstract boolean hasPendingChanges;
+    property public abstract boolean isComposing;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface DisallowComposableCalls {
+  }
+
+  public interface DisposableEffectResult {
+    method public void dispose();
+  }
+
+  public final class DisposableEffectScope {
+    ctor public DisposableEffectScope();
+    method public inline androidx.compose.runtime.DisposableEffectResult onDispose(kotlin.jvm.functions.Function0<kotlin.Unit> onDisposeEffect);
+  }
+
+  public final class EffectsKt {
+    method @Deprecated @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void DisposableEffect(kotlin.jvm.functions.Function1<? super androidx.compose.runtime.DisposableEffectScope,? extends androidx.compose.runtime.DisposableEffectResult> effect);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void DisposableEffect(Object? key1, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.DisposableEffectScope,? extends androidx.compose.runtime.DisposableEffectResult> effect);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void DisposableEffect(Object? key1, Object? key2, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.DisposableEffectScope,? extends androidx.compose.runtime.DisposableEffectResult> effect);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void DisposableEffect(Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.DisposableEffectScope,? extends androidx.compose.runtime.DisposableEffectResult> effect);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void DisposableEffect(Object![]? keys, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.DisposableEffectScope,? extends androidx.compose.runtime.DisposableEffectResult> effect);
+    method @Deprecated @androidx.compose.runtime.Composable public static void LaunchedEffect(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void LaunchedEffect(Object? key1, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void LaunchedEffect(Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void LaunchedEffect(Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void LaunchedEffect(Object![]? keys, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void SideEffect(kotlin.jvm.functions.Function0<kotlin.Unit> effect);
+    method @androidx.compose.runtime.Composable public static inline kotlinx.coroutines.CoroutineScope rememberCoroutineScope(optional kotlin.jvm.functions.Function0<? extends kotlin.coroutines.CoroutineContext> getContext);
+  }
+
+  public final class ExpectKt {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ExplicitGroupsComposable {
+  }
+
+  @androidx.compose.runtime.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface Immutable {
+  }
+
+  public interface MonotonicFrameClock extends kotlin.coroutines.CoroutineContext.Element {
+    method public default kotlin.coroutines.CoroutineContext.Key<?> getKey();
+    method public suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+    property public default kotlin.coroutines.CoroutineContext.Key<?> key;
+    field public static final androidx.compose.runtime.MonotonicFrameClock.Key Key;
+  }
+
+  public static final class MonotonicFrameClock.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.runtime.MonotonicFrameClock> {
+  }
+
+  public final class MonotonicFrameClockKt {
+    method public static androidx.compose.runtime.MonotonicFrameClock getMonotonicFrameClock(kotlin.coroutines.CoroutineContext);
+    method public static suspend inline <R> Object? withFrameMillis(androidx.compose.runtime.MonotonicFrameClock, kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+    method public static suspend <R> Object? withFrameMillis(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+    method public static suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+  }
+
+  @androidx.compose.runtime.Stable public interface MutableState<T> extends androidx.compose.runtime.State<T> {
+    method public operator T! component1();
+    method public operator kotlin.jvm.functions.Function1<T,kotlin.Unit> component2();
+    method public void setValue(T! value);
+    property public abstract T! value;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface NoLiveLiterals {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface NonRestartableComposable {
+  }
+
+  public final class PausableMonotonicFrameClock implements androidx.compose.runtime.MonotonicFrameClock {
+    ctor public PausableMonotonicFrameClock(androidx.compose.runtime.MonotonicFrameClock frameClock);
+    method public boolean isPaused();
+    method public void pause();
+    method public void resume();
+    method public suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+    property public final boolean isPaused;
+  }
+
+  public interface ProduceStateScope<T> extends androidx.compose.runtime.MutableState<T> kotlinx.coroutines.CoroutineScope {
+    method public suspend Object? awaitDispose(kotlin.jvm.functions.Function0<kotlin.Unit> onDispose, kotlin.coroutines.Continuation<?> p);
+  }
+
+  @androidx.compose.runtime.Stable public abstract class ProvidableCompositionLocal<T> extends androidx.compose.runtime.CompositionLocal<T> {
+    method public final infix androidx.compose.runtime.ProvidedValue<T> provides(T? value);
+    method public final infix androidx.compose.runtime.ProvidedValue<T> providesDefault(T? value);
+  }
+
+  public final class ProvidedValue<T> {
+    method public boolean getCanOverride();
+    method public androidx.compose.runtime.CompositionLocal<T> getCompositionLocal();
+    method public T! getValue();
+    property public final boolean canOverride;
+    property public final androidx.compose.runtime.CompositionLocal<T> compositionLocal;
+    property public final T! value;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ReadOnlyComposable {
+  }
+
+  public interface RecomposeScope {
+    method public void invalidate();
+  }
+
+  public final class RecomposeScopeImplKt {
+  }
+
+  public final class Recomposer extends androidx.compose.runtime.CompositionContext {
+    ctor public Recomposer(kotlin.coroutines.CoroutineContext effectCoroutineContext);
+    method public androidx.compose.runtime.RecomposerInfo asRecomposerInfo();
+    method public suspend Object? awaitIdle(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public void cancel();
+    method public void close();
+    method public long getChangeCount();
+    method public kotlinx.coroutines.flow.StateFlow<androidx.compose.runtime.Recomposer.State> getCurrentState();
+    method public boolean getHasPendingWork();
+    method @Deprecated public kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> getState();
+    method public suspend Object? join(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public suspend Object? runRecomposeAndApplyChanges(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    property public final long changeCount;
+    property public final kotlinx.coroutines.flow.StateFlow<androidx.compose.runtime.Recomposer.State> currentState;
+    property public final boolean hasPendingWork;
+    property @Deprecated public final kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> state;
+    field public static final androidx.compose.runtime.Recomposer.Companion Companion;
+  }
+
+  public static final class Recomposer.Companion {
+    method public kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.compose.runtime.RecomposerInfo>> getRunningRecomposers();
+    property public final kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.compose.runtime.RecomposerInfo>> runningRecomposers;
+  }
+
+  public enum Recomposer.State {
+    enum_constant public static final androidx.compose.runtime.Recomposer.State Idle;
+    enum_constant public static final androidx.compose.runtime.Recomposer.State Inactive;
+    enum_constant public static final androidx.compose.runtime.Recomposer.State InactivePendingWork;
+    enum_constant public static final androidx.compose.runtime.Recomposer.State PendingWork;
+    enum_constant public static final androidx.compose.runtime.Recomposer.State ShutDown;
+    enum_constant public static final androidx.compose.runtime.Recomposer.State ShuttingDown;
+  }
+
+  public interface RecomposerInfo {
+    method public long getChangeCount();
+    method public boolean getHasPendingWork();
+    method public kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> getState();
+    property public abstract long changeCount;
+    property public abstract boolean hasPendingWork;
+    property public abstract kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> state;
+  }
+
+  public final class RecomposerKt {
+    method public static suspend <R> Object? withRunningRecomposer(kotlin.jvm.functions.Function3<? super kotlinx.coroutines.CoroutineScope,? super androidx.compose.runtime.Recomposer,? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R> p);
+  }
+
+  public interface RememberObserver {
+    method public void onAbandoned();
+    method public void onForgotten();
+    method public void onRemembered();
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi public interface ScopeUpdateScope {
+    method public void updateScope(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.Composer,? super java.lang.Integer,kotlin.Unit> block);
+  }
+
+  public final inline class SkippableUpdater<T> {
+    ctor public SkippableUpdater();
+    method public inline void update(kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,? extends kotlin.Unit> block);
+  }
+
+  public final class SlotTableKt {
+  }
+
+  public interface SnapshotMutationPolicy<T> {
+    method public boolean equivalent(T? a, T? b);
+    method public default T? merge(T? previous, T? current, T? applied);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  @androidx.compose.runtime.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface Stable {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface StableMarker {
+  }
+
+  @androidx.compose.runtime.Stable public interface State<T> {
+    method public T! getValue();
+    property public abstract T! value;
+  }
+
+  public final class TraceKt {
+  }
+
+  public final inline class Updater<T> {
+    ctor public Updater();
+    method public inline void set(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,? extends kotlin.Unit> block);
+    method public inline void update(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,? extends kotlin.Unit> block);
+  }
+
+}
+
+package androidx.compose.runtime.collection {
+
+  public final class MutableVector<T> implements java.util.RandomAccess {
+    method public boolean add(T? element);
+    method public void add(int index, T? element);
+    method public boolean addAll(int index, java.util.List<? extends T> elements);
+    method public boolean addAll(int index, androidx.compose.runtime.collection.MutableVector<T> elements);
+    method public inline boolean addAll(java.util.List<? extends T> elements);
+    method public inline boolean addAll(androidx.compose.runtime.collection.MutableVector<T> elements);
+    method public boolean addAll(T![] elements);
+    method public boolean addAll(int index, java.util.Collection<? extends T> elements);
+    method public boolean addAll(java.util.Collection<? extends T> elements);
+    method public inline boolean any(kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public java.util.List<T> asMutableList();
+    method public void clear();
+    method public operator boolean contains(T? element);
+    method public boolean containsAll(java.util.List<? extends T> elements);
+    method public boolean containsAll(java.util.Collection<? extends T> elements);
+    method public boolean containsAll(androidx.compose.runtime.collection.MutableVector<T> elements);
+    method public boolean contentEquals(androidx.compose.runtime.collection.MutableVector<T> other);
+    method public void ensureCapacity(int capacity);
+    method public T! first();
+    method public inline T! first(kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public inline T? firstOrNull();
+    method public inline T? firstOrNull(kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public inline <R> R! fold(R? initial, kotlin.jvm.functions.Function2<? super R,? super T,? extends R> operation);
+    method public inline <R> R! foldIndexed(R? initial, kotlin.jvm.functions.Function3<? super java.lang.Integer,? super R,? super T,? extends R> operation);
+    method public inline <R> R! foldRight(R? initial, kotlin.jvm.functions.Function2<? super T,? super R,? extends R> operation);
+    method public inline <R> R! foldRightIndexed(R? initial, kotlin.jvm.functions.Function3<? super java.lang.Integer,? super T,? super R,? extends R> operation);
+    method public inline void forEach(kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline void forEachIndexed(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> block);
+    method public inline void forEachReversed(kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline void forEachReversedIndexed(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> block);
+    method public inline operator T! get(int index);
+    method public inline kotlin.ranges.IntRange getIndices();
+    method public inline int getLastIndex();
+    method public int getSize();
+    method public int indexOf(T? element);
+    method public inline int indexOfFirst(kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public inline int indexOfLast(kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public boolean isEmpty();
+    method public boolean isNotEmpty();
+    method public T! last();
+    method public inline T! last(kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public int lastIndexOf(T? element);
+    method public inline T? lastOrNull();
+    method public inline T? lastOrNull(kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public inline <reified R> R![]! map(kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+    method public inline <reified R> R![]! mapIndexed(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,? extends R> transform);
+    method public inline <reified R> androidx.compose.runtime.collection.MutableVector<R>! mapIndexedNotNull(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,? extends R> transform);
+    method public inline <reified R> androidx.compose.runtime.collection.MutableVector<R>! mapNotNull(kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+    method public inline operator void minusAssign(T? element);
+    method public inline operator void plusAssign(T? element);
+    method public boolean remove(T? element);
+    method public boolean removeAll(java.util.List<? extends T> elements);
+    method public boolean removeAll(androidx.compose.runtime.collection.MutableVector<T> elements);
+    method public boolean removeAll(java.util.Collection<? extends T> elements);
+    method public T! removeAt(int index);
+    method public void removeRange(int start, int end);
+    method public boolean retainAll(java.util.Collection<? extends T> elements);
+    method public inline boolean reversedAny(kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public operator T! set(int index, T? element);
+    method public void sortWith(java.util.Comparator<T> comparator);
+    method public inline int sumBy(kotlin.jvm.functions.Function1<? super T,java.lang.Integer> selector);
+    property public final inline kotlin.ranges.IntRange indices;
+    property public final inline int lastIndex;
+    property public final int size;
+  }
+
+  public final class MutableVectorKt {
+    method public static inline <reified T> androidx.compose.runtime.collection.MutableVector<T>! MutableVector(optional int capacity);
+    method public static inline <reified T> androidx.compose.runtime.collection.MutableVector<T>! MutableVector(int size, kotlin.jvm.functions.Function1<? super java.lang.Integer,? extends T> init);
+    method public static inline <reified T> androidx.compose.runtime.collection.MutableVector<T>! mutableVectorOf();
+    method public static inline <reified T> androidx.compose.runtime.collection.MutableVector<T>! mutableVectorOf(T? elements);
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable {
+
+  public final class ExtensionsKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList {
+
+  public final class UtilsKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap {
+
+  public final class PersistentHashMapContentIteratorsKt {
+  }
+
+  public final class TrieNodeKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableSet {
+
+  public final class TrieNodeKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.internal {
+
+  public final class CommonFunctionsKt {
+  }
+
+  public final class ForEachOneBitKt {
+  }
+
+}
+
+package androidx.compose.runtime.internal {
+
+  @androidx.compose.runtime.ComposeCompilerApi @androidx.compose.runtime.Stable public interface ComposableLambda extends kotlin.jvm.functions.Function2<androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function10<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function11<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function13<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function14<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function15<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function16<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function17<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function18<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function19<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function20<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function21<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function3<java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function4<java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function5<java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function6<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function7<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function8<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function9<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> {
+  }
+
+  public final class ComposableLambdaKt {
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambda composableLambda(androidx.compose.runtime.Composer composer, int key, boolean tracked, Object block);
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambda composableLambdaInstance(int key, boolean tracked, Object block);
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @androidx.compose.runtime.Stable public interface ComposableLambdaN extends kotlin.jvm.functions.FunctionN<java.lang.Object> {
+  }
+
+  public final class ComposableLambdaN_jvmKt {
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambdaN composableLambdaN(androidx.compose.runtime.Composer composer, int key, boolean tracked, int arity, Object block);
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambdaN composableLambdaNInstance(int key, boolean tracked, int arity, Object block);
+  }
+
+  public final class DecoyKt {
+    method @androidx.compose.runtime.ComposeCompilerApi public static Void illegalDecoyCallException(String fName);
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface LiveLiteralFileInfo {
+    method public abstract String file();
+    property public abstract String file;
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface LiveLiteralInfo {
+    method public abstract String key();
+    method public abstract int offset();
+    property public abstract String key;
+    property public abstract int offset;
+  }
+
+  public final class LiveLiteralKt {
+    method public static boolean isLiveLiteralsEnabled();
+    property public static final boolean isLiveLiteralsEnabled;
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface StabilityInferred {
+    method public abstract int parameters();
+    property public abstract int parameters;
+  }
+
+  public final class ThreadMapKt {
+  }
+
+}
+
+package androidx.compose.runtime.snapshots {
+
+  public final class ListUtilsKt {
+  }
+
+  public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
+    method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
+    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 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 kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
+    property public boolean readOnly;
+    property public androidx.compose.runtime.snapshots.Snapshot root;
+    property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver;
+  }
+
+  public fun interface ObserverHandle {
+    method public void dispose();
+  }
+
+  public abstract sealed class Snapshot {
+    method public void dispose();
+    method public final inline <T> T! enter(kotlin.jvm.functions.Function0<? extends T> block);
+    method public int getId();
+    method public abstract boolean getReadOnly();
+    method public abstract androidx.compose.runtime.snapshots.Snapshot getRoot();
+    method public abstract boolean hasPendingChanges();
+    method public abstract androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
+    property public int id;
+    property public abstract boolean readOnly;
+    property public abstract androidx.compose.runtime.snapshots.Snapshot root;
+    field public static final androidx.compose.runtime.snapshots.Snapshot.Companion Companion;
+  }
+
+  public static final class Snapshot.Companion {
+    method public androidx.compose.runtime.snapshots.Snapshot getCurrent();
+    method public inline <T> T! global(kotlin.jvm.functions.Function0<? extends T> block);
+    method public void notifyObjectsInitialized();
+    method public <T> T! observe(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver, kotlin.jvm.functions.Function0<? extends T> block);
+    method public androidx.compose.runtime.snapshots.ObserverHandle registerApplyObserver(kotlin.jvm.functions.Function2<? super java.util.Set<?>,? super androidx.compose.runtime.snapshots.Snapshot,kotlin.Unit> observer);
+    method public androidx.compose.runtime.snapshots.ObserverHandle registerGlobalWriteObserver(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit> observer);
+    method public void sendApplyNotifications();
+    method public androidx.compose.runtime.snapshots.MutableSnapshot takeMutableSnapshot(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 takeSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
+    method public inline <R> R! withMutableSnapshot(kotlin.jvm.functions.Function0<? extends R> block);
+    property public final androidx.compose.runtime.snapshots.Snapshot current;
+  }
+
+  public final class SnapshotApplyConflictException extends java.lang.Exception {
+    ctor public SnapshotApplyConflictException(androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public androidx.compose.runtime.snapshots.Snapshot getSnapshot();
+    property public final androidx.compose.runtime.snapshots.Snapshot snapshot;
+  }
+
+  public abstract sealed class SnapshotApplyResult {
+    method public abstract void check();
+    method public abstract boolean getSucceeded();
+    property public abstract boolean succeeded;
+  }
+
+  public static final class SnapshotApplyResult.Failure extends androidx.compose.runtime.snapshots.SnapshotApplyResult {
+    ctor public SnapshotApplyResult.Failure(androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public void check();
+    method public androidx.compose.runtime.snapshots.Snapshot getSnapshot();
+    method public boolean getSucceeded();
+    property public final androidx.compose.runtime.snapshots.Snapshot snapshot;
+    property public boolean succeeded;
+  }
+
+  public static final class SnapshotApplyResult.Success extends androidx.compose.runtime.snapshots.SnapshotApplyResult {
+    method public void check();
+    method public boolean getSucceeded();
+    property public boolean succeeded;
+    field public static final androidx.compose.runtime.snapshots.SnapshotApplyResult.Success INSTANCE;
+  }
+
+  public final class SnapshotIdSetKt {
+  }
+
+  public final class SnapshotKt {
+    method public static <T extends androidx.compose.runtime.snapshots.StateRecord> T readable(T, androidx.compose.runtime.snapshots.StateObject state);
+    method public static <T extends androidx.compose.runtime.snapshots.StateRecord> T readable(T, androidx.compose.runtime.snapshots.StateObject state, androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public static inline <T extends androidx.compose.runtime.snapshots.StateRecord, R> R! withCurrent(T, kotlin.jvm.functions.Function1<? super T,? extends R> block);
+    method public static inline <T extends androidx.compose.runtime.snapshots.StateRecord, R> R! writable(T, androidx.compose.runtime.snapshots.StateObject state, androidx.compose.runtime.snapshots.Snapshot snapshot, kotlin.jvm.functions.Function1<? super T,? extends R> block);
+    method public static inline <T extends androidx.compose.runtime.snapshots.StateRecord, R> R! writable(T, androidx.compose.runtime.snapshots.StateObject state, kotlin.jvm.functions.Function1<? super T,? extends R> block);
+  }
+
+  public interface SnapshotMutableState<T> extends androidx.compose.runtime.MutableState<T> {
+    method public androidx.compose.runtime.SnapshotMutationPolicy<T> getPolicy();
+    property public abstract androidx.compose.runtime.SnapshotMutationPolicy<T> policy;
+  }
+
+  @androidx.compose.runtime.Stable public final class SnapshotStateList<T> implements kotlin.jvm.internal.markers.KMutableList java.util.List<T> androidx.compose.runtime.snapshots.StateObject {
+    ctor public SnapshotStateList();
+    method public boolean add(T? element);
+    method public void add(int index, T? element);
+    method public boolean addAll(int index, java.util.Collection<? extends T> elements);
+    method public boolean addAll(java.util.Collection<? extends T> elements);
+    method public void clear();
+    method public boolean contains(T? element);
+    method public boolean containsAll(java.util.Collection<E!> elements);
+    method public T! get(int index);
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
+    method public int getSize();
+    method public int indexOf(T? element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<T> iterator();
+    method public int lastIndexOf(T? element);
+    method public java.util.ListIterator<T> listIterator();
+    method public java.util.ListIterator<T> listIterator(int index);
+    method public void prependStateRecord(androidx.compose.runtime.snapshots.StateRecord value);
+    method public boolean remove(T? element);
+    method public boolean removeAll(java.util.Collection<E!> elements);
+    method public T! removeAt(int index);
+    method public void removeRange(int fromIndex, int toIndex);
+    method public boolean retainAll(java.util.Collection<E!> elements);
+    method public T! set(int index, T? element);
+    method public java.util.List<T> subList(int fromIndex, int toIndex);
+    property public androidx.compose.runtime.snapshots.StateRecord firstStateRecord;
+    property public int size;
+  }
+
+  public final class SnapshotStateListKt {
+  }
+
+  @androidx.compose.runtime.Stable public final class SnapshotStateMap<K, V> implements kotlin.jvm.internal.markers.KMutableMap java.util.Map<K,V> androidx.compose.runtime.snapshots.StateObject {
+    ctor public SnapshotStateMap();
+    method public void clear();
+    method public boolean containsKey(K? key);
+    method public boolean containsValue(V? value);
+    method public V? get(Object? key);
+    method public java.util.Set<java.util.Map.Entry<K,V>> getEntries();
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
+    method public java.util.Set<K> getKeys();
+    method public int getSize();
+    method public java.util.Collection<V> getValues();
+    method public boolean isEmpty();
+    method public void prependStateRecord(androidx.compose.runtime.snapshots.StateRecord value);
+    method public V? put(K? key, V? value);
+    method public void putAll(java.util.Map<? extends K,? extends V> from);
+    method public V? remove(Object? key);
+    property public java.util.Set<java.util.Map.Entry<K,V>> entries;
+    property public androidx.compose.runtime.snapshots.StateRecord firstStateRecord;
+    property public java.util.Set<K> keys;
+    property public int size;
+    property public java.util.Collection<V> values;
+  }
+
+  public final class SnapshotStateMapKt {
+  }
+
+  public final class SnapshotStateObserver {
+    ctor public SnapshotStateObserver(kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> onChangedExecutor);
+    method public void clear(Object scope);
+    method public void clear();
+    method public void clearIf(kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> predicate);
+    method @org.jetbrains.annotations.TestOnly public void notifyChanges(java.util.Set<?> changes, androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public <T> void observeReads(T scope, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> onValueChangedForScope, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public void start();
+    method public void stop();
+    method public void withNoObservations(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+  }
+
+  public interface StateObject {
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
+    method public default androidx.compose.runtime.snapshots.StateRecord? mergeRecords(androidx.compose.runtime.snapshots.StateRecord previous, androidx.compose.runtime.snapshots.StateRecord current, androidx.compose.runtime.snapshots.StateRecord applied);
+    method public void prependStateRecord(androidx.compose.runtime.snapshots.StateRecord value);
+    property public abstract androidx.compose.runtime.snapshots.StateRecord firstStateRecord;
+  }
+
+  public abstract class StateRecord {
+    ctor public StateRecord();
+    method public abstract void assign(androidx.compose.runtime.snapshots.StateRecord value);
+    method public abstract androidx.compose.runtime.snapshots.StateRecord create();
+  }
+
+}
+
+package androidx.compose.runtime.tooling {
+
+  public interface CompositionData {
+    method public Iterable<androidx.compose.runtime.tooling.CompositionGroup> getCompositionGroups();
+    method public boolean isEmpty();
+    property public abstract Iterable<androidx.compose.runtime.tooling.CompositionGroup> compositionGroups;
+    property public abstract boolean isEmpty;
+  }
+
+  public interface CompositionGroup extends androidx.compose.runtime.tooling.CompositionData {
+    method public Iterable<java.lang.Object> getData();
+    method public Object getKey();
+    method public Object? getNode();
+    method public String? getSourceInfo();
+    property public abstract Iterable<java.lang.Object> data;
+    property public abstract Object key;
+    property public abstract Object? node;
+    property public abstract String? sourceInfo;
+  }
+
+  public final class InspectionTablesKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.util.Set<androidx.compose.runtime.tooling.CompositionData>> getLocalInspectionTables();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.util.Set<androidx.compose.runtime.tooling.CompositionData>> LocalInspectionTables;
+  }
+
+}
+
diff --git a/compose/runtime/runtime/api/api_lint.ignore b/compose/runtime/runtime/api/api_lint.ignore
index edb0d98..b213aeb 100644
--- a/compose/runtime/runtime/api/api_lint.ignore
+++ b/compose/runtime/runtime/api/api_lint.ignore
@@ -9,6 +9,8 @@
     Method Failure.check appears to be throwing androidx.compose.runtime.snapshots.SnapshotApplyConflictException; this should be recorded with a @Throws annotation; see https://android.github.io/kotlin-guides/interop.html#document-exceptions
 
 
+KotlinOperator: androidx.compose.runtime.Updater#set(int, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,? extends kotlin.Unit>):
+    Note that adding the `operator` keyword would allow calling this method using operator syntax
 KotlinOperator: androidx.compose.runtime.snapshots.SnapshotStateList#contains(T):
     Note that adding the `operator` keyword would allow calling this method using operator syntax
 
diff --git a/compose/runtime/runtime/api/current.txt b/compose/runtime/runtime/api/current.txt
index e12a0a1..d67558a 100644
--- a/compose/runtime/runtime/api/current.txt
+++ b/compose/runtime/runtime/api/current.txt
@@ -18,6 +18,7 @@
 
   public final class ActualAndroid_androidKt {
     method @Deprecated public static androidx.compose.runtime.MonotonicFrameClock getDefaultMonotonicFrameClock();
+    property @Deprecated public static final androidx.compose.runtime.MonotonicFrameClock DefaultMonotonicFrameClock;
   }
 
   public final class ActualJvm_jvmKt {
@@ -71,6 +72,10 @@
     method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function0<? extends T> calculation);
     method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object![]? keys, kotlin.jvm.functions.Function0<? extends T> calculation);
     method @androidx.compose.runtime.Composable public static androidx.compose.runtime.CompositionContext rememberCompositionContext();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static final androidx.compose.runtime.Composer currentComposer;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ExplicitGroupsComposable public static final int currentCompositeKeyHash;
+    property @androidx.compose.runtime.Composable public static final androidx.compose.runtime.CompositionLocalContext currentCompositionLocalContext;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static final androidx.compose.runtime.RecomposeScope currentRecomposeScope;
   }
 
   @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ComposeCompilerApi {
@@ -358,6 +363,7 @@
 
   public final inline class SkippableUpdater<T> {
     ctor public SkippableUpdater();
+    method public inline void update(kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,? extends kotlin.Unit> block);
   }
 
   public final class SlotTableKt {
@@ -393,6 +399,106 @@
     method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
   }
 
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
   @androidx.compose.runtime.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface Stable {
   }
 
@@ -409,6 +515,8 @@
 
   public final inline class Updater<T> {
     ctor public Updater();
+    method public inline void set(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,? extends kotlin.Unit> block);
+    method public inline void update(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,? extends kotlin.Unit> block);
   }
 
 }
@@ -568,6 +676,7 @@
 
   public final class LiveLiteralKt {
     method public static boolean isLiveLiteralsEnabled();
+    property public static final boolean isLiveLiteralsEnabled;
   }
 
   @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface StabilityInferred {
@@ -784,6 +893,7 @@
 
   public final class InspectionTablesKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<java.util.Set<androidx.compose.runtime.tooling.CompositionData>> getLocalInspectionTables();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.util.Set<androidx.compose.runtime.tooling.CompositionData>> LocalInspectionTables;
   }
 
 }
diff --git a/compose/runtime/runtime/api/public_plus_experimental_1.1.0-beta02.txt b/compose/runtime/runtime/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..8c1d725
--- /dev/null
+++ b/compose/runtime/runtime/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,935 @@
+// Signature format: 4.0
+package androidx.compose.runtime {
+
+  public abstract class AbstractApplier<T> implements androidx.compose.runtime.Applier<T> {
+    ctor public AbstractApplier(T? root);
+    method public final void clear();
+    method public void down(T? node);
+    method public T! getCurrent();
+    method public final T! getRoot();
+    method protected final void move(java.util.List<T>, int from, int to, int count);
+    method protected abstract void onClear();
+    method protected final void remove(java.util.List<T>, int index, int count);
+    method protected void setCurrent(T! current);
+    method public void up();
+    property public T! current;
+    property public final T! root;
+  }
+
+  public final class ActualAndroid_androidKt {
+    method @Deprecated public static androidx.compose.runtime.MonotonicFrameClock getDefaultMonotonicFrameClock();
+    property @Deprecated public static final androidx.compose.runtime.MonotonicFrameClock DefaultMonotonicFrameClock;
+  }
+
+  public final class ActualJvm_jvmKt {
+  }
+
+  public interface Applier<N> {
+    method public void clear();
+    method public void down(N? node);
+    method public N! getCurrent();
+    method public void insertBottomUp(int index, N? instance);
+    method public void insertTopDown(int index, N? instance);
+    method public void move(int from, int to, int count);
+    method public default void onBeginChanges();
+    method public default void onEndChanges();
+    method public void remove(int index, int count);
+    method public void up();
+    property public abstract N! current;
+  }
+
+  public final class BitwiseOperatorsKt {
+  }
+
+  public final class BroadcastFrameClock implements androidx.compose.runtime.MonotonicFrameClock {
+    ctor public BroadcastFrameClock(optional kotlin.jvm.functions.Function0<kotlin.Unit>? onNewAwaiters);
+    method public void cancel(optional java.util.concurrent.CancellationException cancellationException);
+    method public boolean getHasAwaiters();
+    method public void sendFrame(long timeNanos);
+    method public suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+    property public final boolean hasAwaiters;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface Composable {
+  }
+
+  public final class ComposablesKt {
+    method @androidx.compose.runtime.Composable public static inline <T extends java.lang.Object, reified E extends androidx.compose.runtime.Applier<?>> void ComposeNode(kotlin.jvm.functions.Function0<? extends T> factory, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,? extends kotlin.Unit> update);
+    method @androidx.compose.runtime.Composable public static inline <T extends java.lang.Object, reified E extends androidx.compose.runtime.Applier<?>> void ComposeNode(kotlin.jvm.functions.Function0<? extends T> factory, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,? extends kotlin.Unit> update, kotlin.jvm.functions.Function0<? extends kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ExplicitGroupsComposable public static inline <T, reified E extends androidx.compose.runtime.Applier<?>> void ComposeNode(kotlin.jvm.functions.Function0<? extends T> factory, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,? extends kotlin.Unit> update, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.SkippableUpdater<T>,? extends kotlin.Unit> skippableUpdate, kotlin.jvm.functions.Function0<? extends kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static inline <T extends java.lang.Object, reified E extends androidx.compose.runtime.Applier<?>> void ReusableComposeNode(kotlin.jvm.functions.Function0<? extends T> factory, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,? extends kotlin.Unit> update);
+    method @androidx.compose.runtime.Composable public static inline <T extends java.lang.Object, reified E extends androidx.compose.runtime.Applier<?>> void ReusableComposeNode(kotlin.jvm.functions.Function0<? extends T> factory, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,? extends kotlin.Unit> update, kotlin.jvm.functions.Function0<? extends kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ExplicitGroupsComposable public static inline <T, reified E extends androidx.compose.runtime.Applier<?>> void ReusableComposeNode(kotlin.jvm.functions.Function0<? extends T> factory, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,? extends kotlin.Unit> update, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.SkippableUpdater<T>,? extends kotlin.Unit> skippableUpdate, kotlin.jvm.functions.Function0<? extends kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static inline void ReusableContent(Object? key, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static androidx.compose.runtime.Composer getCurrentComposer();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ExplicitGroupsComposable public static int getCurrentCompositeKeyHash();
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.CompositionLocalContext getCurrentCompositionLocalContext();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static androidx.compose.runtime.RecomposeScope getCurrentRecomposeScope();
+    method @androidx.compose.runtime.Composable public static inline <T> T! key(Object![]? keys, kotlin.jvm.functions.Function0<? extends T> block);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object? key1, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object? key1, Object? key2, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object![]? keys, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.CompositionContext rememberCompositionContext();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static final androidx.compose.runtime.Composer currentComposer;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ExplicitGroupsComposable public static final int currentCompositeKeyHash;
+    property @androidx.compose.runtime.Composable public static final androidx.compose.runtime.CompositionLocalContext currentCompositionLocalContext;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static final androidx.compose.runtime.RecomposeScope currentRecomposeScope;
+  }
+
+  @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ComposeCompilerApi {
+  }
+
+  public interface Composer {
+    method @androidx.compose.runtime.ComposeCompilerApi public <V, T> void apply(V? value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+    method @androidx.compose.runtime.InternalComposeApi public androidx.compose.runtime.CompositionContext buildContext();
+    method @androidx.compose.runtime.ComposeCompilerApi public boolean changed(Object? value);
+    method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(boolean value);
+    method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(char value);
+    method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(byte value);
+    method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(short value);
+    method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(int value);
+    method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(float value);
+    method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(long value);
+    method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(double value);
+    method public void collectParameterInformation();
+    method @androidx.compose.runtime.InternalComposeApi public <T> T! consume(androidx.compose.runtime.CompositionLocal<T> key);
+    method @androidx.compose.runtime.ComposeCompilerApi public <T> void createNode(kotlin.jvm.functions.Function0<? extends T> factory);
+    method @androidx.compose.runtime.ComposeCompilerApi public void disableReusing();
+    method @androidx.compose.runtime.ComposeCompilerApi public void enableReusing();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endDefaults();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endMovableGroup();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endNode();
+    method @androidx.compose.runtime.InternalComposeApi public void endProviders();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endReplaceableGroup();
+    method @androidx.compose.runtime.ComposeCompilerApi public androidx.compose.runtime.ScopeUpdateScope? endRestartGroup();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endReusableGroup();
+    method public androidx.compose.runtime.Applier<?> getApplier();
+    method @org.jetbrains.annotations.TestOnly public kotlin.coroutines.CoroutineContext getApplyCoroutineContext();
+    method @org.jetbrains.annotations.TestOnly public androidx.compose.runtime.ControlledComposition getComposition();
+    method public androidx.compose.runtime.tooling.CompositionData getCompositionData();
+    method public int getCompoundKeyHash();
+    method public boolean getDefaultsInvalid();
+    method public boolean getInserting();
+    method public androidx.compose.runtime.RecomposeScope? getRecomposeScope();
+    method public boolean getSkipping();
+    method @androidx.compose.runtime.ComposeCompilerApi public Object joinKey(Object? left, Object? right);
+    method @androidx.compose.runtime.InternalComposeApi public void recordSideEffect(kotlin.jvm.functions.Function0<kotlin.Unit> effect);
+    method @androidx.compose.runtime.InternalComposeApi public void recordUsed(androidx.compose.runtime.RecomposeScope scope);
+    method @androidx.compose.runtime.ComposeCompilerApi public Object? rememberedValue();
+    method @androidx.compose.runtime.ComposeCompilerApi public void skipCurrentGroup();
+    method @androidx.compose.runtime.ComposeCompilerApi public void skipToGroupEnd();
+    method public void sourceInformation(String sourceInformation);
+    method public void sourceInformationMarkerEnd();
+    method public void sourceInformationMarkerStart(int key, String sourceInformation);
+    method @androidx.compose.runtime.ComposeCompilerApi public void startDefaults();
+    method @androidx.compose.runtime.ComposeCompilerApi public void startMovableGroup(int key, Object? dataKey);
+    method @androidx.compose.runtime.ComposeCompilerApi public void startNode();
+    method @androidx.compose.runtime.InternalComposeApi public void startProviders(androidx.compose.runtime.ProvidedValue<?>![] values);
+    method @androidx.compose.runtime.ComposeCompilerApi public void startReplaceableGroup(int key);
+    method @androidx.compose.runtime.ComposeCompilerApi public androidx.compose.runtime.Composer startRestartGroup(int key);
+    method @androidx.compose.runtime.ComposeCompilerApi public void startReusableGroup(int key, Object? dataKey);
+    method @androidx.compose.runtime.ComposeCompilerApi public void startReusableNode();
+    method @androidx.compose.runtime.ComposeCompilerApi public void updateRememberedValue(Object? value);
+    method @androidx.compose.runtime.ComposeCompilerApi public void useNode();
+    property public abstract androidx.compose.runtime.Applier<?> applier;
+    property @org.jetbrains.annotations.TestOnly public abstract kotlin.coroutines.CoroutineContext applyCoroutineContext;
+    property @org.jetbrains.annotations.TestOnly public abstract androidx.compose.runtime.ControlledComposition composition;
+    property public abstract androidx.compose.runtime.tooling.CompositionData compositionData;
+    property public abstract int compoundKeyHash;
+    property public abstract boolean defaultsInvalid;
+    property public abstract boolean inserting;
+    property public abstract androidx.compose.runtime.RecomposeScope? recomposeScope;
+    property public abstract boolean skipping;
+    field public static final androidx.compose.runtime.Composer.Companion Companion;
+  }
+
+  public static final class Composer.Companion {
+    method public Object getEmpty();
+    property public final Object Empty;
+  }
+
+  public final class ComposerKt {
+    method @androidx.compose.runtime.ComposeCompilerApi public static inline <T> T! cache(androidx.compose.runtime.Composer, boolean invalid, kotlin.jvm.functions.Function0<? extends T> block);
+    method @androidx.compose.runtime.ComposeCompilerApi public static void sourceInformation(androidx.compose.runtime.Composer composer, String sourceInformation);
+    method @androidx.compose.runtime.ComposeCompilerApi public static void sourceInformationMarkerEnd(androidx.compose.runtime.Composer composer);
+    method @androidx.compose.runtime.ComposeCompilerApi public static void sourceInformationMarkerStart(androidx.compose.runtime.Composer composer, int key, String sourceInformation);
+  }
+
+  public interface Composition {
+    method public void dispose();
+    method public boolean getHasInvalidations();
+    method public boolean isDisposed();
+    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    property public abstract boolean hasInvalidations;
+    property public abstract boolean isDisposed;
+  }
+
+  public abstract class CompositionContext {
+  }
+
+  public final class CompositionContextKt {
+  }
+
+  public final class CompositionKt {
+    method public static androidx.compose.runtime.Composition Composition(androidx.compose.runtime.Applier<?> applier, androidx.compose.runtime.CompositionContext parent);
+    method @androidx.compose.runtime.ExperimentalComposeApi public static androidx.compose.runtime.Composition Composition(androidx.compose.runtime.Applier<?> applier, androidx.compose.runtime.CompositionContext parent, kotlin.coroutines.CoroutineContext recomposeCoroutineContext);
+    method @org.jetbrains.annotations.TestOnly public static androidx.compose.runtime.ControlledComposition ControlledComposition(androidx.compose.runtime.Applier<?> applier, androidx.compose.runtime.CompositionContext parent);
+    method @androidx.compose.runtime.ExperimentalComposeApi @org.jetbrains.annotations.TestOnly public static androidx.compose.runtime.ControlledComposition ControlledComposition(androidx.compose.runtime.Applier<?> applier, androidx.compose.runtime.CompositionContext parent, kotlin.coroutines.CoroutineContext recomposeCoroutineContext);
+    method @androidx.compose.runtime.ExperimentalComposeApi public static kotlin.coroutines.CoroutineContext getRecomposeCoroutineContext(androidx.compose.runtime.ControlledComposition);
+  }
+
+  @androidx.compose.runtime.Stable public abstract sealed class CompositionLocal<T> {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! getCurrent();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! current;
+  }
+
+  @androidx.compose.runtime.Stable public final class CompositionLocalContext {
+  }
+
+  public final class CompositionLocalKt {
+    method @androidx.compose.runtime.Composable public static void CompositionLocalProvider(androidx.compose.runtime.ProvidedValue<?>![] values, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void CompositionLocalProvider(androidx.compose.runtime.CompositionLocalContext context, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> compositionLocalOf(optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy, kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+    method public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> staticCompositionLocalOf(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+  }
+
+  public interface ControlledComposition extends androidx.compose.runtime.Composition {
+    method public void applyChanges();
+    method public void composeContent(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public boolean getHasPendingChanges();
+    method public void invalidateAll();
+    method public boolean isComposing();
+    method public boolean observesAnyOf(java.util.Set<?> values);
+    method public void prepareCompose(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public boolean recompose();
+    method public void recordModificationsOf(java.util.Set<?> values);
+    method public void recordReadOf(Object value);
+    method public void recordWriteOf(Object value);
+    method @androidx.compose.runtime.InternalComposeApi public void verifyConsistent();
+    property public abstract boolean hasPendingChanges;
+    property public abstract boolean isComposing;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface DisallowComposableCalls {
+  }
+
+  public interface DisposableEffectResult {
+    method public void dispose();
+  }
+
+  public final class DisposableEffectScope {
+    ctor public DisposableEffectScope();
+    method public inline androidx.compose.runtime.DisposableEffectResult onDispose(kotlin.jvm.functions.Function0<kotlin.Unit> onDisposeEffect);
+  }
+
+  public final class EffectsKt {
+    method @Deprecated @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void DisposableEffect(kotlin.jvm.functions.Function1<? super androidx.compose.runtime.DisposableEffectScope,? extends androidx.compose.runtime.DisposableEffectResult> effect);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void DisposableEffect(Object? key1, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.DisposableEffectScope,? extends androidx.compose.runtime.DisposableEffectResult> effect);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void DisposableEffect(Object? key1, Object? key2, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.DisposableEffectScope,? extends androidx.compose.runtime.DisposableEffectResult> effect);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void DisposableEffect(Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.DisposableEffectScope,? extends androidx.compose.runtime.DisposableEffectResult> effect);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void DisposableEffect(Object![]? keys, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.DisposableEffectScope,? extends androidx.compose.runtime.DisposableEffectResult> effect);
+    method @Deprecated @androidx.compose.runtime.Composable public static void LaunchedEffect(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void LaunchedEffect(Object? key1, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void LaunchedEffect(Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void LaunchedEffect(Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void LaunchedEffect(Object![]? keys, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void SideEffect(kotlin.jvm.functions.Function0<kotlin.Unit> effect);
+    method @androidx.compose.runtime.Composable public static inline kotlinx.coroutines.CoroutineScope rememberCoroutineScope(optional kotlin.jvm.functions.Function0<? extends kotlin.coroutines.CoroutineContext> getContext);
+  }
+
+  public final class ExpectKt {
+  }
+
+  @kotlin.RequiresOptIn(level=kotlin.RequiresOptIn.Level, message="This is an experimental API for Compose and is likely to change before becoming " + "stable.") @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ExperimentalComposeApi {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ExplicitGroupsComposable {
+  }
+
+  @androidx.compose.runtime.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface Immutable {
+  }
+
+  @kotlin.RequiresOptIn(level=kotlin.RequiresOptIn.Level, message="This is internal API for Compose modules that may change frequently " + "and without warning.") @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface InternalComposeApi {
+  }
+
+  public interface MonotonicFrameClock extends kotlin.coroutines.CoroutineContext.Element {
+    method public default kotlin.coroutines.CoroutineContext.Key<?> getKey();
+    method public suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+    property public default kotlin.coroutines.CoroutineContext.Key<?> key;
+    field public static final androidx.compose.runtime.MonotonicFrameClock.Key Key;
+  }
+
+  public static final class MonotonicFrameClock.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.runtime.MonotonicFrameClock> {
+  }
+
+  public final class MonotonicFrameClockKt {
+    method public static androidx.compose.runtime.MonotonicFrameClock getMonotonicFrameClock(kotlin.coroutines.CoroutineContext);
+    method public static suspend inline <R> Object? withFrameMillis(androidx.compose.runtime.MonotonicFrameClock, kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+    method public static suspend <R> Object? withFrameMillis(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+    method public static suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+  }
+
+  @androidx.compose.runtime.Stable public interface MutableState<T> extends androidx.compose.runtime.State<T> {
+    method public operator T! component1();
+    method public operator kotlin.jvm.functions.Function1<T,kotlin.Unit> component2();
+    method public void setValue(T! value);
+    property public abstract T! value;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface NoLiveLiterals {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface NonRestartableComposable {
+  }
+
+  public final class PausableMonotonicFrameClock implements androidx.compose.runtime.MonotonicFrameClock {
+    ctor public PausableMonotonicFrameClock(androidx.compose.runtime.MonotonicFrameClock frameClock);
+    method public boolean isPaused();
+    method public void pause();
+    method public void resume();
+    method public suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+    property public final boolean isPaused;
+  }
+
+  public interface ProduceStateScope<T> extends androidx.compose.runtime.MutableState<T> kotlinx.coroutines.CoroutineScope {
+    method public suspend Object? awaitDispose(kotlin.jvm.functions.Function0<kotlin.Unit> onDispose, kotlin.coroutines.Continuation<?> p);
+  }
+
+  @androidx.compose.runtime.Stable public abstract class ProvidableCompositionLocal<T> extends androidx.compose.runtime.CompositionLocal<T> {
+    method public final infix androidx.compose.runtime.ProvidedValue<T> provides(T? value);
+    method public final infix androidx.compose.runtime.ProvidedValue<T> providesDefault(T? value);
+  }
+
+  public final class ProvidedValue<T> {
+    method public boolean getCanOverride();
+    method public androidx.compose.runtime.CompositionLocal<T> getCompositionLocal();
+    method public T! getValue();
+    property public final boolean canOverride;
+    property public final androidx.compose.runtime.CompositionLocal<T> compositionLocal;
+    property public final T! value;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ReadOnlyComposable {
+  }
+
+  public interface RecomposeScope {
+    method public void invalidate();
+  }
+
+  public final class RecomposeScopeImplKt {
+  }
+
+  public final class Recomposer extends androidx.compose.runtime.CompositionContext {
+    ctor public Recomposer(kotlin.coroutines.CoroutineContext effectCoroutineContext);
+    method public androidx.compose.runtime.RecomposerInfo asRecomposerInfo();
+    method public suspend Object? awaitIdle(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public void cancel();
+    method public void close();
+    method public long getChangeCount();
+    method public kotlinx.coroutines.flow.StateFlow<androidx.compose.runtime.Recomposer.State> getCurrentState();
+    method public boolean getHasPendingWork();
+    method @Deprecated public kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> getState();
+    method public suspend Object? join(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public suspend Object? runRecomposeAndApplyChanges(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method @androidx.compose.runtime.ExperimentalComposeApi public suspend Object? runRecomposeConcurrentlyAndApplyChanges(kotlin.coroutines.CoroutineContext recomposeCoroutineContext, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    property public final long changeCount;
+    property public final kotlinx.coroutines.flow.StateFlow<androidx.compose.runtime.Recomposer.State> currentState;
+    property public final boolean hasPendingWork;
+    property @Deprecated public final kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> state;
+    field public static final androidx.compose.runtime.Recomposer.Companion Companion;
+  }
+
+  public static final class Recomposer.Companion {
+    method public kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.compose.runtime.RecomposerInfo>> getRunningRecomposers();
+    property public final kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.compose.runtime.RecomposerInfo>> runningRecomposers;
+  }
+
+  public enum Recomposer.State {
+    enum_constant public static final androidx.compose.runtime.Recomposer.State Idle;
+    enum_constant public static final androidx.compose.runtime.Recomposer.State Inactive;
+    enum_constant public static final androidx.compose.runtime.Recomposer.State InactivePendingWork;
+    enum_constant public static final androidx.compose.runtime.Recomposer.State PendingWork;
+    enum_constant public static final androidx.compose.runtime.Recomposer.State ShutDown;
+    enum_constant public static final androidx.compose.runtime.Recomposer.State ShuttingDown;
+  }
+
+  public interface RecomposerInfo {
+    method public long getChangeCount();
+    method public boolean getHasPendingWork();
+    method public kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> getState();
+    property public abstract long changeCount;
+    property public abstract boolean hasPendingWork;
+    property public abstract kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> state;
+  }
+
+  public final class RecomposerKt {
+    method public static suspend <R> Object? withRunningRecomposer(kotlin.jvm.functions.Function3<? super kotlinx.coroutines.CoroutineScope,? super androidx.compose.runtime.Recomposer,? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R> p);
+  }
+
+  public interface RememberObserver {
+    method public void onAbandoned();
+    method public void onForgotten();
+    method public void onRemembered();
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi public interface ScopeUpdateScope {
+    method public void updateScope(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.Composer,? super java.lang.Integer,kotlin.Unit> block);
+  }
+
+  public final inline class SkippableUpdater<T> {
+    ctor public SkippableUpdater();
+    method public inline void update(kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,? extends kotlin.Unit> block);
+  }
+
+  public final class SlotTableKt {
+  }
+
+  public interface SnapshotMutationPolicy<T> {
+    method public boolean equivalent(T? a, T? b);
+    method public default T? merge(T? previous, T? current, T? applied);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  @androidx.compose.runtime.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface Stable {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface StableMarker {
+  }
+
+  @androidx.compose.runtime.Stable public interface State<T> {
+    method public T! getValue();
+    property public abstract T! value;
+  }
+
+  public final class TraceKt {
+  }
+
+  public final inline class Updater<T> {
+    ctor public Updater();
+    method public inline void set(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,? extends kotlin.Unit> block);
+    method public inline void update(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,? extends kotlin.Unit> block);
+  }
+
+}
+
+package androidx.compose.runtime.collection {
+
+  public final class MutableVector<T> implements java.util.RandomAccess {
+    method public boolean add(T? element);
+    method public void add(int index, T? element);
+    method public boolean addAll(int index, java.util.List<? extends T> elements);
+    method public boolean addAll(int index, androidx.compose.runtime.collection.MutableVector<T> elements);
+    method public inline boolean addAll(java.util.List<? extends T> elements);
+    method public inline boolean addAll(androidx.compose.runtime.collection.MutableVector<T> elements);
+    method public boolean addAll(T![] elements);
+    method public boolean addAll(int index, java.util.Collection<? extends T> elements);
+    method public boolean addAll(java.util.Collection<? extends T> elements);
+    method public inline boolean any(kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public java.util.List<T> asMutableList();
+    method public void clear();
+    method public operator boolean contains(T? element);
+    method public boolean containsAll(java.util.List<? extends T> elements);
+    method public boolean containsAll(java.util.Collection<? extends T> elements);
+    method public boolean containsAll(androidx.compose.runtime.collection.MutableVector<T> elements);
+    method public boolean contentEquals(androidx.compose.runtime.collection.MutableVector<T> other);
+    method public void ensureCapacity(int capacity);
+    method public T! first();
+    method public inline T! first(kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public inline T? firstOrNull();
+    method public inline T? firstOrNull(kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public inline <R> R! fold(R? initial, kotlin.jvm.functions.Function2<? super R,? super T,? extends R> operation);
+    method public inline <R> R! foldIndexed(R? initial, kotlin.jvm.functions.Function3<? super java.lang.Integer,? super R,? super T,? extends R> operation);
+    method public inline <R> R! foldRight(R? initial, kotlin.jvm.functions.Function2<? super T,? super R,? extends R> operation);
+    method public inline <R> R! foldRightIndexed(R? initial, kotlin.jvm.functions.Function3<? super java.lang.Integer,? super T,? super R,? extends R> operation);
+    method public inline void forEach(kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline void forEachIndexed(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> block);
+    method public inline void forEachReversed(kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline void forEachReversedIndexed(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> block);
+    method public inline operator T! get(int index);
+    method public inline kotlin.ranges.IntRange getIndices();
+    method public inline int getLastIndex();
+    method public int getSize();
+    method public int indexOf(T? element);
+    method public inline int indexOfFirst(kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public inline int indexOfLast(kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public boolean isEmpty();
+    method public boolean isNotEmpty();
+    method public T! last();
+    method public inline T! last(kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public int lastIndexOf(T? element);
+    method public inline T? lastOrNull();
+    method public inline T? lastOrNull(kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public inline <reified R> R![]! map(kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+    method public inline <reified R> R![]! mapIndexed(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,? extends R> transform);
+    method public inline <reified R> androidx.compose.runtime.collection.MutableVector<R>! mapIndexedNotNull(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,? extends R> transform);
+    method public inline <reified R> androidx.compose.runtime.collection.MutableVector<R>! mapNotNull(kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+    method public inline operator void minusAssign(T? element);
+    method public inline operator void plusAssign(T? element);
+    method public boolean remove(T? element);
+    method public boolean removeAll(java.util.List<? extends T> elements);
+    method public boolean removeAll(androidx.compose.runtime.collection.MutableVector<T> elements);
+    method public boolean removeAll(java.util.Collection<? extends T> elements);
+    method public T! removeAt(int index);
+    method public void removeRange(int start, int end);
+    method public boolean retainAll(java.util.Collection<? extends T> elements);
+    method public inline boolean reversedAny(kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public operator T! set(int index, T? element);
+    method public void sortWith(java.util.Comparator<T> comparator);
+    method public inline int sumBy(kotlin.jvm.functions.Function1<? super T,java.lang.Integer> selector);
+    property public final inline kotlin.ranges.IntRange indices;
+    property public final inline int lastIndex;
+    property public final int size;
+  }
+
+  public final class MutableVectorKt {
+    method public static inline <reified T> androidx.compose.runtime.collection.MutableVector<T>! MutableVector(optional int capacity);
+    method public static inline <reified T> androidx.compose.runtime.collection.MutableVector<T>! MutableVector(int size, kotlin.jvm.functions.Function1<? super java.lang.Integer,? extends T> init);
+    method public static inline <reified T> androidx.compose.runtime.collection.MutableVector<T>! mutableVectorOf();
+    method public static inline <reified T> androidx.compose.runtime.collection.MutableVector<T>! mutableVectorOf(T? elements);
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable {
+
+  public final class ExtensionsKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList {
+
+  public final class UtilsKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap {
+
+  public final class PersistentHashMapContentIteratorsKt {
+  }
+
+  public final class TrieNodeKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableSet {
+
+  public final class TrieNodeKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.internal {
+
+  public final class CommonFunctionsKt {
+  }
+
+  public final class ForEachOneBitKt {
+  }
+
+}
+
+package androidx.compose.runtime.internal {
+
+  @androidx.compose.runtime.ComposeCompilerApi @androidx.compose.runtime.Stable public interface ComposableLambda extends kotlin.jvm.functions.Function2<androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function10<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function11<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function13<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function14<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function15<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function16<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function17<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function18<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function19<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function20<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function21<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function3<java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function4<java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function5<java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function6<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function7<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function8<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function9<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> {
+  }
+
+  public final class ComposableLambdaKt {
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambda composableLambda(androidx.compose.runtime.Composer composer, int key, boolean tracked, Object block);
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambda composableLambdaInstance(int key, boolean tracked, Object block);
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @androidx.compose.runtime.Stable public interface ComposableLambdaN extends kotlin.jvm.functions.FunctionN<java.lang.Object> {
+  }
+
+  public final class ComposableLambdaN_jvmKt {
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambdaN composableLambdaN(androidx.compose.runtime.Composer composer, int key, boolean tracked, int arity, Object block);
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambdaN composableLambdaNInstance(int key, boolean tracked, int arity, Object block);
+  }
+
+  @androidx.compose.runtime.ExperimentalComposeApi @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface Decoy {
+    method public abstract String[] signature();
+    method public abstract String targetName();
+    property public abstract String![] signature;
+    property public abstract String targetName;
+  }
+
+  @androidx.compose.runtime.ExperimentalComposeApi @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface DecoyImplementation {
+    method public abstract long id();
+    method public abstract String name();
+    property public abstract long id;
+    property public abstract String name;
+  }
+
+  public final class DecoyKt {
+    method @androidx.compose.runtime.ComposeCompilerApi public static Void illegalDecoyCallException(String fName);
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface LiveLiteralFileInfo {
+    method public abstract String file();
+    property public abstract String file;
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface LiveLiteralInfo {
+    method public abstract String key();
+    method public abstract int offset();
+    property public abstract String key;
+    property public abstract int offset;
+  }
+
+  public final class LiveLiteralKt {
+    method @androidx.compose.runtime.InternalComposeApi public static void enableLiveLiterals();
+    method public static boolean isLiveLiteralsEnabled();
+    method @androidx.compose.runtime.ComposeCompilerApi @androidx.compose.runtime.InternalComposeApi public static <T> androidx.compose.runtime.State<T> liveLiteral(String key, T? value);
+    method @androidx.compose.runtime.InternalComposeApi public static void updateLiveLiteralValue(String key, Object? value);
+    property public static final boolean isLiveLiteralsEnabled;
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface StabilityInferred {
+    method public abstract int parameters();
+    property public abstract int parameters;
+  }
+
+  public final class ThreadMapKt {
+  }
+
+}
+
+package androidx.compose.runtime.snapshots {
+
+  public final class ListUtilsKt {
+  }
+
+  public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
+    method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
+    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 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 kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
+    property public boolean readOnly;
+    property public androidx.compose.runtime.snapshots.Snapshot root;
+    property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver;
+  }
+
+  public fun interface ObserverHandle {
+    method public void dispose();
+  }
+
+  public abstract sealed class Snapshot {
+    method public void dispose();
+    method public final inline <T> T! enter(kotlin.jvm.functions.Function0<? extends T> block);
+    method public int getId();
+    method public abstract boolean getReadOnly();
+    method public abstract androidx.compose.runtime.snapshots.Snapshot getRoot();
+    method public abstract boolean hasPendingChanges();
+    method public abstract androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
+    property public int id;
+    property public abstract boolean readOnly;
+    property public abstract androidx.compose.runtime.snapshots.Snapshot root;
+    field public static final androidx.compose.runtime.snapshots.Snapshot.Companion Companion;
+  }
+
+  public static final class Snapshot.Companion {
+    method public androidx.compose.runtime.snapshots.Snapshot getCurrent();
+    method public inline <T> T! global(kotlin.jvm.functions.Function0<? extends T> block);
+    method public void notifyObjectsInitialized();
+    method public <T> T! observe(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver, kotlin.jvm.functions.Function0<? extends T> block);
+    method @androidx.compose.runtime.InternalComposeApi public int openSnapshotCount();
+    method public androidx.compose.runtime.snapshots.ObserverHandle registerApplyObserver(kotlin.jvm.functions.Function2<? super java.util.Set<?>,? super androidx.compose.runtime.snapshots.Snapshot,kotlin.Unit> observer);
+    method public androidx.compose.runtime.snapshots.ObserverHandle registerGlobalWriteObserver(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit> observer);
+    method public void sendApplyNotifications();
+    method public androidx.compose.runtime.snapshots.MutableSnapshot takeMutableSnapshot(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 takeSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
+    method public inline <R> R! withMutableSnapshot(kotlin.jvm.functions.Function0<? extends R> block);
+    property public final androidx.compose.runtime.snapshots.Snapshot current;
+  }
+
+  public final class SnapshotApplyConflictException extends java.lang.Exception {
+    ctor public SnapshotApplyConflictException(androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public androidx.compose.runtime.snapshots.Snapshot getSnapshot();
+    property public final androidx.compose.runtime.snapshots.Snapshot snapshot;
+  }
+
+  public abstract sealed class SnapshotApplyResult {
+    method public abstract void check();
+    method public abstract boolean getSucceeded();
+    property public abstract boolean succeeded;
+  }
+
+  public static final class SnapshotApplyResult.Failure extends androidx.compose.runtime.snapshots.SnapshotApplyResult {
+    ctor public SnapshotApplyResult.Failure(androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public void check();
+    method public androidx.compose.runtime.snapshots.Snapshot getSnapshot();
+    method public boolean getSucceeded();
+    property public final androidx.compose.runtime.snapshots.Snapshot snapshot;
+    property public boolean succeeded;
+  }
+
+  public static final class SnapshotApplyResult.Success extends androidx.compose.runtime.snapshots.SnapshotApplyResult {
+    method public void check();
+    method public boolean getSucceeded();
+    property public boolean succeeded;
+    field public static final androidx.compose.runtime.snapshots.SnapshotApplyResult.Success INSTANCE;
+  }
+
+  public final class SnapshotIdSetKt {
+  }
+
+  public final class SnapshotKt {
+    method public static <T extends androidx.compose.runtime.snapshots.StateRecord> T readable(T, androidx.compose.runtime.snapshots.StateObject state);
+    method public static <T extends androidx.compose.runtime.snapshots.StateRecord> T readable(T, androidx.compose.runtime.snapshots.StateObject state, androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public static inline <T extends androidx.compose.runtime.snapshots.StateRecord, R> R! withCurrent(T, kotlin.jvm.functions.Function1<? super T,? extends R> block);
+    method public static inline <T extends androidx.compose.runtime.snapshots.StateRecord, R> R! writable(T, androidx.compose.runtime.snapshots.StateObject state, androidx.compose.runtime.snapshots.Snapshot snapshot, kotlin.jvm.functions.Function1<? super T,? extends R> block);
+    method public static inline <T extends androidx.compose.runtime.snapshots.StateRecord, R> R! writable(T, androidx.compose.runtime.snapshots.StateObject state, kotlin.jvm.functions.Function1<? super T,? extends R> block);
+  }
+
+  public interface SnapshotMutableState<T> extends androidx.compose.runtime.MutableState<T> {
+    method public androidx.compose.runtime.SnapshotMutationPolicy<T> getPolicy();
+    property public abstract androidx.compose.runtime.SnapshotMutationPolicy<T> policy;
+  }
+
+  @androidx.compose.runtime.Stable public final class SnapshotStateList<T> implements kotlin.jvm.internal.markers.KMutableList java.util.List<T> androidx.compose.runtime.snapshots.StateObject {
+    ctor public SnapshotStateList();
+    method public boolean add(T? element);
+    method public void add(int index, T? element);
+    method public boolean addAll(int index, java.util.Collection<? extends T> elements);
+    method public boolean addAll(java.util.Collection<? extends T> elements);
+    method public void clear();
+    method public boolean contains(T? element);
+    method public boolean containsAll(java.util.Collection<E!> elements);
+    method public T! get(int index);
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
+    method public int getSize();
+    method public int indexOf(T? element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<T> iterator();
+    method public int lastIndexOf(T? element);
+    method public java.util.ListIterator<T> listIterator();
+    method public java.util.ListIterator<T> listIterator(int index);
+    method public void prependStateRecord(androidx.compose.runtime.snapshots.StateRecord value);
+    method public boolean remove(T? element);
+    method public boolean removeAll(java.util.Collection<E!> elements);
+    method public T! removeAt(int index);
+    method public void removeRange(int fromIndex, int toIndex);
+    method public boolean retainAll(java.util.Collection<E!> elements);
+    method public T! set(int index, T? element);
+    method public java.util.List<T> subList(int fromIndex, int toIndex);
+    property public androidx.compose.runtime.snapshots.StateRecord firstStateRecord;
+    property public int size;
+  }
+
+  public final class SnapshotStateListKt {
+  }
+
+  @androidx.compose.runtime.Stable public final class SnapshotStateMap<K, V> implements kotlin.jvm.internal.markers.KMutableMap java.util.Map<K,V> androidx.compose.runtime.snapshots.StateObject {
+    ctor public SnapshotStateMap();
+    method public void clear();
+    method public boolean containsKey(K? key);
+    method public boolean containsValue(V? value);
+    method public V? get(Object? key);
+    method public java.util.Set<java.util.Map.Entry<K,V>> getEntries();
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
+    method public java.util.Set<K> getKeys();
+    method public int getSize();
+    method public java.util.Collection<V> getValues();
+    method public boolean isEmpty();
+    method public void prependStateRecord(androidx.compose.runtime.snapshots.StateRecord value);
+    method public V? put(K? key, V? value);
+    method public void putAll(java.util.Map<? extends K,? extends V> from);
+    method public V? remove(Object? key);
+    property public java.util.Set<java.util.Map.Entry<K,V>> entries;
+    property public androidx.compose.runtime.snapshots.StateRecord firstStateRecord;
+    property public java.util.Set<K> keys;
+    property public int size;
+    property public java.util.Collection<V> values;
+  }
+
+  public final class SnapshotStateMapKt {
+  }
+
+  public final class SnapshotStateObserver {
+    ctor public SnapshotStateObserver(kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> onChangedExecutor);
+    method public void clear(Object scope);
+    method public void clear();
+    method public void clearIf(kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> predicate);
+    method @org.jetbrains.annotations.TestOnly public void notifyChanges(java.util.Set<?> changes, androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public <T> void observeReads(T scope, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> onValueChangedForScope, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public void start();
+    method public void stop();
+    method public void withNoObservations(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+  }
+
+  public interface StateObject {
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
+    method public default androidx.compose.runtime.snapshots.StateRecord? mergeRecords(androidx.compose.runtime.snapshots.StateRecord previous, androidx.compose.runtime.snapshots.StateRecord current, androidx.compose.runtime.snapshots.StateRecord applied);
+    method public void prependStateRecord(androidx.compose.runtime.snapshots.StateRecord value);
+    property public abstract androidx.compose.runtime.snapshots.StateRecord firstStateRecord;
+  }
+
+  public abstract class StateRecord {
+    ctor public StateRecord();
+    method public abstract void assign(androidx.compose.runtime.snapshots.StateRecord value);
+    method public abstract androidx.compose.runtime.snapshots.StateRecord create();
+  }
+
+}
+
+package androidx.compose.runtime.tooling {
+
+  public interface CompositionData {
+    method public Iterable<androidx.compose.runtime.tooling.CompositionGroup> getCompositionGroups();
+    method public boolean isEmpty();
+    property public abstract Iterable<androidx.compose.runtime.tooling.CompositionGroup> compositionGroups;
+    property public abstract boolean isEmpty;
+  }
+
+  public interface CompositionGroup extends androidx.compose.runtime.tooling.CompositionData {
+    method public Iterable<java.lang.Object> getData();
+    method public Object getKey();
+    method public Object? getNode();
+    method public String? getSourceInfo();
+    property public abstract Iterable<java.lang.Object> data;
+    property public abstract Object key;
+    property public abstract Object? node;
+    property public abstract String? sourceInfo;
+  }
+
+  public final class InspectionTablesKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.util.Set<androidx.compose.runtime.tooling.CompositionData>> getLocalInspectionTables();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.util.Set<androidx.compose.runtime.tooling.CompositionData>> LocalInspectionTables;
+  }
+
+}
+
diff --git a/compose/runtime/runtime/api/public_plus_experimental_current.txt b/compose/runtime/runtime/api/public_plus_experimental_current.txt
index 8d3e08cd..8c1d725 100644
--- a/compose/runtime/runtime/api/public_plus_experimental_current.txt
+++ b/compose/runtime/runtime/api/public_plus_experimental_current.txt
@@ -18,6 +18,7 @@
 
   public final class ActualAndroid_androidKt {
     method @Deprecated public static androidx.compose.runtime.MonotonicFrameClock getDefaultMonotonicFrameClock();
+    property @Deprecated public static final androidx.compose.runtime.MonotonicFrameClock DefaultMonotonicFrameClock;
   }
 
   public final class ActualJvm_jvmKt {
@@ -71,6 +72,10 @@
     method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function0<? extends T> calculation);
     method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object![]? keys, kotlin.jvm.functions.Function0<? extends T> calculation);
     method @androidx.compose.runtime.Composable public static androidx.compose.runtime.CompositionContext rememberCompositionContext();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static final androidx.compose.runtime.Composer currentComposer;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ExplicitGroupsComposable public static final int currentCompositeKeyHash;
+    property @androidx.compose.runtime.Composable public static final androidx.compose.runtime.CompositionLocalContext currentCompositionLocalContext;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static final androidx.compose.runtime.RecomposeScope currentRecomposeScope;
   }
 
   @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ComposeCompilerApi {
@@ -375,6 +380,7 @@
 
   public final inline class SkippableUpdater<T> {
     ctor public SkippableUpdater();
+    method public inline void update(kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,? extends kotlin.Unit> block);
   }
 
   public final class SlotTableKt {
@@ -410,6 +416,106 @@
     method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
   }
 
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, @kotlin.BuilderInference kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
   @androidx.compose.runtime.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface Stable {
   }
 
@@ -426,6 +532,8 @@
 
   public final inline class Updater<T> {
     ctor public Updater();
+    method public inline void set(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,? extends kotlin.Unit> block);
+    method public inline void update(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,? extends kotlin.Unit> block);
   }
 
 }
@@ -602,6 +710,7 @@
     method public static boolean isLiveLiteralsEnabled();
     method @androidx.compose.runtime.ComposeCompilerApi @androidx.compose.runtime.InternalComposeApi public static <T> androidx.compose.runtime.State<T> liveLiteral(String key, T? value);
     method @androidx.compose.runtime.InternalComposeApi public static void updateLiveLiteralValue(String key, Object? value);
+    property public static final boolean isLiveLiteralsEnabled;
   }
 
   @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface StabilityInferred {
@@ -819,6 +928,7 @@
 
   public final class InspectionTablesKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<java.util.Set<androidx.compose.runtime.tooling.CompositionData>> getLocalInspectionTables();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.util.Set<androidx.compose.runtime.tooling.CompositionData>> LocalInspectionTables;
   }
 
 }
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/runtime/runtime/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to compose/runtime/runtime/api/res-1.1.0-beta02.txt
diff --git a/compose/runtime/runtime/api/restricted_1.1.0-beta02.txt b/compose/runtime/runtime/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..4f28290
--- /dev/null
+++ b/compose/runtime/runtime/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,938 @@
+// Signature format: 4.0
+package androidx.compose.runtime {
+
+  public abstract class AbstractApplier<T> implements androidx.compose.runtime.Applier<T> {
+    ctor public AbstractApplier(T? root);
+    method public final void clear();
+    method public void down(T? node);
+    method public T! getCurrent();
+    method public final T! getRoot();
+    method protected final void move(java.util.List<T>, int from, int to, int count);
+    method protected abstract void onClear();
+    method protected final void remove(java.util.List<T>, int index, int count);
+    method protected void setCurrent(T! current);
+    method public void up();
+    property public T! current;
+    property public final T! root;
+  }
+
+  public final class ActualAndroid_androidKt {
+    method @Deprecated public static androidx.compose.runtime.MonotonicFrameClock getDefaultMonotonicFrameClock();
+    property @Deprecated public static final androidx.compose.runtime.MonotonicFrameClock DefaultMonotonicFrameClock;
+  }
+
+  public final class ActualJvm_jvmKt {
+    method @kotlin.PublishedApi internal static inline <R> R! synchronized(Object lock, kotlin.jvm.functions.Function0<? extends R> block);
+  }
+
+  public interface Applier<N> {
+    method public void clear();
+    method public void down(N? node);
+    method public N! getCurrent();
+    method public void insertBottomUp(int index, N? instance);
+    method public void insertTopDown(int index, N? instance);
+    method public void move(int from, int to, int count);
+    method public default void onBeginChanges();
+    method public default void onEndChanges();
+    method public void remove(int index, int count);
+    method public void up();
+    property public abstract N! current;
+  }
+
+  public final class BitwiseOperatorsKt {
+  }
+
+  public final class BroadcastFrameClock implements androidx.compose.runtime.MonotonicFrameClock {
+    ctor public BroadcastFrameClock(optional kotlin.jvm.functions.Function0<kotlin.Unit>? onNewAwaiters);
+    method public void cancel(optional java.util.concurrent.CancellationException cancellationException);
+    method public boolean getHasAwaiters();
+    method public void sendFrame(long timeNanos);
+    method public suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+    property public final boolean hasAwaiters;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface Composable {
+  }
+
+  public final class ComposablesKt {
+    method @androidx.compose.runtime.Composable public static inline <T extends java.lang.Object, reified E extends androidx.compose.runtime.Applier<?>> void ComposeNode(kotlin.jvm.functions.Function0<? extends T> factory, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,? extends kotlin.Unit> update);
+    method @androidx.compose.runtime.Composable public static inline <T extends java.lang.Object, reified E extends androidx.compose.runtime.Applier<?>> void ComposeNode(kotlin.jvm.functions.Function0<? extends T> factory, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,? extends kotlin.Unit> update, kotlin.jvm.functions.Function0<? extends kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ExplicitGroupsComposable public static inline <T, reified E extends androidx.compose.runtime.Applier<?>> void ComposeNode(kotlin.jvm.functions.Function0<? extends T> factory, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,? extends kotlin.Unit> update, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.SkippableUpdater<T>,? extends kotlin.Unit> skippableUpdate, kotlin.jvm.functions.Function0<? extends kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static inline <T extends java.lang.Object, reified E extends androidx.compose.runtime.Applier<?>> void ReusableComposeNode(kotlin.jvm.functions.Function0<? extends T> factory, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,? extends kotlin.Unit> update);
+    method @androidx.compose.runtime.Composable public static inline <T extends java.lang.Object, reified E extends androidx.compose.runtime.Applier<?>> void ReusableComposeNode(kotlin.jvm.functions.Function0<? extends T> factory, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,? extends kotlin.Unit> update, kotlin.jvm.functions.Function0<? extends kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ExplicitGroupsComposable public static inline <T, reified E extends androidx.compose.runtime.Applier<?>> void ReusableComposeNode(kotlin.jvm.functions.Function0<? extends T> factory, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,? extends kotlin.Unit> update, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.SkippableUpdater<T>,? extends kotlin.Unit> skippableUpdate, kotlin.jvm.functions.Function0<? extends kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static inline void ReusableContent(Object? key, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static androidx.compose.runtime.Composer getCurrentComposer();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ExplicitGroupsComposable public static int getCurrentCompositeKeyHash();
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.CompositionLocalContext getCurrentCompositionLocalContext();
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static androidx.compose.runtime.RecomposeScope getCurrentRecomposeScope();
+    method @kotlin.PublishedApi internal static void invalidApplier();
+    method @androidx.compose.runtime.Composable public static inline <T> T! key(Object![]? keys, kotlin.jvm.functions.Function0<? extends T> block);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object? key1, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object? key1, Object? key2, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object![]? keys, kotlin.jvm.functions.Function0<? extends T> calculation);
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.CompositionContext rememberCompositionContext();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static final androidx.compose.runtime.Composer currentComposer;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ExplicitGroupsComposable public static final int currentCompositeKeyHash;
+    property @androidx.compose.runtime.Composable public static final androidx.compose.runtime.CompositionLocalContext currentCompositionLocalContext;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static final androidx.compose.runtime.RecomposeScope currentRecomposeScope;
+  }
+
+  @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ComposeCompilerApi {
+  }
+
+  public interface Composer {
+    method @androidx.compose.runtime.ComposeCompilerApi public <V, T> void apply(V? value, kotlin.jvm.functions.Function2<? super T,? super V,kotlin.Unit> block);
+    method @androidx.compose.runtime.ComposeCompilerApi public boolean changed(Object? value);
+    method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(boolean value);
+    method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(char value);
+    method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(byte value);
+    method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(short value);
+    method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(int value);
+    method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(float value);
+    method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(long value);
+    method @androidx.compose.runtime.ComposeCompilerApi public default boolean changed(double value);
+    method public void collectParameterInformation();
+    method @androidx.compose.runtime.ComposeCompilerApi public <T> void createNode(kotlin.jvm.functions.Function0<? extends T> factory);
+    method @androidx.compose.runtime.ComposeCompilerApi public void disableReusing();
+    method @androidx.compose.runtime.ComposeCompilerApi public void enableReusing();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endDefaults();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endMovableGroup();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endNode();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endReplaceableGroup();
+    method @androidx.compose.runtime.ComposeCompilerApi public androidx.compose.runtime.ScopeUpdateScope? endRestartGroup();
+    method @androidx.compose.runtime.ComposeCompilerApi public void endReusableGroup();
+    method public androidx.compose.runtime.Applier<?> getApplier();
+    method @org.jetbrains.annotations.TestOnly public kotlin.coroutines.CoroutineContext getApplyCoroutineContext();
+    method @org.jetbrains.annotations.TestOnly public androidx.compose.runtime.ControlledComposition getComposition();
+    method public androidx.compose.runtime.tooling.CompositionData getCompositionData();
+    method public int getCompoundKeyHash();
+    method public boolean getDefaultsInvalid();
+    method public boolean getInserting();
+    method public androidx.compose.runtime.RecomposeScope? getRecomposeScope();
+    method public boolean getSkipping();
+    method @androidx.compose.runtime.ComposeCompilerApi public Object joinKey(Object? left, Object? right);
+    method @androidx.compose.runtime.ComposeCompilerApi public Object? rememberedValue();
+    method @androidx.compose.runtime.ComposeCompilerApi public void skipCurrentGroup();
+    method @androidx.compose.runtime.ComposeCompilerApi public void skipToGroupEnd();
+    method public void sourceInformation(String sourceInformation);
+    method public void sourceInformationMarkerEnd();
+    method public void sourceInformationMarkerStart(int key, String sourceInformation);
+    method @androidx.compose.runtime.ComposeCompilerApi public void startDefaults();
+    method @androidx.compose.runtime.ComposeCompilerApi public void startMovableGroup(int key, Object? dataKey);
+    method @androidx.compose.runtime.ComposeCompilerApi public void startNode();
+    method @androidx.compose.runtime.ComposeCompilerApi public void startReplaceableGroup(int key);
+    method @androidx.compose.runtime.ComposeCompilerApi public androidx.compose.runtime.Composer startRestartGroup(int key);
+    method @androidx.compose.runtime.ComposeCompilerApi public void startReusableGroup(int key, Object? dataKey);
+    method @androidx.compose.runtime.ComposeCompilerApi public void startReusableNode();
+    method @androidx.compose.runtime.ComposeCompilerApi public void updateRememberedValue(Object? value);
+    method @androidx.compose.runtime.ComposeCompilerApi public void useNode();
+    property public abstract androidx.compose.runtime.Applier<?> applier;
+    property @org.jetbrains.annotations.TestOnly public abstract kotlin.coroutines.CoroutineContext applyCoroutineContext;
+    property @org.jetbrains.annotations.TestOnly public abstract androidx.compose.runtime.ControlledComposition composition;
+    property public abstract androidx.compose.runtime.tooling.CompositionData compositionData;
+    property public abstract int compoundKeyHash;
+    property public abstract boolean defaultsInvalid;
+    property public abstract boolean inserting;
+    property public abstract androidx.compose.runtime.RecomposeScope? recomposeScope;
+    property public abstract boolean skipping;
+    field public static final androidx.compose.runtime.Composer.Companion Companion;
+  }
+
+  public static final class Composer.Companion {
+    method public Object getEmpty();
+    property public final Object Empty;
+  }
+
+  public final class ComposerKt {
+    method @androidx.compose.runtime.ComposeCompilerApi public static inline <T> T! cache(androidx.compose.runtime.Composer, boolean invalid, kotlin.jvm.functions.Function0<? extends T> block);
+    method @androidx.compose.runtime.ComposeCompilerApi public static void sourceInformation(androidx.compose.runtime.Composer composer, String sourceInformation);
+    method @androidx.compose.runtime.ComposeCompilerApi public static void sourceInformationMarkerEnd(androidx.compose.runtime.Composer composer);
+    method @androidx.compose.runtime.ComposeCompilerApi public static void sourceInformationMarkerStart(androidx.compose.runtime.Composer composer, int key, String sourceInformation);
+    field @kotlin.PublishedApi internal static final Object compositionLocalMap;
+    field @kotlin.PublishedApi internal static final int compositionLocalMapKey = 202; // 0xca
+    field @kotlin.PublishedApi internal static final Object invocation;
+    field @kotlin.PublishedApi internal static final int invocationKey = 200; // 0xc8
+    field @kotlin.PublishedApi internal static final Object provider;
+    field @kotlin.PublishedApi internal static final int providerKey = 201; // 0xc9
+    field @kotlin.PublishedApi internal static final Object providerMaps;
+    field @kotlin.PublishedApi internal static final int providerMapsKey = 204; // 0xcc
+    field @kotlin.PublishedApi internal static final Object providerValues;
+    field @kotlin.PublishedApi internal static final int providerValuesKey = 203; // 0xcb
+    field @kotlin.PublishedApi internal static final Object reference;
+    field @kotlin.PublishedApi internal static final int referenceKey = 206; // 0xce
+    field @kotlin.PublishedApi internal static final int reuseKey = 207; // 0xcf
+  }
+
+  public interface Composition {
+    method public void dispose();
+    method public boolean getHasInvalidations();
+    method public boolean isDisposed();
+    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    property public abstract boolean hasInvalidations;
+    property public abstract boolean isDisposed;
+  }
+
+  public abstract class CompositionContext {
+  }
+
+  public final class CompositionContextKt {
+  }
+
+  public final class CompositionKt {
+    method public static androidx.compose.runtime.Composition Composition(androidx.compose.runtime.Applier<?> applier, androidx.compose.runtime.CompositionContext parent);
+    method @org.jetbrains.annotations.TestOnly public static androidx.compose.runtime.ControlledComposition ControlledComposition(androidx.compose.runtime.Applier<?> applier, androidx.compose.runtime.CompositionContext parent);
+  }
+
+  @androidx.compose.runtime.Stable public abstract sealed class CompositionLocal<T> {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! getCurrent();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final inline T! current;
+  }
+
+  @androidx.compose.runtime.Stable public final class CompositionLocalContext {
+  }
+
+  public final class CompositionLocalKt {
+    method @androidx.compose.runtime.Composable public static void CompositionLocalProvider(androidx.compose.runtime.ProvidedValue<?>![] values, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void CompositionLocalProvider(androidx.compose.runtime.CompositionLocalContext context, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> compositionLocalOf(optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy, kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+    method public static <T> androidx.compose.runtime.ProvidableCompositionLocal<T> staticCompositionLocalOf(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+  }
+
+  @kotlin.PublishedApi internal final class CompositionScopedCoroutineScopeCanceller implements androidx.compose.runtime.RememberObserver {
+    ctor public CompositionScopedCoroutineScopeCanceller(kotlinx.coroutines.CoroutineScope coroutineScope);
+    method public kotlinx.coroutines.CoroutineScope getCoroutineScope();
+    method public void onAbandoned();
+    method public void onForgotten();
+    method public void onRemembered();
+    property public final kotlinx.coroutines.CoroutineScope coroutineScope;
+  }
+
+  public interface ControlledComposition extends androidx.compose.runtime.Composition {
+    method public void applyChanges();
+    method public void composeContent(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method public boolean getHasPendingChanges();
+    method public void invalidateAll();
+    method public boolean isComposing();
+    method public boolean observesAnyOf(java.util.Set<?> values);
+    method public void prepareCompose(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public boolean recompose();
+    method public void recordModificationsOf(java.util.Set<?> values);
+    method public void recordReadOf(Object value);
+    method public void recordWriteOf(Object value);
+    property public abstract boolean hasPendingChanges;
+    property public abstract boolean isComposing;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface DisallowComposableCalls {
+  }
+
+  public interface DisposableEffectResult {
+    method public void dispose();
+  }
+
+  public final class DisposableEffectScope {
+    ctor public DisposableEffectScope();
+    method public inline androidx.compose.runtime.DisposableEffectResult onDispose(kotlin.jvm.functions.Function0<kotlin.Unit> onDisposeEffect);
+  }
+
+  public final class EffectsKt {
+    method @Deprecated @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void DisposableEffect(kotlin.jvm.functions.Function1<? super androidx.compose.runtime.DisposableEffectScope,? extends androidx.compose.runtime.DisposableEffectResult> effect);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void DisposableEffect(Object? key1, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.DisposableEffectScope,? extends androidx.compose.runtime.DisposableEffectResult> effect);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void DisposableEffect(Object? key1, Object? key2, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.DisposableEffectScope,? extends androidx.compose.runtime.DisposableEffectResult> effect);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void DisposableEffect(Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.DisposableEffectScope,? extends androidx.compose.runtime.DisposableEffectResult> effect);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void DisposableEffect(Object![]? keys, kotlin.jvm.functions.Function1<? super androidx.compose.runtime.DisposableEffectScope,? extends androidx.compose.runtime.DisposableEffectResult> effect);
+    method @Deprecated @androidx.compose.runtime.Composable public static void LaunchedEffect(kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void LaunchedEffect(Object? key1, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void LaunchedEffect(Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void LaunchedEffect(Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void LaunchedEffect(Object![]? keys, kotlin.jvm.functions.Function2<? super kotlinx.coroutines.CoroutineScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.NonRestartableComposable public static void SideEffect(kotlin.jvm.functions.Function0<kotlin.Unit> effect);
+    method @kotlin.PublishedApi internal static kotlinx.coroutines.CoroutineScope createCompositionCoroutineScope(kotlin.coroutines.CoroutineContext coroutineContext, androidx.compose.runtime.Composer composer);
+    method @androidx.compose.runtime.Composable public static inline kotlinx.coroutines.CoroutineScope rememberCoroutineScope(optional kotlin.jvm.functions.Function0<? extends kotlin.coroutines.CoroutineContext> getContext);
+  }
+
+  public final class ExpectKt {
+    method @kotlin.PublishedApi internal static inline <R> R! synchronized(Object lock, kotlin.jvm.functions.Function0<? extends R> block);
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ExplicitGroupsComposable {
+  }
+
+  @androidx.compose.runtime.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface Immutable {
+  }
+
+  public interface MonotonicFrameClock extends kotlin.coroutines.CoroutineContext.Element {
+    method public default kotlin.coroutines.CoroutineContext.Key<?> getKey();
+    method public suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+    property public default kotlin.coroutines.CoroutineContext.Key<?> key;
+    field public static final androidx.compose.runtime.MonotonicFrameClock.Key Key;
+  }
+
+  public static final class MonotonicFrameClock.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.runtime.MonotonicFrameClock> {
+  }
+
+  public final class MonotonicFrameClockKt {
+    method public static androidx.compose.runtime.MonotonicFrameClock getMonotonicFrameClock(kotlin.coroutines.CoroutineContext);
+    method public static suspend inline <R> Object? withFrameMillis(androidx.compose.runtime.MonotonicFrameClock, kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+    method public static suspend <R> Object? withFrameMillis(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+    method public static suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+  }
+
+  @androidx.compose.runtime.Stable public interface MutableState<T> extends androidx.compose.runtime.State<T> {
+    method public operator T! component1();
+    method public operator kotlin.jvm.functions.Function1<T,kotlin.Unit> component2();
+    method public void setValue(T! value);
+    property public abstract T! value;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface NoLiveLiterals {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface NonRestartableComposable {
+  }
+
+  public final class PausableMonotonicFrameClock implements androidx.compose.runtime.MonotonicFrameClock {
+    ctor public PausableMonotonicFrameClock(androidx.compose.runtime.MonotonicFrameClock frameClock);
+    method public boolean isPaused();
+    method public void pause();
+    method public void resume();
+    method public suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+    property public final boolean isPaused;
+  }
+
+  public interface ProduceStateScope<T> extends androidx.compose.runtime.MutableState<T> kotlinx.coroutines.CoroutineScope {
+    method public suspend Object? awaitDispose(kotlin.jvm.functions.Function0<kotlin.Unit> onDispose, kotlin.coroutines.Continuation<?> p);
+  }
+
+  @androidx.compose.runtime.Stable public abstract class ProvidableCompositionLocal<T> extends androidx.compose.runtime.CompositionLocal<T> {
+    method public final infix androidx.compose.runtime.ProvidedValue<T> provides(T? value);
+    method public final infix androidx.compose.runtime.ProvidedValue<T> providesDefault(T? value);
+  }
+
+  public final class ProvidedValue<T> {
+    method public boolean getCanOverride();
+    method public androidx.compose.runtime.CompositionLocal<T> getCompositionLocal();
+    method public T! getValue();
+    property public final boolean canOverride;
+    property public final androidx.compose.runtime.CompositionLocal<T> compositionLocal;
+    property public final T! value;
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ReadOnlyComposable {
+  }
+
+  public interface RecomposeScope {
+    method public void invalidate();
+  }
+
+  public final class RecomposeScopeImplKt {
+  }
+
+  public final class Recomposer extends androidx.compose.runtime.CompositionContext {
+    ctor public Recomposer(kotlin.coroutines.CoroutineContext effectCoroutineContext);
+    method public androidx.compose.runtime.RecomposerInfo asRecomposerInfo();
+    method public suspend Object? awaitIdle(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public void cancel();
+    method public void close();
+    method public long getChangeCount();
+    method public kotlinx.coroutines.flow.StateFlow<androidx.compose.runtime.Recomposer.State> getCurrentState();
+    method public boolean getHasPendingWork();
+    method @Deprecated public kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> getState();
+    method public suspend Object? join(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public suspend Object? runRecomposeAndApplyChanges(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    property public final long changeCount;
+    property public final kotlinx.coroutines.flow.StateFlow<androidx.compose.runtime.Recomposer.State> currentState;
+    property public final boolean hasPendingWork;
+    property @Deprecated public final kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> state;
+    field public static final androidx.compose.runtime.Recomposer.Companion Companion;
+  }
+
+  public static final class Recomposer.Companion {
+    method public kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.compose.runtime.RecomposerInfo>> getRunningRecomposers();
+    property public final kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.compose.runtime.RecomposerInfo>> runningRecomposers;
+  }
+
+  public enum Recomposer.State {
+    enum_constant public static final androidx.compose.runtime.Recomposer.State Idle;
+    enum_constant public static final androidx.compose.runtime.Recomposer.State Inactive;
+    enum_constant public static final androidx.compose.runtime.Recomposer.State InactivePendingWork;
+    enum_constant public static final androidx.compose.runtime.Recomposer.State PendingWork;
+    enum_constant public static final androidx.compose.runtime.Recomposer.State ShutDown;
+    enum_constant public static final androidx.compose.runtime.Recomposer.State ShuttingDown;
+  }
+
+  public interface RecomposerInfo {
+    method public long getChangeCount();
+    method public boolean getHasPendingWork();
+    method public kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> getState();
+    property public abstract long changeCount;
+    property public abstract boolean hasPendingWork;
+    property public abstract kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> state;
+  }
+
+  public final class RecomposerKt {
+    method public static suspend <R> Object? withRunningRecomposer(kotlin.jvm.functions.Function3<? super kotlinx.coroutines.CoroutineScope,? super androidx.compose.runtime.Recomposer,? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R> p);
+  }
+
+  public interface RememberObserver {
+    method public void onAbandoned();
+    method public void onForgotten();
+    method public void onRemembered();
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi public interface ScopeUpdateScope {
+    method public void updateScope(kotlin.jvm.functions.Function2<? super androidx.compose.runtime.Composer,? super java.lang.Integer,kotlin.Unit> block);
+  }
+
+  public final inline class SkippableUpdater<T> {
+    ctor public SkippableUpdater();
+    method public inline void update(kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,? extends kotlin.Unit> block);
+  }
+
+  public final class SlotTableKt {
+  }
+
+  public interface SnapshotMutationPolicy<T> {
+    method public boolean equivalent(T? a, T? b);
+    method public default T? merge(T? previous, T? current, T? applied);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  @androidx.compose.runtime.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface Stable {
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface StableMarker {
+  }
+
+  @androidx.compose.runtime.Stable public interface State<T> {
+    method public T! getValue();
+    property public abstract T! value;
+  }
+
+  public final class TraceKt {
+  }
+
+  public final inline class Updater<T> {
+    ctor public Updater();
+    method public inline void set(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,? extends kotlin.Unit> block);
+    method public inline void update(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,? extends kotlin.Unit> block);
+  }
+
+}
+
+package androidx.compose.runtime.collection {
+
+  public final class MutableVector<T> implements java.util.RandomAccess {
+    ctor @kotlin.PublishedApi internal MutableVector(@kotlin.PublishedApi T![] content, int size);
+    method public boolean add(T? element);
+    method public void add(int index, T? element);
+    method public boolean addAll(int index, java.util.List<? extends T> elements);
+    method public boolean addAll(int index, androidx.compose.runtime.collection.MutableVector<T> elements);
+    method public inline boolean addAll(java.util.List<? extends T> elements);
+    method public inline boolean addAll(androidx.compose.runtime.collection.MutableVector<T> elements);
+    method public boolean addAll(T![] elements);
+    method public boolean addAll(int index, java.util.Collection<? extends T> elements);
+    method public boolean addAll(java.util.Collection<? extends T> elements);
+    method public inline boolean any(kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public java.util.List<T> asMutableList();
+    method public void clear();
+    method public operator boolean contains(T? element);
+    method public boolean containsAll(java.util.List<? extends T> elements);
+    method public boolean containsAll(java.util.Collection<? extends T> elements);
+    method public boolean containsAll(androidx.compose.runtime.collection.MutableVector<T> elements);
+    method public boolean contentEquals(androidx.compose.runtime.collection.MutableVector<T> other);
+    method public void ensureCapacity(int capacity);
+    method public T! first();
+    method public inline T! first(kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public inline T? firstOrNull();
+    method public inline T? firstOrNull(kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public inline <R> R! fold(R? initial, kotlin.jvm.functions.Function2<? super R,? super T,? extends R> operation);
+    method public inline <R> R! foldIndexed(R? initial, kotlin.jvm.functions.Function3<? super java.lang.Integer,? super R,? super T,? extends R> operation);
+    method public inline <R> R! foldRight(R? initial, kotlin.jvm.functions.Function2<? super T,? super R,? extends R> operation);
+    method public inline <R> R! foldRightIndexed(R? initial, kotlin.jvm.functions.Function3<? super java.lang.Integer,? super T,? super R,? extends R> operation);
+    method public inline void forEach(kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline void forEachIndexed(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> block);
+    method public inline void forEachReversed(kotlin.jvm.functions.Function1<? super T,kotlin.Unit> block);
+    method public inline void forEachReversedIndexed(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> block);
+    method public inline operator T! get(int index);
+    method public inline kotlin.ranges.IntRange getIndices();
+    method public inline int getLastIndex();
+    method public int getSize();
+    method public int indexOf(T? element);
+    method public inline int indexOfFirst(kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public inline int indexOfLast(kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public boolean isEmpty();
+    method public boolean isNotEmpty();
+    method public T! last();
+    method public inline T! last(kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public int lastIndexOf(T? element);
+    method public inline T? lastOrNull();
+    method public inline T? lastOrNull(kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public inline <reified R> R![]! map(kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+    method public inline <reified R> R![]! mapIndexed(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,? extends R> transform);
+    method public inline <reified R> androidx.compose.runtime.collection.MutableVector<R>! mapIndexedNotNull(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,? extends R> transform);
+    method public inline <reified R> androidx.compose.runtime.collection.MutableVector<R>! mapNotNull(kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+    method public inline operator void minusAssign(T? element);
+    method public inline operator void plusAssign(T? element);
+    method public boolean remove(T? element);
+    method public boolean removeAll(java.util.List<? extends T> elements);
+    method public boolean removeAll(androidx.compose.runtime.collection.MutableVector<T> elements);
+    method public boolean removeAll(java.util.Collection<? extends T> elements);
+    method public T! removeAt(int index);
+    method public void removeRange(int start, int end);
+    method public boolean retainAll(java.util.Collection<? extends T> elements);
+    method public inline boolean reversedAny(kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public operator T! set(int index, T? element);
+    method public void sortWith(java.util.Comparator<T> comparator);
+    method public inline int sumBy(kotlin.jvm.functions.Function1<? super T,java.lang.Integer> selector);
+    method @kotlin.PublishedApi internal Void throwNoSuchElementException();
+    property public final inline kotlin.ranges.IntRange indices;
+    property public final inline int lastIndex;
+    property public final int size;
+  }
+
+  public final class MutableVectorKt {
+    method public static inline <reified T> androidx.compose.runtime.collection.MutableVector<T>! MutableVector(optional int capacity);
+    method public static inline <reified T> androidx.compose.runtime.collection.MutableVector<T>! MutableVector(int size, kotlin.jvm.functions.Function1<? super java.lang.Integer,? extends T> init);
+    method public static inline <reified T> androidx.compose.runtime.collection.MutableVector<T>! mutableVectorOf();
+    method public static inline <reified T> androidx.compose.runtime.collection.MutableVector<T>! mutableVectorOf(T? elements);
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable {
+
+  public final class ExtensionsKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList {
+
+  public final class UtilsKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableMap {
+
+  public final class PersistentHashMapContentIteratorsKt {
+  }
+
+  public final class TrieNodeKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableSet {
+
+  public final class TrieNodeKt {
+  }
+
+}
+
+package androidx.compose.runtime.external.kotlinx.collections.immutable.internal {
+
+  public final class CommonFunctionsKt {
+  }
+
+  public final class ForEachOneBitKt {
+  }
+
+}
+
+package androidx.compose.runtime.internal {
+
+  @androidx.compose.runtime.ComposeCompilerApi @androidx.compose.runtime.Stable public interface ComposableLambda extends kotlin.jvm.functions.Function2<androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function10<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function11<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function13<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function14<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function15<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function16<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function17<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function18<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function19<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function20<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function21<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function3<java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function4<java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function5<java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function6<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function7<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function8<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> kotlin.jvm.functions.Function9<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,androidx.compose.runtime.Composer,java.lang.Integer,java.lang.Object> {
+  }
+
+  public final class ComposableLambdaKt {
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambda composableLambda(androidx.compose.runtime.Composer composer, int key, boolean tracked, Object block);
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambda composableLambdaInstance(int key, boolean tracked, Object block);
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @androidx.compose.runtime.Stable public interface ComposableLambdaN extends kotlin.jvm.functions.FunctionN<java.lang.Object> {
+  }
+
+  public final class ComposableLambdaN_jvmKt {
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambdaN composableLambdaN(androidx.compose.runtime.Composer composer, int key, boolean tracked, int arity, Object block);
+    method @androidx.compose.runtime.ComposeCompilerApi public static androidx.compose.runtime.internal.ComposableLambdaN composableLambdaNInstance(int key, boolean tracked, int arity, Object block);
+  }
+
+  public final class DecoyKt {
+    method @androidx.compose.runtime.ComposeCompilerApi public static Void illegalDecoyCallException(String fName);
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface LiveLiteralFileInfo {
+    method public abstract String file();
+    property public abstract String file;
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface LiveLiteralInfo {
+    method public abstract String key();
+    method public abstract int offset();
+    property public abstract String key;
+    property public abstract int offset;
+  }
+
+  public final class LiveLiteralKt {
+    method public static boolean isLiveLiteralsEnabled();
+    property public static final boolean isLiveLiteralsEnabled;
+  }
+
+  @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface StabilityInferred {
+    method public abstract int parameters();
+    property public abstract int parameters;
+  }
+
+  public final class ThreadMapKt {
+  }
+
+}
+
+package androidx.compose.runtime.snapshots {
+
+  public final class ListUtilsKt {
+  }
+
+  public class MutableSnapshot extends androidx.compose.runtime.snapshots.Snapshot {
+    method public androidx.compose.runtime.snapshots.SnapshotApplyResult apply();
+    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 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 kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver;
+    property public boolean readOnly;
+    property public androidx.compose.runtime.snapshots.Snapshot root;
+    property public kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver;
+  }
+
+  public fun interface ObserverHandle {
+    method public void dispose();
+  }
+
+  public abstract sealed class Snapshot {
+    method public void dispose();
+    method public final inline <T> T! enter(kotlin.jvm.functions.Function0<? extends T> block);
+    method public int getId();
+    method public abstract boolean getReadOnly();
+    method public abstract androidx.compose.runtime.snapshots.Snapshot getRoot();
+    method public abstract boolean hasPendingChanges();
+    method @kotlin.PublishedApi internal androidx.compose.runtime.snapshots.Snapshot? makeCurrent();
+    method @kotlin.PublishedApi internal void restoreCurrent(androidx.compose.runtime.snapshots.Snapshot? snapshot);
+    method public abstract androidx.compose.runtime.snapshots.Snapshot takeNestedSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
+    property public int id;
+    property public abstract boolean readOnly;
+    property public abstract androidx.compose.runtime.snapshots.Snapshot root;
+    field public static final androidx.compose.runtime.snapshots.Snapshot.Companion Companion;
+  }
+
+  public static final class Snapshot.Companion {
+    method public androidx.compose.runtime.snapshots.Snapshot getCurrent();
+    method public inline <T> T! global(kotlin.jvm.functions.Function0<? extends T> block);
+    method public void notifyObjectsInitialized();
+    method public <T> T! observe(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver, optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? writeObserver, kotlin.jvm.functions.Function0<? extends T> block);
+    method public androidx.compose.runtime.snapshots.ObserverHandle registerApplyObserver(kotlin.jvm.functions.Function2<? super java.util.Set<?>,? super androidx.compose.runtime.snapshots.Snapshot,kotlin.Unit> observer);
+    method public androidx.compose.runtime.snapshots.ObserverHandle registerGlobalWriteObserver(kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit> observer);
+    method @kotlin.PublishedApi internal androidx.compose.runtime.snapshots.Snapshot? removeCurrent();
+    method @kotlin.PublishedApi internal void restoreCurrent(androidx.compose.runtime.snapshots.Snapshot? previous);
+    method public void sendApplyNotifications();
+    method public androidx.compose.runtime.snapshots.MutableSnapshot takeMutableSnapshot(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 takeSnapshot(optional kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit>? readObserver);
+    method public inline <R> R! withMutableSnapshot(kotlin.jvm.functions.Function0<? extends R> block);
+    property public final androidx.compose.runtime.snapshots.Snapshot current;
+  }
+
+  public final class SnapshotApplyConflictException extends java.lang.Exception {
+    ctor public SnapshotApplyConflictException(androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public androidx.compose.runtime.snapshots.Snapshot getSnapshot();
+    property public final androidx.compose.runtime.snapshots.Snapshot snapshot;
+  }
+
+  public abstract sealed class SnapshotApplyResult {
+    method public abstract void check();
+    method public abstract boolean getSucceeded();
+    property public abstract boolean succeeded;
+  }
+
+  public static final class SnapshotApplyResult.Failure extends androidx.compose.runtime.snapshots.SnapshotApplyResult {
+    ctor public SnapshotApplyResult.Failure(androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public void check();
+    method public androidx.compose.runtime.snapshots.Snapshot getSnapshot();
+    method public boolean getSucceeded();
+    property public final androidx.compose.runtime.snapshots.Snapshot snapshot;
+    property public boolean succeeded;
+  }
+
+  public static final class SnapshotApplyResult.Success extends androidx.compose.runtime.snapshots.SnapshotApplyResult {
+    method public void check();
+    method public boolean getSucceeded();
+    property public boolean succeeded;
+    field public static final androidx.compose.runtime.snapshots.SnapshotApplyResult.Success INSTANCE;
+  }
+
+  public final class SnapshotIdSetKt {
+  }
+
+  public final class SnapshotKt {
+    method @kotlin.PublishedApi internal static <T extends androidx.compose.runtime.snapshots.StateRecord> T current(T r, androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method @kotlin.PublishedApi internal static void notifyWrite(androidx.compose.runtime.snapshots.Snapshot snapshot, androidx.compose.runtime.snapshots.StateObject state);
+    method public static <T extends androidx.compose.runtime.snapshots.StateRecord> T readable(T, androidx.compose.runtime.snapshots.StateObject state);
+    method public static <T extends androidx.compose.runtime.snapshots.StateRecord> T readable(T, androidx.compose.runtime.snapshots.StateObject state, androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method @kotlin.PublishedApi internal static inline <T> T! sync(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static inline <T extends androidx.compose.runtime.snapshots.StateRecord, R> R! withCurrent(T, kotlin.jvm.functions.Function1<? super T,? extends R> block);
+    method public static inline <T extends androidx.compose.runtime.snapshots.StateRecord, R> R! writable(T, androidx.compose.runtime.snapshots.StateObject state, androidx.compose.runtime.snapshots.Snapshot snapshot, kotlin.jvm.functions.Function1<? super T,? extends R> block);
+    method public static inline <T extends androidx.compose.runtime.snapshots.StateRecord, R> R! writable(T, androidx.compose.runtime.snapshots.StateObject state, kotlin.jvm.functions.Function1<? super T,? extends R> block);
+    method @kotlin.PublishedApi internal static <T extends androidx.compose.runtime.snapshots.StateRecord> T writableRecord(T, androidx.compose.runtime.snapshots.StateObject state, androidx.compose.runtime.snapshots.Snapshot snapshot);
+    field @kotlin.PublishedApi internal static final Object lock;
+    field @kotlin.PublishedApi internal static final androidx.compose.runtime.snapshots.Snapshot snapshotInitializer;
+  }
+
+  public interface SnapshotMutableState<T> extends androidx.compose.runtime.MutableState<T> {
+    method public androidx.compose.runtime.SnapshotMutationPolicy<T> getPolicy();
+    property public abstract androidx.compose.runtime.SnapshotMutationPolicy<T> policy;
+  }
+
+  @androidx.compose.runtime.Stable public final class SnapshotStateList<T> implements kotlin.jvm.internal.markers.KMutableList java.util.List<T> androidx.compose.runtime.snapshots.StateObject {
+    ctor public SnapshotStateList();
+    method public boolean add(T? element);
+    method public void add(int index, T? element);
+    method public boolean addAll(int index, java.util.Collection<? extends T> elements);
+    method public boolean addAll(java.util.Collection<? extends T> elements);
+    method public void clear();
+    method public boolean contains(T? element);
+    method public boolean containsAll(java.util.Collection<E!> elements);
+    method public T! get(int index);
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
+    method public int getSize();
+    method public int indexOf(T? element);
+    method public boolean isEmpty();
+    method public java.util.Iterator<T> iterator();
+    method public int lastIndexOf(T? element);
+    method public java.util.ListIterator<T> listIterator();
+    method public java.util.ListIterator<T> listIterator(int index);
+    method public void prependStateRecord(androidx.compose.runtime.snapshots.StateRecord value);
+    method public boolean remove(T? element);
+    method public boolean removeAll(java.util.Collection<E!> elements);
+    method public T! removeAt(int index);
+    method public void removeRange(int fromIndex, int toIndex);
+    method public boolean retainAll(java.util.Collection<E!> elements);
+    method public T! set(int index, T? element);
+    method public java.util.List<T> subList(int fromIndex, int toIndex);
+    property public androidx.compose.runtime.snapshots.StateRecord firstStateRecord;
+    property public int size;
+  }
+
+  public final class SnapshotStateListKt {
+  }
+
+  @androidx.compose.runtime.Stable public final class SnapshotStateMap<K, V> implements kotlin.jvm.internal.markers.KMutableMap java.util.Map<K,V> androidx.compose.runtime.snapshots.StateObject {
+    ctor public SnapshotStateMap();
+    method public void clear();
+    method public boolean containsKey(K? key);
+    method public boolean containsValue(V? value);
+    method public V? get(Object? key);
+    method public java.util.Set<java.util.Map.Entry<K,V>> getEntries();
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
+    method public java.util.Set<K> getKeys();
+    method public int getSize();
+    method public java.util.Collection<V> getValues();
+    method public boolean isEmpty();
+    method public void prependStateRecord(androidx.compose.runtime.snapshots.StateRecord value);
+    method public V? put(K? key, V? value);
+    method public void putAll(java.util.Map<? extends K,? extends V> from);
+    method public V? remove(Object? key);
+    property public java.util.Set<java.util.Map.Entry<K,V>> entries;
+    property public androidx.compose.runtime.snapshots.StateRecord firstStateRecord;
+    property public java.util.Set<K> keys;
+    property public int size;
+    property public java.util.Collection<V> values;
+  }
+
+  public final class SnapshotStateMapKt {
+  }
+
+  public final class SnapshotStateObserver {
+    ctor public SnapshotStateObserver(kotlin.jvm.functions.Function1<? super kotlin.jvm.functions.Function0<kotlin.Unit>,kotlin.Unit> onChangedExecutor);
+    method public void clear(Object scope);
+    method public void clear();
+    method public void clearIf(kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Boolean> predicate);
+    method @org.jetbrains.annotations.TestOnly public void notifyChanges(java.util.Set<?> changes, androidx.compose.runtime.snapshots.Snapshot snapshot);
+    method public <T> void observeReads(T scope, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> onValueChangedForScope, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public void start();
+    method public void stop();
+    method public void withNoObservations(kotlin.jvm.functions.Function0<kotlin.Unit> block);
+  }
+
+  public interface StateObject {
+    method public androidx.compose.runtime.snapshots.StateRecord getFirstStateRecord();
+    method public default androidx.compose.runtime.snapshots.StateRecord? mergeRecords(androidx.compose.runtime.snapshots.StateRecord previous, androidx.compose.runtime.snapshots.StateRecord current, androidx.compose.runtime.snapshots.StateRecord applied);
+    method public void prependStateRecord(androidx.compose.runtime.snapshots.StateRecord value);
+    property public abstract androidx.compose.runtime.snapshots.StateRecord firstStateRecord;
+  }
+
+  public abstract class StateRecord {
+    ctor public StateRecord();
+    method public abstract void assign(androidx.compose.runtime.snapshots.StateRecord value);
+    method public abstract androidx.compose.runtime.snapshots.StateRecord create();
+  }
+
+}
+
+package androidx.compose.runtime.tooling {
+
+  public interface CompositionData {
+    method public Iterable<androidx.compose.runtime.tooling.CompositionGroup> getCompositionGroups();
+    method public boolean isEmpty();
+    property public abstract Iterable<androidx.compose.runtime.tooling.CompositionGroup> compositionGroups;
+    property public abstract boolean isEmpty;
+  }
+
+  public interface CompositionGroup extends androidx.compose.runtime.tooling.CompositionData {
+    method public Iterable<java.lang.Object> getData();
+    method public Object getKey();
+    method public Object? getNode();
+    method public String? getSourceInfo();
+    property public abstract Iterable<java.lang.Object> data;
+    property public abstract Object key;
+    property public abstract Object? node;
+    property public abstract String? sourceInfo;
+  }
+
+  public final class InspectionTablesKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.util.Set<androidx.compose.runtime.tooling.CompositionData>> getLocalInspectionTables();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.util.Set<androidx.compose.runtime.tooling.CompositionData>> LocalInspectionTables;
+  }
+
+}
+
diff --git a/compose/runtime/runtime/api/restricted_current.txt b/compose/runtime/runtime/api/restricted_current.txt
index e228621..4f28290 100644
--- a/compose/runtime/runtime/api/restricted_current.txt
+++ b/compose/runtime/runtime/api/restricted_current.txt
@@ -18,6 +18,7 @@
 
   public final class ActualAndroid_androidKt {
     method @Deprecated public static androidx.compose.runtime.MonotonicFrameClock getDefaultMonotonicFrameClock();
+    property @Deprecated public static final androidx.compose.runtime.MonotonicFrameClock DefaultMonotonicFrameClock;
   }
 
   public final class ActualJvm_jvmKt {
@@ -73,6 +74,10 @@
     method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function0<? extends T> calculation);
     method @androidx.compose.runtime.Composable public static inline <T> T! remember(Object![]? keys, kotlin.jvm.functions.Function0<? extends T> calculation);
     method @androidx.compose.runtime.Composable public static androidx.compose.runtime.CompositionContext rememberCompositionContext();
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static final androidx.compose.runtime.Composer currentComposer;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ExplicitGroupsComposable public static final int currentCompositeKeyHash;
+    property @androidx.compose.runtime.Composable public static final androidx.compose.runtime.CompositionLocalContext currentCompositionLocalContext;
+    property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static final androidx.compose.runtime.RecomposeScope currentRecomposeScope;
   }
 
   @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ComposeCompilerApi {
@@ -384,6 +389,7 @@
 
   public final inline class SkippableUpdater<T> {
     ctor public SkippableUpdater();
+    method public inline void update(kotlin.jvm.functions.Function1<? super androidx.compose.runtime.Updater<T>,? extends kotlin.Unit> block);
   }
 
   public final class SlotTableKt {
@@ -419,6 +425,106 @@
     method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
   }
 
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
+  public final class SnapshotStateKt {
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> collectAsState(kotlinx.coroutines.flow.StateFlow<? extends T>, optional kotlin.coroutines.CoroutineContext context);
+    method @androidx.compose.runtime.Composable public static <T extends R, R> androidx.compose.runtime.State<R> collectAsState(kotlinx.coroutines.flow.Flow<? extends T>, R? initial, optional kotlin.coroutines.CoroutineContext context);
+    method public static <T> androidx.compose.runtime.State<T> derivedStateOf(kotlin.jvm.functions.Function0<? extends T> calculation);
+    method public static inline operator <T> T! getValue(androidx.compose.runtime.State<? extends T>, Object? thisObj, kotlin.reflect.KProperty<?> property);
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> mutableStateListOf(T?... elements);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf();
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> mutableStateMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+    method public static <T> androidx.compose.runtime.MutableState<T> mutableStateOf(T? value, optional androidx.compose.runtime.SnapshotMutationPolicy<T> policy);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object? key1, Object? key2, Object? key3, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> produceState(T? initialValue, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.runtime.ProduceStateScope<T>,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> producer);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
+    method @androidx.compose.runtime.Composable public static <T> androidx.compose.runtime.State<T> rememberUpdatedState(T? newValue);
+    method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
+    method public static <T> kotlinx.coroutines.flow.Flow<T> snapshotFlow(kotlin.jvm.functions.Function0<? extends T> block);
+    method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
+    method public static <T> androidx.compose.runtime.snapshots.SnapshotStateList<T> toMutableStateList(java.util.Collection<? extends T>);
+    method public static <K, V> androidx.compose.runtime.snapshots.SnapshotStateMap<K,V> toMutableStateMap(Iterable<? extends kotlin.Pair<? extends K,? extends V>>);
+  }
+
   @androidx.compose.runtime.StableMarker @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface Stable {
   }
 
@@ -435,6 +541,8 @@
 
   public final inline class Updater<T> {
     ctor public Updater();
+    method public inline void set(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,? extends kotlin.Unit> block);
+    method public inline void update(int value, kotlin.jvm.functions.Function2<? super T,? super java.lang.Integer,? extends kotlin.Unit> block);
   }
 
 }
@@ -596,6 +704,7 @@
 
   public final class LiveLiteralKt {
     method public static boolean isLiveLiteralsEnabled();
+    property public static final boolean isLiveLiteralsEnabled;
   }
 
   @androidx.compose.runtime.ComposeCompilerApi @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface StabilityInferred {
@@ -822,6 +931,7 @@
 
   public final class InspectionTablesKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<java.util.Set<androidx.compose.runtime.tooling.CompositionData>> getLocalInspectionTables();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.util.Set<androidx.compose.runtime.tooling.CompositionData>> LocalInspectionTables;
   }
 
 }
diff --git a/compose/runtime/runtime/lint-baseline.xml b/compose/runtime/runtime/lint-baseline.xml
index 9a42aba..4643833 100644
--- a/compose/runtime/runtime/lint-baseline.xml
+++ b/compose/runtime/runtime/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.2.0-dev" type="baseline" client="cli" dependencies="false" name="AGP (7.2.0-dev)" variant="all" version="7.2.0-dev">
+<issues format="6" by="lint 7.2.0-dev" type="baseline" client="gradle" dependencies="false" name="AGP (7.2.0-dev)" variant="all" version="7.2.0-dev">
 
     <issue
         id="UnknownNullness"
@@ -41,7 +41,51 @@
         errorLine2="        ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt"
-            line="332"
+            line="233"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Should explicitly declare type here since implicit type does not specify nullness"
+        errorLine1="fun &lt;T> mutableStateListOf(vararg elements: T) ="
+        errorLine2="        ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt"
+            line="233"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Should explicitly declare type here since implicit type does not specify nullness"
+        errorLine1="fun &lt;T> mutableStateListOf(vararg elements: T) ="
+        errorLine2="        ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt"
+            line="233"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Should explicitly declare type here since implicit type does not specify nullness"
+        errorLine1="fun &lt;T> mutableStateListOf(vararg elements: T) ="
+        errorLine2="        ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt"
+            line="233"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Should explicitly declare type here since implicit type does not specify nullness"
+        errorLine1="fun &lt;T> mutableStateListOf(vararg elements: T) ="
+        errorLine2="        ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt"
+            line="233"
             column="9"/>
     </issue>
 
@@ -52,7 +96,51 @@
         errorLine2="                      ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt"
-            line="339"
+            line="240"
+            column="23"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Should explicitly declare type here since implicit type does not specify nullness"
+        errorLine1="fun &lt;T> Collection&lt;T>.toMutableStateList() = SnapshotStateList&lt;T>().also { it.addAll(this) }"
+        errorLine2="                      ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt"
+            line="240"
+            column="23"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Should explicitly declare type here since implicit type does not specify nullness"
+        errorLine1="fun &lt;T> Collection&lt;T>.toMutableStateList() = SnapshotStateList&lt;T>().also { it.addAll(this) }"
+        errorLine2="                      ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt"
+            line="240"
+            column="23"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Should explicitly declare type here since implicit type does not specify nullness"
+        errorLine1="fun &lt;T> Collection&lt;T>.toMutableStateList() = SnapshotStateList&lt;T>().also { it.addAll(this) }"
+        errorLine2="                      ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt"
+            line="240"
+            column="23"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Should explicitly declare type here since implicit type does not specify nullness"
+        errorLine1="fun &lt;T> Collection&lt;T>.toMutableStateList() = SnapshotStateList&lt;T>().also { it.addAll(this) }"
+        errorLine2="                      ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt"
+            line="240"
             column="23"/>
     </issue>
 
@@ -63,7 +151,51 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~">
         <location
             file="src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt"
-            line="361"
+            line="262"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Should explicitly declare type here since implicit type does not specify nullness"
+        errorLine1="fun &lt;K, V> mutableStateMapOf(vararg pairs: Pair&lt;K, V>) ="
+        errorLine2="           ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt"
+            line="262"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Should explicitly declare type here since implicit type does not specify nullness"
+        errorLine1="fun &lt;K, V> mutableStateMapOf(vararg pairs: Pair&lt;K, V>) ="
+        errorLine2="           ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt"
+            line="262"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Should explicitly declare type here since implicit type does not specify nullness"
+        errorLine1="fun &lt;K, V> mutableStateMapOf(vararg pairs: Pair&lt;K, V>) ="
+        errorLine2="           ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt"
+            line="262"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Should explicitly declare type here since implicit type does not specify nullness"
+        errorLine1="fun &lt;K, V> mutableStateMapOf(vararg pairs: Pair&lt;K, V>) ="
+        errorLine2="           ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt"
+            line="262"
             column="12"/>
     </issue>
 
@@ -74,7 +206,51 @@
         errorLine2="                                ~~~~~~~~~~~~~~~~~">
         <location
             file="src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt"
-            line="369"
+            line="270"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Should explicitly declare type here since implicit type does not specify nullness"
+        errorLine1="fun &lt;K, V> Iterable&lt;Pair&lt;K, V>>.toMutableStateMap() ="
+        errorLine2="                                ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt"
+            line="270"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Should explicitly declare type here since implicit type does not specify nullness"
+        errorLine1="fun &lt;K, V> Iterable&lt;Pair&lt;K, V>>.toMutableStateMap() ="
+        errorLine2="                                ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt"
+            line="270"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Should explicitly declare type here since implicit type does not specify nullness"
+        errorLine1="fun &lt;K, V> Iterable&lt;Pair&lt;K, V>>.toMutableStateMap() ="
+        errorLine2="                                ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt"
+            line="270"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Should explicitly declare type here since implicit type does not specify nullness"
+        errorLine1="fun &lt;K, V> Iterable&lt;Pair&lt;K, V>>.toMutableStateMap() ="
+        errorLine2="                                ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt"
+            line="270"
             column="33"/>
     </issue>
 
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 2e18cec..8f9e279 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 = 4600
+    const val version: Int = 4700
 }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composition.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composition.kt
index 83f25a4..df49cd8 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composition.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composition.kt
@@ -498,9 +498,9 @@
                     manager.dispatchAbandons()
                 }
                 composer.dispose()
-                parent.unregisterComposition(this)
             }
         }
+        parent.unregisterComposition(this)
     }
 
     override val hasInvalidations get() = synchronized(lock) { invalidations.size > 0 }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/DerivedState.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/DerivedState.kt
new file mode 100644
index 0000000..ef047f9
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/DerivedState.kt
@@ -0,0 +1,238 @@
+/*
+ * 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.
+ */
+
+@file:JvmName("SnapshotStateKt")
+@file:JvmMultifileClass
+package androidx.compose.runtime
+
+import androidx.compose.runtime.external.kotlinx.collections.immutable.PersistentList
+import androidx.compose.runtime.external.kotlinx.collections.immutable.persistentListOf
+import androidx.compose.runtime.snapshots.Snapshot
+import androidx.compose.runtime.snapshots.StateObject
+import androidx.compose.runtime.snapshots.StateRecord
+import androidx.compose.runtime.snapshots.fastForEach
+import androidx.compose.runtime.snapshots.newWritableRecord
+import androidx.compose.runtime.snapshots.readable
+import androidx.compose.runtime.snapshots.sync
+import androidx.compose.runtime.snapshots.withCurrent
+// Explicit imports for these needed in common source sets.
+import kotlin.jvm.JvmName
+import kotlin.jvm.JvmMultifileClass
+
+/**
+ * A [State] that is derived from one or more other states.
+ *
+ * @see derivedStateOf
+ */
+internal interface DerivedState<T> : State<T> {
+    /**
+     * The value of the derived state retrieved without triggering a notification to read observers.
+     */
+    val currentValue: T
+
+    /**
+     * A list of the dependencies used to produce [value] or [currentValue].
+     *
+     * The [dependencies] list can be used to determine when a [StateObject] appears in the apply
+     * observer set, if the state could affect value of this derived state.
+     */
+    val dependencies: Set<StateObject>
+}
+
+private typealias DerivedStateObservers = Pair<(DerivedState<*>) -> Unit, (DerivedState<*>) -> Unit>
+
+private val derivedStateObservers = SnapshotThreadLocal<PersistentList<DerivedStateObservers>>()
+
+private class DerivedSnapshotState<T>(
+    private val calculation: () -> T
+) : StateObject, DerivedState<T> {
+    private var first: ResultRecord<T> = ResultRecord()
+
+    private class ResultRecord<T> : StateRecord() {
+        var dependencies: HashSet<StateObject>? = null
+        var result: T? = null
+        var resultHash: Int = 0
+
+        override fun assign(value: StateRecord) {
+            @Suppress("UNCHECKED_CAST")
+            val other = value as ResultRecord<T>
+            dependencies = other.dependencies
+            result = other.result
+            resultHash = other.resultHash
+        }
+
+        override fun create(): StateRecord = ResultRecord<T>()
+
+        fun isValid(derivedState: DerivedState<*>, snapshot: Snapshot): Boolean =
+            result != null && resultHash == readableHash(derivedState, snapshot)
+
+        fun readableHash(derivedState: DerivedState<*>, snapshot: Snapshot): Int {
+            var hash = 7
+            val dependencies = sync { dependencies }
+            if (dependencies != null) {
+                notifyObservers(derivedState) {
+                    for (stateObject in dependencies) {
+                        // Find the first record without triggering an observer read.
+                        val record = stateObject.firstStateRecord.readable(stateObject, snapshot)
+                        hash = 31 * hash + identityHashCode(record)
+                        hash = 31 * hash + record.snapshotId
+                    }
+                }
+            }
+            return hash
+        }
+    }
+
+    private fun currentRecord(
+        readable: ResultRecord<T>,
+        snapshot: Snapshot,
+        calculation: () -> T
+    ): ResultRecord<T> {
+        if (readable.isValid(this, snapshot)) {
+            @Suppress("UNCHECKED_CAST")
+            return readable
+        }
+        val newDependencies = HashSet<StateObject>()
+        val result = notifyObservers(this) {
+            Snapshot.observe(
+                {
+                    if (it === this)
+                        error("A derived state cannot calculation cannot read itself")
+                    if (it is StateObject) newDependencies.add(it)
+                },
+                null, calculation
+            )
+        }
+
+        val written = sync {
+            val writeSnapshot = Snapshot.current
+            val writable = first.newWritableRecord(this, writeSnapshot)
+            writable.dependencies = newDependencies
+            writable.resultHash = writable.readableHash(this, writeSnapshot)
+            writable.result = result
+            writable
+        }
+        Snapshot.notifyObjectsInitialized()
+
+        return written
+    }
+
+    override val firstStateRecord: StateRecord get() = first
+
+    override fun prependStateRecord(value: StateRecord) {
+        @Suppress("UNCHECKED_CAST")
+        first = value as ResultRecord<T>
+    }
+
+    override val value: T
+        get() {
+            // Unlike most state objects, the record list of a derived state can change during a read
+            // because reading updates the cache. To account for this, instead of calling readable,
+            // which sends the read notification, the read observer is notified directly and current
+            // value is used instead which doesn't notify. This allow the read observer to read the
+            // value and only update the cache once.
+            Snapshot.current.readObserver?.invoke(this)
+            return currentValue
+        }
+
+    override val currentValue: T
+        get() = first.withCurrent {
+            @Suppress("UNCHECKED_CAST")
+            currentRecord(it, Snapshot.current, calculation).result as T
+        }
+
+    override val dependencies: Set<StateObject>
+        get() = first.withCurrent {
+            currentRecord(it, Snapshot.current, calculation).dependencies ?: emptySet()
+        }
+
+    override fun toString(): String = first.withCurrent {
+        "DerivedState(value=${displayValue()})@${hashCode()}"
+    }
+
+    /**
+     * A function used by the debugger to display the value of the current value of the mutable
+     * state object without triggering read observers.
+     */
+    @Suppress("unused")
+    val debuggerDisplayValue: T?
+        @JvmName("getDebuggerDisplayValue")
+        get() = first.withCurrent {
+            if (it.isValid(this, Snapshot.current))
+                it.result
+            else null
+        }
+
+    private fun displayValue(): String {
+        first.withCurrent {
+            if (it.isValid(this, Snapshot.current)) {
+                return it.result.toString()
+            }
+            return "<Not calculated>"
+        }
+    }
+}
+
+private inline fun <R> notifyObservers(derivedState: DerivedState<*>, block: () -> R): R {
+    val observers = derivedStateObservers.get() ?: persistentListOf()
+    observers.fastForEach { (start, _) -> start(derivedState) }
+    return try {
+        block()
+    } finally {
+        observers.fastForEach { (_, done) -> done(derivedState) }
+    }
+}
+
+/**
+ * Creates a [State] object whose [State.value] is the result of [calculation]. The result of
+ * calculation will be cached in such a way that calling [State.value] repeatedly will not cause
+ * [calculation] to be executed multiple times, but reading [State.value] will cause all [State]
+ * objects that got read during the [calculation] to be read in the current [Snapshot], meaning
+ * that this will correctly subscribe to the derived state objects if the value is being read in
+ * an observed context such as a [Composable] function.
+ *
+ * @sample androidx.compose.runtime.samples.DerivedStateSample
+ *
+ * @param calculation the calculation to create the value this state object represents.
+ */
+fun <T> derivedStateOf(calculation: () -> T): State<T> = DerivedSnapshotState(calculation)
+
+/**
+ * Observe the recalculations performed by any derived state that is recalculated during the
+ * execution of [block]. [start] is called before a calculation starts and [done] is called
+ * after the started calculation is complete.
+ *
+ * @param start a lambda called before every calculation of a derived state is in [block].
+ * @param done a lambda that is called after the state passed to [start] is recalculated.
+ * @param block the block of code to observe.
+ */
+internal fun <R> observeDerivedStateRecalculations(
+    start: (derivedState: State<*>) -> Unit,
+    done: (derivedState: State<*>) -> Unit,
+    block: () -> R
+) {
+    val previous = derivedStateObservers.get()
+    try {
+        derivedStateObservers.set(
+            (derivedStateObservers.get() ?: persistentListOf()).add(
+                start to done
+            )
+        )
+        block()
+    } finally {
+        derivedStateObservers.set(previous)
+    }
+}
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ProduceState.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ProduceState.kt
new file mode 100644
index 0000000..1b22fc9
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ProduceState.kt
@@ -0,0 +1,225 @@
+/*
+ * 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.
+ */
+
+@file:OptIn(ExperimentalTypeInference::class)
+@file:JvmName("SnapshotStateKt")
+@file:JvmMultifileClass
+package androidx.compose.runtime
+
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.suspendCancellableCoroutine
+import kotlin.coroutines.CoroutineContext
+import kotlin.experimental.ExperimentalTypeInference
+// Explicit imports for these needed in common source sets.
+import kotlin.jvm.JvmName
+import kotlin.jvm.JvmMultifileClass
+
+/**
+ * Receiver scope for use with [produceState].
+ */
+interface ProduceStateScope<T> : MutableState<T>, CoroutineScope {
+    /**
+     * Await the disposal of this producer whether it left the composition,
+     * the source changed, or an error occurred. Always runs [onDispose] before resuming.
+     *
+     * This method is useful when configuring callback-based state producers that do not suspend,
+     * for example:
+     *
+     * @sample androidx.compose.runtime.samples.ProduceStateAwaitDispose
+     */
+    suspend fun awaitDispose(onDispose: () -> Unit): Nothing
+}
+
+private class ProduceStateScopeImpl<T>(
+    state: MutableState<T>,
+    override val coroutineContext: CoroutineContext
+) : ProduceStateScope<T>, MutableState<T> by state {
+
+    override suspend fun awaitDispose(onDispose: () -> Unit): Nothing {
+        try {
+            suspendCancellableCoroutine<Nothing> { }
+        } finally {
+            onDispose()
+        }
+    }
+}
+
+/**
+ * Return an observable [snapshot][androidx.compose.runtime.snapshots.Snapshot] [State] that
+ * produces values over time without a defined data source.
+ *
+ * [producer] is launched when [produceState] enters the composition and is cancelled when
+ * [produceState] leaves the composition. [producer] should use [ProduceStateScope.value]
+ * to set new values on the returned [State].
+ *
+ * The returned [State] conflates values; no change will be observable if
+ * [ProduceStateScope.value] is used to set a value that is [equal][Any.equals] to its old value,
+ * and observers may only see the latest value if several values are set in rapid succession.
+ *
+ * [produceState] may be used to observe either suspending or non-suspending sources of external
+ * data, for example:
+ *
+ * @sample androidx.compose.runtime.samples.ProduceState
+ *
+ * @sample androidx.compose.runtime.samples.ProduceStateAwaitDispose
+ */
+@Composable
+fun <T> produceState(
+    initialValue: T,
+    @BuilderInference producer: suspend ProduceStateScope<T>.() -> Unit
+): State<T> {
+    val result = remember { mutableStateOf(initialValue) }
+    LaunchedEffect(Unit) {
+        ProduceStateScopeImpl(result, coroutineContext).producer()
+    }
+    return result
+}
+
+/**
+ * Return an observable [snapshot][androidx.compose.runtime.snapshots.Snapshot] [State] that
+ * produces values over time from [key1].
+ *
+ * [producer] is launched when [produceState] enters the composition and is cancelled when
+ * [produceState] leaves the composition. If [key1] changes, a running [producer] will be
+ * cancelled and re-launched for the new source. [producer] should use [ProduceStateScope.value]
+ * to set new values on the returned [State].
+ *
+ * The returned [State] conflates values; no change will be observable if
+ * [ProduceStateScope.value] is used to set a value that is [equal][Any.equals] to its old value,
+ * and observers may only see the latest value if several values are set in rapid succession.
+ *
+ * [produceState] may be used to observe either suspending or non-suspending sources of external
+ * data, for example:
+ *
+ * @sample androidx.compose.runtime.samples.ProduceState
+ *
+ * @sample androidx.compose.runtime.samples.ProduceStateAwaitDispose
+ */
+@Composable
+fun <T> produceState(
+    initialValue: T,
+    key1: Any?,
+    @BuilderInference producer: suspend ProduceStateScope<T>.() -> Unit
+): State<T> {
+    val result = remember { mutableStateOf(initialValue) }
+    LaunchedEffect(key1) {
+        ProduceStateScopeImpl(result, coroutineContext).producer()
+    }
+    return result
+}
+
+/**
+ * Return an observable [snapshot][androidx.compose.runtime.snapshots.Snapshot] [State] that
+ * produces values over time from [key1] and [key2].
+ *
+ * [producer] is launched when [produceState] enters the composition and is cancelled when
+ * [produceState] leaves the composition. If [key1] or [key2] change, a running [producer]
+ * will be cancelled and re-launched for the new source. [producer] should use
+ * [ProduceStateScope.value] to set new values on the returned [State].
+ *
+ * The returned [State] conflates values; no change will be observable if
+ * [ProduceStateScope.value] is used to set a value that is [equal][Any.equals] to its old value,
+ * and observers may only see the latest value if several values are set in rapid succession.
+ *
+ * [produceState] may be used to observe either suspending or non-suspending sources of external
+ * data, for example:
+ *
+ * @sample androidx.compose.runtime.samples.ProduceState
+ *
+ * @sample androidx.compose.runtime.samples.ProduceStateAwaitDispose
+ */
+@Composable
+fun <T> produceState(
+    initialValue: T,
+    key1: Any?,
+    key2: Any?,
+    @BuilderInference producer: suspend ProduceStateScope<T>.() -> Unit
+): State<T> {
+    val result = remember { mutableStateOf(initialValue) }
+    LaunchedEffect(key1, key2) {
+        ProduceStateScopeImpl(result, coroutineContext).producer()
+    }
+    return result
+}
+
+/**
+ * Return an observable [snapshot][androidx.compose.runtime.snapshots.Snapshot] [State] that
+ * produces values over time from [key1], [key2] and [key3].
+ *
+ * [producer] is launched when [produceState] enters the composition and is cancelled when
+ * [produceState] leaves the composition. If [key1], [key2] or [key3] change, a running
+ * [producer] will be cancelled and re-launched for the new source. [producer should use
+ * [ProduceStateScope.value] to set new values on the returned [State].
+ *
+ * The returned [State] conflates values; no change will be observable if
+ * [ProduceStateScope.value] is used to set a value that is [equal][Any.equals] to its old value,
+ * and observers may only see the latest value if several values are set in rapid succession.
+ *
+ * [produceState] may be used to observe either suspending or non-suspending sources of external
+ * data, for example:
+ *
+ * @sample androidx.compose.runtime.samples.ProduceState
+ *
+ * @sample androidx.compose.runtime.samples.ProduceStateAwaitDispose
+ */
+@Composable
+fun <T> produceState(
+    initialValue: T,
+    key1: Any?,
+    key2: Any?,
+    key3: Any?,
+    @BuilderInference producer: suspend ProduceStateScope<T>.() -> Unit
+): State<T> {
+    val result = remember { mutableStateOf(initialValue) }
+    LaunchedEffect(key1, key2, key3) {
+        ProduceStateScopeImpl(result, coroutineContext).producer()
+    }
+    return result
+}
+
+/**
+ * Return an observable [snapshot][androidx.compose.runtime.snapshots.Snapshot] [State] that
+ * produces values over time from [keys].
+ *
+ * [producer] is launched when [produceState] enters the composition and is cancelled when
+ * [produceState] leaves the composition. If [keys] change, a running [producer] will be
+ * cancelled and re-launched for the new source. [producer] should use [ProduceStateScope.value]
+ * to set new values on the returned [State].
+ *
+ * The returned [State] conflates values; no change will be observable if
+ * [ProduceStateScope.value] is used to set a value that is [equal][Any.equals] to its old value,
+ * and observers may only see the latest value if several values are set in rapid succession.
+ *
+ * [produceState] may be used to observe either suspending or non-suspending sources of external
+ * data, for example:
+ *
+ * @sample androidx.compose.runtime.samples.ProduceState
+ *
+ * @sample androidx.compose.runtime.samples.ProduceStateAwaitDispose
+ */
+@Composable
+fun <T> produceState(
+    initialValue: T,
+    vararg keys: Any?,
+    @BuilderInference producer: suspend ProduceStateScope<T>.() -> Unit
+): State<T> {
+    val result = remember { mutableStateOf(initialValue) }
+    @Suppress("CHANGING_ARGUMENTS_EXECUTION_ORDER_FOR_NAMED_VARARGS")
+    LaunchedEffect(keys = keys) {
+        ProduceStateScopeImpl(result, coroutineContext).producer()
+    }
+    return result
+}
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotFlow.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotFlow.kt
new file mode 100644
index 0000000..12250ab
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotFlow.kt
@@ -0,0 +1,173 @@
+/*
+ * 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.
+ */
+
+@file:JvmName("SnapshotStateKt")
+@file:JvmMultifileClass
+package androidx.compose.runtime
+
+import androidx.compose.runtime.snapshots.Snapshot
+import kotlinx.coroutines.channels.Channel
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.collect
+import kotlinx.coroutines.flow.flow
+import kotlinx.coroutines.withContext
+import kotlin.coroutines.CoroutineContext
+import kotlin.coroutines.EmptyCoroutineContext
+// Explicit imports for these needed in common source sets.
+import kotlin.jvm.JvmName
+import kotlin.jvm.JvmMultifileClass
+
+/**
+ * Collects values from this [StateFlow] and represents its latest value via [State].
+ * The [StateFlow.value] is used as an initial value. Every time there would be new value posted
+ * into the [StateFlow] the returned [State] will be updated causing recomposition of every
+ * [State.value] usage.
+ *
+ * @sample androidx.compose.runtime.samples.StateFlowSample
+ *
+ * @param context [CoroutineContext] to use for collecting.
+ */
+@Suppress("StateFlowValueCalledInComposition")
+@Composable
+fun <T> StateFlow<T>.collectAsState(
+    context: CoroutineContext = EmptyCoroutineContext
+): State<T> = collectAsState(value, context)
+
+/**
+ * Collects values from this [Flow] and represents its latest value via [State]. Every time there
+ * would be new value posted into the [Flow] the returned [State] will be updated causing
+ * recomposition of every [State.value] usage.
+ *
+ * @sample androidx.compose.runtime.samples.FlowWithInitialSample
+ *
+ * @param context [CoroutineContext] to use for collecting.
+ */
+@Composable
+fun <T : R, R> Flow<T>.collectAsState(
+    initial: R,
+    context: CoroutineContext = EmptyCoroutineContext
+): State<R> = produceState(initial, this, context) {
+    if (context == EmptyCoroutineContext) {
+        collect { value = it }
+    } else withContext(context) {
+        collect { value = it }
+    }
+}
+
+/**
+ * Create a [Flow] from observable [Snapshot] state. (e.g. state holders returned by
+ * [mutableStateOf][androidx.compose.runtime.mutableStateOf].)
+ *
+ * [snapshotFlow] creates a [Flow] that runs [block] when collected and emits the result,
+ * recording any snapshot state that was accessed. While collection continues, if a new [Snapshot]
+ * is applied that changes state accessed by [block], the flow will run [block] again,
+ * re-recording the snapshot state that was accessed.
+ * If the result of [block] is not [equal to][Any.equals] the previous result, the flow will emit
+ * that new result. (This behavior is similar to that of
+ * [Flow.distinctUntilChanged][kotlinx.coroutines.flow.distinctUntilChanged].) Collection will
+ * continue indefinitely unless it is explicitly cancelled or limited by the use of other [Flow]
+ * operators.
+ *
+ * @sample androidx.compose.runtime.samples.snapshotFlowSample
+ *
+ * [block] is run in a **read-only** [Snapshot] and may not modify snapshot data. If [block]
+ * attempts to modify snapshot data, flow collection will fail with [IllegalStateException].
+ *
+ * [block] may run more than once for equal sets of inputs or only once after many rapid
+ * snapshot changes; it should be idempotent and free of side effects.
+ *
+ * When working with [Snapshot] state it is useful to keep the distinction between **events** and
+ * **state** in mind. [snapshotFlow] models snapshot changes as events, but events **cannot** be
+ * effectively modeled as observable state. Observable state is a lossy compression of the events
+ * that produced that state.
+ *
+ * An observable **event** happens at a point in time and is discarded. All registered observers
+ * at the time the event occurred are notified. All individual events in a stream are assumed
+ * to be relevant and may build on one another; repeated equal events have meaning and therefore
+ * a registered observer must observe all events without skipping.
+ *
+ * Observable **state** raises change events when the state changes from one value to a new,
+ * unequal value. State change events are **conflated;** only the most recent state matters.
+ * Observers of state changes must therefore be **idempotent;** given the same state value the
+ * observer should produce the same result. It is valid for a state observer to both skip
+ * intermediate states as well as run multiple times for the same state and the result should
+ * be the same.
+ */
+fun <T> snapshotFlow(
+    block: () -> T
+): Flow<T> = flow {
+    // Objects read the last time block was run
+    val readSet = mutableSetOf<Any>()
+    val readObserver: (Any) -> Unit = { readSet.add(it) }
+
+    // This channel may not block or lose data on a trySend call.
+    val appliedChanges = Channel<Set<Any>>(Channel.UNLIMITED)
+
+    // Register the apply observer before running for the first time
+    // so that we don't miss updates.
+    val unregisterApplyObserver = Snapshot.registerApplyObserver { changed, _ ->
+        appliedChanges.trySend(changed)
+    }
+
+    try {
+        var lastValue = Snapshot.takeSnapshot(readObserver).run {
+            try {
+                enter(block)
+            } finally {
+                dispose()
+            }
+        }
+        emit(lastValue)
+
+        while (true) {
+            var found = false
+            var changedObjects = appliedChanges.receive()
+
+            // Poll for any other changes before running block to minimize the number of
+            // additional times it runs for the same data
+            while (true) {
+                // Assumption: readSet will typically be smaller than changed
+                found = found || readSet.intersects(changedObjects)
+                changedObjects = appliedChanges.tryReceive().getOrNull() ?: break
+            }
+
+            if (found) {
+                readSet.clear()
+                val newValue = Snapshot.takeSnapshot(readObserver).run {
+                    try {
+                        enter(block)
+                    } finally {
+                        dispose()
+                    }
+                }
+
+                if (newValue != lastValue) {
+                    lastValue = newValue
+                    emit(newValue)
+                }
+            }
+        }
+    } finally {
+        unregisterApplyObserver.dispose()
+    }
+}
+
+/**
+ * Return `true` if there are any elements shared between `this` and [other]
+ */
+private fun <T> Set<T>.intersects(other: Set<T>): Boolean =
+    if (size < other.size) any { it in other } else other.any { it in this }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotMutationPolicy.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotMutationPolicy.kt
new file mode 100644
index 0000000..bb6ca6a
--- /dev/null
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotMutationPolicy.kt
@@ -0,0 +1,108 @@
+/*
+ * 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.
+ */
+
+@file:JvmName("SnapshotStateKt")
+@file:JvmMultifileClass
+package androidx.compose.runtime
+
+import androidx.compose.runtime.snapshots.MutableSnapshot
+// Explicit imports for these needed in common source sets.
+import kotlin.jvm.JvmName
+import kotlin.jvm.JvmMultifileClass
+
+/**
+ * A policy to control how the result of [mutableStateOf] report and merge changes to
+ * the state object.
+ *
+ * A mutation policy can be passed as an parameter to [mutableStateOf], and [compositionLocalOf].
+ *
+ * Typically, one of the stock policies should be used such as [referentialEqualityPolicy],
+ * [structuralEqualityPolicy], or [neverEqualPolicy]. However, a custom mutation policy can be
+ * created by implementing this interface, such as a counter policy,
+ *
+ * @sample androidx.compose.runtime.samples.counterSample
+ */
+interface SnapshotMutationPolicy<T> {
+    /**
+     * Determine if setting a state value's are equivalent and should be treated as equal. If
+     * [equivalent] returns `true` the new value is not considered a change.
+     */
+    fun equivalent(a: T, b: T): Boolean
+
+    /**
+     * Merge conflicting changes in snapshots. This is only called if [current] and [applied] are
+     * not [equivalent]. If a valid merged value can be calculated then it should be returned.
+     *
+     * For example, if the state object holds an immutable data class with multiple fields,
+     * and [applied] has changed fields that are unmodified by [current] it might be valid to return
+     * a new copy of the data class that combines that changes from both [current] and [applied]
+     * allowing a snapshot to apply that would have otherwise failed.
+     *
+     * @sample androidx.compose.runtime.samples.counterSample
+     */
+    fun merge(previous: T, current: T, applied: T): T? = null
+}
+
+/**
+ * A policy to treat values of a [MutableState] as equivalent if they are referentially (===) equal.
+ *
+ * Setting [MutableState.value] to its current referentially (===) equal value is not considered
+ * a change. When applying a [MutableSnapshot], if the snapshot changes the value to the
+ * equivalent value the parent snapshot has is not considered a conflict.
+ */
+@Suppress("UNCHECKED_CAST")
+fun <T> referentialEqualityPolicy(): SnapshotMutationPolicy<T> =
+    ReferentialEqualityPolicy as SnapshotMutationPolicy<T>
+
+private object ReferentialEqualityPolicy : SnapshotMutationPolicy<Any?> {
+    override fun equivalent(a: Any?, b: Any?) = a === b
+
+    override fun toString() = "ReferentialEqualityPolicy"
+}
+
+/**
+ * A policy to treat values of a [MutableState] as equivalent if they are structurally (==) equal.
+ *
+ * Setting [MutableState.value] to its current structurally (==) equal value is not considered
+ * a change. When applying a [MutableSnapshot], if the snapshot changes the value to the
+ * equivalent value the parent snapshot has is not considered a conflict.
+ */
+@Suppress("UNCHECKED_CAST")
+fun <T> structuralEqualityPolicy(): SnapshotMutationPolicy<T> =
+    StructuralEqualityPolicy as SnapshotMutationPolicy<T>
+
+private object StructuralEqualityPolicy : SnapshotMutationPolicy<Any?> {
+    override fun equivalent(a: Any?, b: Any?) = a == b
+
+    override fun toString() = "StructuralEqualityPolicy"
+}
+
+/**
+ * A policy never treat values of a [MutableState] as equivalent.
+ *
+ * Setting [MutableState.value] will always be considered a change. When applying a
+ * [MutableSnapshot] that changes the state will always conflict with other snapshots that change
+ * the same state.
+ */
+@Suppress("UNCHECKED_CAST")
+fun <T> neverEqualPolicy(): SnapshotMutationPolicy<T> =
+    NeverEqualPolicy as SnapshotMutationPolicy<T>
+
+private object NeverEqualPolicy : SnapshotMutationPolicy<Any?> {
+    override fun equivalent(a: Any?, b: Any?) = false
+
+    override fun toString() = "NeverEqualPolicy"
+}
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt
index 65c4e73..343cd1a 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/SnapshotState.kt
@@ -14,37 +14,22 @@
  * limitations under the License.
  */
 
-@file:OptIn(ExperimentalTypeInference::class)
-
+@file:JvmName("SnapshotStateKt")
+@file:JvmMultifileClass
 package androidx.compose.runtime
 
-import androidx.compose.runtime.external.kotlinx.collections.immutable.PersistentList
-import androidx.compose.runtime.external.kotlinx.collections.immutable.persistentListOf
-import androidx.compose.runtime.snapshots.MutableSnapshot
 import androidx.compose.runtime.snapshots.Snapshot
 import androidx.compose.runtime.snapshots.SnapshotMutableState
 import androidx.compose.runtime.snapshots.SnapshotStateList
 import androidx.compose.runtime.snapshots.SnapshotStateMap
 import androidx.compose.runtime.snapshots.StateObject
 import androidx.compose.runtime.snapshots.StateRecord
-import androidx.compose.runtime.snapshots.fastForEach
-import androidx.compose.runtime.snapshots.newWritableRecord
 import androidx.compose.runtime.snapshots.overwritable
 import androidx.compose.runtime.snapshots.readable
-import androidx.compose.runtime.snapshots.sync
 import androidx.compose.runtime.snapshots.withCurrent
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.channels.Channel
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.StateFlow
-import kotlinx.coroutines.flow.collect
-import kotlinx.coroutines.flow.flow
-import kotlinx.coroutines.suspendCancellableCoroutine
-import kotlinx.coroutines.withContext
-import kotlin.coroutines.CoroutineContext
-import kotlin.coroutines.EmptyCoroutineContext
-import kotlin.experimental.ExperimentalTypeInference
+// Explicit imports for jvm annotations needed in common source sets.
 import kotlin.jvm.JvmName
+import kotlin.jvm.JvmMultifileClass
 import kotlin.reflect.KProperty
 
 /**
@@ -226,91 +211,7 @@
 }
 
 /**
- * A policy to control how the result of [mutableStateOf] report and merge changes to
- * the state object.
- *
- * A mutation policy can be passed as an parameter to [mutableStateOf], and [compositionLocalOf].
- *
- * Typically, one of the stock policies should be used such as [referentialEqualityPolicy],
- * [structuralEqualityPolicy], or [neverEqualPolicy]. However, a custom mutation policy can be
- * created by implementing this interface, such as a counter policy,
- *
- * @sample androidx.compose.runtime.samples.counterSample
- */
-interface SnapshotMutationPolicy<T> {
-    /**
-     * Determine if setting a state value's are equivalent and should be treated as equal. If
-     * [equivalent] returns `true` the new value is not considered a change.
-     */
-    fun equivalent(a: T, b: T): Boolean
-
-    /**
-     * Merge conflicting changes in snapshots. This is only called if [current] and [applied] are
-     * not [equivalent]. If a valid merged value can be calculated then it should be returned.
-     *
-     * For example, if the state object holds an immutable data class with multiple fields,
-     * and [applied] has changed fields that are unmodified by [current] it might be valid to return
-     * a new copy of the data class that combines that changes from both [current] and [applied]
-     * allowing a snapshot to apply that would have otherwise failed.
-     *
-     * @sample androidx.compose.runtime.samples.counterSample
-     */
-    fun merge(previous: T, current: T, applied: T): T? = null
-}
-
-/**
- * A policy to treat values of a [MutableState] as equivalent if they are referentially (===) equal.
- *
- * Setting [MutableState.value] to its current referentially (===) equal value is not considered
- * a change. When applying a [MutableSnapshot], if the snapshot changes the value to the
- * equivalent value the parent snapshot has is not considered a conflict.
- */
-@Suppress("UNCHECKED_CAST")
-fun <T> referentialEqualityPolicy(): SnapshotMutationPolicy<T> =
-    ReferentialEqualityPolicy as SnapshotMutationPolicy<T>
-
-private object ReferentialEqualityPolicy : SnapshotMutationPolicy<Any?> {
-    override fun equivalent(a: Any?, b: Any?) = a === b
-
-    override fun toString() = "ReferentialEqualityPolicy"
-}
-
-/**
- * A policy to treat values of a [MutableState] as equivalent if they are structurally (==) equal.
- *
- * Setting [MutableState.value] to its current structurally (==) equal value is not considered
- * a change. When applying a [MutableSnapshot], if the snapshot changes the value to the
- * equivalent value the parent snapshot has is not considered a conflict.
- */
-@Suppress("UNCHECKED_CAST")
-fun <T> structuralEqualityPolicy(): SnapshotMutationPolicy<T> =
-    StructuralEqualityPolicy as SnapshotMutationPolicy<T>
-
-private object StructuralEqualityPolicy : SnapshotMutationPolicy<Any?> {
-    override fun equivalent(a: Any?, b: Any?) = a == b
-
-    override fun toString() = "StructuralEqualityPolicy"
-}
-
-/**
- * A policy never treat values of a [MutableState] as equivalent.
- *
- * Setting [MutableState.value] will always be considered a change. When applying a
- * [MutableSnapshot] that changes the state will always conflict with other snapshots that change
- * the same state.
- */
-@Suppress("UNCHECKED_CAST")
-fun <T> neverEqualPolicy(): SnapshotMutationPolicy<T> =
-    NeverEqualPolicy as SnapshotMutationPolicy<T>
-
-private object NeverEqualPolicy : SnapshotMutationPolicy<Any?> {
-    override fun equivalent(a: Any?, b: Any?) = false
-
-    override fun toString() = "NeverEqualPolicy"
-}
-
-/**
- * Create a instance of MutableList<T> that is observable and can be snapshot.
+ * Create a instance of [MutableList]<T> that is observable and can be snapshot.
  *
  * @sample androidx.compose.runtime.samples.stateListSample
  *
@@ -322,7 +223,7 @@
 fun <T> mutableStateListOf() = SnapshotStateList<T>()
 
 /**
- * Create an instance of MutableList<T> that is observable and can be snapshot.
+ * Create an instance of [MutableList]<T> that is observable and can be snapshot.
  *
  * @see mutableStateOf
  * @see mutableListOf
@@ -370,408 +271,6 @@
     SnapshotStateMap<K, V>().also { it.putAll(this.toMap()) }
 
 /**
- * A [State] that is derived from one or more other states.
- *
- * @see derivedStateOf
- */
-internal interface DerivedState<T> : State<T> {
-    /**
-     * The value of the derived state retrieved without triggering a notification to read observers.
-     */
-    val currentValue: T
-
-    /**
-     * A list of the dependencies used to produce [value] or [currentValue].
-     *
-     * The [dependencies] list can be used to determine when a [StateObject] appears in the apply
-     * observer set, if the state could affect value of this derived state.
-     */
-    val dependencies: Set<StateObject>
-}
-
-private typealias DerivedStateObservers = Pair<(DerivedState<*>) -> Unit, (DerivedState<*>) -> Unit>
-
-private val derivedStateObservers = SnapshotThreadLocal<PersistentList<DerivedStateObservers>>()
-
-private class DerivedSnapshotState<T>(
-    private val calculation: () -> T
-) : StateObject, DerivedState<T> {
-    private var first: ResultRecord<T> = ResultRecord()
-
-    private class ResultRecord<T> : StateRecord() {
-        var dependencies: HashSet<StateObject>? = null
-        var result: T? = null
-        var resultHash: Int = 0
-
-        override fun assign(value: StateRecord) {
-            @Suppress("UNCHECKED_CAST")
-            val other = value as ResultRecord<T>
-            dependencies = other.dependencies
-            result = other.result
-            resultHash = other.resultHash
-        }
-
-        override fun create(): StateRecord = ResultRecord<T>()
-
-        fun isValid(derivedState: DerivedState<*>, snapshot: Snapshot): Boolean =
-            result != null && resultHash == readableHash(derivedState, snapshot)
-
-        fun readableHash(derivedState: DerivedState<*>, snapshot: Snapshot): Int {
-            var hash = 7
-            val dependencies = sync { dependencies }
-            if (dependencies != null) {
-                notifyObservers(derivedState) {
-                    for (stateObject in dependencies) {
-                        // Find the first record without triggering an observer read.
-                        val record = stateObject.firstStateRecord.readable(stateObject, snapshot)
-                        hash = 31 * hash + identityHashCode(record)
-                        hash = 31 * hash + record.snapshotId
-                    }
-                }
-            }
-            return hash
-        }
-    }
-
-    private fun currentRecord(
-        readable: ResultRecord<T>,
-        snapshot: Snapshot,
-        calculation: () -> T
-    ): ResultRecord<T> {
-        if (readable.isValid(this, snapshot)) {
-            @Suppress("UNCHECKED_CAST")
-            return readable
-        }
-        val newDependencies = HashSet<StateObject>()
-        val result = notifyObservers(this) {
-            Snapshot.observe(
-                {
-                    if (it === this)
-                        error("A derived state cannot calculation cannot read itself")
-                    if (it is StateObject) newDependencies.add(it)
-                },
-                null, calculation
-            )
-        }
-
-        val written = sync {
-            val writeSnapshot = Snapshot.current
-            val writable = first.newWritableRecord(this, writeSnapshot)
-            writable.dependencies = newDependencies
-            writable.resultHash = writable.readableHash(this, writeSnapshot)
-            writable.result = result
-            writable
-        }
-        Snapshot.notifyObjectsInitialized()
-
-        return written
-    }
-
-    override val firstStateRecord: StateRecord get() = first
-
-    override fun prependStateRecord(value: StateRecord) {
-        @Suppress("UNCHECKED_CAST")
-        first = value as ResultRecord<T>
-    }
-
-    override val value: T
-        get() {
-            // Unlike most state objects, the record list of a derived state can change during a read
-            // because reading updates the cache. To account for this, instead of calling readable,
-            // which sends the read notification, the read observer is notified directly and current
-            // value is used instead which doesn't notify. This allow the read observer to read the
-            // value and only update the cache once.
-            Snapshot.current.readObserver?.invoke(this)
-            return currentValue
-        }
-
-    override val currentValue: T
-        get() = first.withCurrent {
-            @Suppress("UNCHECKED_CAST")
-            currentRecord(it, Snapshot.current, calculation).result as T
-        }
-
-    override val dependencies: Set<StateObject>
-        get() = first.withCurrent {
-            currentRecord(it, Snapshot.current, calculation).dependencies ?: emptySet()
-        }
-
-    override fun toString(): String = first.withCurrent {
-        "DerivedState(value=${displayValue()})@${hashCode()}"
-    }
-
-    /**
-     * A function used by the debugger to display the value of the current value of the mutable
-     * state object without triggering read observers.
-     */
-    @Suppress("unused")
-    val debuggerDisplayValue: T?
-        @JvmName("getDebuggerDisplayValue")
-        get() = first.withCurrent {
-            if (it.isValid(this, Snapshot.current))
-                it.result
-            else null
-        }
-
-    private fun displayValue(): String {
-        first.withCurrent {
-            if (it.isValid(this, Snapshot.current)) {
-                return it.result.toString()
-            }
-            return "<Not calculated>"
-        }
-    }
-}
-
-private inline fun <R> notifyObservers(derivedState: DerivedState<*>, block: () -> R): R {
-    val observers = derivedStateObservers.get() ?: persistentListOf()
-    observers.fastForEach { (start, _) -> start(derivedState) }
-    return try {
-        block()
-    } finally {
-        observers.fastForEach { (_, done) -> done(derivedState) }
-    }
-}
-
-/**
- * Creates a [State] object whose [State.value] is the result of [calculation]. The result of
- * calculation will be cached in such a way that calling [State.value] repeatedly will not cause
- * [calculation] to be executed multiple times, but reading [State.value] will cause all [State]
- * objects that got read during the [calculation] to be read in the current [Snapshot], meaning
- * that this will correctly subscribe to the derived state objects if the value is being read in
- * an observed context such as a [Composable] function.
- *
- * @sample androidx.compose.runtime.samples.DerivedStateSample
- *
- * @param calculation the calculation to create the value this state object represents.
- */
-fun <T> derivedStateOf(calculation: () -> T): State<T> = DerivedSnapshotState(calculation)
-
-/**
- * Observe the recalculations performed by any derived state that is recalculated during the
- * execution of [block]. [start] is called before a calculation starts and [done] is called
- * after the started calculation is complete.
- *
- * @param start a lambda called before every calculation of a derived state is in [block].
- * @param done a lambda that is called after the state passed to [start] is recalculated.
- * @param block the block of code to observe.
- */
-internal fun <R> observeDerivedStateRecalculations(
-    start: (derivedState: State<*>) -> Unit,
-    done: (derivedState: State<*>) -> Unit,
-    block: () -> R
-) {
-    val previous = derivedStateObservers.get()
-    try {
-        derivedStateObservers.set(
-            (derivedStateObservers.get() ?: persistentListOf()).add(
-                start to done
-            )
-        )
-        block()
-    } finally {
-        derivedStateObservers.set(previous)
-    }
-}
-
-/**
- * Receiver scope for use with [produceState].
- */
-interface ProduceStateScope<T> : MutableState<T>, CoroutineScope {
-    /**
-     * Await the disposal of this producer whether it left the composition,
-     * the source changed, or an error occurred. Always runs [onDispose] before resuming.
-     *
-     * This method is useful when configuring callback-based state producers that do not suspend,
-     * for example:
-     *
-     * @sample androidx.compose.runtime.samples.ProduceStateAwaitDispose
-     */
-    suspend fun awaitDispose(onDispose: () -> Unit): Nothing
-}
-
-private class ProduceStateScopeImpl<T>(
-    state: MutableState<T>,
-    override val coroutineContext: CoroutineContext
-) : ProduceStateScope<T>, MutableState<T> by state {
-
-    override suspend fun awaitDispose(onDispose: () -> Unit): Nothing {
-        try {
-            suspendCancellableCoroutine<Nothing> { }
-        } finally {
-            onDispose()
-        }
-    }
-}
-
-/**
- * Return an observable [snapshot][androidx.compose.runtime.snapshots.Snapshot] [State] that
- * produces values over time without a defined data source.
- *
- * [producer] is launched when [produceState] enters the composition and is cancelled when
- * [produceState] leaves the composition. [producer] should use [ProduceStateScope.value]
- * to set new values on the returned [State].
- *
- * The returned [State] conflates values; no change will be observable if
- * [ProduceStateScope.value] is used to set a value that is [equal][Any.equals] to its old value,
- * and observers may only see the latest value if several values are set in rapid succession.
- *
- * [produceState] may be used to observe either suspending or non-suspending sources of external
- * data, for example:
- *
- * @sample androidx.compose.runtime.samples.ProduceState
- *
- * @sample androidx.compose.runtime.samples.ProduceStateAwaitDispose
- */
-@Composable
-fun <T> produceState(
-    initialValue: T,
-    @BuilderInference producer: suspend ProduceStateScope<T>.() -> Unit
-): State<T> {
-    val result = remember { mutableStateOf(initialValue) }
-    LaunchedEffect(Unit) {
-        ProduceStateScopeImpl(result, coroutineContext).producer()
-    }
-    return result
-}
-
-/**
- * Return an observable [snapshot][androidx.compose.runtime.snapshots.Snapshot] [State] that
- * produces values over time from [key1].
- *
- * [producer] is launched when [produceState] enters the composition and is cancelled when
- * [produceState] leaves the composition. If [key1] changes, a running [producer] will be
- * cancelled and re-launched for the new source. [producer] should use [ProduceStateScope.value]
- * to set new values on the returned [State].
- *
- * The returned [State] conflates values; no change will be observable if
- * [ProduceStateScope.value] is used to set a value that is [equal][Any.equals] to its old value,
- * and observers may only see the latest value if several values are set in rapid succession.
- *
- * [produceState] may be used to observe either suspending or non-suspending sources of external
- * data, for example:
- *
- * @sample androidx.compose.runtime.samples.ProduceState
- *
- * @sample androidx.compose.runtime.samples.ProduceStateAwaitDispose
- */
-@Composable
-fun <T> produceState(
-    initialValue: T,
-    key1: Any?,
-    @BuilderInference producer: suspend ProduceStateScope<T>.() -> Unit
-): State<T> {
-    val result = remember { mutableStateOf(initialValue) }
-    LaunchedEffect(key1) {
-        ProduceStateScopeImpl(result, coroutineContext).producer()
-    }
-    return result
-}
-
-/**
- * Return an observable [snapshot][androidx.compose.runtime.snapshots.Snapshot] [State] that
- * produces values over time from [key1] and [key2].
- *
- * [producer] is launched when [produceState] enters the composition and is cancelled when
- * [produceState] leaves the composition. If [key1] or [key2] change, a running [producer]
- * will be cancelled and re-launched for the new source. [producer] should use
- * [ProduceStateScope.value] to set new values on the returned [State].
- *
- * The returned [State] conflates values; no change will be observable if
- * [ProduceStateScope.value] is used to set a value that is [equal][Any.equals] to its old value,
- * and observers may only see the latest value if several values are set in rapid succession.
- *
- * [produceState] may be used to observe either suspending or non-suspending sources of external
- * data, for example:
- *
- * @sample androidx.compose.runtime.samples.ProduceState
- *
- * @sample androidx.compose.runtime.samples.ProduceStateAwaitDispose
- */
-@Composable
-fun <T> produceState(
-    initialValue: T,
-    key1: Any?,
-    key2: Any?,
-    @BuilderInference producer: suspend ProduceStateScope<T>.() -> Unit
-): State<T> {
-    val result = remember { mutableStateOf(initialValue) }
-    LaunchedEffect(key1, key2) {
-        ProduceStateScopeImpl(result, coroutineContext).producer()
-    }
-    return result
-}
-
-/**
- * Return an observable [snapshot][androidx.compose.runtime.snapshots.Snapshot] [State] that
- * produces values over time from [key1], [key2] and [key3].
- *
- * [producer] is launched when [produceState] enters the composition and is cancelled when
- * [produceState] leaves the composition. If [key1], [key2] or [key3] change, a running
- * [producer] will be cancelled and re-launched for the new source. [producer should use
- * [ProduceStateScope.value] to set new values on the returned [State].
- *
- * The returned [State] conflates values; no change will be observable if
- * [ProduceStateScope.value] is used to set a value that is [equal][Any.equals] to its old value,
- * and observers may only see the latest value if several values are set in rapid succession.
- *
- * [produceState] may be used to observe either suspending or non-suspending sources of external
- * data, for example:
- *
- * @sample androidx.compose.runtime.samples.ProduceState
- *
- * @sample androidx.compose.runtime.samples.ProduceStateAwaitDispose
- */
-@Composable
-fun <T> produceState(
-    initialValue: T,
-    key1: Any?,
-    key2: Any?,
-    key3: Any?,
-    @BuilderInference producer: suspend ProduceStateScope<T>.() -> Unit
-): State<T> {
-    val result = remember { mutableStateOf(initialValue) }
-    LaunchedEffect(key1, key2, key3) {
-        ProduceStateScopeImpl(result, coroutineContext).producer()
-    }
-    return result
-}
-
-/**
- * Return an observable [snapshot][androidx.compose.runtime.snapshots.Snapshot] [State] that
- * produces values over time from [keys].
- *
- * [producer] is launched when [produceState] enters the composition and is cancelled when
- * [produceState] leaves the composition. If [keys] change, a running [producer] will be
- * cancelled and re-launched for the new source. [producer] should use [ProduceStateScope.value]
- * to set new values on the returned [State].
- *
- * The returned [State] conflates values; no change will be observable if
- * [ProduceStateScope.value] is used to set a value that is [equal][Any.equals] to its old value,
- * and observers may only see the latest value if several values are set in rapid succession.
- *
- * [produceState] may be used to observe either suspending or non-suspending sources of external
- * data, for example:
- *
- * @sample androidx.compose.runtime.samples.ProduceState
- *
- * @sample androidx.compose.runtime.samples.ProduceStateAwaitDispose
- */
-@Composable
-fun <T> produceState(
-    initialValue: T,
-    vararg keys: Any?,
-    @BuilderInference producer: suspend ProduceStateScope<T>.() -> Unit
-): State<T> {
-    val result = remember { mutableStateOf(initialValue) }
-    @Suppress("CHANGING_ARGUMENTS_EXECUTION_ORDER_FOR_NAMED_VARARGS")
-    LaunchedEffect(keys = keys) {
-        ProduceStateScopeImpl(result, coroutineContext).producer()
-    }
-    return result
-}
-
-/**
  * [remember] a [mutableStateOf] [newValue] and update its value to [newValue] on each
  * recomposition of the [rememberUpdatedState] call.
  *
@@ -796,144 +295,3 @@
 fun <T> rememberUpdatedState(newValue: T): State<T> = remember {
     mutableStateOf(newValue)
 }.apply { value = newValue }
-
-/**
- * Collects values from this [StateFlow] and represents its latest value via [State].
- * The [StateFlow.value] is used as an initial value. Every time there would be new value posted
- * into the [StateFlow] the returned [State] will be updated causing recomposition of every
- * [State.value] usage.
- *
- * @sample androidx.compose.runtime.samples.StateFlowSample
- *
- * @param context [CoroutineContext] to use for collecting.
- */
-@Suppress("StateFlowValueCalledInComposition")
-@Composable
-fun <T> StateFlow<T>.collectAsState(
-    context: CoroutineContext = EmptyCoroutineContext
-): State<T> = collectAsState(value, context)
-
-/**
- * Collects values from this [Flow] and represents its latest value via [State]. Every time there
- * would be new value posted into the [Flow] the returned [State] will be updated causing
- * recomposition of every [State.value] usage.
- *
- * @sample androidx.compose.runtime.samples.FlowWithInitialSample
- *
- * @param context [CoroutineContext] to use for collecting.
- */
-@Composable
-fun <T : R, R> Flow<T>.collectAsState(
-    initial: R,
-    context: CoroutineContext = EmptyCoroutineContext
-): State<R> = produceState(initial, this, context) {
-    if (context == EmptyCoroutineContext) {
-        collect { value = it }
-    } else withContext(context) {
-        collect { value = it }
-    }
-}
-
-/**
- * Create a [Flow] from observable [Snapshot] state. (e.g. state holders returned by
- * [mutableStateOf][androidx.compose.runtime.mutableStateOf].)
- *
- * [snapshotFlow] creates a [Flow] that runs [block] when collected and emits the result,
- * recording any snapshot state that was accessed. While collection continues, if a new [Snapshot]
- * is applied that changes state accessed by [block], the flow will run [block] again,
- * re-recording the snapshot state that was accessed.
- * If the result of [block] is not [equal to][Any.equals] the previous result, the flow will emit
- * that new result. (This behavior is similar to that of
- * [Flow.distinctUntilChanged][kotlinx.coroutines.flow.distinctUntilChanged].) Collection will
- * continue indefinitely unless it is explicitly cancelled or limited by the use of other [Flow]
- * operators.
- *
- * @sample androidx.compose.runtime.samples.snapshotFlowSample
- *
- * [block] is run in a **read-only** [Snapshot] and may not modify snapshot data. If [block]
- * attempts to modify snapshot data, flow collection will fail with [IllegalStateException].
- *
- * [block] may run more than once for equal sets of inputs or only once after many rapid
- * snapshot changes; it should be idempotent and free of side effects.
- *
- * When working with [Snapshot] state it is useful to keep the distinction between **events** and
- * **state** in mind. [snapshotFlow] models snapshot changes as events, but events **cannot** be
- * effectively modeled as observable state. Observable state is a lossy compression of the events
- * that produced that state.
- *
- * An observable **event** happens at a point in time and is discarded. All registered observers
- * at the time the event occurred are notified. All individual events in a stream are assumed
- * to be relevant and may build on one another; repeated equal events have meaning and therefore
- * a registered observer must observe all events without skipping.
- *
- * Observable **state** raises change events when the state changes from one value to a new,
- * unequal value. State change events are **conflated;** only the most recent state matters.
- * Observers of state changes must therefore be **idempotent;** given the same state value the
- * observer should produce the same result. It is valid for a state observer to both skip
- * intermediate states as well as run multiple times for the same state and the result should
- * be the same.
- */
-fun <T> snapshotFlow(
-    block: () -> T
-): Flow<T> = flow {
-    // Objects read the last time block was run
-    val readSet = mutableSetOf<Any>()
-    val readObserver: (Any) -> Unit = { readSet.add(it) }
-
-    // This channel may not block or lose data on a trySend call.
-    val appliedChanges = Channel<Set<Any>>(Channel.UNLIMITED)
-
-    // Register the apply observer before running for the first time
-    // so that we don't miss updates.
-    val unregisterApplyObserver = Snapshot.registerApplyObserver { changed, _ ->
-        appliedChanges.trySend(changed)
-    }
-
-    try {
-        var lastValue = Snapshot.takeSnapshot(readObserver).run {
-            try {
-                enter(block)
-            } finally {
-                dispose()
-            }
-        }
-        emit(lastValue)
-
-        while (true) {
-            var found = false
-            var changedObjects = appliedChanges.receive()
-
-            // Poll for any other changes before running block to minimize the number of
-            // additional times it runs for the same data
-            while (true) {
-                // Assumption: readSet will typically be smaller than changed
-                found = found || readSet.intersects(changedObjects)
-                changedObjects = appliedChanges.tryReceive().getOrNull() ?: break
-            }
-
-            if (found) {
-                readSet.clear()
-                val newValue = Snapshot.takeSnapshot(readObserver).run {
-                    try {
-                        enter(block)
-                    } finally {
-                        dispose()
-                    }
-                }
-
-                if (newValue != lastValue) {
-                    lastValue = newValue
-                    emit(newValue)
-                }
-            }
-        }
-    } finally {
-        unregisterApplyObserver.dispose()
-    }
-}
-
-/**
- * Return `true` if there are any elements shared between `this` and [other]
- */
-private fun <T> Set<T>.intersects(other: Set<T>): Boolean =
-    if (size < other.size) any { it in other } else other.any { it in this }
\ No newline at end of file
diff --git a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/CompositionTests.kt b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/CompositionTests.kt
index 36f11ee..0b04cf0 100644
--- a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/CompositionTests.kt
+++ b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/CompositionTests.kt
@@ -41,12 +41,15 @@
 import androidx.compose.runtime.mock.skip
 import androidx.compose.runtime.mock.validate
 import androidx.compose.runtime.snapshots.Snapshot
+import androidx.compose.runtime.snapshots.SnapshotStateObserver
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.coroutineScope
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.test.TestCoroutineDispatcher
 import kotlinx.coroutines.test.runBlockingTest
+import kotlin.concurrent.thread
 import kotlin.random.Random
 import kotlin.test.Test
 import kotlin.test.assertEquals
@@ -3153,6 +3156,42 @@
             }
         }
     }
+
+    // Regression test for b/202967533
+    // Test taken from the bug report; reformatted to conform to lint rules.
+    @OptIn(ExperimentalCoroutinesApi::class)
+    @Test
+    fun avoidsDeadlockInRecomposerComposerDispose() {
+        val thread = thread {
+            while (!Thread.interrupted()) {
+                // -> synchronized(stateLock) -> recordComposerModificationsLocked
+                // -> composition.recordModificationsOf -> synchronized(lock)
+                Snapshot.sendApplyNotifications()
+            }
+        }
+
+        for (i in 1..5000) {
+            runBlocking(TestCoroutineDispatcher()) {
+                localRecomposerTest {
+                    @Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE")
+                    var value by mutableStateOf(0)
+                    val snapshotObserver = SnapshotStateObserver {}
+                    snapshotObserver.start()
+                    @Suppress("UNUSED_VALUE")
+                    value = 4
+                    val composition = Composition(EmptyApplier(), it)
+                    composition.setContent {}
+
+                    // -> synchronized(lock) -> parent.unregisterComposition(this)
+                    // -> synchronized(stateLock)
+                    composition.dispose()
+                    snapshotObserver.stop()
+                }
+            }
+        }
+
+        thread.interrupt()
+    }
 }
 
 var stateA by mutableStateOf(1000)
diff --git a/compose/ui/ui-android-stubs/api/1.1.0-beta02.txt b/compose/ui/ui-android-stubs/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..db6e322
--- /dev/null
+++ b/compose/ui/ui-android-stubs/api/1.1.0-beta02.txt
@@ -0,0 +1,73 @@
+// Signature format: 4.0
+package android.view {
+
+  public final class DisplayListCanvas extends android.graphics.Canvas {
+    ctor public DisplayListCanvas();
+    method public void drawRenderNode(android.view.RenderNode);
+  }
+
+  public class RenderNode {
+    method public static android.view.RenderNode create(String?, android.view.View?);
+    method public void destroy();
+    method public void discardDisplayList();
+    method public void end(android.view.DisplayListCanvas);
+    method public float getAlpha();
+    method public float getCameraDistance();
+    method public boolean getClipToOutline();
+    method public float getElevation();
+    method public void getInverseMatrix(android.graphics.Matrix);
+    method public void getMatrix(android.graphics.Matrix);
+    method public float getPivotX();
+    method public float getPivotY();
+    method public float getRotation();
+    method public float getRotationX();
+    method public float getRotationY();
+    method public float getScaleX();
+    method public float getScaleY();
+    method public float getTranslationX();
+    method public float getTranslationY();
+    method public float getTranslationZ();
+    method public boolean hasIdentityMatrix();
+    method public boolean hasOverlappingRendering();
+    method public boolean hasShadow();
+    method public boolean isAttached();
+    method public boolean isPivotExplicitlySet();
+    method public boolean isValid();
+    method public boolean offsetLeftAndRight(int);
+    method public boolean offsetTopAndBottom(int);
+    method public void output();
+    method public boolean setAlpha(float);
+    method public boolean setAnimationMatrix(android.graphics.Matrix);
+    method public boolean setBottom(int);
+    method public boolean setCameraDistance(float);
+    method public boolean setClipBounds(android.graphics.Rect?);
+    method public boolean setClipToBounds(boolean);
+    method public boolean setClipToOutline(boolean);
+    method public boolean setElevation(float);
+    method public boolean setHasOverlappingRendering(boolean);
+    method public boolean setLayerPaint(android.graphics.Paint?);
+    method public boolean setLayerType(int);
+    method public boolean setLeft(int);
+    method public boolean setLeftTopRightBottom(int, int, int, int);
+    method public boolean setOutline(android.graphics.Outline?);
+    method public boolean setPivotX(float);
+    method public boolean setPivotY(float);
+    method public boolean setProjectBackwards(boolean);
+    method public boolean setProjectionReceiver(boolean);
+    method public boolean setRevealClip(boolean, float, float, float);
+    method public boolean setRight(int);
+    method public boolean setRotation(float);
+    method public boolean setRotationX(float);
+    method public boolean setRotationY(float);
+    method public boolean setScaleX(float);
+    method public boolean setScaleY(float);
+    method public boolean setStaticMatrix(android.graphics.Matrix);
+    method public boolean setTop(int);
+    method public boolean setTranslationX(float);
+    method public boolean setTranslationY(float);
+    method public boolean setTranslationZ(float);
+    method public android.view.DisplayListCanvas start(int, int);
+  }
+
+}
+
diff --git a/compose/ui/ui-android-stubs/api/public_plus_experimental_1.1.0-beta02.txt b/compose/ui/ui-android-stubs/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..db6e322
--- /dev/null
+++ b/compose/ui/ui-android-stubs/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,73 @@
+// Signature format: 4.0
+package android.view {
+
+  public final class DisplayListCanvas extends android.graphics.Canvas {
+    ctor public DisplayListCanvas();
+    method public void drawRenderNode(android.view.RenderNode);
+  }
+
+  public class RenderNode {
+    method public static android.view.RenderNode create(String?, android.view.View?);
+    method public void destroy();
+    method public void discardDisplayList();
+    method public void end(android.view.DisplayListCanvas);
+    method public float getAlpha();
+    method public float getCameraDistance();
+    method public boolean getClipToOutline();
+    method public float getElevation();
+    method public void getInverseMatrix(android.graphics.Matrix);
+    method public void getMatrix(android.graphics.Matrix);
+    method public float getPivotX();
+    method public float getPivotY();
+    method public float getRotation();
+    method public float getRotationX();
+    method public float getRotationY();
+    method public float getScaleX();
+    method public float getScaleY();
+    method public float getTranslationX();
+    method public float getTranslationY();
+    method public float getTranslationZ();
+    method public boolean hasIdentityMatrix();
+    method public boolean hasOverlappingRendering();
+    method public boolean hasShadow();
+    method public boolean isAttached();
+    method public boolean isPivotExplicitlySet();
+    method public boolean isValid();
+    method public boolean offsetLeftAndRight(int);
+    method public boolean offsetTopAndBottom(int);
+    method public void output();
+    method public boolean setAlpha(float);
+    method public boolean setAnimationMatrix(android.graphics.Matrix);
+    method public boolean setBottom(int);
+    method public boolean setCameraDistance(float);
+    method public boolean setClipBounds(android.graphics.Rect?);
+    method public boolean setClipToBounds(boolean);
+    method public boolean setClipToOutline(boolean);
+    method public boolean setElevation(float);
+    method public boolean setHasOverlappingRendering(boolean);
+    method public boolean setLayerPaint(android.graphics.Paint?);
+    method public boolean setLayerType(int);
+    method public boolean setLeft(int);
+    method public boolean setLeftTopRightBottom(int, int, int, int);
+    method public boolean setOutline(android.graphics.Outline?);
+    method public boolean setPivotX(float);
+    method public boolean setPivotY(float);
+    method public boolean setProjectBackwards(boolean);
+    method public boolean setProjectionReceiver(boolean);
+    method public boolean setRevealClip(boolean, float, float, float);
+    method public boolean setRight(int);
+    method public boolean setRotation(float);
+    method public boolean setRotationX(float);
+    method public boolean setRotationY(float);
+    method public boolean setScaleX(float);
+    method public boolean setScaleY(float);
+    method public boolean setStaticMatrix(android.graphics.Matrix);
+    method public boolean setTop(int);
+    method public boolean setTranslationX(float);
+    method public boolean setTranslationY(float);
+    method public boolean setTranslationZ(float);
+    method public android.view.DisplayListCanvas start(int, int);
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/ui/ui-android-stubs/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to compose/ui/ui-android-stubs/api/res-1.1.0-beta02.txt
diff --git a/compose/ui/ui-android-stubs/api/restricted_1.1.0-beta02.txt b/compose/ui/ui-android-stubs/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..db6e322
--- /dev/null
+++ b/compose/ui/ui-android-stubs/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,73 @@
+// Signature format: 4.0
+package android.view {
+
+  public final class DisplayListCanvas extends android.graphics.Canvas {
+    ctor public DisplayListCanvas();
+    method public void drawRenderNode(android.view.RenderNode);
+  }
+
+  public class RenderNode {
+    method public static android.view.RenderNode create(String?, android.view.View?);
+    method public void destroy();
+    method public void discardDisplayList();
+    method public void end(android.view.DisplayListCanvas);
+    method public float getAlpha();
+    method public float getCameraDistance();
+    method public boolean getClipToOutline();
+    method public float getElevation();
+    method public void getInverseMatrix(android.graphics.Matrix);
+    method public void getMatrix(android.graphics.Matrix);
+    method public float getPivotX();
+    method public float getPivotY();
+    method public float getRotation();
+    method public float getRotationX();
+    method public float getRotationY();
+    method public float getScaleX();
+    method public float getScaleY();
+    method public float getTranslationX();
+    method public float getTranslationY();
+    method public float getTranslationZ();
+    method public boolean hasIdentityMatrix();
+    method public boolean hasOverlappingRendering();
+    method public boolean hasShadow();
+    method public boolean isAttached();
+    method public boolean isPivotExplicitlySet();
+    method public boolean isValid();
+    method public boolean offsetLeftAndRight(int);
+    method public boolean offsetTopAndBottom(int);
+    method public void output();
+    method public boolean setAlpha(float);
+    method public boolean setAnimationMatrix(android.graphics.Matrix);
+    method public boolean setBottom(int);
+    method public boolean setCameraDistance(float);
+    method public boolean setClipBounds(android.graphics.Rect?);
+    method public boolean setClipToBounds(boolean);
+    method public boolean setClipToOutline(boolean);
+    method public boolean setElevation(float);
+    method public boolean setHasOverlappingRendering(boolean);
+    method public boolean setLayerPaint(android.graphics.Paint?);
+    method public boolean setLayerType(int);
+    method public boolean setLeft(int);
+    method public boolean setLeftTopRightBottom(int, int, int, int);
+    method public boolean setOutline(android.graphics.Outline?);
+    method public boolean setPivotX(float);
+    method public boolean setPivotY(float);
+    method public boolean setProjectBackwards(boolean);
+    method public boolean setProjectionReceiver(boolean);
+    method public boolean setRevealClip(boolean, float, float, float);
+    method public boolean setRight(int);
+    method public boolean setRotation(float);
+    method public boolean setRotationX(float);
+    method public boolean setRotationY(float);
+    method public boolean setScaleX(float);
+    method public boolean setScaleY(float);
+    method public boolean setStaticMatrix(android.graphics.Matrix);
+    method public boolean setTop(int);
+    method public boolean setTranslationX(float);
+    method public boolean setTranslationY(float);
+    method public boolean setTranslationZ(float);
+    method public android.view.DisplayListCanvas start(int, int);
+  }
+
+}
+
diff --git a/compose/ui/ui-geometry/api/1.1.0-beta02.txt b/compose/ui/ui-geometry/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..f8601c7
--- /dev/null
+++ b/compose/ui/ui-geometry/api/1.1.0-beta02.txt
@@ -0,0 +1,256 @@
+// Signature format: 4.0
+package androidx.compose.ui.geometry {
+
+  @androidx.compose.runtime.Immutable public final inline class CornerRadius {
+    ctor public CornerRadius();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public operator long minus(long other);
+    method @androidx.compose.runtime.Stable public operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public operator long unaryMinus();
+  }
+
+  public static final class CornerRadius.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class CornerRadiusKt {
+    method @androidx.compose.runtime.Stable public static long CornerRadius(float x, optional float y);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+  }
+
+  public final class GeometryUtilsKt {
+  }
+
+  public final class MutableRect {
+    ctor public MutableRect(float left, float top, float right, float bottom);
+    method public boolean contains(long offset);
+    method public float getBottom();
+    method public inline float getHeight();
+    method public float getLeft();
+    method public float getRight();
+    method public long getSize();
+    method public float getTop();
+    method public inline float getWidth();
+    method @androidx.compose.runtime.Stable public void intersect(float left, float top, float right, float bottom);
+    method public boolean isEmpty();
+    method public void set(float left, float top, float right, float bottom);
+    method public void setBottom(float bottom);
+    method public void setLeft(float left);
+    method public void setRight(float right);
+    method public void setTop(float top);
+    property public final float bottom;
+    property public final inline float height;
+    property public final boolean isEmpty;
+    property public final float left;
+    property public final float right;
+    property public final long size;
+    property public final float top;
+    property public final inline float width;
+  }
+
+  public final class MutableRectKt {
+    method public static androidx.compose.ui.geometry.Rect toRect(androidx.compose.ui.geometry.MutableRect);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Offset {
+    ctor public Offset();
+    method @androidx.compose.runtime.Stable public operator float component1();
+    method @androidx.compose.runtime.Stable public operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public float getDistance();
+    method @androidx.compose.runtime.Stable public float getDistanceSquared();
+    method @androidx.compose.runtime.Stable public boolean isValid();
+    method @androidx.compose.runtime.Stable public operator long minus(long other);
+    method @androidx.compose.runtime.Stable public operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long rem(float operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public operator long unaryMinus();
+  }
+
+  public static final class Offset.Companion {
+    method public long getInfinite();
+    method public long getUnspecified();
+    method public long getZero();
+    property public final long Infinite;
+    property public final long Unspecified;
+    property public final long Zero;
+  }
+
+  public final class OffsetKt {
+    method @androidx.compose.runtime.Stable public static long Offset(float x, float y);
+    method public static boolean isFinite(long);
+    method public static boolean isSpecified(long);
+    method public static boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Offset> block);
+  }
+
+  @androidx.compose.runtime.Immutable public final class Rect {
+    ctor public Rect(@androidx.compose.runtime.Stable float left, @androidx.compose.runtime.Stable float top, @androidx.compose.runtime.Stable float right, @androidx.compose.runtime.Stable float bottom);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public boolean contains(long offset);
+    method public androidx.compose.ui.geometry.Rect copy(float left, float top, float right, float bottom);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect deflate(float delta);
+    method public float getBottom();
+    method public long getBottomCenter();
+    method public long getBottomLeft();
+    method public long getBottomRight();
+    method public long getCenter();
+    method public long getCenterLeft();
+    method public long getCenterRight();
+    method public float getHeight();
+    method public float getLeft();
+    method public float getMaxDimension();
+    method public float getMinDimension();
+    method public float getRight();
+    method public long getSize();
+    method public float getTop();
+    method public long getTopCenter();
+    method public long getTopLeft();
+    method public long getTopRight();
+    method public float getWidth();
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect inflate(float delta);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect intersect(androidx.compose.ui.geometry.Rect other);
+    method public boolean isEmpty();
+    method public boolean isFinite();
+    method public boolean isInfinite();
+    method public boolean overlaps(androidx.compose.ui.geometry.Rect other);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect translate(long offset);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect translate(float translateX, float translateY);
+    property public final float bottom;
+    property public final long bottomCenter;
+    property public final long bottomLeft;
+    property public final long bottomRight;
+    property public final long center;
+    property public final long centerLeft;
+    property public final long centerRight;
+    property public final float height;
+    property public final boolean isEmpty;
+    property public final boolean isFinite;
+    property public final boolean isInfinite;
+    property public final float left;
+    property public final float maxDimension;
+    property public final float minDimension;
+    property public final float right;
+    property public final long size;
+    property public final float top;
+    property public final long topCenter;
+    property public final long topLeft;
+    property public final long topRight;
+    property public final float width;
+    field public static final androidx.compose.ui.geometry.Rect.Companion Companion;
+  }
+
+  public static final class Rect.Companion {
+    method public androidx.compose.ui.geometry.Rect getZero();
+    property public final androidx.compose.ui.geometry.Rect Zero;
+  }
+
+  public final class RectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect(long offset, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect(long center, float radius);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect lerp(androidx.compose.ui.geometry.Rect start, androidx.compose.ui.geometry.Rect stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class RoundRect {
+    ctor public RoundRect(float left, float top, float right, float bottom, optional long topLeftCornerRadius, optional long topRightCornerRadius, optional long bottomRightCornerRadius, optional long bottomLeftCornerRadius);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public long component5-kKHJgLs();
+    method public long component6-kKHJgLs();
+    method public long component7-kKHJgLs();
+    method public long component8-kKHJgLs();
+    method public boolean contains(long point);
+    method public androidx.compose.ui.geometry.RoundRect copy-MDFrsts(float left, float top, float right, float bottom, long topLeftCornerRadius, long topRightCornerRadius, long bottomRightCornerRadius, long bottomLeftCornerRadius);
+    method public float getBottom();
+    method public long getBottomLeftCornerRadius();
+    method public long getBottomRightCornerRadius();
+    method public float getHeight();
+    method public float getLeft();
+    method public float getRight();
+    method public float getTop();
+    method public long getTopLeftCornerRadius();
+    method public long getTopRightCornerRadius();
+    method public float getWidth();
+    method public static androidx.compose.ui.geometry.RoundRect getZero();
+    property public static final androidx.compose.ui.geometry.RoundRect Zero;
+    property public final float bottom;
+    property public final long bottomLeftCornerRadius;
+    property public final long bottomRightCornerRadius;
+    property public final float height;
+    property public final float left;
+    property public final float right;
+    property public final float top;
+    property public final long topLeftCornerRadius;
+    property public final long topRightCornerRadius;
+    property public final float width;
+    field public static final androidx.compose.ui.geometry.RoundRect.Companion Companion;
+  }
+
+  public static final class RoundRect.Companion {
+    method public androidx.compose.ui.geometry.RoundRect getZero();
+    property public final androidx.compose.ui.geometry.RoundRect Zero;
+  }
+
+  public final class RoundRectKt {
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(float left, float top, float right, float bottom, long cornerRadius);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(androidx.compose.ui.geometry.Rect rect, float radiusX, float radiusY);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(androidx.compose.ui.geometry.Rect rect, long cornerRadius);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(androidx.compose.ui.geometry.Rect rect, optional long topLeft, optional long topRight, optional long bottomRight, optional long bottomLeft);
+    method public static androidx.compose.ui.geometry.Rect getBoundingRect(androidx.compose.ui.geometry.RoundRect);
+    method public static long getCenter(androidx.compose.ui.geometry.RoundRect);
+    method public static float getMaxDimension(androidx.compose.ui.geometry.RoundRect);
+    method public static float getMinDimension(androidx.compose.ui.geometry.RoundRect);
+    method public static androidx.compose.ui.geometry.Rect getSafeInnerRect(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isCircle(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isEllipse(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isEmpty(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isFinite(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isRect(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isSimple(androidx.compose.ui.geometry.RoundRect);
+    method public static androidx.compose.ui.geometry.RoundRect lerp(androidx.compose.ui.geometry.RoundRect start, androidx.compose.ui.geometry.RoundRect stop, float fraction);
+    method public static androidx.compose.ui.geometry.RoundRect translate(androidx.compose.ui.geometry.RoundRect, long offset);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Size {
+    ctor public Size();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public boolean isEmpty();
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+  }
+
+  public static final class Size.Companion {
+    method public long getUnspecified();
+    method public long getZero();
+    property public final long Unspecified;
+    property public final long Zero;
+  }
+
+  public final class SizeKt {
+    method @androidx.compose.runtime.Stable public static long Size(float width, float height);
+    method public static long getCenter(long);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Size> block);
+    method @androidx.compose.runtime.Stable public static inline operator long times(int, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times(double, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times(float, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect toRect(long);
+  }
+
+}
+
diff --git a/compose/ui/ui-geometry/api/current.txt b/compose/ui/ui-geometry/api/current.txt
index bb288cb..f8601c7 100644
--- a/compose/ui/ui-geometry/api/current.txt
+++ b/compose/ui/ui-geometry/api/current.txt
@@ -3,6 +3,13 @@
 
   @androidx.compose.runtime.Immutable public final inline class CornerRadius {
     ctor public CornerRadius();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public operator long minus(long other);
+    method @androidx.compose.runtime.Stable public operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public operator long unaryMinus();
   }
 
   public static final class CornerRadius.Companion {
@@ -51,6 +58,17 @@
 
   @androidx.compose.runtime.Immutable public final inline class Offset {
     ctor public Offset();
+    method @androidx.compose.runtime.Stable public operator float component1();
+    method @androidx.compose.runtime.Stable public operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public float getDistance();
+    method @androidx.compose.runtime.Stable public float getDistanceSquared();
+    method @androidx.compose.runtime.Stable public boolean isValid();
+    method @androidx.compose.runtime.Stable public operator long minus(long other);
+    method @androidx.compose.runtime.Stable public operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long rem(float operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public operator long unaryMinus();
   }
 
   public static final class Offset.Companion {
@@ -165,6 +183,7 @@
     method public long getTopRightCornerRadius();
     method public float getWidth();
     method public static androidx.compose.ui.geometry.RoundRect getZero();
+    property public static final androidx.compose.ui.geometry.RoundRect Zero;
     property public final float bottom;
     property public final long bottomLeftCornerRadius;
     property public final long bottomRightCornerRadius;
@@ -206,6 +225,11 @@
 
   @androidx.compose.runtime.Immutable public final inline class Size {
     ctor public Size();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public boolean isEmpty();
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
   }
 
   public static final class Size.Companion {
diff --git a/compose/ui/ui-geometry/api/public_plus_experimental_1.1.0-beta02.txt b/compose/ui/ui-geometry/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..f8601c7
--- /dev/null
+++ b/compose/ui/ui-geometry/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,256 @@
+// Signature format: 4.0
+package androidx.compose.ui.geometry {
+
+  @androidx.compose.runtime.Immutable public final inline class CornerRadius {
+    ctor public CornerRadius();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public operator long minus(long other);
+    method @androidx.compose.runtime.Stable public operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public operator long unaryMinus();
+  }
+
+  public static final class CornerRadius.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class CornerRadiusKt {
+    method @androidx.compose.runtime.Stable public static long CornerRadius(float x, optional float y);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+  }
+
+  public final class GeometryUtilsKt {
+  }
+
+  public final class MutableRect {
+    ctor public MutableRect(float left, float top, float right, float bottom);
+    method public boolean contains(long offset);
+    method public float getBottom();
+    method public inline float getHeight();
+    method public float getLeft();
+    method public float getRight();
+    method public long getSize();
+    method public float getTop();
+    method public inline float getWidth();
+    method @androidx.compose.runtime.Stable public void intersect(float left, float top, float right, float bottom);
+    method public boolean isEmpty();
+    method public void set(float left, float top, float right, float bottom);
+    method public void setBottom(float bottom);
+    method public void setLeft(float left);
+    method public void setRight(float right);
+    method public void setTop(float top);
+    property public final float bottom;
+    property public final inline float height;
+    property public final boolean isEmpty;
+    property public final float left;
+    property public final float right;
+    property public final long size;
+    property public final float top;
+    property public final inline float width;
+  }
+
+  public final class MutableRectKt {
+    method public static androidx.compose.ui.geometry.Rect toRect(androidx.compose.ui.geometry.MutableRect);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Offset {
+    ctor public Offset();
+    method @androidx.compose.runtime.Stable public operator float component1();
+    method @androidx.compose.runtime.Stable public operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public float getDistance();
+    method @androidx.compose.runtime.Stable public float getDistanceSquared();
+    method @androidx.compose.runtime.Stable public boolean isValid();
+    method @androidx.compose.runtime.Stable public operator long minus(long other);
+    method @androidx.compose.runtime.Stable public operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long rem(float operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public operator long unaryMinus();
+  }
+
+  public static final class Offset.Companion {
+    method public long getInfinite();
+    method public long getUnspecified();
+    method public long getZero();
+    property public final long Infinite;
+    property public final long Unspecified;
+    property public final long Zero;
+  }
+
+  public final class OffsetKt {
+    method @androidx.compose.runtime.Stable public static long Offset(float x, float y);
+    method public static boolean isFinite(long);
+    method public static boolean isSpecified(long);
+    method public static boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Offset> block);
+  }
+
+  @androidx.compose.runtime.Immutable public final class Rect {
+    ctor public Rect(@androidx.compose.runtime.Stable float left, @androidx.compose.runtime.Stable float top, @androidx.compose.runtime.Stable float right, @androidx.compose.runtime.Stable float bottom);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public boolean contains(long offset);
+    method public androidx.compose.ui.geometry.Rect copy(float left, float top, float right, float bottom);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect deflate(float delta);
+    method public float getBottom();
+    method public long getBottomCenter();
+    method public long getBottomLeft();
+    method public long getBottomRight();
+    method public long getCenter();
+    method public long getCenterLeft();
+    method public long getCenterRight();
+    method public float getHeight();
+    method public float getLeft();
+    method public float getMaxDimension();
+    method public float getMinDimension();
+    method public float getRight();
+    method public long getSize();
+    method public float getTop();
+    method public long getTopCenter();
+    method public long getTopLeft();
+    method public long getTopRight();
+    method public float getWidth();
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect inflate(float delta);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect intersect(androidx.compose.ui.geometry.Rect other);
+    method public boolean isEmpty();
+    method public boolean isFinite();
+    method public boolean isInfinite();
+    method public boolean overlaps(androidx.compose.ui.geometry.Rect other);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect translate(long offset);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect translate(float translateX, float translateY);
+    property public final float bottom;
+    property public final long bottomCenter;
+    property public final long bottomLeft;
+    property public final long bottomRight;
+    property public final long center;
+    property public final long centerLeft;
+    property public final long centerRight;
+    property public final float height;
+    property public final boolean isEmpty;
+    property public final boolean isFinite;
+    property public final boolean isInfinite;
+    property public final float left;
+    property public final float maxDimension;
+    property public final float minDimension;
+    property public final float right;
+    property public final long size;
+    property public final float top;
+    property public final long topCenter;
+    property public final long topLeft;
+    property public final long topRight;
+    property public final float width;
+    field public static final androidx.compose.ui.geometry.Rect.Companion Companion;
+  }
+
+  public static final class Rect.Companion {
+    method public androidx.compose.ui.geometry.Rect getZero();
+    property public final androidx.compose.ui.geometry.Rect Zero;
+  }
+
+  public final class RectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect(long offset, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect(long center, float radius);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect lerp(androidx.compose.ui.geometry.Rect start, androidx.compose.ui.geometry.Rect stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class RoundRect {
+    ctor public RoundRect(float left, float top, float right, float bottom, optional long topLeftCornerRadius, optional long topRightCornerRadius, optional long bottomRightCornerRadius, optional long bottomLeftCornerRadius);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public long component5-kKHJgLs();
+    method public long component6-kKHJgLs();
+    method public long component7-kKHJgLs();
+    method public long component8-kKHJgLs();
+    method public boolean contains(long point);
+    method public androidx.compose.ui.geometry.RoundRect copy-MDFrsts(float left, float top, float right, float bottom, long topLeftCornerRadius, long topRightCornerRadius, long bottomRightCornerRadius, long bottomLeftCornerRadius);
+    method public float getBottom();
+    method public long getBottomLeftCornerRadius();
+    method public long getBottomRightCornerRadius();
+    method public float getHeight();
+    method public float getLeft();
+    method public float getRight();
+    method public float getTop();
+    method public long getTopLeftCornerRadius();
+    method public long getTopRightCornerRadius();
+    method public float getWidth();
+    method public static androidx.compose.ui.geometry.RoundRect getZero();
+    property public static final androidx.compose.ui.geometry.RoundRect Zero;
+    property public final float bottom;
+    property public final long bottomLeftCornerRadius;
+    property public final long bottomRightCornerRadius;
+    property public final float height;
+    property public final float left;
+    property public final float right;
+    property public final float top;
+    property public final long topLeftCornerRadius;
+    property public final long topRightCornerRadius;
+    property public final float width;
+    field public static final androidx.compose.ui.geometry.RoundRect.Companion Companion;
+  }
+
+  public static final class RoundRect.Companion {
+    method public androidx.compose.ui.geometry.RoundRect getZero();
+    property public final androidx.compose.ui.geometry.RoundRect Zero;
+  }
+
+  public final class RoundRectKt {
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(float left, float top, float right, float bottom, long cornerRadius);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(androidx.compose.ui.geometry.Rect rect, float radiusX, float radiusY);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(androidx.compose.ui.geometry.Rect rect, long cornerRadius);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(androidx.compose.ui.geometry.Rect rect, optional long topLeft, optional long topRight, optional long bottomRight, optional long bottomLeft);
+    method public static androidx.compose.ui.geometry.Rect getBoundingRect(androidx.compose.ui.geometry.RoundRect);
+    method public static long getCenter(androidx.compose.ui.geometry.RoundRect);
+    method public static float getMaxDimension(androidx.compose.ui.geometry.RoundRect);
+    method public static float getMinDimension(androidx.compose.ui.geometry.RoundRect);
+    method public static androidx.compose.ui.geometry.Rect getSafeInnerRect(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isCircle(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isEllipse(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isEmpty(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isFinite(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isRect(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isSimple(androidx.compose.ui.geometry.RoundRect);
+    method public static androidx.compose.ui.geometry.RoundRect lerp(androidx.compose.ui.geometry.RoundRect start, androidx.compose.ui.geometry.RoundRect stop, float fraction);
+    method public static androidx.compose.ui.geometry.RoundRect translate(androidx.compose.ui.geometry.RoundRect, long offset);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Size {
+    ctor public Size();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public boolean isEmpty();
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+  }
+
+  public static final class Size.Companion {
+    method public long getUnspecified();
+    method public long getZero();
+    property public final long Unspecified;
+    property public final long Zero;
+  }
+
+  public final class SizeKt {
+    method @androidx.compose.runtime.Stable public static long Size(float width, float height);
+    method public static long getCenter(long);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Size> block);
+    method @androidx.compose.runtime.Stable public static inline operator long times(int, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times(double, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times(float, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect toRect(long);
+  }
+
+}
+
diff --git a/compose/ui/ui-geometry/api/public_plus_experimental_current.txt b/compose/ui/ui-geometry/api/public_plus_experimental_current.txt
index bb288cb..f8601c7 100644
--- a/compose/ui/ui-geometry/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-geometry/api/public_plus_experimental_current.txt
@@ -3,6 +3,13 @@
 
   @androidx.compose.runtime.Immutable public final inline class CornerRadius {
     ctor public CornerRadius();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public operator long minus(long other);
+    method @androidx.compose.runtime.Stable public operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public operator long unaryMinus();
   }
 
   public static final class CornerRadius.Companion {
@@ -51,6 +58,17 @@
 
   @androidx.compose.runtime.Immutable public final inline class Offset {
     ctor public Offset();
+    method @androidx.compose.runtime.Stable public operator float component1();
+    method @androidx.compose.runtime.Stable public operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public float getDistance();
+    method @androidx.compose.runtime.Stable public float getDistanceSquared();
+    method @androidx.compose.runtime.Stable public boolean isValid();
+    method @androidx.compose.runtime.Stable public operator long minus(long other);
+    method @androidx.compose.runtime.Stable public operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long rem(float operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public operator long unaryMinus();
   }
 
   public static final class Offset.Companion {
@@ -165,6 +183,7 @@
     method public long getTopRightCornerRadius();
     method public float getWidth();
     method public static androidx.compose.ui.geometry.RoundRect getZero();
+    property public static final androidx.compose.ui.geometry.RoundRect Zero;
     property public final float bottom;
     property public final long bottomLeftCornerRadius;
     property public final long bottomRightCornerRadius;
@@ -206,6 +225,11 @@
 
   @androidx.compose.runtime.Immutable public final inline class Size {
     ctor public Size();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public boolean isEmpty();
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
   }
 
   public static final class Size.Companion {
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/ui/ui-geometry/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to compose/ui/ui-geometry/api/res-1.1.0-beta02.txt
diff --git a/compose/ui/ui-geometry/api/restricted_1.1.0-beta02.txt b/compose/ui/ui-geometry/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..f8601c7
--- /dev/null
+++ b/compose/ui/ui-geometry/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,256 @@
+// Signature format: 4.0
+package androidx.compose.ui.geometry {
+
+  @androidx.compose.runtime.Immutable public final inline class CornerRadius {
+    ctor public CornerRadius();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public operator long minus(long other);
+    method @androidx.compose.runtime.Stable public operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public operator long unaryMinus();
+  }
+
+  public static final class CornerRadius.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class CornerRadiusKt {
+    method @androidx.compose.runtime.Stable public static long CornerRadius(float x, optional float y);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+  }
+
+  public final class GeometryUtilsKt {
+  }
+
+  public final class MutableRect {
+    ctor public MutableRect(float left, float top, float right, float bottom);
+    method public boolean contains(long offset);
+    method public float getBottom();
+    method public inline float getHeight();
+    method public float getLeft();
+    method public float getRight();
+    method public long getSize();
+    method public float getTop();
+    method public inline float getWidth();
+    method @androidx.compose.runtime.Stable public void intersect(float left, float top, float right, float bottom);
+    method public boolean isEmpty();
+    method public void set(float left, float top, float right, float bottom);
+    method public void setBottom(float bottom);
+    method public void setLeft(float left);
+    method public void setRight(float right);
+    method public void setTop(float top);
+    property public final float bottom;
+    property public final inline float height;
+    property public final boolean isEmpty;
+    property public final float left;
+    property public final float right;
+    property public final long size;
+    property public final float top;
+    property public final inline float width;
+  }
+
+  public final class MutableRectKt {
+    method public static androidx.compose.ui.geometry.Rect toRect(androidx.compose.ui.geometry.MutableRect);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Offset {
+    ctor public Offset();
+    method @androidx.compose.runtime.Stable public operator float component1();
+    method @androidx.compose.runtime.Stable public operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public float getDistance();
+    method @androidx.compose.runtime.Stable public float getDistanceSquared();
+    method @androidx.compose.runtime.Stable public boolean isValid();
+    method @androidx.compose.runtime.Stable public operator long minus(long other);
+    method @androidx.compose.runtime.Stable public operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long rem(float operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public operator long unaryMinus();
+  }
+
+  public static final class Offset.Companion {
+    method public long getInfinite();
+    method public long getUnspecified();
+    method public long getZero();
+    property public final long Infinite;
+    property public final long Unspecified;
+    property public final long Zero;
+  }
+
+  public final class OffsetKt {
+    method @androidx.compose.runtime.Stable public static long Offset(float x, float y);
+    method public static boolean isFinite(long);
+    method public static boolean isSpecified(long);
+    method public static boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Offset> block);
+  }
+
+  @androidx.compose.runtime.Immutable public final class Rect {
+    ctor public Rect(@androidx.compose.runtime.Stable float left, @androidx.compose.runtime.Stable float top, @androidx.compose.runtime.Stable float right, @androidx.compose.runtime.Stable float bottom);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public boolean contains(long offset);
+    method public androidx.compose.ui.geometry.Rect copy(float left, float top, float right, float bottom);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect deflate(float delta);
+    method public float getBottom();
+    method public long getBottomCenter();
+    method public long getBottomLeft();
+    method public long getBottomRight();
+    method public long getCenter();
+    method public long getCenterLeft();
+    method public long getCenterRight();
+    method public float getHeight();
+    method public float getLeft();
+    method public float getMaxDimension();
+    method public float getMinDimension();
+    method public float getRight();
+    method public long getSize();
+    method public float getTop();
+    method public long getTopCenter();
+    method public long getTopLeft();
+    method public long getTopRight();
+    method public float getWidth();
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect inflate(float delta);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect intersect(androidx.compose.ui.geometry.Rect other);
+    method public boolean isEmpty();
+    method public boolean isFinite();
+    method public boolean isInfinite();
+    method public boolean overlaps(androidx.compose.ui.geometry.Rect other);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect translate(long offset);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.geometry.Rect translate(float translateX, float translateY);
+    property public final float bottom;
+    property public final long bottomCenter;
+    property public final long bottomLeft;
+    property public final long bottomRight;
+    property public final long center;
+    property public final long centerLeft;
+    property public final long centerRight;
+    property public final float height;
+    property public final boolean isEmpty;
+    property public final boolean isFinite;
+    property public final boolean isInfinite;
+    property public final float left;
+    property public final float maxDimension;
+    property public final float minDimension;
+    property public final float right;
+    property public final long size;
+    property public final float top;
+    property public final long topCenter;
+    property public final long topLeft;
+    property public final long topRight;
+    property public final float width;
+    field public static final androidx.compose.ui.geometry.Rect.Companion Companion;
+  }
+
+  public static final class Rect.Companion {
+    method public androidx.compose.ui.geometry.Rect getZero();
+    property public final androidx.compose.ui.geometry.Rect Zero;
+  }
+
+  public final class RectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect(long offset, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect Rect(long center, float radius);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect lerp(androidx.compose.ui.geometry.Rect start, androidx.compose.ui.geometry.Rect stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class RoundRect {
+    ctor public RoundRect(float left, float top, float right, float bottom, optional long topLeftCornerRadius, optional long topRightCornerRadius, optional long bottomRightCornerRadius, optional long bottomLeftCornerRadius);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public long component5-kKHJgLs();
+    method public long component6-kKHJgLs();
+    method public long component7-kKHJgLs();
+    method public long component8-kKHJgLs();
+    method public boolean contains(long point);
+    method public androidx.compose.ui.geometry.RoundRect copy-MDFrsts(float left, float top, float right, float bottom, long topLeftCornerRadius, long topRightCornerRadius, long bottomRightCornerRadius, long bottomLeftCornerRadius);
+    method public float getBottom();
+    method public long getBottomLeftCornerRadius();
+    method public long getBottomRightCornerRadius();
+    method public float getHeight();
+    method public float getLeft();
+    method public float getRight();
+    method public float getTop();
+    method public long getTopLeftCornerRadius();
+    method public long getTopRightCornerRadius();
+    method public float getWidth();
+    method public static androidx.compose.ui.geometry.RoundRect getZero();
+    property public static final androidx.compose.ui.geometry.RoundRect Zero;
+    property public final float bottom;
+    property public final long bottomLeftCornerRadius;
+    property public final long bottomRightCornerRadius;
+    property public final float height;
+    property public final float left;
+    property public final float right;
+    property public final float top;
+    property public final long topLeftCornerRadius;
+    property public final long topRightCornerRadius;
+    property public final float width;
+    field public static final androidx.compose.ui.geometry.RoundRect.Companion Companion;
+  }
+
+  public static final class RoundRect.Companion {
+    method public androidx.compose.ui.geometry.RoundRect getZero();
+    property public final androidx.compose.ui.geometry.RoundRect Zero;
+  }
+
+  public final class RoundRectKt {
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(float left, float top, float right, float bottom, long cornerRadius);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(androidx.compose.ui.geometry.Rect rect, float radiusX, float radiusY);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(androidx.compose.ui.geometry.Rect rect, long cornerRadius);
+    method public static androidx.compose.ui.geometry.RoundRect RoundRect(androidx.compose.ui.geometry.Rect rect, optional long topLeft, optional long topRight, optional long bottomRight, optional long bottomLeft);
+    method public static androidx.compose.ui.geometry.Rect getBoundingRect(androidx.compose.ui.geometry.RoundRect);
+    method public static long getCenter(androidx.compose.ui.geometry.RoundRect);
+    method public static float getMaxDimension(androidx.compose.ui.geometry.RoundRect);
+    method public static float getMinDimension(androidx.compose.ui.geometry.RoundRect);
+    method public static androidx.compose.ui.geometry.Rect getSafeInnerRect(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isCircle(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isEllipse(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isEmpty(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isFinite(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isRect(androidx.compose.ui.geometry.RoundRect);
+    method public static boolean isSimple(androidx.compose.ui.geometry.RoundRect);
+    method public static androidx.compose.ui.geometry.RoundRect lerp(androidx.compose.ui.geometry.RoundRect start, androidx.compose.ui.geometry.RoundRect stop, float fraction);
+    method public static androidx.compose.ui.geometry.RoundRect translate(androidx.compose.ui.geometry.RoundRect, long offset);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Size {
+    ctor public Size();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public boolean isEmpty();
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+  }
+
+  public static final class Size.Companion {
+    method public long getUnspecified();
+    method public long getZero();
+    property public final long Unspecified;
+    property public final long Zero;
+  }
+
+  public final class SizeKt {
+    method @androidx.compose.runtime.Stable public static long Size(float width, float height);
+    method public static long getCenter(long);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Size> block);
+    method @androidx.compose.runtime.Stable public static inline operator long times(int, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times(double, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times(float, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect toRect(long);
+  }
+
+}
+
diff --git a/compose/ui/ui-geometry/api/restricted_current.txt b/compose/ui/ui-geometry/api/restricted_current.txt
index bb288cb..f8601c7 100644
--- a/compose/ui/ui-geometry/api/restricted_current.txt
+++ b/compose/ui/ui-geometry/api/restricted_current.txt
@@ -3,6 +3,13 @@
 
   @androidx.compose.runtime.Immutable public final inline class CornerRadius {
     ctor public CornerRadius();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public operator long minus(long other);
+    method @androidx.compose.runtime.Stable public operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public operator long unaryMinus();
   }
 
   public static final class CornerRadius.Companion {
@@ -51,6 +58,17 @@
 
   @androidx.compose.runtime.Immutable public final inline class Offset {
     ctor public Offset();
+    method @androidx.compose.runtime.Stable public operator float component1();
+    method @androidx.compose.runtime.Stable public operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public float getDistance();
+    method @androidx.compose.runtime.Stable public float getDistanceSquared();
+    method @androidx.compose.runtime.Stable public boolean isValid();
+    method @androidx.compose.runtime.Stable public operator long minus(long other);
+    method @androidx.compose.runtime.Stable public operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long rem(float operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public operator long unaryMinus();
   }
 
   public static final class Offset.Companion {
@@ -165,6 +183,7 @@
     method public long getTopRightCornerRadius();
     method public float getWidth();
     method public static androidx.compose.ui.geometry.RoundRect getZero();
+    property public static final androidx.compose.ui.geometry.RoundRect Zero;
     property public final float bottom;
     property public final long bottomLeftCornerRadius;
     property public final long bottomRightCornerRadius;
@@ -206,6 +225,11 @@
 
   @androidx.compose.runtime.Immutable public final inline class Size {
     ctor public Size();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public boolean isEmpty();
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
   }
 
   public static final class Size.Companion {
diff --git a/compose/ui/ui-graphics/api/1.1.0-beta02.txt b/compose/ui/ui-graphics/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..0acbb6f
--- /dev/null
+++ b/compose/ui/ui-graphics/api/1.1.0-beta02.txt
@@ -0,0 +1,1571 @@
+// Signature format: 4.0
+package androidx.compose.ui.graphics {
+
+  public final class AndroidBlendMode_androidKt {
+    method public static boolean isSupported(int);
+  }
+
+  public final class AndroidCanvas_androidKt {
+    method public static androidx.compose.ui.graphics.Canvas Canvas(android.graphics.Canvas c);
+    method public static android.graphics.Canvas getNativeCanvas(androidx.compose.ui.graphics.Canvas);
+  }
+
+  public final class AndroidColorFilter_androidKt {
+    method public static android.graphics.ColorFilter asAndroidColorFilter(androidx.compose.ui.graphics.ColorFilter);
+    method public static androidx.compose.ui.graphics.ColorFilter asComposeColorFilter(android.graphics.ColorFilter);
+  }
+
+  public final class AndroidImageBitmap_androidKt {
+    method public static android.graphics.Bitmap asAndroidBitmap(androidx.compose.ui.graphics.ImageBitmap);
+    method public static androidx.compose.ui.graphics.ImageBitmap asImageBitmap(android.graphics.Bitmap);
+  }
+
+  public final class AndroidMatrixConversions_androidKt {
+    method public static void setFrom(float[], android.graphics.Matrix matrix);
+    method public static void setFrom(android.graphics.Matrix, float[] matrix);
+  }
+
+  public final class AndroidPaint implements androidx.compose.ui.graphics.Paint {
+    ctor public AndroidPaint();
+    method public android.graphics.Paint asFrameworkPaint();
+    method public float getAlpha();
+    method public int getBlendMode();
+    method public long getColor();
+    method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
+    method public int getFilterQuality();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public android.graphics.Shader? getShader();
+    method public int getStrokeCap();
+    method public int getStrokeJoin();
+    method public float getStrokeMiterLimit();
+    method public float getStrokeWidth();
+    method public int getStyle();
+    method public boolean isAntiAlias();
+    method public void setAlpha(float value);
+    method public void setAntiAlias(boolean value);
+    method public void setBlendMode(int value);
+    method public void setColor(long color);
+    method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? value);
+    method public void setFilterQuality(int value);
+    method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? value);
+    method public void setShader(android.graphics.Shader? value);
+    method public void setStrokeCap(int value);
+    method public void setStrokeJoin(int value);
+    method public void setStrokeMiterLimit(float value);
+    method public void setStrokeWidth(float value);
+    method public void setStyle(int value);
+    property public float alpha;
+    property public int blendMode;
+    property public long color;
+    property public androidx.compose.ui.graphics.ColorFilter? colorFilter;
+    property public int filterQuality;
+    property public boolean isAntiAlias;
+    property public androidx.compose.ui.graphics.PathEffect? pathEffect;
+    property public android.graphics.Shader? shader;
+    property public int strokeCap;
+    property public int strokeJoin;
+    property public float strokeMiterLimit;
+    property public float strokeWidth;
+    property public int style;
+  }
+
+  public final class AndroidPaint_androidKt {
+    method public static androidx.compose.ui.graphics.Paint Paint();
+  }
+
+  public final class AndroidPath implements androidx.compose.ui.graphics.Path {
+    ctor public AndroidPath(optional android.graphics.Path internalPath);
+    method public void addArc(androidx.compose.ui.geometry.Rect oval, float startAngleDegrees, float sweepAngleDegrees);
+    method public void addArcRad(androidx.compose.ui.geometry.Rect oval, float startAngleRadians, float sweepAngleRadians);
+    method public void addOval(androidx.compose.ui.geometry.Rect oval);
+    method public void addPath(androidx.compose.ui.graphics.Path path, long offset);
+    method public void addRect(androidx.compose.ui.geometry.Rect rect);
+    method public void addRoundRect(androidx.compose.ui.geometry.RoundRect roundRect);
+    method public void arcTo(androidx.compose.ui.geometry.Rect rect, float startAngleDegrees, float sweepAngleDegrees, boolean forceMoveTo);
+    method public void close();
+    method public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public int getFillType();
+    method public android.graphics.Path getInternalPath();
+    method public boolean isConvex();
+    method public boolean isEmpty();
+    method public void lineTo(float x, float y);
+    method public void moveTo(float x, float y);
+    method public boolean op(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, int operation);
+    method public void quadraticBezierTo(float x1, float y1, float x2, float y2);
+    method public void relativeCubicTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public void relativeLineTo(float dx, float dy);
+    method public void relativeMoveTo(float dx, float dy);
+    method public void relativeQuadraticBezierTo(float dx1, float dy1, float dx2, float dy2);
+    method public void reset();
+    method public void setFillType(int value);
+    method public void translate(long offset);
+    property public int fillType;
+    property public final android.graphics.Path internalPath;
+    property public boolean isConvex;
+    property public boolean isEmpty;
+  }
+
+  public final class AndroidPathEffect_androidKt {
+    method public static android.graphics.PathEffect asAndroidPathEffect(androidx.compose.ui.graphics.PathEffect);
+    method public static androidx.compose.ui.graphics.PathEffect toComposePathEffect(android.graphics.PathEffect);
+  }
+
+  public final class AndroidPathMeasure implements androidx.compose.ui.graphics.PathMeasure {
+    method public float getLength();
+    method public boolean getSegment(float startDistance, float stopDistance, androidx.compose.ui.graphics.Path destination, boolean startWithMoveTo);
+    method public void setPath(androidx.compose.ui.graphics.Path? path, boolean forceClosed);
+    property public float length;
+  }
+
+  public final class AndroidPathMeasure_androidKt {
+    method public static androidx.compose.ui.graphics.PathMeasure PathMeasure();
+  }
+
+  public final class AndroidPath_androidKt {
+    method public static androidx.compose.ui.graphics.Path Path();
+    method public static inline android.graphics.Path asAndroidPath(androidx.compose.ui.graphics.Path);
+    method public static androidx.compose.ui.graphics.Path asComposePath(android.graphics.Path);
+  }
+
+  public final class AndroidRenderEffect_androidKt {
+    method public static androidx.compose.ui.graphics.RenderEffect asComposeRenderEffect(android.graphics.RenderEffect);
+  }
+
+  public final class AndroidShader_androidKt {
+  }
+
+  public final class AndroidTileMode_androidKt {
+    method public static boolean isSupported(int);
+    method public static android.graphics.Shader.TileMode toAndroidTileMode(int);
+    method public static int toComposeTileMode(android.graphics.Shader.TileMode);
+  }
+
+  public final class AndroidVertexMode_androidKt {
+    method public static android.graphics.Canvas.VertexMode toAndroidVertexMode(int);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class BlendMode {
+    ctor public BlendMode();
+  }
+
+  public static final class BlendMode.Companion {
+    method public int getClear();
+    method public int getColor();
+    method public int getColorBurn();
+    method public int getColorDodge();
+    method public int getDarken();
+    method public int getDifference();
+    method public int getDst();
+    method public int getDstAtop();
+    method public int getDstIn();
+    method public int getDstOut();
+    method public int getDstOver();
+    method public int getExclusion();
+    method public int getHardlight();
+    method public int getHue();
+    method public int getLighten();
+    method public int getLuminosity();
+    method public int getModulate();
+    method public int getMultiply();
+    method public int getOverlay();
+    method public int getPlus();
+    method public int getSaturation();
+    method public int getScreen();
+    method public int getSoftlight();
+    method public int getSrc();
+    method public int getSrcAtop();
+    method public int getSrcIn();
+    method public int getSrcOut();
+    method public int getSrcOver();
+    method public int getXor();
+    property public final int Clear;
+    property public final int Color;
+    property public final int ColorBurn;
+    property public final int ColorDodge;
+    property public final int Darken;
+    property public final int Difference;
+    property public final int Dst;
+    property public final int DstAtop;
+    property public final int DstIn;
+    property public final int DstOut;
+    property public final int DstOver;
+    property public final int Exclusion;
+    property public final int Hardlight;
+    property public final int Hue;
+    property public final int Lighten;
+    property public final int Luminosity;
+    property public final int Modulate;
+    property public final int Multiply;
+    property public final int Overlay;
+    property public final int Plus;
+    property public final int Saturation;
+    property public final int Screen;
+    property public final int Softlight;
+    property public final int Src;
+    property public final int SrcAtop;
+    property public final int SrcIn;
+    property public final int SrcOut;
+    property public final int SrcOver;
+    property public final int Xor;
+  }
+
+  @androidx.compose.runtime.Immutable public final class BlurEffect extends androidx.compose.ui.graphics.RenderEffect {
+    ctor public BlurEffect(androidx.compose.ui.graphics.RenderEffect? renderEffect, float radiusX, float radiusY, int edgeTreatment);
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) protected android.graphics.RenderEffect createRenderEffect();
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class Brush {
+    method public abstract void applyTo(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public long getIntrinsicSize();
+    property public long intrinsicSize;
+    field public static final androidx.compose.ui.graphics.Brush.Companion Companion;
+  }
+
+  public static final class Brush.Companion {
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startX, optional float endX, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startX, optional float endX, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long start, optional long end, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long start, optional long end, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center, optional float radius, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center, optional float radius, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startY, optional float endY, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startY, optional float endY, optional int tileMode);
+  }
+
+  public final class BrushKt {
+    method public static androidx.compose.ui.graphics.ShaderBrush ShaderBrush(android.graphics.Shader shader);
+  }
+
+  public interface Canvas {
+    method public void clipPath(androidx.compose.ui.graphics.Path path, optional int clipOp);
+    method public default void clipRect(androidx.compose.ui.geometry.Rect rect, optional int clipOp);
+    method public void clipRect(float left, float top, float right, float bottom, optional int clipOp);
+    method public void concat(float[] matrix);
+    method public void disableZ();
+    method public default void drawArc(androidx.compose.ui.geometry.Rect rect, float startAngle, float sweepAngle, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
+    method public void drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
+    method public default void drawArcRad(androidx.compose.ui.geometry.Rect rect, float startAngleRad, float sweepAngleRad, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
+    method public void drawCircle(long center, float radius, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, long topLeftOffset, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImageRect(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, androidx.compose.ui.graphics.Paint paint);
+    method public void drawLine(long p1, long p2, androidx.compose.ui.graphics.Paint paint);
+    method public default void drawOval(androidx.compose.ui.geometry.Rect rect, androidx.compose.ui.graphics.Paint paint);
+    method public void drawOval(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Paint paint);
+    method public void drawPoints(int pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRawPoints(int pointMode, float[] points, androidx.compose.ui.graphics.Paint paint);
+    method public default void drawRect(androidx.compose.ui.geometry.Rect rect, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRect(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY, androidx.compose.ui.graphics.Paint paint);
+    method public void drawVertices(androidx.compose.ui.graphics.Vertices vertices, int blendMode, androidx.compose.ui.graphics.Paint paint);
+    method public void enableZ();
+    method public void restore();
+    method public void rotate(float degrees);
+    method public void save();
+    method public void saveLayer(androidx.compose.ui.geometry.Rect bounds, androidx.compose.ui.graphics.Paint paint);
+    method public void scale(float sx, optional float sy);
+    method public void skew(float sx, float sy);
+    method public default void skewRad(float sxRad, float syRad);
+    method public void translate(float dx, float dy);
+  }
+
+  public final class CanvasHolder {
+    ctor public CanvasHolder();
+    method public inline void drawInto(android.graphics.Canvas targetCanvas, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class CanvasKt {
+    method public static androidx.compose.ui.graphics.Canvas Canvas(androidx.compose.ui.graphics.ImageBitmap image);
+    method public static void rotate(androidx.compose.ui.graphics.Canvas, float degrees, float pivotX, float pivotY);
+    method public static void rotateRad(androidx.compose.ui.graphics.Canvas, float radians, optional float pivotX, optional float pivotY);
+    method public static void scale(androidx.compose.ui.graphics.Canvas, float sx, optional float sy, float pivotX, float pivotY);
+    method public static inline void withSave(androidx.compose.ui.graphics.Canvas, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public static inline void withSaveLayer(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.geometry.Rect bounds, androidx.compose.ui.graphics.Paint paint, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class ClipOp {
+    ctor public ClipOp();
+  }
+
+  public static final class ClipOp.Companion {
+    method public int getDifference();
+    method public int getIntersect();
+    property public final int Difference;
+    property public final int Intersect;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Color {
+    ctor public Color();
+    method @androidx.compose.runtime.Stable public operator float component1();
+    method @androidx.compose.runtime.Stable public operator float component2();
+    method @androidx.compose.runtime.Stable public operator float component3();
+    method @androidx.compose.runtime.Stable public operator float component4();
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.graphics.colorspace.ColorSpace! component5();
+    method @androidx.compose.runtime.Stable public long copy(optional float alpha, optional float red, optional float green, optional float blue);
+    method public long getValue();
+    property public final long value;
+  }
+
+  public static final class Color.Companion {
+    method public long getBlack();
+    method public long getBlue();
+    method public long getCyan();
+    method public long getDarkGray();
+    method public long getGray();
+    method public long getGreen();
+    method public long getLightGray();
+    method public long getMagenta();
+    method public long getRed();
+    method public long getTransparent();
+    method public long getUnspecified();
+    method public long getWhite();
+    method public long getYellow();
+    property public final long Black;
+    property public final long Blue;
+    property public final long Cyan;
+    property public final long DarkGray;
+    property public final long Gray;
+    property public final long Green;
+    property public final long LightGray;
+    property public final long Magenta;
+    property public final long Red;
+    property public final long Transparent;
+    property public final long Unspecified;
+    property public final long White;
+    property public final long Yellow;
+  }
+
+  @androidx.compose.runtime.Immutable public final class ColorFilter {
+    field public static final androidx.compose.ui.graphics.ColorFilter.Companion Companion;
+  }
+
+  public static final class ColorFilter.Companion {
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter colorMatrix(float[] colorMatrix);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter lighting(long multiply, long add);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter tint(long color, optional int blendMode);
+  }
+
+  public final class ColorKt {
+    method @androidx.compose.runtime.Stable public static long Color(float red, float green, float blue, optional float alpha, optional androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
+    method @androidx.compose.runtime.Stable public static long Color(int color);
+    method @androidx.compose.runtime.Stable public static long Color(long color);
+    method @androidx.compose.runtime.Stable public static long Color(int red, int green, int blue, optional int alpha);
+    method @androidx.compose.runtime.Stable public static long compositeOver(long, long background);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static float luminance(long);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.graphics.Color> block);
+    method @androidx.compose.runtime.Stable public static int toArgb(long);
+  }
+
+  public final inline class ColorMatrix {
+    ctor public ColorMatrix();
+    method public inline operator float get(int row, int column);
+    method public float[] getValues();
+    method public inline operator void set(int row, int column, float v);
+    method public operator void timesAssign(float[] colorMatrix);
+    property public final float[] values;
+  }
+
+  public final class DegreesKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class FilterQuality {
+    ctor public FilterQuality();
+    method public int getValue();
+    property public final int value;
+  }
+
+  public static final class FilterQuality.Companion {
+    method public int getHigh();
+    method public int getLow();
+    method public int getMedium();
+    method public int getNone();
+    property public final int High;
+    property public final int Low;
+    property public final int Medium;
+    property public final int None;
+  }
+
+  public final class Float16Kt {
+  }
+
+  public interface ImageBitmap {
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace();
+    method public int getConfig();
+    method public boolean getHasAlpha();
+    method public int getHeight();
+    method public int getWidth();
+    method public void prepareToDraw();
+    method public void readPixels(int[] buffer, optional int startX, optional int startY, optional int width, optional int height, optional int bufferOffset, optional int stride);
+    property public abstract androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace;
+    property public abstract int config;
+    property public abstract boolean hasAlpha;
+    property public abstract int height;
+    property public abstract int width;
+    field public static final androidx.compose.ui.graphics.ImageBitmap.Companion Companion;
+  }
+
+  public static final class ImageBitmap.Companion {
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class ImageBitmapConfig {
+    ctor public ImageBitmapConfig();
+    method public int getValue();
+    property public final int value;
+  }
+
+  public static final class ImageBitmapConfig.Companion {
+    method public int getAlpha8();
+    method public int getArgb8888();
+    method public int getF16();
+    method public int getGpu();
+    method public int getRgb565();
+    property public final int Alpha8;
+    property public final int Argb8888;
+    property public final int F16;
+    property public final int Gpu;
+    property public final int Rgb565;
+  }
+
+  public final class ImageBitmapKt {
+    method public static androidx.compose.ui.graphics.ImageBitmap ImageBitmap(int width, int height, optional int config, optional boolean hasAlpha, optional androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
+    method public static androidx.compose.ui.graphics.PixelMap toPixelMap(androidx.compose.ui.graphics.ImageBitmap, optional int startX, optional int startY, optional int width, optional int height, optional int[] buffer, optional int bufferOffset, optional int stride);
+  }
+
+  @androidx.compose.runtime.Immutable public final class LinearGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader(long size);
+    property public long intrinsicSize;
+  }
+
+  public final inline class Matrix {
+    ctor public Matrix();
+    method public inline operator float get(int row, int column);
+    method public float[] getValues();
+    method public inline operator void set(int row, int column, float v);
+    method public operator void timesAssign(float[] m);
+    property public final float[] values;
+  }
+
+  public static final class Matrix.Companion {
+  }
+
+  public final class MatrixKt {
+    method public static boolean isIdentity(float[]);
+  }
+
+  @androidx.compose.runtime.Immutable public final class OffsetEffect extends androidx.compose.ui.graphics.RenderEffect {
+    ctor public OffsetEffect(androidx.compose.ui.graphics.RenderEffect? renderEffect, long offset);
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) protected android.graphics.RenderEffect createRenderEffect();
+  }
+
+  public abstract sealed class Outline {
+    method public abstract androidx.compose.ui.geometry.Rect getBounds();
+    property public abstract androidx.compose.ui.geometry.Rect bounds;
+  }
+
+  public static final class Outline.Generic extends androidx.compose.ui.graphics.Outline {
+    ctor public Outline.Generic(androidx.compose.ui.graphics.Path path);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public androidx.compose.ui.graphics.Path getPath();
+    property public androidx.compose.ui.geometry.Rect bounds;
+    property public final androidx.compose.ui.graphics.Path path;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class Outline.Rectangle extends androidx.compose.ui.graphics.Outline {
+    ctor public Outline.Rectangle(androidx.compose.ui.geometry.Rect rect);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public androidx.compose.ui.geometry.Rect getRect();
+    property public androidx.compose.ui.geometry.Rect bounds;
+    property public final androidx.compose.ui.geometry.Rect rect;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class Outline.Rounded extends androidx.compose.ui.graphics.Outline {
+    ctor public Outline.Rounded(androidx.compose.ui.geometry.RoundRect roundRect);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public androidx.compose.ui.geometry.RoundRect getRoundRect();
+    property public androidx.compose.ui.geometry.Rect bounds;
+    property public final androidx.compose.ui.geometry.RoundRect roundRect;
+  }
+
+  public final class OutlineKt {
+    method public static void addOutline(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.Outline outline);
+    method public static void drawOutline(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public static void drawOutline(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public static void drawOutline(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Paint paint);
+  }
+
+  public interface Paint {
+    method public android.graphics.Paint asFrameworkPaint();
+    method public float getAlpha();
+    method public int getBlendMode();
+    method public long getColor();
+    method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
+    method public int getFilterQuality();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public android.graphics.Shader? getShader();
+    method public int getStrokeCap();
+    method public int getStrokeJoin();
+    method public float getStrokeMiterLimit();
+    method public float getStrokeWidth();
+    method public int getStyle();
+    method public boolean isAntiAlias();
+    method public void setAlpha(float alpha);
+    method public void setAntiAlias(boolean isAntiAlias);
+    method public void setBlendMode(int blendMode);
+    method public void setColor(long color);
+    method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method public void setFilterQuality(int filterQuality);
+    method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? pathEffect);
+    method public void setShader(android.graphics.Shader? shader);
+    method public void setStrokeCap(int strokeCap);
+    method public void setStrokeJoin(int strokeJoin);
+    method public void setStrokeMiterLimit(float strokeMiterLimit);
+    method public void setStrokeWidth(float strokeWidth);
+    method public void setStyle(int style);
+    property public abstract float alpha;
+    property public abstract int blendMode;
+    property public abstract long color;
+    property public abstract androidx.compose.ui.graphics.ColorFilter? colorFilter;
+    property public abstract int filterQuality;
+    property public abstract boolean isAntiAlias;
+    property public abstract androidx.compose.ui.graphics.PathEffect? pathEffect;
+    property public abstract android.graphics.Shader? shader;
+    property public abstract int strokeCap;
+    property public abstract int strokeJoin;
+    property public abstract float strokeMiterLimit;
+    property public abstract float strokeWidth;
+    property public abstract int style;
+  }
+
+  public final class PaintKt {
+    method public static androidx.compose.ui.graphics.Paint! Paint();
+    field public static final float DefaultAlpha = 1.0f;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class PaintingStyle {
+    ctor public PaintingStyle();
+  }
+
+  public static final class PaintingStyle.Companion {
+    method public int getFill();
+    method public int getStroke();
+    property public final int Fill;
+    property public final int Stroke;
+  }
+
+  public interface Path {
+    method public void addArc(androidx.compose.ui.geometry.Rect oval, float startAngleDegrees, float sweepAngleDegrees);
+    method public void addArcRad(androidx.compose.ui.geometry.Rect oval, float startAngleRadians, float sweepAngleRadians);
+    method public void addOval(androidx.compose.ui.geometry.Rect oval);
+    method public void addPath(androidx.compose.ui.graphics.Path path, optional long offset);
+    method public void addRect(androidx.compose.ui.geometry.Rect rect);
+    method public void addRoundRect(androidx.compose.ui.geometry.RoundRect roundRect);
+    method public void arcTo(androidx.compose.ui.geometry.Rect rect, float startAngleDegrees, float sweepAngleDegrees, boolean forceMoveTo);
+    method public default void arcToRad(androidx.compose.ui.geometry.Rect rect, float startAngleRadians, float sweepAngleRadians, boolean forceMoveTo);
+    method public void close();
+    method public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public int getFillType();
+    method public boolean isConvex();
+    method public boolean isEmpty();
+    method public void lineTo(float x, float y);
+    method public void moveTo(float x, float y);
+    method public boolean op(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, int operation);
+    method public void quadraticBezierTo(float x1, float y1, float x2, float y2);
+    method public void relativeCubicTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public void relativeLineTo(float dx, float dy);
+    method public void relativeMoveTo(float dx, float dy);
+    method public void relativeQuadraticBezierTo(float dx1, float dy1, float dx2, float dy2);
+    method public void reset();
+    method public void setFillType(int fillType);
+    method public void translate(long offset);
+    property public abstract int fillType;
+    property public abstract boolean isConvex;
+    property public abstract boolean isEmpty;
+    field public static final androidx.compose.ui.graphics.Path.Companion Companion;
+  }
+
+  public static final class Path.Companion {
+    method public androidx.compose.ui.graphics.Path combine(int operation, androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2);
+  }
+
+  public interface PathEffect {
+    field public static final androidx.compose.ui.graphics.PathEffect.Companion Companion;
+  }
+
+  public static final class PathEffect.Companion {
+    method public androidx.compose.ui.graphics.PathEffect chainPathEffect(androidx.compose.ui.graphics.PathEffect outer, androidx.compose.ui.graphics.PathEffect inner);
+    method public androidx.compose.ui.graphics.PathEffect cornerPathEffect(float radius);
+    method public androidx.compose.ui.graphics.PathEffect dashPathEffect(float[] intervals, optional float phase);
+    method public androidx.compose.ui.graphics.PathEffect stampedPathEffect(androidx.compose.ui.graphics.Path shape, float advance, float phase, int style);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class PathFillType {
+    ctor public PathFillType();
+  }
+
+  public static final class PathFillType.Companion {
+    method public int getEvenOdd();
+    method public int getNonZero();
+    property public final int EvenOdd;
+    property public final int NonZero;
+  }
+
+  public interface PathMeasure {
+    method public float getLength();
+    method public boolean getSegment(float startDistance, float stopDistance, androidx.compose.ui.graphics.Path destination, optional boolean startWithMoveTo);
+    method public void setPath(androidx.compose.ui.graphics.Path? path, boolean forceClosed);
+    property public abstract float length;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class PathOperation {
+    ctor public PathOperation();
+  }
+
+  public static final class PathOperation.Companion {
+    method public int getDifference();
+    method public int getIntersect();
+    method public int getReverseDifference();
+    method public int getUnion();
+    method public int getXor();
+    property public final int Difference;
+    property public final int Intersect;
+    property public final int ReverseDifference;
+    property public final int Union;
+    property public final int Xor;
+  }
+
+  public final class PathOperationKt {
+    method @Deprecated public static int getDifference(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getIntersect(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getReverseDifference(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getUnion(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getXor(androidx.compose.ui.graphics.PathOperation.Companion);
+  }
+
+  public final class PixelMap {
+    ctor public PixelMap(int[] buffer, int width, int height, int bufferOffset, int stride);
+    method public operator long get(int x, int y);
+    method public int[] getBuffer();
+    method public int getBufferOffset();
+    method public int getHeight();
+    method public int getStride();
+    method public int getWidth();
+    property public final int[] buffer;
+    property public final int bufferOffset;
+    property public final int height;
+    property public final int stride;
+    property public final int width;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class PointMode {
+    ctor public PointMode();
+  }
+
+  public static final class PointMode.Companion {
+    method public int getLines();
+    method public int getPoints();
+    method public int getPolygon();
+    property public final int Lines;
+    property public final int Points;
+    property public final int Polygon;
+  }
+
+  @androidx.compose.runtime.Immutable public final class RadialGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader(long size);
+    property public long intrinsicSize;
+  }
+
+  public final class RectHelper_androidKt {
+    method public static android.graphics.Rect toAndroidRect(androidx.compose.ui.geometry.Rect);
+    method public static android.graphics.RectF toAndroidRectF(androidx.compose.ui.geometry.Rect);
+    method public static androidx.compose.ui.geometry.Rect toComposeRect(android.graphics.Rect);
+  }
+
+  public final class RectangleShapeKt {
+    method public static androidx.compose.ui.graphics.Shape getRectangleShape();
+    property public static final androidx.compose.ui.graphics.Shape RectangleShape;
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class RenderEffect {
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) public final android.graphics.RenderEffect asAndroidRenderEffect();
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) protected abstract android.graphics.RenderEffect createRenderEffect();
+    method public boolean isSupported();
+  }
+
+  public final class RenderEffectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.graphics.BlurEffect BlurEffect(float radiusX, float radiusY, optional int edgeTreatment);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.graphics.OffsetEffect OffsetEffect(float offsetX, float offsetY);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract class ShaderBrush extends androidx.compose.ui.graphics.Brush {
+    ctor public ShaderBrush();
+    method public final void applyTo(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public abstract android.graphics.Shader createShader(long size);
+  }
+
+  public final class ShaderKt {
+    method public static android.graphics.Shader ImageShader(androidx.compose.ui.graphics.ImageBitmap image, optional int tileModeX, optional int tileModeY);
+    method public static android.graphics.Shader LinearGradientShader(long from, long to, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
+    method public static android.graphics.Shader RadialGradientShader(long center, float radius, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
+    method public static android.graphics.Shader SweepGradientShader(long center, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops);
+  }
+
+  @androidx.compose.runtime.Immutable public final class Shadow {
+    ctor public Shadow(optional @androidx.compose.runtime.Stable long color, optional @androidx.compose.runtime.Stable long offset, optional @androidx.compose.runtime.Stable float blurRadius);
+    method public androidx.compose.ui.graphics.Shadow copy(optional long color, optional long offset, optional float blurRadius);
+    method public float getBlurRadius();
+    method public long getColor();
+    method public long getOffset();
+    property public final float blurRadius;
+    property public final long color;
+    property public final long offset;
+    field public static final androidx.compose.ui.graphics.Shadow.Companion Companion;
+  }
+
+  public static final class Shadow.Companion {
+    method public androidx.compose.ui.graphics.Shadow getNone();
+    property public final androidx.compose.ui.graphics.Shadow None;
+  }
+
+  public final class ShadowKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.graphics.Shadow lerp(androidx.compose.ui.graphics.Shadow start, androidx.compose.ui.graphics.Shadow stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public interface Shape {
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+  }
+
+  @androidx.compose.runtime.Immutable public final class SolidColor extends androidx.compose.ui.graphics.Brush {
+    ctor public SolidColor(long value);
+    method public void applyTo(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public long getValue();
+    property public final long value;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class StampedPathEffectStyle {
+    ctor public StampedPathEffectStyle();
+  }
+
+  public static final class StampedPathEffectStyle.Companion {
+    method public int getMorph();
+    method public int getRotate();
+    method public int getTranslate();
+    property public final int Morph;
+    property public final int Rotate;
+    property public final int Translate;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class StrokeCap {
+    ctor public StrokeCap();
+  }
+
+  public static final class StrokeCap.Companion {
+    method public int getButt();
+    method public int getRound();
+    method public int getSquare();
+    property public final int Butt;
+    property public final int Round;
+    property public final int Square;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class StrokeJoin {
+    ctor public StrokeJoin();
+  }
+
+  public static final class StrokeJoin.Companion {
+    method public int getBevel();
+    method public int getMiter();
+    method public int getRound();
+    property public final int Bevel;
+    property public final int Miter;
+    property public final int Round;
+  }
+
+  @androidx.compose.runtime.Immutable public final class SweepGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader(long size);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class TileMode {
+    ctor public TileMode();
+  }
+
+  public static final class TileMode.Companion {
+    method public int getClamp();
+    method public int getDecal();
+    method public int getMirror();
+    method public int getRepeated();
+    property public final int Clamp;
+    property public final int Decal;
+    property public final int Mirror;
+    property public final int Repeated;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class VertexMode {
+    ctor public VertexMode();
+  }
+
+  public static final class VertexMode.Companion {
+    method public int getTriangleFan();
+    method public int getTriangleStrip();
+    method public int getTriangles();
+    property public final int TriangleFan;
+    property public final int TriangleStrip;
+    property public final int Triangles;
+  }
+
+  public final class Vertices {
+    ctor public Vertices(int vertexMode, java.util.List<androidx.compose.ui.geometry.Offset> positions, java.util.List<androidx.compose.ui.geometry.Offset> textureCoordinates, java.util.List<androidx.compose.ui.graphics.Color> colors, java.util.List<java.lang.Integer> indices);
+    method public int[] getColors();
+    method public short[] getIndices();
+    method public float[] getPositions();
+    method public float[] getTextureCoordinates();
+    method public int getVertexMode();
+    property public final int[] colors;
+    property public final short[] indices;
+    property public final float[] positions;
+    property public final float[] textureCoordinates;
+    property public final int vertexMode;
+  }
+
+}
+
+package androidx.compose.ui.graphics.colorspace {
+
+  public abstract class Adaptation {
+    field public static final androidx.compose.ui.graphics.colorspace.Adaptation.Companion Companion;
+  }
+
+  public static final class Adaptation.Companion {
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getBradford();
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getCiecat02();
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getVonKries();
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation Bradford;
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation Ciecat02;
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation VonKries;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class ColorModel {
+    ctor public ColorModel();
+  }
+
+  public static final class ColorModel.Companion {
+    method public long getCmyk();
+    method public long getLab();
+    method public long getRgb();
+    method public long getXyz();
+    property public final long Cmyk;
+    property public final long Lab;
+    property public final long Rgb;
+    property public final long Xyz;
+  }
+
+  public abstract class ColorSpace {
+    ctor public ColorSpace(String name, long model);
+    method public final float[] fromXyz(float x, float y, float z);
+    method public abstract float[] fromXyz(float[] v);
+    method public final int getComponentCount();
+    method public abstract float getMaxValue(int component);
+    method public abstract float getMinValue(int component);
+    method public final long getModel();
+    method public final String getName();
+    method public boolean isSrgb();
+    method public abstract boolean isWideGamut();
+    method public final float[] toXyz(float r, float g, float b);
+    method public abstract float[] toXyz(float[] v);
+    property public final int componentCount;
+    property public boolean isSrgb;
+    property public abstract boolean isWideGamut;
+    property public final long model;
+    property public final String name;
+  }
+
+  public final class ColorSpaceKt {
+    method public static androidx.compose.ui.graphics.colorspace.ColorSpace adapt(androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, optional androidx.compose.ui.graphics.colorspace.Adaptation adaptation);
+    method public static androidx.compose.ui.graphics.colorspace.ColorSpace adapt(androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint);
+    method public static androidx.compose.ui.graphics.colorspace.Connector connect(androidx.compose.ui.graphics.colorspace.ColorSpace, optional androidx.compose.ui.graphics.colorspace.ColorSpace destination, optional int intent);
+  }
+
+  public final class ColorSpaces {
+    method public androidx.compose.ui.graphics.colorspace.Rgb getAces();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getAcescg();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getAdobeRgb();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getBt2020();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getBt709();
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getCieLab();
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getCieXyz();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getDciP3();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getDisplayP3();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getExtendedSrgb();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getLinearExtendedSrgb();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getLinearSrgb();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getNtsc1953();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getProPhotoRgb();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getSmpteC();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getSrgb();
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace? match(float[] toXYZD50, androidx.compose.ui.graphics.colorspace.TransferParameters function);
+    property public final androidx.compose.ui.graphics.colorspace.Rgb Aces;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb Acescg;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb AdobeRgb;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb Bt2020;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb Bt709;
+    property public final androidx.compose.ui.graphics.colorspace.ColorSpace CieLab;
+    property public final androidx.compose.ui.graphics.colorspace.ColorSpace CieXyz;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb DciP3;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb DisplayP3;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb ExtendedSrgb;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb LinearExtendedSrgb;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb LinearSrgb;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb Ntsc1953;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb ProPhotoRgb;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb SmpteC;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb Srgb;
+    field public static final androidx.compose.ui.graphics.colorspace.ColorSpaces INSTANCE;
+  }
+
+  public class Connector {
+    method public final androidx.compose.ui.graphics.colorspace.ColorSpace getDestination();
+    method public final int getRenderIntent();
+    method public final androidx.compose.ui.graphics.colorspace.ColorSpace getSource();
+    method public final float[] transform(float r, float g, float b);
+    method public float[] transform(float[] v);
+    property public final androidx.compose.ui.graphics.colorspace.ColorSpace destination;
+    property public final int renderIntent;
+    property public final androidx.compose.ui.graphics.colorspace.ColorSpace source;
+  }
+
+  public final class Illuminant {
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getA();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getB();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getC();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD50();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD55();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD60();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD65();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD75();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getE();
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint A;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint B;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint C;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D50;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D55;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D60;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D65;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D75;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint E;
+    field public static final androidx.compose.ui.graphics.colorspace.Illuminant INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class RenderIntent {
+    ctor public RenderIntent();
+  }
+
+  public static final class RenderIntent.Companion {
+    method public int getAbsolute();
+    method public int getPerceptual();
+    method public int getRelative();
+    method public int getSaturation();
+    property public final int Absolute;
+    property public final int Perceptual;
+    property public final int Relative;
+    property public final int Saturation;
+  }
+
+  public final class Rgb extends androidx.compose.ui.graphics.colorspace.ColorSpace {
+    ctor public Rgb(String name, float[] toXYZ, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> oetf, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> eotf);
+    ctor public Rgb(String name, float[] primaries, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> oetf, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> eotf, float min, float max);
+    ctor public Rgb(String name, float[] toXYZ, androidx.compose.ui.graphics.colorspace.TransferParameters function);
+    ctor public Rgb(String name, float[] primaries, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, androidx.compose.ui.graphics.colorspace.TransferParameters function);
+    ctor public Rgb(String name, float[] toXYZ, double gamma);
+    ctor public Rgb(String name, float[] primaries, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, double gamma);
+    method public float[] fromLinear(float r, float g, float b);
+    method public float[] fromLinear(float[] v);
+    method public float[] fromXyz(float[] v);
+    method public kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> getEotf();
+    method public float[] getInverseTransform();
+    method public float[] getInverseTransform(float[] inverseTransform);
+    method public float getMaxValue(int component);
+    method public float getMinValue(int component);
+    method public kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> getOetf();
+    method public float[] getPrimaries();
+    method public float[] getPrimaries(float[] primaries);
+    method public androidx.compose.ui.graphics.colorspace.TransferParameters? getTransferParameters();
+    method public float[] getTransform();
+    method public float[] getTransform(float[] transform);
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getWhitePoint();
+    method public boolean isWideGamut();
+    method public float[] toLinear(float r, float g, float b);
+    method public float[] toLinear(float[] v);
+    method public float[] toXyz(float[] v);
+    property public final kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> eotf;
+    property public boolean isSrgb;
+    property public boolean isWideGamut;
+    property public final kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> oetf;
+    property public final androidx.compose.ui.graphics.colorspace.TransferParameters? transferParameters;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint;
+  }
+
+  public final class TransferParameters {
+    ctor public TransferParameters(double gamma, double a, double b, double c, double d, optional double e, optional double f);
+    method public double component1();
+    method public double component2();
+    method public double component3();
+    method public double component4();
+    method public double component5();
+    method public double component6();
+    method public double component7();
+    method public androidx.compose.ui.graphics.colorspace.TransferParameters copy(double gamma, double a, double b, double c, double d, double e, double f);
+    method public double getA();
+    method public double getB();
+    method public double getC();
+    method public double getD();
+    method public double getE();
+    method public double getF();
+    method public double getGamma();
+    property public final double a;
+    property public final double b;
+    property public final double c;
+    property public final double d;
+    property public final double e;
+    property public final double f;
+    property public final double gamma;
+  }
+
+  public final class WhitePoint {
+    ctor public WhitePoint(float x, float y);
+    ctor public WhitePoint(float x, float y, float z);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+}
+
+package androidx.compose.ui.graphics.drawscope {
+
+  public final class CanvasDrawScope implements androidx.compose.ui.graphics.drawscope.DrawScope {
+    ctor public CanvasDrawScope();
+    method public inline void draw(androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.graphics.Canvas canvas, long size, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public void drawArc(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawArc(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawCircle(androidx.compose.ui.graphics.Brush brush, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawCircle(long color, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, long topLeft, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, long srcOffset, long srcSize, long dstOffset, long dstSize, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawLine(androidx.compose.ui.graphics.Brush brush, long start, long end, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawLine(long color, long start, long end, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawOval(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawOval(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, long color, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, long color, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, androidx.compose.ui.graphics.Brush brush, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRect(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRect(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRoundRect(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, long cornerRadius, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRoundRect(long color, long topLeft, long size, long cornerRadius, androidx.compose.ui.graphics.drawscope.DrawStyle style, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public float getDensity();
+    method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
+    method public float getFontScale();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    property public float density;
+    property public androidx.compose.ui.graphics.drawscope.DrawContext drawContext;
+    property public float fontScale;
+    property public androidx.compose.ui.unit.LayoutDirection layoutDirection;
+  }
+
+  public final class CanvasDrawScopeKt {
+  }
+
+  public interface ContentDrawScope extends androidx.compose.ui.graphics.drawscope.DrawScope {
+    method public void drawContent();
+  }
+
+  public interface DrawContext {
+    method public androidx.compose.ui.graphics.Canvas getCanvas();
+    method public long getSize();
+    method public androidx.compose.ui.graphics.drawscope.DrawTransform getTransform();
+    method public void setSize(long size);
+    property public abstract androidx.compose.ui.graphics.Canvas canvas;
+    property public abstract long size;
+    property public abstract androidx.compose.ui.graphics.drawscope.DrawTransform transform;
+  }
+
+  @androidx.compose.ui.graphics.drawscope.DrawScopeMarker public interface DrawScope extends androidx.compose.ui.unit.Density {
+    method public void drawArc(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawArc(long color, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawCircle(androidx.compose.ui.graphics.Brush brush, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawCircle(long color, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public default void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode, optional int filterQuality);
+    method @Deprecated public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawLine(androidx.compose.ui.graphics.Brush brush, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawLine(long color, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawOval(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawOval(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, long color, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, androidx.compose.ui.graphics.Brush brush, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRect(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRect(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRoundRect(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional long cornerRadius, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRoundRect(long color, optional long topLeft, optional long size, optional long cornerRadius, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public default long getCenter();
+    method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public default long getSize();
+    property public default long center;
+    property public abstract androidx.compose.ui.graphics.drawscope.DrawContext drawContext;
+    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public default long size;
+    field public static final androidx.compose.ui.graphics.drawscope.DrawScope.Companion Companion;
+  }
+
+  public static final class DrawScope.Companion {
+    method public int getDefaultBlendMode();
+    method public int getDefaultFilterQuality();
+    property public final int DefaultBlendMode;
+    property public final int DefaultFilterQuality;
+  }
+
+  public final class DrawScopeKt {
+    method public static inline void clipPath(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Path path, optional int clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void clipRect(androidx.compose.ui.graphics.drawscope.DrawScope, optional float left, optional float top, optional float right, optional float bottom, optional int clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void drawIntoCanvas(androidx.compose.ui.graphics.drawscope.DrawScope, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, float inset, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, optional float horizontal, optional float vertical, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void rotate(androidx.compose.ui.graphics.drawscope.DrawScope, float degrees, optional long pivot, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void rotateRad(androidx.compose.ui.graphics.drawscope.DrawScope, float radians, optional long pivot, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void scale(androidx.compose.ui.graphics.drawscope.DrawScope, float scaleX, float scaleY, optional long pivot, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void scale(androidx.compose.ui.graphics.drawscope.DrawScope, float scale, optional long pivot, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void translate(androidx.compose.ui.graphics.drawscope.DrawScope, optional float left, optional float top, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void withTransform(androidx.compose.ui.graphics.drawscope.DrawScope, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawTransform,kotlin.Unit> transformBlock, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> drawBlock);
+  }
+
+  @kotlin.DslMarker public @interface DrawScopeMarker {
+  }
+
+  public abstract sealed class DrawStyle {
+  }
+
+  @androidx.compose.ui.graphics.drawscope.DrawScopeMarker public interface DrawTransform {
+    method public void clipPath(androidx.compose.ui.graphics.Path path, optional int clipOp);
+    method public void clipRect(optional float left, optional float top, optional float right, optional float bottom, optional int clipOp);
+    method public default long getCenter();
+    method public long getSize();
+    method public void inset(float left, float top, float right, float bottom);
+    method public void rotate(float degrees, optional long pivot);
+    method public void scale(float scaleX, float scaleY, optional long pivot);
+    method public void transform(float[] matrix);
+    method public void translate(optional float left, optional float top);
+    property public default long center;
+    property public abstract long size;
+  }
+
+  public final class DrawTransformKt {
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawTransform, optional float horizontal, optional float vertical);
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawTransform, float inset);
+    method public static inline void rotateRad(androidx.compose.ui.graphics.drawscope.DrawTransform, float radians, optional long pivot);
+    method public static inline void scale(androidx.compose.ui.graphics.drawscope.DrawTransform, float scale, optional long pivot);
+  }
+
+  public final class Fill extends androidx.compose.ui.graphics.drawscope.DrawStyle {
+    field public static final androidx.compose.ui.graphics.drawscope.Fill INSTANCE;
+  }
+
+  public final class Stroke extends androidx.compose.ui.graphics.drawscope.DrawStyle {
+    ctor public Stroke(optional float width, optional float miter, optional int cap, optional int join, optional androidx.compose.ui.graphics.PathEffect? pathEffect);
+    method public int getCap();
+    method public int getJoin();
+    method public float getMiter();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public float getWidth();
+    property public final int cap;
+    property public final int join;
+    property public final float miter;
+    property public final androidx.compose.ui.graphics.PathEffect? pathEffect;
+    property public final float width;
+    field public static final androidx.compose.ui.graphics.drawscope.Stroke.Companion Companion;
+    field public static final float DefaultMiter = 4.0f;
+    field public static final float HairlineWidth = 0.0f;
+  }
+
+  public static final class Stroke.Companion {
+    method public int getDefaultCap();
+    method public int getDefaultJoin();
+    property public final int DefaultCap;
+    property public final int DefaultJoin;
+  }
+
+}
+
+package androidx.compose.ui.graphics.painter {
+
+  public final class BitmapPainter extends androidx.compose.ui.graphics.painter.Painter {
+    ctor public BitmapPainter(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize);
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public long intrinsicSize;
+  }
+
+  public final class BitmapPainterKt {
+    method public static androidx.compose.ui.graphics.painter.BitmapPainter BitmapPainter(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional int filterQuality);
+  }
+
+  public final class BrushPainter extends androidx.compose.ui.graphics.painter.Painter {
+    ctor public BrushPainter(androidx.compose.ui.graphics.Brush brush);
+    method public androidx.compose.ui.graphics.Brush getBrush();
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public final androidx.compose.ui.graphics.Brush brush;
+    property public long intrinsicSize;
+  }
+
+  public final class ColorPainter extends androidx.compose.ui.graphics.painter.Painter {
+    ctor public ColorPainter(long color);
+    method public long getColor();
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public final long color;
+    property public long intrinsicSize;
+  }
+
+  public abstract class Painter {
+    ctor public Painter();
+    method protected boolean applyAlpha(float alpha);
+    method protected boolean applyColorFilter(androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method protected boolean applyLayoutDirection(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public final void draw(androidx.compose.ui.graphics.drawscope.DrawScope, long size, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method public abstract long getIntrinsicSize();
+    method protected abstract void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public abstract long intrinsicSize;
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector {
+
+  public final class PathBuilder {
+    ctor public PathBuilder();
+    method public androidx.compose.ui.graphics.vector.PathBuilder arcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float x1, float y1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder arcToRelative(float a, float b, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float dx1, float dy1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder close();
+    method public androidx.compose.ui.graphics.vector.PathBuilder curveTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public androidx.compose.ui.graphics.vector.PathBuilder curveToRelative(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getNodes();
+    method public androidx.compose.ui.graphics.vector.PathBuilder horizontalLineTo(float x);
+    method public androidx.compose.ui.graphics.vector.PathBuilder horizontalLineToRelative(float dx);
+    method public androidx.compose.ui.graphics.vector.PathBuilder lineTo(float x, float y);
+    method public androidx.compose.ui.graphics.vector.PathBuilder lineToRelative(float dx, float dy);
+    method public androidx.compose.ui.graphics.vector.PathBuilder moveTo(float x, float y);
+    method public androidx.compose.ui.graphics.vector.PathBuilder moveToRelative(float dx, float dy);
+    method public androidx.compose.ui.graphics.vector.PathBuilder quadTo(float x1, float y1, float x2, float y2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder quadToRelative(float dx1, float dy1, float dx2, float dy2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveCurveTo(float x1, float y1, float x2, float y2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveCurveToRelative(float dx1, float dy1, float dx2, float dy2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveQuadTo(float x1, float y1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveQuadToRelative(float dx1, float dy1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder verticalLineTo(float y);
+    method public androidx.compose.ui.graphics.vector.PathBuilder verticalLineToRelative(float dy);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class PathNode {
+    method public final boolean isCurve();
+    method public final boolean isQuad();
+    property public final boolean isCurve;
+    property public final boolean isQuad;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.ArcTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.ArcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartX, float arcStartY);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public boolean component4();
+    method public boolean component5();
+    method public float component6();
+    method public float component7();
+    method public androidx.compose.ui.graphics.vector.PathNode.ArcTo copy(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartX, float arcStartY);
+    method public float getArcStartX();
+    method public float getArcStartY();
+    method public float getHorizontalEllipseRadius();
+    method public float getTheta();
+    method public float getVerticalEllipseRadius();
+    method public boolean isMoreThanHalf();
+    method public boolean isPositiveArc();
+    property public final float arcStartX;
+    property public final float arcStartY;
+    property public final float horizontalEllipseRadius;
+    property public final boolean isMoreThanHalf;
+    property public final boolean isPositiveArc;
+    property public final float theta;
+    property public final float verticalEllipseRadius;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.Close extends androidx.compose.ui.graphics.vector.PathNode {
+    field public static final androidx.compose.ui.graphics.vector.PathNode.Close INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.CurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.CurveTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public float component5();
+    method public float component6();
+    method public androidx.compose.ui.graphics.vector.PathNode.CurveTo copy(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public float getX1();
+    method public float getX2();
+    method public float getX3();
+    method public float getY1();
+    method public float getY2();
+    method public float getY3();
+    property public final float x1;
+    property public final float x2;
+    property public final float x3;
+    property public final float y1;
+    property public final float y2;
+    property public final float y3;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.HorizontalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.HorizontalTo(float x);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.HorizontalTo copy(float x);
+    method public float getX();
+    property public final float x;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.LineTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.LineTo(float x, float y);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.LineTo copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.MoveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.MoveTo(float x, float y);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.MoveTo copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.QuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.QuadTo(float x1, float y1, float x2, float y2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.QuadTo copy(float x1, float y1, float x2, float y2);
+    method public float getX1();
+    method public float getX2();
+    method public float getY1();
+    method public float getY2();
+    property public final float x1;
+    property public final float x2;
+    property public final float y1;
+    property public final float y2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.ReflectiveCurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.ReflectiveCurveTo(float x1, float y1, float x2, float y2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.ReflectiveCurveTo copy(float x1, float y1, float x2, float y2);
+    method public float getX1();
+    method public float getX2();
+    method public float getY1();
+    method public float getY2();
+    property public final float x1;
+    property public final float x2;
+    property public final float y1;
+    property public final float y2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.ReflectiveQuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.ReflectiveQuadTo(float x, float y);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.ReflectiveQuadTo copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeArcTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeArcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartDx, float arcStartDy);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public boolean component4();
+    method public boolean component5();
+    method public float component6();
+    method public float component7();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeArcTo copy(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartDx, float arcStartDy);
+    method public float getArcStartDx();
+    method public float getArcStartDy();
+    method public float getHorizontalEllipseRadius();
+    method public float getTheta();
+    method public float getVerticalEllipseRadius();
+    method public boolean isMoreThanHalf();
+    method public boolean isPositiveArc();
+    property public final float arcStartDx;
+    property public final float arcStartDy;
+    property public final float horizontalEllipseRadius;
+    property public final boolean isMoreThanHalf;
+    property public final boolean isPositiveArc;
+    property public final float theta;
+    property public final float verticalEllipseRadius;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeCurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeCurveTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public float component5();
+    method public float component6();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeCurveTo copy(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public float getDx1();
+    method public float getDx2();
+    method public float getDx3();
+    method public float getDy1();
+    method public float getDy2();
+    method public float getDy3();
+    property public final float dx1;
+    property public final float dx2;
+    property public final float dx3;
+    property public final float dy1;
+    property public final float dy2;
+    property public final float dy3;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeHorizontalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeHorizontalTo(float dx);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeHorizontalTo copy(float dx);
+    method public float getDx();
+    property public final float dx;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeLineTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeLineTo(float dx, float dy);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeLineTo copy(float dx, float dy);
+    method public float getDx();
+    method public float getDy();
+    property public final float dx;
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeMoveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeMoveTo(float dx, float dy);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeMoveTo copy(float dx, float dy);
+    method public float getDx();
+    method public float getDy();
+    property public final float dx;
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeQuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeQuadTo(float dx1, float dy1, float dx2, float dy2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeQuadTo copy(float dx1, float dy1, float dx2, float dy2);
+    method public float getDx1();
+    method public float getDx2();
+    method public float getDy1();
+    method public float getDy2();
+    property public final float dx1;
+    property public final float dx2;
+    property public final float dy1;
+    property public final float dy2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeReflectiveCurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeReflectiveCurveTo(float dx1, float dy1, float dx2, float dy2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeReflectiveCurveTo copy(float dx1, float dy1, float dx2, float dy2);
+    method public float getDx1();
+    method public float getDx2();
+    method public float getDy1();
+    method public float getDy2();
+    property public final float dx1;
+    property public final float dx2;
+    property public final float dy1;
+    property public final float dy2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeReflectiveQuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeReflectiveQuadTo(float dx, float dy);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeReflectiveQuadTo copy(float dx, float dy);
+    method public float getDx();
+    method public float getDy();
+    property public final float dx;
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeVerticalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeVerticalTo(float dy);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeVerticalTo copy(float dy);
+    method public float getDy();
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.VerticalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.VerticalTo(float y);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.VerticalTo copy(float y);
+    method public float getY();
+    property public final float y;
+  }
+
+  public final class PathNodeKt {
+  }
+
+  public final class PathParser {
+    ctor public PathParser();
+    method public androidx.compose.ui.graphics.vector.PathParser addPathNodes(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> nodes);
+    method public void clear();
+    method public androidx.compose.ui.graphics.vector.PathParser parsePathString(String pathData);
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> toNodes();
+    method public androidx.compose.ui.graphics.Path toPath(optional androidx.compose.ui.graphics.Path target);
+  }
+
+}
+
diff --git a/compose/ui/ui-graphics/api/api_lint.ignore b/compose/ui/ui-graphics/api/api_lint.ignore
index 7a6216f..75e464a 100644
--- a/compose/ui/ui-graphics/api/api_lint.ignore
+++ b/compose/ui/ui-graphics/api/api_lint.ignore
@@ -47,6 +47,12 @@
     androidx.compose.ui.graphics.vector.PathBuilder does not declare a `build()` method, but builder classes are expected to
 
 
+MissingNullability: androidx.compose.ui.graphics.Color#component5():
+    Missing nullability on method `component5` return
+MissingNullability: androidx.compose.ui.graphics.PaintKt#Paint():
+    Missing nullability on method `Paint` return
+
+
 NotCloseable: androidx.compose.ui.graphics.AndroidPath:
     Classes that release resources (close()) should implement AutoClosable and CloseGuard: class androidx.compose.ui.graphics.AndroidPath
 NotCloseable: androidx.compose.ui.graphics.Path:
diff --git a/compose/ui/ui-graphics/api/current.ignore b/compose/ui/ui-graphics/api/current.ignore
new file mode 100644
index 0000000..3ccbf6c
--- /dev/null
+++ b/compose/ui/ui-graphics/api/current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#offsetSize(long, long):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.offsetSize(long,long)
diff --git a/compose/ui/ui-graphics/api/current.txt b/compose/ui/ui-graphics/api/current.txt
index c8e5a43..0acbb6f 100644
--- a/compose/ui/ui-graphics/api/current.txt
+++ b/compose/ui/ui-graphics/api/current.txt
@@ -299,6 +299,12 @@
 
   @androidx.compose.runtime.Immutable public final inline class Color {
     ctor public Color();
+    method @androidx.compose.runtime.Stable public operator float component1();
+    method @androidx.compose.runtime.Stable public operator float component2();
+    method @androidx.compose.runtime.Stable public operator float component3();
+    method @androidx.compose.runtime.Stable public operator float component4();
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.graphics.colorspace.ColorSpace! component5();
+    method @androidx.compose.runtime.Stable public long copy(optional float alpha, optional float red, optional float green, optional float blue);
     method public long getValue();
     property public final long value;
   }
@@ -358,7 +364,10 @@
 
   public final inline class ColorMatrix {
     ctor public ColorMatrix();
+    method public inline operator float get(int row, int column);
     method public float[] getValues();
+    method public inline operator void set(int row, int column, float v);
+    method public operator void timesAssign(float[] colorMatrix);
     property public final float[] values;
   }
 
@@ -435,7 +444,10 @@
 
   public final inline class Matrix {
     ctor public Matrix();
+    method public inline operator float get(int row, int column);
     method public float[] getValues();
+    method public inline operator void set(int row, int column, float v);
+    method public operator void timesAssign(float[] m);
     property public final float[] values;
   }
 
@@ -531,6 +543,7 @@
   }
 
   public final class PaintKt {
+    method public static androidx.compose.ui.graphics.Paint! Paint();
     field public static final float DefaultAlpha = 1.0f;
   }
 
@@ -676,6 +689,7 @@
 
   public final class RectangleShapeKt {
     method public static androidx.compose.ui.graphics.Shape getRectangleShape();
+    property public static final androidx.compose.ui.graphics.Shape RectangleShape;
   }
 
   @androidx.compose.runtime.Immutable public abstract sealed class RenderEffect {
@@ -1093,7 +1107,7 @@
     method public void drawCircle(long color, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
     method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
     method public default void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode, optional int filterQuality);
-    method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method @Deprecated public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
     method public void drawLine(androidx.compose.ui.graphics.Brush brush, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
     method public void drawLine(long color, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
     method public void drawOval(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
@@ -1110,7 +1124,6 @@
     method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
     method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
     method public default long getSize();
-    method public long offsetSize(long, long offset);
     property public default long center;
     property public abstract androidx.compose.ui.graphics.drawscope.DrawContext drawContext;
     property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
diff --git a/compose/ui/ui-graphics/api/public_plus_experimental_1.1.0-beta02.txt b/compose/ui/ui-graphics/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..4dea06e9
--- /dev/null
+++ b/compose/ui/ui-graphics/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,1576 @@
+// Signature format: 4.0
+package androidx.compose.ui.graphics {
+
+  public final class AndroidBlendMode_androidKt {
+    method public static boolean isSupported(int);
+  }
+
+  public final class AndroidCanvas_androidKt {
+    method public static androidx.compose.ui.graphics.Canvas Canvas(android.graphics.Canvas c);
+    method public static android.graphics.Canvas getNativeCanvas(androidx.compose.ui.graphics.Canvas);
+  }
+
+  public final class AndroidColorFilter_androidKt {
+    method public static android.graphics.ColorFilter asAndroidColorFilter(androidx.compose.ui.graphics.ColorFilter);
+    method public static androidx.compose.ui.graphics.ColorFilter asComposeColorFilter(android.graphics.ColorFilter);
+  }
+
+  public final class AndroidImageBitmap_androidKt {
+    method public static android.graphics.Bitmap asAndroidBitmap(androidx.compose.ui.graphics.ImageBitmap);
+    method public static androidx.compose.ui.graphics.ImageBitmap asImageBitmap(android.graphics.Bitmap);
+  }
+
+  public final class AndroidMatrixConversions_androidKt {
+    method public static void setFrom(float[], android.graphics.Matrix matrix);
+    method public static void setFrom(android.graphics.Matrix, float[] matrix);
+  }
+
+  public final class AndroidPaint implements androidx.compose.ui.graphics.Paint {
+    ctor public AndroidPaint();
+    method public android.graphics.Paint asFrameworkPaint();
+    method public float getAlpha();
+    method public int getBlendMode();
+    method public long getColor();
+    method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
+    method public int getFilterQuality();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public android.graphics.Shader? getShader();
+    method public int getStrokeCap();
+    method public int getStrokeJoin();
+    method public float getStrokeMiterLimit();
+    method public float getStrokeWidth();
+    method public int getStyle();
+    method public boolean isAntiAlias();
+    method public void setAlpha(float value);
+    method public void setAntiAlias(boolean value);
+    method public void setBlendMode(int value);
+    method public void setColor(long color);
+    method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? value);
+    method public void setFilterQuality(int value);
+    method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? value);
+    method public void setShader(android.graphics.Shader? value);
+    method public void setStrokeCap(int value);
+    method public void setStrokeJoin(int value);
+    method public void setStrokeMiterLimit(float value);
+    method public void setStrokeWidth(float value);
+    method public void setStyle(int value);
+    property public float alpha;
+    property public int blendMode;
+    property public long color;
+    property public androidx.compose.ui.graphics.ColorFilter? colorFilter;
+    property public int filterQuality;
+    property public boolean isAntiAlias;
+    property public androidx.compose.ui.graphics.PathEffect? pathEffect;
+    property public android.graphics.Shader? shader;
+    property public int strokeCap;
+    property public int strokeJoin;
+    property public float strokeMiterLimit;
+    property public float strokeWidth;
+    property public int style;
+  }
+
+  public final class AndroidPaint_androidKt {
+    method public static androidx.compose.ui.graphics.Paint Paint();
+  }
+
+  public final class AndroidPath implements androidx.compose.ui.graphics.Path {
+    ctor public AndroidPath(optional android.graphics.Path internalPath);
+    method public void addArc(androidx.compose.ui.geometry.Rect oval, float startAngleDegrees, float sweepAngleDegrees);
+    method public void addArcRad(androidx.compose.ui.geometry.Rect oval, float startAngleRadians, float sweepAngleRadians);
+    method public void addOval(androidx.compose.ui.geometry.Rect oval);
+    method public void addPath(androidx.compose.ui.graphics.Path path, long offset);
+    method public void addRect(androidx.compose.ui.geometry.Rect rect);
+    method public void addRoundRect(androidx.compose.ui.geometry.RoundRect roundRect);
+    method public void arcTo(androidx.compose.ui.geometry.Rect rect, float startAngleDegrees, float sweepAngleDegrees, boolean forceMoveTo);
+    method public void close();
+    method public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public int getFillType();
+    method public android.graphics.Path getInternalPath();
+    method public boolean isConvex();
+    method public boolean isEmpty();
+    method public void lineTo(float x, float y);
+    method public void moveTo(float x, float y);
+    method public boolean op(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, int operation);
+    method public void quadraticBezierTo(float x1, float y1, float x2, float y2);
+    method public void relativeCubicTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public void relativeLineTo(float dx, float dy);
+    method public void relativeMoveTo(float dx, float dy);
+    method public void relativeQuadraticBezierTo(float dx1, float dy1, float dx2, float dy2);
+    method public void reset();
+    method public void setFillType(int value);
+    method public void translate(long offset);
+    property public int fillType;
+    property public final android.graphics.Path internalPath;
+    property public boolean isConvex;
+    property public boolean isEmpty;
+  }
+
+  public final class AndroidPathEffect_androidKt {
+    method public static android.graphics.PathEffect asAndroidPathEffect(androidx.compose.ui.graphics.PathEffect);
+    method public static androidx.compose.ui.graphics.PathEffect toComposePathEffect(android.graphics.PathEffect);
+  }
+
+  public final class AndroidPathMeasure implements androidx.compose.ui.graphics.PathMeasure {
+    method public float getLength();
+    method public boolean getSegment(float startDistance, float stopDistance, androidx.compose.ui.graphics.Path destination, boolean startWithMoveTo);
+    method public void setPath(androidx.compose.ui.graphics.Path? path, boolean forceClosed);
+    property public float length;
+  }
+
+  public final class AndroidPathMeasure_androidKt {
+    method public static androidx.compose.ui.graphics.PathMeasure PathMeasure();
+  }
+
+  public final class AndroidPath_androidKt {
+    method public static androidx.compose.ui.graphics.Path Path();
+    method public static inline android.graphics.Path asAndroidPath(androidx.compose.ui.graphics.Path);
+    method public static androidx.compose.ui.graphics.Path asComposePath(android.graphics.Path);
+  }
+
+  public final class AndroidRenderEffect_androidKt {
+    method public static androidx.compose.ui.graphics.RenderEffect asComposeRenderEffect(android.graphics.RenderEffect);
+  }
+
+  public final class AndroidShader_androidKt {
+  }
+
+  public final class AndroidTileMode_androidKt {
+    method public static boolean isSupported(int);
+    method public static android.graphics.Shader.TileMode toAndroidTileMode(int);
+    method public static int toComposeTileMode(android.graphics.Shader.TileMode);
+  }
+
+  public final class AndroidVertexMode_androidKt {
+    method public static android.graphics.Canvas.VertexMode toAndroidVertexMode(int);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class BlendMode {
+    ctor public BlendMode();
+  }
+
+  public static final class BlendMode.Companion {
+    method public int getClear();
+    method public int getColor();
+    method public int getColorBurn();
+    method public int getColorDodge();
+    method public int getDarken();
+    method public int getDifference();
+    method public int getDst();
+    method public int getDstAtop();
+    method public int getDstIn();
+    method public int getDstOut();
+    method public int getDstOver();
+    method public int getExclusion();
+    method public int getHardlight();
+    method public int getHue();
+    method public int getLighten();
+    method public int getLuminosity();
+    method public int getModulate();
+    method public int getMultiply();
+    method public int getOverlay();
+    method public int getPlus();
+    method public int getSaturation();
+    method public int getScreen();
+    method public int getSoftlight();
+    method public int getSrc();
+    method public int getSrcAtop();
+    method public int getSrcIn();
+    method public int getSrcOut();
+    method public int getSrcOver();
+    method public int getXor();
+    property public final int Clear;
+    property public final int Color;
+    property public final int ColorBurn;
+    property public final int ColorDodge;
+    property public final int Darken;
+    property public final int Difference;
+    property public final int Dst;
+    property public final int DstAtop;
+    property public final int DstIn;
+    property public final int DstOut;
+    property public final int DstOver;
+    property public final int Exclusion;
+    property public final int Hardlight;
+    property public final int Hue;
+    property public final int Lighten;
+    property public final int Luminosity;
+    property public final int Modulate;
+    property public final int Multiply;
+    property public final int Overlay;
+    property public final int Plus;
+    property public final int Saturation;
+    property public final int Screen;
+    property public final int Softlight;
+    property public final int Src;
+    property public final int SrcAtop;
+    property public final int SrcIn;
+    property public final int SrcOut;
+    property public final int SrcOver;
+    property public final int Xor;
+  }
+
+  @androidx.compose.runtime.Immutable public final class BlurEffect extends androidx.compose.ui.graphics.RenderEffect {
+    ctor public BlurEffect(androidx.compose.ui.graphics.RenderEffect? renderEffect, float radiusX, float radiusY, int edgeTreatment);
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) protected android.graphics.RenderEffect createRenderEffect();
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class Brush {
+    method public abstract void applyTo(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public long getIntrinsicSize();
+    property public long intrinsicSize;
+    field public static final androidx.compose.ui.graphics.Brush.Companion Companion;
+  }
+
+  public static final class Brush.Companion {
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startX, optional float endX, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startX, optional float endX, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long start, optional long end, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long start, optional long end, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center, optional float radius, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center, optional float radius, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startY, optional float endY, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startY, optional float endY, optional int tileMode);
+  }
+
+  public final class BrushKt {
+    method public static androidx.compose.ui.graphics.ShaderBrush ShaderBrush(android.graphics.Shader shader);
+  }
+
+  public interface Canvas {
+    method public void clipPath(androidx.compose.ui.graphics.Path path, optional int clipOp);
+    method public default void clipRect(androidx.compose.ui.geometry.Rect rect, optional int clipOp);
+    method public void clipRect(float left, float top, float right, float bottom, optional int clipOp);
+    method public void concat(float[] matrix);
+    method public void disableZ();
+    method public default void drawArc(androidx.compose.ui.geometry.Rect rect, float startAngle, float sweepAngle, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
+    method public void drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
+    method public default void drawArcRad(androidx.compose.ui.geometry.Rect rect, float startAngleRad, float sweepAngleRad, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
+    method public void drawCircle(long center, float radius, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, long topLeftOffset, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImageRect(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, androidx.compose.ui.graphics.Paint paint);
+    method public void drawLine(long p1, long p2, androidx.compose.ui.graphics.Paint paint);
+    method public default void drawOval(androidx.compose.ui.geometry.Rect rect, androidx.compose.ui.graphics.Paint paint);
+    method public void drawOval(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Paint paint);
+    method public void drawPoints(int pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRawPoints(int pointMode, float[] points, androidx.compose.ui.graphics.Paint paint);
+    method public default void drawRect(androidx.compose.ui.geometry.Rect rect, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRect(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY, androidx.compose.ui.graphics.Paint paint);
+    method public void drawVertices(androidx.compose.ui.graphics.Vertices vertices, int blendMode, androidx.compose.ui.graphics.Paint paint);
+    method public void enableZ();
+    method public void restore();
+    method public void rotate(float degrees);
+    method public void save();
+    method public void saveLayer(androidx.compose.ui.geometry.Rect bounds, androidx.compose.ui.graphics.Paint paint);
+    method public void scale(float sx, optional float sy);
+    method public void skew(float sx, float sy);
+    method public default void skewRad(float sxRad, float syRad);
+    method public void translate(float dx, float dy);
+  }
+
+  public final class CanvasHolder {
+    ctor public CanvasHolder();
+    method public inline void drawInto(android.graphics.Canvas targetCanvas, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Canvas,kotlin.Unit> block);
+  }
+
+  public final class CanvasKt {
+    method public static androidx.compose.ui.graphics.Canvas Canvas(androidx.compose.ui.graphics.ImageBitmap image);
+    method public static void rotate(androidx.compose.ui.graphics.Canvas, float degrees, float pivotX, float pivotY);
+    method public static void rotateRad(androidx.compose.ui.graphics.Canvas, float radians, optional float pivotX, optional float pivotY);
+    method public static void scale(androidx.compose.ui.graphics.Canvas, float sx, optional float sy, float pivotX, float pivotY);
+    method public static inline void withSave(androidx.compose.ui.graphics.Canvas, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public static inline void withSaveLayer(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.geometry.Rect bounds, androidx.compose.ui.graphics.Paint paint, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class ClipOp {
+    ctor public ClipOp();
+  }
+
+  public static final class ClipOp.Companion {
+    method public int getDifference();
+    method public int getIntersect();
+    property public final int Difference;
+    property public final int Intersect;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Color {
+    ctor public Color();
+    method @androidx.compose.runtime.Stable public operator float component1();
+    method @androidx.compose.runtime.Stable public operator float component2();
+    method @androidx.compose.runtime.Stable public operator float component3();
+    method @androidx.compose.runtime.Stable public operator float component4();
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.graphics.colorspace.ColorSpace! component5();
+    method @androidx.compose.runtime.Stable public long copy(optional float alpha, optional float red, optional float green, optional float blue);
+    method public long getValue();
+    property public final long value;
+  }
+
+  public static final class Color.Companion {
+    method public long getBlack();
+    method public long getBlue();
+    method public long getCyan();
+    method public long getDarkGray();
+    method public long getGray();
+    method public long getGreen();
+    method public long getLightGray();
+    method public long getMagenta();
+    method public long getRed();
+    method public long getTransparent();
+    method public long getUnspecified();
+    method public long getWhite();
+    method public long getYellow();
+    method @androidx.compose.ui.graphics.ExperimentalGraphicsApi public long hsl(float hue, float saturation, float lightness, optional float alpha, optional androidx.compose.ui.graphics.colorspace.Rgb colorSpace);
+    method @androidx.compose.ui.graphics.ExperimentalGraphicsApi public long hsv(float hue, float saturation, float value, optional float alpha, optional androidx.compose.ui.graphics.colorspace.Rgb colorSpace);
+    property public final long Black;
+    property public final long Blue;
+    property public final long Cyan;
+    property public final long DarkGray;
+    property public final long Gray;
+    property public final long Green;
+    property public final long LightGray;
+    property public final long Magenta;
+    property public final long Red;
+    property public final long Transparent;
+    property public final long Unspecified;
+    property public final long White;
+    property public final long Yellow;
+  }
+
+  @androidx.compose.runtime.Immutable public final class ColorFilter {
+    field public static final androidx.compose.ui.graphics.ColorFilter.Companion Companion;
+  }
+
+  public static final class ColorFilter.Companion {
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter colorMatrix(float[] colorMatrix);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter lighting(long multiply, long add);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter tint(long color, optional int blendMode);
+  }
+
+  public final class ColorKt {
+    method @androidx.compose.runtime.Stable public static long Color(float red, float green, float blue, optional float alpha, optional androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
+    method @androidx.compose.runtime.Stable public static long Color(int color);
+    method @androidx.compose.runtime.Stable public static long Color(long color);
+    method @androidx.compose.runtime.Stable public static long Color(int red, int green, int blue, optional int alpha);
+    method @androidx.compose.runtime.Stable public static long compositeOver(long, long background);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static float luminance(long);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.graphics.Color> block);
+    method @androidx.compose.runtime.Stable public static int toArgb(long);
+  }
+
+  public final inline class ColorMatrix {
+    ctor public ColorMatrix();
+    method public inline operator float get(int row, int column);
+    method public float[] getValues();
+    method public inline operator void set(int row, int column, float v);
+    method public operator void timesAssign(float[] colorMatrix);
+    property public final float[] values;
+  }
+
+  public final class DegreesKt {
+  }
+
+  @kotlin.RequiresOptIn(message="This API is experimental and is likely to change in the future.") public @interface ExperimentalGraphicsApi {
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class FilterQuality {
+    ctor public FilterQuality();
+    method public int getValue();
+    property public final int value;
+  }
+
+  public static final class FilterQuality.Companion {
+    method public int getHigh();
+    method public int getLow();
+    method public int getMedium();
+    method public int getNone();
+    property public final int High;
+    property public final int Low;
+    property public final int Medium;
+    property public final int None;
+  }
+
+  public final class Float16Kt {
+  }
+
+  public interface ImageBitmap {
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace();
+    method public int getConfig();
+    method public boolean getHasAlpha();
+    method public int getHeight();
+    method public int getWidth();
+    method public void prepareToDraw();
+    method public void readPixels(int[] buffer, optional int startX, optional int startY, optional int width, optional int height, optional int bufferOffset, optional int stride);
+    property public abstract androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace;
+    property public abstract int config;
+    property public abstract boolean hasAlpha;
+    property public abstract int height;
+    property public abstract int width;
+    field public static final androidx.compose.ui.graphics.ImageBitmap.Companion Companion;
+  }
+
+  public static final class ImageBitmap.Companion {
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class ImageBitmapConfig {
+    ctor public ImageBitmapConfig();
+    method public int getValue();
+    property public final int value;
+  }
+
+  public static final class ImageBitmapConfig.Companion {
+    method public int getAlpha8();
+    method public int getArgb8888();
+    method public int getF16();
+    method public int getGpu();
+    method public int getRgb565();
+    property public final int Alpha8;
+    property public final int Argb8888;
+    property public final int F16;
+    property public final int Gpu;
+    property public final int Rgb565;
+  }
+
+  public final class ImageBitmapKt {
+    method public static androidx.compose.ui.graphics.ImageBitmap ImageBitmap(int width, int height, optional int config, optional boolean hasAlpha, optional androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
+    method public static androidx.compose.ui.graphics.PixelMap toPixelMap(androidx.compose.ui.graphics.ImageBitmap, optional int startX, optional int startY, optional int width, optional int height, optional int[] buffer, optional int bufferOffset, optional int stride);
+  }
+
+  @androidx.compose.runtime.Immutable public final class LinearGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader(long size);
+    property public long intrinsicSize;
+  }
+
+  public final inline class Matrix {
+    ctor public Matrix();
+    method public inline operator float get(int row, int column);
+    method public float[] getValues();
+    method public inline operator void set(int row, int column, float v);
+    method public operator void timesAssign(float[] m);
+    property public final float[] values;
+  }
+
+  public static final class Matrix.Companion {
+  }
+
+  public final class MatrixKt {
+    method public static boolean isIdentity(float[]);
+  }
+
+  @androidx.compose.runtime.Immutable public final class OffsetEffect extends androidx.compose.ui.graphics.RenderEffect {
+    ctor public OffsetEffect(androidx.compose.ui.graphics.RenderEffect? renderEffect, long offset);
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) protected android.graphics.RenderEffect createRenderEffect();
+  }
+
+  public abstract sealed class Outline {
+    method public abstract androidx.compose.ui.geometry.Rect getBounds();
+    property public abstract androidx.compose.ui.geometry.Rect bounds;
+  }
+
+  public static final class Outline.Generic extends androidx.compose.ui.graphics.Outline {
+    ctor public Outline.Generic(androidx.compose.ui.graphics.Path path);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public androidx.compose.ui.graphics.Path getPath();
+    property public androidx.compose.ui.geometry.Rect bounds;
+    property public final androidx.compose.ui.graphics.Path path;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class Outline.Rectangle extends androidx.compose.ui.graphics.Outline {
+    ctor public Outline.Rectangle(androidx.compose.ui.geometry.Rect rect);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public androidx.compose.ui.geometry.Rect getRect();
+    property public androidx.compose.ui.geometry.Rect bounds;
+    property public final androidx.compose.ui.geometry.Rect rect;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class Outline.Rounded extends androidx.compose.ui.graphics.Outline {
+    ctor public Outline.Rounded(androidx.compose.ui.geometry.RoundRect roundRect);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public androidx.compose.ui.geometry.RoundRect getRoundRect();
+    property public androidx.compose.ui.geometry.Rect bounds;
+    property public final androidx.compose.ui.geometry.RoundRect roundRect;
+  }
+
+  public final class OutlineKt {
+    method public static void addOutline(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.Outline outline);
+    method public static void drawOutline(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public static void drawOutline(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public static void drawOutline(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Paint paint);
+  }
+
+  public interface Paint {
+    method public android.graphics.Paint asFrameworkPaint();
+    method public float getAlpha();
+    method public int getBlendMode();
+    method public long getColor();
+    method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
+    method public int getFilterQuality();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public android.graphics.Shader? getShader();
+    method public int getStrokeCap();
+    method public int getStrokeJoin();
+    method public float getStrokeMiterLimit();
+    method public float getStrokeWidth();
+    method public int getStyle();
+    method public boolean isAntiAlias();
+    method public void setAlpha(float alpha);
+    method public void setAntiAlias(boolean isAntiAlias);
+    method public void setBlendMode(int blendMode);
+    method public void setColor(long color);
+    method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method public void setFilterQuality(int filterQuality);
+    method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? pathEffect);
+    method public void setShader(android.graphics.Shader? shader);
+    method public void setStrokeCap(int strokeCap);
+    method public void setStrokeJoin(int strokeJoin);
+    method public void setStrokeMiterLimit(float strokeMiterLimit);
+    method public void setStrokeWidth(float strokeWidth);
+    method public void setStyle(int style);
+    property public abstract float alpha;
+    property public abstract int blendMode;
+    property public abstract long color;
+    property public abstract androidx.compose.ui.graphics.ColorFilter? colorFilter;
+    property public abstract int filterQuality;
+    property public abstract boolean isAntiAlias;
+    property public abstract androidx.compose.ui.graphics.PathEffect? pathEffect;
+    property public abstract android.graphics.Shader? shader;
+    property public abstract int strokeCap;
+    property public abstract int strokeJoin;
+    property public abstract float strokeMiterLimit;
+    property public abstract float strokeWidth;
+    property public abstract int style;
+  }
+
+  public final class PaintKt {
+    method public static androidx.compose.ui.graphics.Paint! Paint();
+    field public static final float DefaultAlpha = 1.0f;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class PaintingStyle {
+    ctor public PaintingStyle();
+  }
+
+  public static final class PaintingStyle.Companion {
+    method public int getFill();
+    method public int getStroke();
+    property public final int Fill;
+    property public final int Stroke;
+  }
+
+  public interface Path {
+    method public void addArc(androidx.compose.ui.geometry.Rect oval, float startAngleDegrees, float sweepAngleDegrees);
+    method public void addArcRad(androidx.compose.ui.geometry.Rect oval, float startAngleRadians, float sweepAngleRadians);
+    method public void addOval(androidx.compose.ui.geometry.Rect oval);
+    method public void addPath(androidx.compose.ui.graphics.Path path, optional long offset);
+    method public void addRect(androidx.compose.ui.geometry.Rect rect);
+    method public void addRoundRect(androidx.compose.ui.geometry.RoundRect roundRect);
+    method public void arcTo(androidx.compose.ui.geometry.Rect rect, float startAngleDegrees, float sweepAngleDegrees, boolean forceMoveTo);
+    method public default void arcToRad(androidx.compose.ui.geometry.Rect rect, float startAngleRadians, float sweepAngleRadians, boolean forceMoveTo);
+    method public void close();
+    method public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public int getFillType();
+    method public boolean isConvex();
+    method public boolean isEmpty();
+    method public void lineTo(float x, float y);
+    method public void moveTo(float x, float y);
+    method public boolean op(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, int operation);
+    method public void quadraticBezierTo(float x1, float y1, float x2, float y2);
+    method public void relativeCubicTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public void relativeLineTo(float dx, float dy);
+    method public void relativeMoveTo(float dx, float dy);
+    method public void relativeQuadraticBezierTo(float dx1, float dy1, float dx2, float dy2);
+    method public void reset();
+    method public void setFillType(int fillType);
+    method public void translate(long offset);
+    property public abstract int fillType;
+    property public abstract boolean isConvex;
+    property public abstract boolean isEmpty;
+    field public static final androidx.compose.ui.graphics.Path.Companion Companion;
+  }
+
+  public static final class Path.Companion {
+    method public androidx.compose.ui.graphics.Path combine(int operation, androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2);
+  }
+
+  public interface PathEffect {
+    field public static final androidx.compose.ui.graphics.PathEffect.Companion Companion;
+  }
+
+  public static final class PathEffect.Companion {
+    method public androidx.compose.ui.graphics.PathEffect chainPathEffect(androidx.compose.ui.graphics.PathEffect outer, androidx.compose.ui.graphics.PathEffect inner);
+    method public androidx.compose.ui.graphics.PathEffect cornerPathEffect(float radius);
+    method public androidx.compose.ui.graphics.PathEffect dashPathEffect(float[] intervals, optional float phase);
+    method public androidx.compose.ui.graphics.PathEffect stampedPathEffect(androidx.compose.ui.graphics.Path shape, float advance, float phase, int style);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class PathFillType {
+    ctor public PathFillType();
+  }
+
+  public static final class PathFillType.Companion {
+    method public int getEvenOdd();
+    method public int getNonZero();
+    property public final int EvenOdd;
+    property public final int NonZero;
+  }
+
+  public interface PathMeasure {
+    method public float getLength();
+    method public boolean getSegment(float startDistance, float stopDistance, androidx.compose.ui.graphics.Path destination, optional boolean startWithMoveTo);
+    method public void setPath(androidx.compose.ui.graphics.Path? path, boolean forceClosed);
+    property public abstract float length;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class PathOperation {
+    ctor public PathOperation();
+  }
+
+  public static final class PathOperation.Companion {
+    method public int getDifference();
+    method public int getIntersect();
+    method public int getReverseDifference();
+    method public int getUnion();
+    method public int getXor();
+    property public final int Difference;
+    property public final int Intersect;
+    property public final int ReverseDifference;
+    property public final int Union;
+    property public final int Xor;
+  }
+
+  public final class PathOperationKt {
+    method @Deprecated public static int getDifference(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getIntersect(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getReverseDifference(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getUnion(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getXor(androidx.compose.ui.graphics.PathOperation.Companion);
+  }
+
+  public final class PixelMap {
+    ctor public PixelMap(int[] buffer, int width, int height, int bufferOffset, int stride);
+    method public operator long get(int x, int y);
+    method public int[] getBuffer();
+    method public int getBufferOffset();
+    method public int getHeight();
+    method public int getStride();
+    method public int getWidth();
+    property public final int[] buffer;
+    property public final int bufferOffset;
+    property public final int height;
+    property public final int stride;
+    property public final int width;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class PointMode {
+    ctor public PointMode();
+  }
+
+  public static final class PointMode.Companion {
+    method public int getLines();
+    method public int getPoints();
+    method public int getPolygon();
+    property public final int Lines;
+    property public final int Points;
+    property public final int Polygon;
+  }
+
+  @androidx.compose.runtime.Immutable public final class RadialGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader(long size);
+    property public long intrinsicSize;
+  }
+
+  public final class RectHelper_androidKt {
+    method public static android.graphics.Rect toAndroidRect(androidx.compose.ui.geometry.Rect);
+    method public static android.graphics.RectF toAndroidRectF(androidx.compose.ui.geometry.Rect);
+    method public static androidx.compose.ui.geometry.Rect toComposeRect(android.graphics.Rect);
+  }
+
+  public final class RectangleShapeKt {
+    method public static androidx.compose.ui.graphics.Shape getRectangleShape();
+    property public static final androidx.compose.ui.graphics.Shape RectangleShape;
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class RenderEffect {
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) public final android.graphics.RenderEffect asAndroidRenderEffect();
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) protected abstract android.graphics.RenderEffect createRenderEffect();
+    method public boolean isSupported();
+  }
+
+  public final class RenderEffectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.graphics.BlurEffect BlurEffect(float radiusX, float radiusY, optional int edgeTreatment);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.graphics.OffsetEffect OffsetEffect(float offsetX, float offsetY);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract class ShaderBrush extends androidx.compose.ui.graphics.Brush {
+    ctor public ShaderBrush();
+    method public final void applyTo(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public abstract android.graphics.Shader createShader(long size);
+  }
+
+  public final class ShaderKt {
+    method public static android.graphics.Shader ImageShader(androidx.compose.ui.graphics.ImageBitmap image, optional int tileModeX, optional int tileModeY);
+    method public static android.graphics.Shader LinearGradientShader(long from, long to, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
+    method public static android.graphics.Shader RadialGradientShader(long center, float radius, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
+    method public static android.graphics.Shader SweepGradientShader(long center, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops);
+  }
+
+  @androidx.compose.runtime.Immutable public final class Shadow {
+    ctor public Shadow(optional @androidx.compose.runtime.Stable long color, optional @androidx.compose.runtime.Stable long offset, optional @androidx.compose.runtime.Stable float blurRadius);
+    method public androidx.compose.ui.graphics.Shadow copy(optional long color, optional long offset, optional float blurRadius);
+    method public float getBlurRadius();
+    method public long getColor();
+    method public long getOffset();
+    property public final float blurRadius;
+    property public final long color;
+    property public final long offset;
+    field public static final androidx.compose.ui.graphics.Shadow.Companion Companion;
+  }
+
+  public static final class Shadow.Companion {
+    method public androidx.compose.ui.graphics.Shadow getNone();
+    property public final androidx.compose.ui.graphics.Shadow None;
+  }
+
+  public final class ShadowKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.graphics.Shadow lerp(androidx.compose.ui.graphics.Shadow start, androidx.compose.ui.graphics.Shadow stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public interface Shape {
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+  }
+
+  @androidx.compose.runtime.Immutable public final class SolidColor extends androidx.compose.ui.graphics.Brush {
+    ctor public SolidColor(long value);
+    method public void applyTo(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public long getValue();
+    property public final long value;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class StampedPathEffectStyle {
+    ctor public StampedPathEffectStyle();
+  }
+
+  public static final class StampedPathEffectStyle.Companion {
+    method public int getMorph();
+    method public int getRotate();
+    method public int getTranslate();
+    property public final int Morph;
+    property public final int Rotate;
+    property public final int Translate;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class StrokeCap {
+    ctor public StrokeCap();
+  }
+
+  public static final class StrokeCap.Companion {
+    method public int getButt();
+    method public int getRound();
+    method public int getSquare();
+    property public final int Butt;
+    property public final int Round;
+    property public final int Square;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class StrokeJoin {
+    ctor public StrokeJoin();
+  }
+
+  public static final class StrokeJoin.Companion {
+    method public int getBevel();
+    method public int getMiter();
+    method public int getRound();
+    property public final int Bevel;
+    property public final int Miter;
+    property public final int Round;
+  }
+
+  @androidx.compose.runtime.Immutable public final class SweepGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader(long size);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class TileMode {
+    ctor public TileMode();
+  }
+
+  public static final class TileMode.Companion {
+    method public int getClamp();
+    method public int getDecal();
+    method public int getMirror();
+    method public int getRepeated();
+    property public final int Clamp;
+    property public final int Decal;
+    property public final int Mirror;
+    property public final int Repeated;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class VertexMode {
+    ctor public VertexMode();
+  }
+
+  public static final class VertexMode.Companion {
+    method public int getTriangleFan();
+    method public int getTriangleStrip();
+    method public int getTriangles();
+    property public final int TriangleFan;
+    property public final int TriangleStrip;
+    property public final int Triangles;
+  }
+
+  public final class Vertices {
+    ctor public Vertices(int vertexMode, java.util.List<androidx.compose.ui.geometry.Offset> positions, java.util.List<androidx.compose.ui.geometry.Offset> textureCoordinates, java.util.List<androidx.compose.ui.graphics.Color> colors, java.util.List<java.lang.Integer> indices);
+    method public int[] getColors();
+    method public short[] getIndices();
+    method public float[] getPositions();
+    method public float[] getTextureCoordinates();
+    method public int getVertexMode();
+    property public final int[] colors;
+    property public final short[] indices;
+    property public final float[] positions;
+    property public final float[] textureCoordinates;
+    property public final int vertexMode;
+  }
+
+}
+
+package androidx.compose.ui.graphics.colorspace {
+
+  public abstract class Adaptation {
+    field public static final androidx.compose.ui.graphics.colorspace.Adaptation.Companion Companion;
+  }
+
+  public static final class Adaptation.Companion {
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getBradford();
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getCiecat02();
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getVonKries();
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation Bradford;
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation Ciecat02;
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation VonKries;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class ColorModel {
+    ctor public ColorModel();
+  }
+
+  public static final class ColorModel.Companion {
+    method public long getCmyk();
+    method public long getLab();
+    method public long getRgb();
+    method public long getXyz();
+    property public final long Cmyk;
+    property public final long Lab;
+    property public final long Rgb;
+    property public final long Xyz;
+  }
+
+  public abstract class ColorSpace {
+    ctor public ColorSpace(String name, long model);
+    method public final float[] fromXyz(float x, float y, float z);
+    method public abstract float[] fromXyz(float[] v);
+    method public final int getComponentCount();
+    method public abstract float getMaxValue(int component);
+    method public abstract float getMinValue(int component);
+    method public final long getModel();
+    method public final String getName();
+    method public boolean isSrgb();
+    method public abstract boolean isWideGamut();
+    method public final float[] toXyz(float r, float g, float b);
+    method public abstract float[] toXyz(float[] v);
+    property public final int componentCount;
+    property public boolean isSrgb;
+    property public abstract boolean isWideGamut;
+    property public final long model;
+    property public final String name;
+  }
+
+  public final class ColorSpaceKt {
+    method public static androidx.compose.ui.graphics.colorspace.ColorSpace adapt(androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, optional androidx.compose.ui.graphics.colorspace.Adaptation adaptation);
+    method public static androidx.compose.ui.graphics.colorspace.ColorSpace adapt(androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint);
+    method public static androidx.compose.ui.graphics.colorspace.Connector connect(androidx.compose.ui.graphics.colorspace.ColorSpace, optional androidx.compose.ui.graphics.colorspace.ColorSpace destination, optional int intent);
+  }
+
+  public final class ColorSpaces {
+    method public androidx.compose.ui.graphics.colorspace.Rgb getAces();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getAcescg();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getAdobeRgb();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getBt2020();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getBt709();
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getCieLab();
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getCieXyz();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getDciP3();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getDisplayP3();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getExtendedSrgb();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getLinearExtendedSrgb();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getLinearSrgb();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getNtsc1953();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getProPhotoRgb();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getSmpteC();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getSrgb();
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace? match(float[] toXYZD50, androidx.compose.ui.graphics.colorspace.TransferParameters function);
+    property public final androidx.compose.ui.graphics.colorspace.Rgb Aces;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb Acescg;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb AdobeRgb;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb Bt2020;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb Bt709;
+    property public final androidx.compose.ui.graphics.colorspace.ColorSpace CieLab;
+    property public final androidx.compose.ui.graphics.colorspace.ColorSpace CieXyz;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb DciP3;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb DisplayP3;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb ExtendedSrgb;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb LinearExtendedSrgb;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb LinearSrgb;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb Ntsc1953;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb ProPhotoRgb;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb SmpteC;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb Srgb;
+    field public static final androidx.compose.ui.graphics.colorspace.ColorSpaces INSTANCE;
+  }
+
+  public class Connector {
+    method public final androidx.compose.ui.graphics.colorspace.ColorSpace getDestination();
+    method public final int getRenderIntent();
+    method public final androidx.compose.ui.graphics.colorspace.ColorSpace getSource();
+    method public final float[] transform(float r, float g, float b);
+    method public float[] transform(float[] v);
+    property public final androidx.compose.ui.graphics.colorspace.ColorSpace destination;
+    property public final int renderIntent;
+    property public final androidx.compose.ui.graphics.colorspace.ColorSpace source;
+  }
+
+  public final class Illuminant {
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getA();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getB();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getC();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD50();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD55();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD60();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD65();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD75();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getE();
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint A;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint B;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint C;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D50;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D55;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D60;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D65;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D75;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint E;
+    field public static final androidx.compose.ui.graphics.colorspace.Illuminant INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class RenderIntent {
+    ctor public RenderIntent();
+  }
+
+  public static final class RenderIntent.Companion {
+    method public int getAbsolute();
+    method public int getPerceptual();
+    method public int getRelative();
+    method public int getSaturation();
+    property public final int Absolute;
+    property public final int Perceptual;
+    property public final int Relative;
+    property public final int Saturation;
+  }
+
+  public final class Rgb extends androidx.compose.ui.graphics.colorspace.ColorSpace {
+    ctor public Rgb(String name, float[] toXYZ, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> oetf, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> eotf);
+    ctor public Rgb(String name, float[] primaries, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> oetf, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> eotf, float min, float max);
+    ctor public Rgb(String name, float[] toXYZ, androidx.compose.ui.graphics.colorspace.TransferParameters function);
+    ctor public Rgb(String name, float[] primaries, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, androidx.compose.ui.graphics.colorspace.TransferParameters function);
+    ctor public Rgb(String name, float[] toXYZ, double gamma);
+    ctor public Rgb(String name, float[] primaries, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, double gamma);
+    method public float[] fromLinear(float r, float g, float b);
+    method public float[] fromLinear(float[] v);
+    method public float[] fromXyz(float[] v);
+    method public kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> getEotf();
+    method public float[] getInverseTransform();
+    method public float[] getInverseTransform(float[] inverseTransform);
+    method public float getMaxValue(int component);
+    method public float getMinValue(int component);
+    method public kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> getOetf();
+    method public float[] getPrimaries();
+    method public float[] getPrimaries(float[] primaries);
+    method public androidx.compose.ui.graphics.colorspace.TransferParameters? getTransferParameters();
+    method public float[] getTransform();
+    method public float[] getTransform(float[] transform);
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getWhitePoint();
+    method public boolean isWideGamut();
+    method public float[] toLinear(float r, float g, float b);
+    method public float[] toLinear(float[] v);
+    method public float[] toXyz(float[] v);
+    property public final kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> eotf;
+    property public boolean isSrgb;
+    property public boolean isWideGamut;
+    property public final kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> oetf;
+    property public final androidx.compose.ui.graphics.colorspace.TransferParameters? transferParameters;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint;
+  }
+
+  public final class TransferParameters {
+    ctor public TransferParameters(double gamma, double a, double b, double c, double d, optional double e, optional double f);
+    method public double component1();
+    method public double component2();
+    method public double component3();
+    method public double component4();
+    method public double component5();
+    method public double component6();
+    method public double component7();
+    method public androidx.compose.ui.graphics.colorspace.TransferParameters copy(double gamma, double a, double b, double c, double d, double e, double f);
+    method public double getA();
+    method public double getB();
+    method public double getC();
+    method public double getD();
+    method public double getE();
+    method public double getF();
+    method public double getGamma();
+    property public final double a;
+    property public final double b;
+    property public final double c;
+    property public final double d;
+    property public final double e;
+    property public final double f;
+    property public final double gamma;
+  }
+
+  public final class WhitePoint {
+    ctor public WhitePoint(float x, float y);
+    ctor public WhitePoint(float x, float y, float z);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+}
+
+package androidx.compose.ui.graphics.drawscope {
+
+  public final class CanvasDrawScope implements androidx.compose.ui.graphics.drawscope.DrawScope {
+    ctor public CanvasDrawScope();
+    method public inline void draw(androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.graphics.Canvas canvas, long size, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public void drawArc(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawArc(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawCircle(androidx.compose.ui.graphics.Brush brush, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawCircle(long color, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, long topLeft, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, long srcOffset, long srcSize, long dstOffset, long dstSize, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawLine(androidx.compose.ui.graphics.Brush brush, long start, long end, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawLine(long color, long start, long end, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawOval(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawOval(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, long color, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, long color, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, androidx.compose.ui.graphics.Brush brush, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRect(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRect(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRoundRect(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, long cornerRadius, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRoundRect(long color, long topLeft, long size, long cornerRadius, androidx.compose.ui.graphics.drawscope.DrawStyle style, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public float getDensity();
+    method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
+    method public float getFontScale();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    property public float density;
+    property public androidx.compose.ui.graphics.drawscope.DrawContext drawContext;
+    property public float fontScale;
+    property public androidx.compose.ui.unit.LayoutDirection layoutDirection;
+  }
+
+  public final class CanvasDrawScopeKt {
+  }
+
+  public interface ContentDrawScope extends androidx.compose.ui.graphics.drawscope.DrawScope {
+    method public void drawContent();
+  }
+
+  public interface DrawContext {
+    method public androidx.compose.ui.graphics.Canvas getCanvas();
+    method public long getSize();
+    method public androidx.compose.ui.graphics.drawscope.DrawTransform getTransform();
+    method public void setSize(long size);
+    property public abstract androidx.compose.ui.graphics.Canvas canvas;
+    property public abstract long size;
+    property public abstract androidx.compose.ui.graphics.drawscope.DrawTransform transform;
+  }
+
+  @androidx.compose.ui.graphics.drawscope.DrawScopeMarker public interface DrawScope extends androidx.compose.ui.unit.Density {
+    method public void drawArc(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawArc(long color, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawCircle(androidx.compose.ui.graphics.Brush brush, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawCircle(long color, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public default void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode, optional int filterQuality);
+    method @Deprecated public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawLine(androidx.compose.ui.graphics.Brush brush, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawLine(long color, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawOval(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawOval(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, long color, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, androidx.compose.ui.graphics.Brush brush, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRect(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRect(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRoundRect(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional long cornerRadius, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRoundRect(long color, optional long topLeft, optional long size, optional long cornerRadius, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public default long getCenter();
+    method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public default long getSize();
+    property public default long center;
+    property public abstract androidx.compose.ui.graphics.drawscope.DrawContext drawContext;
+    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public default long size;
+    field public static final androidx.compose.ui.graphics.drawscope.DrawScope.Companion Companion;
+  }
+
+  public static final class DrawScope.Companion {
+    method public int getDefaultBlendMode();
+    method public int getDefaultFilterQuality();
+    property public final int DefaultBlendMode;
+    property public final int DefaultFilterQuality;
+  }
+
+  public final class DrawScopeKt {
+    method public static inline void clipPath(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Path path, optional int clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void clipRect(androidx.compose.ui.graphics.drawscope.DrawScope, optional float left, optional float top, optional float right, optional float bottom, optional int clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void drawIntoCanvas(androidx.compose.ui.graphics.drawscope.DrawScope, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, float inset, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, optional float horizontal, optional float vertical, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void rotate(androidx.compose.ui.graphics.drawscope.DrawScope, float degrees, optional long pivot, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void rotateRad(androidx.compose.ui.graphics.drawscope.DrawScope, float radians, optional long pivot, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void scale(androidx.compose.ui.graphics.drawscope.DrawScope, float scaleX, float scaleY, optional long pivot, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void scale(androidx.compose.ui.graphics.drawscope.DrawScope, float scale, optional long pivot, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void translate(androidx.compose.ui.graphics.drawscope.DrawScope, optional float left, optional float top, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void withTransform(androidx.compose.ui.graphics.drawscope.DrawScope, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawTransform,kotlin.Unit> transformBlock, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> drawBlock);
+  }
+
+  @kotlin.DslMarker public @interface DrawScopeMarker {
+  }
+
+  public abstract sealed class DrawStyle {
+  }
+
+  @androidx.compose.ui.graphics.drawscope.DrawScopeMarker public interface DrawTransform {
+    method public void clipPath(androidx.compose.ui.graphics.Path path, optional int clipOp);
+    method public void clipRect(optional float left, optional float top, optional float right, optional float bottom, optional int clipOp);
+    method public default long getCenter();
+    method public long getSize();
+    method public void inset(float left, float top, float right, float bottom);
+    method public void rotate(float degrees, optional long pivot);
+    method public void scale(float scaleX, float scaleY, optional long pivot);
+    method public void transform(float[] matrix);
+    method public void translate(optional float left, optional float top);
+    property public default long center;
+    property public abstract long size;
+  }
+
+  public final class DrawTransformKt {
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawTransform, optional float horizontal, optional float vertical);
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawTransform, float inset);
+    method public static inline void rotateRad(androidx.compose.ui.graphics.drawscope.DrawTransform, float radians, optional long pivot);
+    method public static inline void scale(androidx.compose.ui.graphics.drawscope.DrawTransform, float scale, optional long pivot);
+  }
+
+  public final class Fill extends androidx.compose.ui.graphics.drawscope.DrawStyle {
+    field public static final androidx.compose.ui.graphics.drawscope.Fill INSTANCE;
+  }
+
+  public final class Stroke extends androidx.compose.ui.graphics.drawscope.DrawStyle {
+    ctor public Stroke(optional float width, optional float miter, optional int cap, optional int join, optional androidx.compose.ui.graphics.PathEffect? pathEffect);
+    method public int getCap();
+    method public int getJoin();
+    method public float getMiter();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public float getWidth();
+    property public final int cap;
+    property public final int join;
+    property public final float miter;
+    property public final androidx.compose.ui.graphics.PathEffect? pathEffect;
+    property public final float width;
+    field public static final androidx.compose.ui.graphics.drawscope.Stroke.Companion Companion;
+    field public static final float DefaultMiter = 4.0f;
+    field public static final float HairlineWidth = 0.0f;
+  }
+
+  public static final class Stroke.Companion {
+    method public int getDefaultCap();
+    method public int getDefaultJoin();
+    property public final int DefaultCap;
+    property public final int DefaultJoin;
+  }
+
+}
+
+package androidx.compose.ui.graphics.painter {
+
+  public final class BitmapPainter extends androidx.compose.ui.graphics.painter.Painter {
+    ctor public BitmapPainter(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize);
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public long intrinsicSize;
+  }
+
+  public final class BitmapPainterKt {
+    method public static androidx.compose.ui.graphics.painter.BitmapPainter BitmapPainter(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional int filterQuality);
+  }
+
+  public final class BrushPainter extends androidx.compose.ui.graphics.painter.Painter {
+    ctor public BrushPainter(androidx.compose.ui.graphics.Brush brush);
+    method public androidx.compose.ui.graphics.Brush getBrush();
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public final androidx.compose.ui.graphics.Brush brush;
+    property public long intrinsicSize;
+  }
+
+  public final class ColorPainter extends androidx.compose.ui.graphics.painter.Painter {
+    ctor public ColorPainter(long color);
+    method public long getColor();
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public final long color;
+    property public long intrinsicSize;
+  }
+
+  public abstract class Painter {
+    ctor public Painter();
+    method protected boolean applyAlpha(float alpha);
+    method protected boolean applyColorFilter(androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method protected boolean applyLayoutDirection(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public final void draw(androidx.compose.ui.graphics.drawscope.DrawScope, long size, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method public abstract long getIntrinsicSize();
+    method protected abstract void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public abstract long intrinsicSize;
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector {
+
+  public final class PathBuilder {
+    ctor public PathBuilder();
+    method public androidx.compose.ui.graphics.vector.PathBuilder arcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float x1, float y1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder arcToRelative(float a, float b, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float dx1, float dy1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder close();
+    method public androidx.compose.ui.graphics.vector.PathBuilder curveTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public androidx.compose.ui.graphics.vector.PathBuilder curveToRelative(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getNodes();
+    method public androidx.compose.ui.graphics.vector.PathBuilder horizontalLineTo(float x);
+    method public androidx.compose.ui.graphics.vector.PathBuilder horizontalLineToRelative(float dx);
+    method public androidx.compose.ui.graphics.vector.PathBuilder lineTo(float x, float y);
+    method public androidx.compose.ui.graphics.vector.PathBuilder lineToRelative(float dx, float dy);
+    method public androidx.compose.ui.graphics.vector.PathBuilder moveTo(float x, float y);
+    method public androidx.compose.ui.graphics.vector.PathBuilder moveToRelative(float dx, float dy);
+    method public androidx.compose.ui.graphics.vector.PathBuilder quadTo(float x1, float y1, float x2, float y2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder quadToRelative(float dx1, float dy1, float dx2, float dy2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveCurveTo(float x1, float y1, float x2, float y2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveCurveToRelative(float dx1, float dy1, float dx2, float dy2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveQuadTo(float x1, float y1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveQuadToRelative(float dx1, float dy1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder verticalLineTo(float y);
+    method public androidx.compose.ui.graphics.vector.PathBuilder verticalLineToRelative(float dy);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class PathNode {
+    method public final boolean isCurve();
+    method public final boolean isQuad();
+    property public final boolean isCurve;
+    property public final boolean isQuad;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.ArcTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.ArcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartX, float arcStartY);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public boolean component4();
+    method public boolean component5();
+    method public float component6();
+    method public float component7();
+    method public androidx.compose.ui.graphics.vector.PathNode.ArcTo copy(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartX, float arcStartY);
+    method public float getArcStartX();
+    method public float getArcStartY();
+    method public float getHorizontalEllipseRadius();
+    method public float getTheta();
+    method public float getVerticalEllipseRadius();
+    method public boolean isMoreThanHalf();
+    method public boolean isPositiveArc();
+    property public final float arcStartX;
+    property public final float arcStartY;
+    property public final float horizontalEllipseRadius;
+    property public final boolean isMoreThanHalf;
+    property public final boolean isPositiveArc;
+    property public final float theta;
+    property public final float verticalEllipseRadius;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.Close extends androidx.compose.ui.graphics.vector.PathNode {
+    field public static final androidx.compose.ui.graphics.vector.PathNode.Close INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.CurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.CurveTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public float component5();
+    method public float component6();
+    method public androidx.compose.ui.graphics.vector.PathNode.CurveTo copy(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public float getX1();
+    method public float getX2();
+    method public float getX3();
+    method public float getY1();
+    method public float getY2();
+    method public float getY3();
+    property public final float x1;
+    property public final float x2;
+    property public final float x3;
+    property public final float y1;
+    property public final float y2;
+    property public final float y3;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.HorizontalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.HorizontalTo(float x);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.HorizontalTo copy(float x);
+    method public float getX();
+    property public final float x;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.LineTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.LineTo(float x, float y);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.LineTo copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.MoveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.MoveTo(float x, float y);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.MoveTo copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.QuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.QuadTo(float x1, float y1, float x2, float y2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.QuadTo copy(float x1, float y1, float x2, float y2);
+    method public float getX1();
+    method public float getX2();
+    method public float getY1();
+    method public float getY2();
+    property public final float x1;
+    property public final float x2;
+    property public final float y1;
+    property public final float y2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.ReflectiveCurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.ReflectiveCurveTo(float x1, float y1, float x2, float y2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.ReflectiveCurveTo copy(float x1, float y1, float x2, float y2);
+    method public float getX1();
+    method public float getX2();
+    method public float getY1();
+    method public float getY2();
+    property public final float x1;
+    property public final float x2;
+    property public final float y1;
+    property public final float y2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.ReflectiveQuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.ReflectiveQuadTo(float x, float y);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.ReflectiveQuadTo copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeArcTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeArcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartDx, float arcStartDy);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public boolean component4();
+    method public boolean component5();
+    method public float component6();
+    method public float component7();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeArcTo copy(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartDx, float arcStartDy);
+    method public float getArcStartDx();
+    method public float getArcStartDy();
+    method public float getHorizontalEllipseRadius();
+    method public float getTheta();
+    method public float getVerticalEllipseRadius();
+    method public boolean isMoreThanHalf();
+    method public boolean isPositiveArc();
+    property public final float arcStartDx;
+    property public final float arcStartDy;
+    property public final float horizontalEllipseRadius;
+    property public final boolean isMoreThanHalf;
+    property public final boolean isPositiveArc;
+    property public final float theta;
+    property public final float verticalEllipseRadius;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeCurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeCurveTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public float component5();
+    method public float component6();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeCurveTo copy(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public float getDx1();
+    method public float getDx2();
+    method public float getDx3();
+    method public float getDy1();
+    method public float getDy2();
+    method public float getDy3();
+    property public final float dx1;
+    property public final float dx2;
+    property public final float dx3;
+    property public final float dy1;
+    property public final float dy2;
+    property public final float dy3;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeHorizontalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeHorizontalTo(float dx);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeHorizontalTo copy(float dx);
+    method public float getDx();
+    property public final float dx;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeLineTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeLineTo(float dx, float dy);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeLineTo copy(float dx, float dy);
+    method public float getDx();
+    method public float getDy();
+    property public final float dx;
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeMoveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeMoveTo(float dx, float dy);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeMoveTo copy(float dx, float dy);
+    method public float getDx();
+    method public float getDy();
+    property public final float dx;
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeQuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeQuadTo(float dx1, float dy1, float dx2, float dy2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeQuadTo copy(float dx1, float dy1, float dx2, float dy2);
+    method public float getDx1();
+    method public float getDx2();
+    method public float getDy1();
+    method public float getDy2();
+    property public final float dx1;
+    property public final float dx2;
+    property public final float dy1;
+    property public final float dy2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeReflectiveCurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeReflectiveCurveTo(float dx1, float dy1, float dx2, float dy2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeReflectiveCurveTo copy(float dx1, float dy1, float dx2, float dy2);
+    method public float getDx1();
+    method public float getDx2();
+    method public float getDy1();
+    method public float getDy2();
+    property public final float dx1;
+    property public final float dx2;
+    property public final float dy1;
+    property public final float dy2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeReflectiveQuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeReflectiveQuadTo(float dx, float dy);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeReflectiveQuadTo copy(float dx, float dy);
+    method public float getDx();
+    method public float getDy();
+    property public final float dx;
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeVerticalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeVerticalTo(float dy);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeVerticalTo copy(float dy);
+    method public float getDy();
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.VerticalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.VerticalTo(float y);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.VerticalTo copy(float y);
+    method public float getY();
+    property public final float y;
+  }
+
+  public final class PathNodeKt {
+  }
+
+  public final class PathParser {
+    ctor public PathParser();
+    method public androidx.compose.ui.graphics.vector.PathParser addPathNodes(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> nodes);
+    method public void clear();
+    method public androidx.compose.ui.graphics.vector.PathParser parsePathString(String pathData);
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> toNodes();
+    method public androidx.compose.ui.graphics.Path toPath(optional androidx.compose.ui.graphics.Path target);
+  }
+
+}
+
diff --git a/compose/ui/ui-graphics/api/public_plus_experimental_current.txt b/compose/ui/ui-graphics/api/public_plus_experimental_current.txt
index ae319a1..4dea06e9 100644
--- a/compose/ui/ui-graphics/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-graphics/api/public_plus_experimental_current.txt
@@ -299,6 +299,12 @@
 
   @androidx.compose.runtime.Immutable public final inline class Color {
     ctor public Color();
+    method @androidx.compose.runtime.Stable public operator float component1();
+    method @androidx.compose.runtime.Stable public operator float component2();
+    method @androidx.compose.runtime.Stable public operator float component3();
+    method @androidx.compose.runtime.Stable public operator float component4();
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.graphics.colorspace.ColorSpace! component5();
+    method @androidx.compose.runtime.Stable public long copy(optional float alpha, optional float red, optional float green, optional float blue);
     method public long getValue();
     property public final long value;
   }
@@ -360,7 +366,10 @@
 
   public final inline class ColorMatrix {
     ctor public ColorMatrix();
+    method public inline operator float get(int row, int column);
     method public float[] getValues();
+    method public inline operator void set(int row, int column, float v);
+    method public operator void timesAssign(float[] colorMatrix);
     property public final float[] values;
   }
 
@@ -440,7 +449,10 @@
 
   public final inline class Matrix {
     ctor public Matrix();
+    method public inline operator float get(int row, int column);
     method public float[] getValues();
+    method public inline operator void set(int row, int column, float v);
+    method public operator void timesAssign(float[] m);
     property public final float[] values;
   }
 
@@ -536,6 +548,7 @@
   }
 
   public final class PaintKt {
+    method public static androidx.compose.ui.graphics.Paint! Paint();
     field public static final float DefaultAlpha = 1.0f;
   }
 
@@ -681,6 +694,7 @@
 
   public final class RectangleShapeKt {
     method public static androidx.compose.ui.graphics.Shape getRectangleShape();
+    property public static final androidx.compose.ui.graphics.Shape RectangleShape;
   }
 
   @androidx.compose.runtime.Immutable public abstract sealed class RenderEffect {
@@ -1098,7 +1112,7 @@
     method public void drawCircle(long color, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
     method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
     method public default void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode, optional int filterQuality);
-    method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method @Deprecated public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
     method public void drawLine(androidx.compose.ui.graphics.Brush brush, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
     method public void drawLine(long color, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
     method public void drawOval(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
@@ -1115,7 +1129,6 @@
     method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
     method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
     method public default long getSize();
-    method public long offsetSize(long, long offset);
     property public default long center;
     property public abstract androidx.compose.ui.graphics.drawscope.DrawContext drawContext;
     property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/ui/ui-graphics/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to compose/ui/ui-graphics/api/res-1.1.0-beta02.txt
diff --git a/compose/ui/ui-graphics/api/restricted_1.1.0-beta02.txt b/compose/ui/ui-graphics/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..ced5908
--- /dev/null
+++ b/compose/ui/ui-graphics/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,1627 @@
+// Signature format: 4.0
+package androidx.compose.ui.graphics {
+
+  public final class AndroidBlendMode_androidKt {
+    method public static boolean isSupported(int);
+  }
+
+  @kotlin.PublishedApi internal final class AndroidCanvas implements androidx.compose.ui.graphics.Canvas {
+    ctor public AndroidCanvas();
+    method public void clipPath(androidx.compose.ui.graphics.Path path, int clipOp);
+    method public void clipRect(float left, float top, float right, float bottom, int clipOp);
+    method public void concat(float[] matrix);
+    method public void disableZ();
+    method public void drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
+    method public void drawCircle(long center, float radius, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, long topLeftOffset, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImageRect(androidx.compose.ui.graphics.ImageBitmap image, long srcOffset, long srcSize, long dstOffset, long dstSize, androidx.compose.ui.graphics.Paint paint);
+    method public void drawLine(long p1, long p2, androidx.compose.ui.graphics.Paint paint);
+    method public void drawOval(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Paint paint);
+    method public void drawPoints(int pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRawPoints(int pointMode, float[] points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRect(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY, androidx.compose.ui.graphics.Paint paint);
+    method public void drawVertices(androidx.compose.ui.graphics.Vertices vertices, int blendMode, androidx.compose.ui.graphics.Paint paint);
+    method public void enableZ();
+    method public void restore();
+    method public void rotate(float degrees);
+    method public void save();
+    method public void saveLayer(androidx.compose.ui.geometry.Rect bounds, androidx.compose.ui.graphics.Paint paint);
+    method public void scale(float sx, float sy);
+    method public void skew(float sx, float sy);
+    method public android.graphics.Region.Op toRegionOp(int);
+    method public void translate(float dx, float dy);
+    field @kotlin.PublishedApi internal android.graphics.Canvas internalCanvas;
+  }
+
+  public final class AndroidCanvas_androidKt {
+    method public static androidx.compose.ui.graphics.Canvas Canvas(android.graphics.Canvas c);
+    method public static android.graphics.Canvas getNativeCanvas(androidx.compose.ui.graphics.Canvas);
+  }
+
+  public final class AndroidColorFilter_androidKt {
+    method public static android.graphics.ColorFilter asAndroidColorFilter(androidx.compose.ui.graphics.ColorFilter);
+    method public static androidx.compose.ui.graphics.ColorFilter asComposeColorFilter(android.graphics.ColorFilter);
+  }
+
+  public final class AndroidImageBitmap_androidKt {
+    method public static android.graphics.Bitmap asAndroidBitmap(androidx.compose.ui.graphics.ImageBitmap);
+    method public static androidx.compose.ui.graphics.ImageBitmap asImageBitmap(android.graphics.Bitmap);
+  }
+
+  public final class AndroidMatrixConversions_androidKt {
+    method public static void setFrom(float[], android.graphics.Matrix matrix);
+    method public static void setFrom(android.graphics.Matrix, float[] matrix);
+  }
+
+  public final class AndroidPaint implements androidx.compose.ui.graphics.Paint {
+    ctor public AndroidPaint();
+    method public android.graphics.Paint asFrameworkPaint();
+    method public float getAlpha();
+    method public int getBlendMode();
+    method public long getColor();
+    method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
+    method public int getFilterQuality();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public android.graphics.Shader? getShader();
+    method public int getStrokeCap();
+    method public int getStrokeJoin();
+    method public float getStrokeMiterLimit();
+    method public float getStrokeWidth();
+    method public int getStyle();
+    method public boolean isAntiAlias();
+    method public void setAlpha(float value);
+    method public void setAntiAlias(boolean value);
+    method public void setBlendMode(int value);
+    method public void setColor(long color);
+    method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? value);
+    method public void setFilterQuality(int value);
+    method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? value);
+    method public void setShader(android.graphics.Shader? value);
+    method public void setStrokeCap(int value);
+    method public void setStrokeJoin(int value);
+    method public void setStrokeMiterLimit(float value);
+    method public void setStrokeWidth(float value);
+    method public void setStyle(int value);
+    property public float alpha;
+    property public int blendMode;
+    property public long color;
+    property public androidx.compose.ui.graphics.ColorFilter? colorFilter;
+    property public int filterQuality;
+    property public boolean isAntiAlias;
+    property public androidx.compose.ui.graphics.PathEffect? pathEffect;
+    property public android.graphics.Shader? shader;
+    property public int strokeCap;
+    property public int strokeJoin;
+    property public float strokeMiterLimit;
+    property public float strokeWidth;
+    property public int style;
+  }
+
+  public final class AndroidPaint_androidKt {
+    method public static androidx.compose.ui.graphics.Paint Paint();
+  }
+
+  public final class AndroidPath implements androidx.compose.ui.graphics.Path {
+    ctor public AndroidPath(optional android.graphics.Path internalPath);
+    method public void addArc(androidx.compose.ui.geometry.Rect oval, float startAngleDegrees, float sweepAngleDegrees);
+    method public void addArcRad(androidx.compose.ui.geometry.Rect oval, float startAngleRadians, float sweepAngleRadians);
+    method public void addOval(androidx.compose.ui.geometry.Rect oval);
+    method public void addPath(androidx.compose.ui.graphics.Path path, long offset);
+    method public void addRect(androidx.compose.ui.geometry.Rect rect);
+    method public void addRoundRect(androidx.compose.ui.geometry.RoundRect roundRect);
+    method public void arcTo(androidx.compose.ui.geometry.Rect rect, float startAngleDegrees, float sweepAngleDegrees, boolean forceMoveTo);
+    method public void close();
+    method public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public int getFillType();
+    method public android.graphics.Path getInternalPath();
+    method public boolean isConvex();
+    method public boolean isEmpty();
+    method public void lineTo(float x, float y);
+    method public void moveTo(float x, float y);
+    method public boolean op(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, int operation);
+    method public void quadraticBezierTo(float x1, float y1, float x2, float y2);
+    method public void relativeCubicTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public void relativeLineTo(float dx, float dy);
+    method public void relativeMoveTo(float dx, float dy);
+    method public void relativeQuadraticBezierTo(float dx1, float dy1, float dx2, float dy2);
+    method public void reset();
+    method public void setFillType(int value);
+    method public void translate(long offset);
+    property public int fillType;
+    property public final android.graphics.Path internalPath;
+    property public boolean isConvex;
+    property public boolean isEmpty;
+  }
+
+  public final class AndroidPathEffect_androidKt {
+    method public static android.graphics.PathEffect asAndroidPathEffect(androidx.compose.ui.graphics.PathEffect);
+    method public static androidx.compose.ui.graphics.PathEffect toComposePathEffect(android.graphics.PathEffect);
+  }
+
+  public final class AndroidPathMeasure implements androidx.compose.ui.graphics.PathMeasure {
+    method public float getLength();
+    method public boolean getSegment(float startDistance, float stopDistance, androidx.compose.ui.graphics.Path destination, boolean startWithMoveTo);
+    method public void setPath(androidx.compose.ui.graphics.Path? path, boolean forceClosed);
+    property public float length;
+  }
+
+  public final class AndroidPathMeasure_androidKt {
+    method public static androidx.compose.ui.graphics.PathMeasure PathMeasure();
+  }
+
+  public final class AndroidPath_androidKt {
+    method public static androidx.compose.ui.graphics.Path Path();
+    method public static inline android.graphics.Path asAndroidPath(androidx.compose.ui.graphics.Path);
+    method public static androidx.compose.ui.graphics.Path asComposePath(android.graphics.Path);
+  }
+
+  public final class AndroidRenderEffect_androidKt {
+    method public static androidx.compose.ui.graphics.RenderEffect asComposeRenderEffect(android.graphics.RenderEffect);
+  }
+
+  public final class AndroidShader_androidKt {
+  }
+
+  public final class AndroidTileMode_androidKt {
+    method public static boolean isSupported(int);
+    method public static android.graphics.Shader.TileMode toAndroidTileMode(int);
+    method public static int toComposeTileMode(android.graphics.Shader.TileMode);
+  }
+
+  public final class AndroidVertexMode_androidKt {
+    method public static android.graphics.Canvas.VertexMode toAndroidVertexMode(int);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class BlendMode {
+    ctor public BlendMode();
+  }
+
+  public static final class BlendMode.Companion {
+    method public int getClear();
+    method public int getColor();
+    method public int getColorBurn();
+    method public int getColorDodge();
+    method public int getDarken();
+    method public int getDifference();
+    method public int getDst();
+    method public int getDstAtop();
+    method public int getDstIn();
+    method public int getDstOut();
+    method public int getDstOver();
+    method public int getExclusion();
+    method public int getHardlight();
+    method public int getHue();
+    method public int getLighten();
+    method public int getLuminosity();
+    method public int getModulate();
+    method public int getMultiply();
+    method public int getOverlay();
+    method public int getPlus();
+    method public int getSaturation();
+    method public int getScreen();
+    method public int getSoftlight();
+    method public int getSrc();
+    method public int getSrcAtop();
+    method public int getSrcIn();
+    method public int getSrcOut();
+    method public int getSrcOver();
+    method public int getXor();
+    property public final int Clear;
+    property public final int Color;
+    property public final int ColorBurn;
+    property public final int ColorDodge;
+    property public final int Darken;
+    property public final int Difference;
+    property public final int Dst;
+    property public final int DstAtop;
+    property public final int DstIn;
+    property public final int DstOut;
+    property public final int DstOver;
+    property public final int Exclusion;
+    property public final int Hardlight;
+    property public final int Hue;
+    property public final int Lighten;
+    property public final int Luminosity;
+    property public final int Modulate;
+    property public final int Multiply;
+    property public final int Overlay;
+    property public final int Plus;
+    property public final int Saturation;
+    property public final int Screen;
+    property public final int Softlight;
+    property public final int Src;
+    property public final int SrcAtop;
+    property public final int SrcIn;
+    property public final int SrcOut;
+    property public final int SrcOver;
+    property public final int Xor;
+  }
+
+  @androidx.compose.runtime.Immutable public final class BlurEffect extends androidx.compose.ui.graphics.RenderEffect {
+    ctor public BlurEffect(androidx.compose.ui.graphics.RenderEffect? renderEffect, float radiusX, float radiusY, int edgeTreatment);
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) protected android.graphics.RenderEffect createRenderEffect();
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class Brush {
+    method public abstract void applyTo(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public long getIntrinsicSize();
+    property public long intrinsicSize;
+    field public static final androidx.compose.ui.graphics.Brush.Companion Companion;
+  }
+
+  public static final class Brush.Companion {
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startX, optional float endX, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush horizontalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startX, optional float endX, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long start, optional long end, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush linearGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long start, optional long end, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center, optional float radius, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush radialGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center, optional float radius, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional long center);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush sweepGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional long center);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient(java.util.List<androidx.compose.ui.graphics.Color> colors, optional float startY, optional float endY, optional int tileMode);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.Brush verticalGradient(kotlin.Pair<java.lang.Float,androidx.compose.ui.graphics.Color>![] colorStops, optional float startY, optional float endY, optional int tileMode);
+  }
+
+  public final class BrushKt {
+    method public static androidx.compose.ui.graphics.ShaderBrush ShaderBrush(android.graphics.Shader shader);
+  }
+
+  public interface Canvas {
+    method public void clipPath(androidx.compose.ui.graphics.Path path, optional int clipOp);
+    method public default void clipRect(androidx.compose.ui.geometry.Rect rect, optional int clipOp);
+    method public void clipRect(float left, float top, float right, float bottom, optional int clipOp);
+    method public void concat(float[] matrix);
+    method public void disableZ();
+    method public default void drawArc(androidx.compose.ui.geometry.Rect rect, float startAngle, float sweepAngle, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
+    method public void drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
+    method public default void drawArcRad(androidx.compose.ui.geometry.Rect rect, float startAngleRad, float sweepAngleRad, boolean useCenter, androidx.compose.ui.graphics.Paint paint);
+    method public void drawCircle(long center, float radius, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, long topLeftOffset, androidx.compose.ui.graphics.Paint paint);
+    method public void drawImageRect(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, androidx.compose.ui.graphics.Paint paint);
+    method public void drawLine(long p1, long p2, androidx.compose.ui.graphics.Paint paint);
+    method public default void drawOval(androidx.compose.ui.geometry.Rect rect, androidx.compose.ui.graphics.Paint paint);
+    method public void drawOval(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Paint paint);
+    method public void drawPoints(int pointMode, java.util.List<androidx.compose.ui.geometry.Offset> points, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRawPoints(int pointMode, float[] points, androidx.compose.ui.graphics.Paint paint);
+    method public default void drawRect(androidx.compose.ui.geometry.Rect rect, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRect(float left, float top, float right, float bottom, androidx.compose.ui.graphics.Paint paint);
+    method public void drawRoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY, androidx.compose.ui.graphics.Paint paint);
+    method public void drawVertices(androidx.compose.ui.graphics.Vertices vertices, int blendMode, androidx.compose.ui.graphics.Paint paint);
+    method public void enableZ();
+    method public void restore();
+    method public void rotate(float degrees);
+    method public void save();
+    method public void saveLayer(androidx.compose.ui.geometry.Rect bounds, androidx.compose.ui.graphics.Paint paint);
+    method public void scale(float sx, optional float sy);
+    method public void skew(float sx, float sy);
+    method public default void skewRad(float sxRad, float syRad);
+    method public void translate(float dx, float dy);
+  }
+
+  public final class CanvasHolder {
+    ctor public CanvasHolder();
+    method public inline void drawInto(android.graphics.Canvas targetCanvas, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Canvas,kotlin.Unit> block);
+    field @kotlin.PublishedApi internal final androidx.compose.ui.graphics.AndroidCanvas androidCanvas;
+  }
+
+  public final class CanvasKt {
+    method public static androidx.compose.ui.graphics.Canvas Canvas(androidx.compose.ui.graphics.ImageBitmap image);
+    method public static void rotate(androidx.compose.ui.graphics.Canvas, float degrees, float pivotX, float pivotY);
+    method public static void rotateRad(androidx.compose.ui.graphics.Canvas, float radians, optional float pivotX, optional float pivotY);
+    method public static void scale(androidx.compose.ui.graphics.Canvas, float sx, optional float sy, float pivotX, float pivotY);
+    method public static inline void withSave(androidx.compose.ui.graphics.Canvas, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+    method public static inline void withSaveLayer(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.geometry.Rect bounds, androidx.compose.ui.graphics.Paint paint, kotlin.jvm.functions.Function0<kotlin.Unit> block);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class ClipOp {
+    ctor public ClipOp();
+  }
+
+  public static final class ClipOp.Companion {
+    method public int getDifference();
+    method public int getIntersect();
+    property public final int Difference;
+    property public final int Intersect;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Color {
+    ctor public Color();
+    method @androidx.compose.runtime.Stable public operator float component1();
+    method @androidx.compose.runtime.Stable public operator float component2();
+    method @androidx.compose.runtime.Stable public operator float component3();
+    method @androidx.compose.runtime.Stable public operator float component4();
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.graphics.colorspace.ColorSpace! component5();
+    method @androidx.compose.runtime.Stable public long copy(optional float alpha, optional float red, optional float green, optional float blue);
+    method public long getValue();
+    property public final long value;
+  }
+
+  public static final class Color.Companion {
+    method public long getBlack();
+    method public long getBlue();
+    method public long getCyan();
+    method public long getDarkGray();
+    method public long getGray();
+    method public long getGreen();
+    method public long getLightGray();
+    method public long getMagenta();
+    method public long getRed();
+    method public long getTransparent();
+    method public long getUnspecified();
+    method public long getWhite();
+    method public long getYellow();
+    property public final long Black;
+    property public final long Blue;
+    property public final long Cyan;
+    property public final long DarkGray;
+    property public final long Gray;
+    property public final long Green;
+    property public final long LightGray;
+    property public final long Magenta;
+    property public final long Red;
+    property public final long Transparent;
+    property public final long Unspecified;
+    property public final long White;
+    property public final long Yellow;
+  }
+
+  @androidx.compose.runtime.Immutable public final class ColorFilter {
+    field public static final androidx.compose.ui.graphics.ColorFilter.Companion Companion;
+  }
+
+  public static final class ColorFilter.Companion {
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter colorMatrix(float[] colorMatrix);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter lighting(long multiply, long add);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.graphics.ColorFilter tint(long color, optional int blendMode);
+  }
+
+  public final class ColorKt {
+    method @androidx.compose.runtime.Stable public static long Color(float red, float green, float blue, optional float alpha, optional androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
+    method @androidx.compose.runtime.Stable public static long Color(int color);
+    method @androidx.compose.runtime.Stable public static long Color(long color);
+    method @androidx.compose.runtime.Stable public static long Color(int red, int green, int blue, optional int alpha);
+    method @androidx.compose.runtime.Stable public static long compositeOver(long, long background);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static float luminance(long);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.graphics.Color> block);
+    method @androidx.compose.runtime.Stable public static int toArgb(long);
+  }
+
+  public final inline class ColorMatrix {
+    ctor public ColorMatrix();
+    method public inline operator float get(int row, int column);
+    method public float[] getValues();
+    method public inline operator void set(int row, int column, float v);
+    method public operator void timesAssign(float[] colorMatrix);
+    property public final float[] values;
+  }
+
+  public final class DegreesKt {
+    method @kotlin.PublishedApi internal static float degrees(float radians);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class FilterQuality {
+    ctor public FilterQuality();
+    method public int getValue();
+    property public final int value;
+  }
+
+  public static final class FilterQuality.Companion {
+    method public int getHigh();
+    method public int getLow();
+    method public int getMedium();
+    method public int getNone();
+    property public final int High;
+    property public final int Low;
+    property public final int Medium;
+    property public final int None;
+  }
+
+  public final class Float16Kt {
+  }
+
+  public interface ImageBitmap {
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getColorSpace();
+    method public int getConfig();
+    method public boolean getHasAlpha();
+    method public int getHeight();
+    method public int getWidth();
+    method public void prepareToDraw();
+    method public void readPixels(int[] buffer, optional int startX, optional int startY, optional int width, optional int height, optional int bufferOffset, optional int stride);
+    property public abstract androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace;
+    property public abstract int config;
+    property public abstract boolean hasAlpha;
+    property public abstract int height;
+    property public abstract int width;
+    field public static final androidx.compose.ui.graphics.ImageBitmap.Companion Companion;
+  }
+
+  public static final class ImageBitmap.Companion {
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class ImageBitmapConfig {
+    ctor public ImageBitmapConfig();
+    method public int getValue();
+    property public final int value;
+  }
+
+  public static final class ImageBitmapConfig.Companion {
+    method public int getAlpha8();
+    method public int getArgb8888();
+    method public int getF16();
+    method public int getGpu();
+    method public int getRgb565();
+    property public final int Alpha8;
+    property public final int Argb8888;
+    property public final int F16;
+    property public final int Gpu;
+    property public final int Rgb565;
+  }
+
+  public final class ImageBitmapKt {
+    method public static androidx.compose.ui.graphics.ImageBitmap ImageBitmap(int width, int height, optional int config, optional boolean hasAlpha, optional androidx.compose.ui.graphics.colorspace.ColorSpace colorSpace);
+    method public static androidx.compose.ui.graphics.PixelMap toPixelMap(androidx.compose.ui.graphics.ImageBitmap, optional int startX, optional int startY, optional int width, optional int height, optional int[] buffer, optional int bufferOffset, optional int stride);
+  }
+
+  @androidx.compose.runtime.Immutable public final class LinearGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader(long size);
+    property public long intrinsicSize;
+  }
+
+  public final inline class Matrix {
+    ctor public Matrix();
+    method public inline operator float get(int row, int column);
+    method public float[] getValues();
+    method public inline operator void set(int row, int column, float v);
+    method public operator void timesAssign(float[] m);
+    property public final float[] values;
+  }
+
+  public static final class Matrix.Companion {
+  }
+
+  public final class MatrixKt {
+    method public static boolean isIdentity(float[]);
+  }
+
+  @androidx.compose.runtime.Immutable public final class OffsetEffect extends androidx.compose.ui.graphics.RenderEffect {
+    ctor public OffsetEffect(androidx.compose.ui.graphics.RenderEffect? renderEffect, long offset);
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) protected android.graphics.RenderEffect createRenderEffect();
+  }
+
+  public abstract sealed class Outline {
+    method public abstract androidx.compose.ui.geometry.Rect getBounds();
+    property public abstract androidx.compose.ui.geometry.Rect bounds;
+  }
+
+  public static final class Outline.Generic extends androidx.compose.ui.graphics.Outline {
+    ctor public Outline.Generic(androidx.compose.ui.graphics.Path path);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public androidx.compose.ui.graphics.Path getPath();
+    property public androidx.compose.ui.geometry.Rect bounds;
+    property public final androidx.compose.ui.graphics.Path path;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class Outline.Rectangle extends androidx.compose.ui.graphics.Outline {
+    ctor public Outline.Rectangle(androidx.compose.ui.geometry.Rect rect);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public androidx.compose.ui.geometry.Rect getRect();
+    property public androidx.compose.ui.geometry.Rect bounds;
+    property public final androidx.compose.ui.geometry.Rect rect;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class Outline.Rounded extends androidx.compose.ui.graphics.Outline {
+    ctor public Outline.Rounded(androidx.compose.ui.geometry.RoundRect roundRect);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public androidx.compose.ui.geometry.RoundRect getRoundRect();
+    property public androidx.compose.ui.geometry.Rect bounds;
+    property public final androidx.compose.ui.geometry.RoundRect roundRect;
+  }
+
+  public final class OutlineKt {
+    method public static void addOutline(androidx.compose.ui.graphics.Path, androidx.compose.ui.graphics.Outline outline);
+    method public static void drawOutline(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public static void drawOutline(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public static void drawOutline(androidx.compose.ui.graphics.Canvas, androidx.compose.ui.graphics.Outline outline, androidx.compose.ui.graphics.Paint paint);
+  }
+
+  public interface Paint {
+    method public android.graphics.Paint asFrameworkPaint();
+    method public float getAlpha();
+    method public int getBlendMode();
+    method public long getColor();
+    method public androidx.compose.ui.graphics.ColorFilter? getColorFilter();
+    method public int getFilterQuality();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public android.graphics.Shader? getShader();
+    method public int getStrokeCap();
+    method public int getStrokeJoin();
+    method public float getStrokeMiterLimit();
+    method public float getStrokeWidth();
+    method public int getStyle();
+    method public boolean isAntiAlias();
+    method public void setAlpha(float alpha);
+    method public void setAntiAlias(boolean isAntiAlias);
+    method public void setBlendMode(int blendMode);
+    method public void setColor(long color);
+    method public void setColorFilter(androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method public void setFilterQuality(int filterQuality);
+    method public void setPathEffect(androidx.compose.ui.graphics.PathEffect? pathEffect);
+    method public void setShader(android.graphics.Shader? shader);
+    method public void setStrokeCap(int strokeCap);
+    method public void setStrokeJoin(int strokeJoin);
+    method public void setStrokeMiterLimit(float strokeMiterLimit);
+    method public void setStrokeWidth(float strokeWidth);
+    method public void setStyle(int style);
+    property public abstract float alpha;
+    property public abstract int blendMode;
+    property public abstract long color;
+    property public abstract androidx.compose.ui.graphics.ColorFilter? colorFilter;
+    property public abstract int filterQuality;
+    property public abstract boolean isAntiAlias;
+    property public abstract androidx.compose.ui.graphics.PathEffect? pathEffect;
+    property public abstract android.graphics.Shader? shader;
+    property public abstract int strokeCap;
+    property public abstract int strokeJoin;
+    property public abstract float strokeMiterLimit;
+    property public abstract float strokeWidth;
+    property public abstract int style;
+  }
+
+  public final class PaintKt {
+    method public static androidx.compose.ui.graphics.Paint! Paint();
+    field public static final float DefaultAlpha = 1.0f;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class PaintingStyle {
+    ctor public PaintingStyle();
+  }
+
+  public static final class PaintingStyle.Companion {
+    method public int getFill();
+    method public int getStroke();
+    property public final int Fill;
+    property public final int Stroke;
+  }
+
+  public interface Path {
+    method public void addArc(androidx.compose.ui.geometry.Rect oval, float startAngleDegrees, float sweepAngleDegrees);
+    method public void addArcRad(androidx.compose.ui.geometry.Rect oval, float startAngleRadians, float sweepAngleRadians);
+    method public void addOval(androidx.compose.ui.geometry.Rect oval);
+    method public void addPath(androidx.compose.ui.graphics.Path path, optional long offset);
+    method public void addRect(androidx.compose.ui.geometry.Rect rect);
+    method public void addRoundRect(androidx.compose.ui.geometry.RoundRect roundRect);
+    method public void arcTo(androidx.compose.ui.geometry.Rect rect, float startAngleDegrees, float sweepAngleDegrees, boolean forceMoveTo);
+    method public default void arcToRad(androidx.compose.ui.geometry.Rect rect, float startAngleRadians, float sweepAngleRadians, boolean forceMoveTo);
+    method public void close();
+    method public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public androidx.compose.ui.geometry.Rect getBounds();
+    method public int getFillType();
+    method public boolean isConvex();
+    method public boolean isEmpty();
+    method public void lineTo(float x, float y);
+    method public void moveTo(float x, float y);
+    method public boolean op(androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2, int operation);
+    method public void quadraticBezierTo(float x1, float y1, float x2, float y2);
+    method public void relativeCubicTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public void relativeLineTo(float dx, float dy);
+    method public void relativeMoveTo(float dx, float dy);
+    method public void relativeQuadraticBezierTo(float dx1, float dy1, float dx2, float dy2);
+    method public void reset();
+    method public void setFillType(int fillType);
+    method public void translate(long offset);
+    property public abstract int fillType;
+    property public abstract boolean isConvex;
+    property public abstract boolean isEmpty;
+    field public static final androidx.compose.ui.graphics.Path.Companion Companion;
+  }
+
+  public static final class Path.Companion {
+    method public androidx.compose.ui.graphics.Path combine(int operation, androidx.compose.ui.graphics.Path path1, androidx.compose.ui.graphics.Path path2);
+  }
+
+  public interface PathEffect {
+    field public static final androidx.compose.ui.graphics.PathEffect.Companion Companion;
+  }
+
+  public static final class PathEffect.Companion {
+    method public androidx.compose.ui.graphics.PathEffect chainPathEffect(androidx.compose.ui.graphics.PathEffect outer, androidx.compose.ui.graphics.PathEffect inner);
+    method public androidx.compose.ui.graphics.PathEffect cornerPathEffect(float radius);
+    method public androidx.compose.ui.graphics.PathEffect dashPathEffect(float[] intervals, optional float phase);
+    method public androidx.compose.ui.graphics.PathEffect stampedPathEffect(androidx.compose.ui.graphics.Path shape, float advance, float phase, int style);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class PathFillType {
+    ctor public PathFillType();
+  }
+
+  public static final class PathFillType.Companion {
+    method public int getEvenOdd();
+    method public int getNonZero();
+    property public final int EvenOdd;
+    property public final int NonZero;
+  }
+
+  public interface PathMeasure {
+    method public float getLength();
+    method public boolean getSegment(float startDistance, float stopDistance, androidx.compose.ui.graphics.Path destination, optional boolean startWithMoveTo);
+    method public void setPath(androidx.compose.ui.graphics.Path? path, boolean forceClosed);
+    property public abstract float length;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class PathOperation {
+    ctor public PathOperation();
+  }
+
+  public static final class PathOperation.Companion {
+    method public int getDifference();
+    method public int getIntersect();
+    method public int getReverseDifference();
+    method public int getUnion();
+    method public int getXor();
+    property public final int Difference;
+    property public final int Intersect;
+    property public final int ReverseDifference;
+    property public final int Union;
+    property public final int Xor;
+  }
+
+  public final class PathOperationKt {
+    method @Deprecated public static int getDifference(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getIntersect(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getReverseDifference(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getUnion(androidx.compose.ui.graphics.PathOperation.Companion);
+    method @Deprecated public static int getXor(androidx.compose.ui.graphics.PathOperation.Companion);
+  }
+
+  public final class PixelMap {
+    ctor public PixelMap(int[] buffer, int width, int height, int bufferOffset, int stride);
+    method public operator long get(int x, int y);
+    method public int[] getBuffer();
+    method public int getBufferOffset();
+    method public int getHeight();
+    method public int getStride();
+    method public int getWidth();
+    property public final int[] buffer;
+    property public final int bufferOffset;
+    property public final int height;
+    property public final int stride;
+    property public final int width;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class PointMode {
+    ctor public PointMode();
+  }
+
+  public static final class PointMode.Companion {
+    method public int getLines();
+    method public int getPoints();
+    method public int getPolygon();
+    property public final int Lines;
+    property public final int Points;
+    property public final int Polygon;
+  }
+
+  @androidx.compose.runtime.Immutable public final class RadialGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader(long size);
+    property public long intrinsicSize;
+  }
+
+  public final class RectHelper_androidKt {
+    method public static android.graphics.Rect toAndroidRect(androidx.compose.ui.geometry.Rect);
+    method public static android.graphics.RectF toAndroidRectF(androidx.compose.ui.geometry.Rect);
+    method public static androidx.compose.ui.geometry.Rect toComposeRect(android.graphics.Rect);
+  }
+
+  public final class RectangleShapeKt {
+    method public static androidx.compose.ui.graphics.Shape getRectangleShape();
+    property public static final androidx.compose.ui.graphics.Shape RectangleShape;
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class RenderEffect {
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) public final android.graphics.RenderEffect asAndroidRenderEffect();
+    method @RequiresApi(android.os.Build.VERSION_CODES.S) protected abstract android.graphics.RenderEffect createRenderEffect();
+    method public boolean isSupported();
+  }
+
+  public final class RenderEffectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.graphics.BlurEffect BlurEffect(float radiusX, float radiusY, optional int edgeTreatment);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.graphics.OffsetEffect OffsetEffect(float offsetX, float offsetY);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract class ShaderBrush extends androidx.compose.ui.graphics.Brush {
+    ctor public ShaderBrush();
+    method public final void applyTo(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public abstract android.graphics.Shader createShader(long size);
+  }
+
+  public final class ShaderKt {
+    method public static android.graphics.Shader ImageShader(androidx.compose.ui.graphics.ImageBitmap image, optional int tileModeX, optional int tileModeY);
+    method public static android.graphics.Shader LinearGradientShader(long from, long to, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
+    method public static android.graphics.Shader RadialGradientShader(long center, float radius, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops, optional int tileMode);
+    method public static android.graphics.Shader SweepGradientShader(long center, java.util.List<androidx.compose.ui.graphics.Color> colors, optional java.util.List<java.lang.Float>? colorStops);
+  }
+
+  @androidx.compose.runtime.Immutable public final class Shadow {
+    ctor public Shadow(optional @androidx.compose.runtime.Stable long color, optional @androidx.compose.runtime.Stable long offset, optional @androidx.compose.runtime.Stable float blurRadius);
+    method public androidx.compose.ui.graphics.Shadow copy(optional long color, optional long offset, optional float blurRadius);
+    method public float getBlurRadius();
+    method public long getColor();
+    method public long getOffset();
+    property public final float blurRadius;
+    property public final long color;
+    property public final long offset;
+    field public static final androidx.compose.ui.graphics.Shadow.Companion Companion;
+  }
+
+  public static final class Shadow.Companion {
+    method public androidx.compose.ui.graphics.Shadow getNone();
+    property public final androidx.compose.ui.graphics.Shadow None;
+  }
+
+  public final class ShadowKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.graphics.Shadow lerp(androidx.compose.ui.graphics.Shadow start, androidx.compose.ui.graphics.Shadow stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public interface Shape {
+    method public androidx.compose.ui.graphics.Outline createOutline(long size, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.unit.Density density);
+  }
+
+  @androidx.compose.runtime.Immutable public final class SolidColor extends androidx.compose.ui.graphics.Brush {
+    ctor public SolidColor(long value);
+    method public void applyTo(long size, androidx.compose.ui.graphics.Paint p, float alpha);
+    method public long getValue();
+    property public final long value;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class StampedPathEffectStyle {
+    ctor public StampedPathEffectStyle();
+  }
+
+  public static final class StampedPathEffectStyle.Companion {
+    method public int getMorph();
+    method public int getRotate();
+    method public int getTranslate();
+    property public final int Morph;
+    property public final int Rotate;
+    property public final int Translate;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class StrokeCap {
+    ctor public StrokeCap();
+  }
+
+  public static final class StrokeCap.Companion {
+    method public int getButt();
+    method public int getRound();
+    method public int getSquare();
+    property public final int Butt;
+    property public final int Round;
+    property public final int Square;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class StrokeJoin {
+    ctor public StrokeJoin();
+  }
+
+  public static final class StrokeJoin.Companion {
+    method public int getBevel();
+    method public int getMiter();
+    method public int getRound();
+    property public final int Bevel;
+    property public final int Miter;
+    property public final int Round;
+  }
+
+  @androidx.compose.runtime.Immutable public final class SweepGradient extends androidx.compose.ui.graphics.ShaderBrush {
+    method public android.graphics.Shader createShader(long size);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class TileMode {
+    ctor public TileMode();
+  }
+
+  public static final class TileMode.Companion {
+    method public int getClamp();
+    method public int getDecal();
+    method public int getMirror();
+    method public int getRepeated();
+    property public final int Clamp;
+    property public final int Decal;
+    property public final int Mirror;
+    property public final int Repeated;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class VertexMode {
+    ctor public VertexMode();
+  }
+
+  public static final class VertexMode.Companion {
+    method public int getTriangleFan();
+    method public int getTriangleStrip();
+    method public int getTriangles();
+    property public final int TriangleFan;
+    property public final int TriangleStrip;
+    property public final int Triangles;
+  }
+
+  public final class Vertices {
+    ctor public Vertices(int vertexMode, java.util.List<androidx.compose.ui.geometry.Offset> positions, java.util.List<androidx.compose.ui.geometry.Offset> textureCoordinates, java.util.List<androidx.compose.ui.graphics.Color> colors, java.util.List<java.lang.Integer> indices);
+    method public int[] getColors();
+    method public short[] getIndices();
+    method public float[] getPositions();
+    method public float[] getTextureCoordinates();
+    method public int getVertexMode();
+    property public final int[] colors;
+    property public final short[] indices;
+    property public final float[] positions;
+    property public final float[] textureCoordinates;
+    property public final int vertexMode;
+  }
+
+}
+
+package androidx.compose.ui.graphics.colorspace {
+
+  public abstract class Adaptation {
+    field public static final androidx.compose.ui.graphics.colorspace.Adaptation.Companion Companion;
+  }
+
+  public static final class Adaptation.Companion {
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getBradford();
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getCiecat02();
+    method public androidx.compose.ui.graphics.colorspace.Adaptation getVonKries();
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation Bradford;
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation Ciecat02;
+    property public final androidx.compose.ui.graphics.colorspace.Adaptation VonKries;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class ColorModel {
+    ctor public ColorModel();
+  }
+
+  public static final class ColorModel.Companion {
+    method public long getCmyk();
+    method public long getLab();
+    method public long getRgb();
+    method public long getXyz();
+    property public final long Cmyk;
+    property public final long Lab;
+    property public final long Rgb;
+    property public final long Xyz;
+  }
+
+  public abstract class ColorSpace {
+    ctor public ColorSpace(String name, long model);
+    method public final float[] fromXyz(float x, float y, float z);
+    method public abstract float[] fromXyz(float[] v);
+    method public final int getComponentCount();
+    method public abstract float getMaxValue(int component);
+    method public abstract float getMinValue(int component);
+    method public final long getModel();
+    method public final String getName();
+    method public boolean isSrgb();
+    method public abstract boolean isWideGamut();
+    method public final float[] toXyz(float r, float g, float b);
+    method public abstract float[] toXyz(float[] v);
+    property public final int componentCount;
+    property public boolean isSrgb;
+    property public abstract boolean isWideGamut;
+    property public final long model;
+    property public final String name;
+  }
+
+  public final class ColorSpaceKt {
+    method public static androidx.compose.ui.graphics.colorspace.ColorSpace adapt(androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, optional androidx.compose.ui.graphics.colorspace.Adaptation adaptation);
+    method public static androidx.compose.ui.graphics.colorspace.ColorSpace adapt(androidx.compose.ui.graphics.colorspace.ColorSpace, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint);
+    method public static androidx.compose.ui.graphics.colorspace.Connector connect(androidx.compose.ui.graphics.colorspace.ColorSpace, optional androidx.compose.ui.graphics.colorspace.ColorSpace destination, optional int intent);
+  }
+
+  public final class ColorSpaces {
+    method public androidx.compose.ui.graphics.colorspace.Rgb getAces();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getAcescg();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getAdobeRgb();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getBt2020();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getBt709();
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getCieLab();
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace getCieXyz();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getDciP3();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getDisplayP3();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getExtendedSrgb();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getLinearExtendedSrgb();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getLinearSrgb();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getNtsc1953();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getProPhotoRgb();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getSmpteC();
+    method public androidx.compose.ui.graphics.colorspace.Rgb getSrgb();
+    method public androidx.compose.ui.graphics.colorspace.ColorSpace? match(float[] toXYZD50, androidx.compose.ui.graphics.colorspace.TransferParameters function);
+    property public final androidx.compose.ui.graphics.colorspace.Rgb Aces;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb Acescg;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb AdobeRgb;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb Bt2020;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb Bt709;
+    property public final androidx.compose.ui.graphics.colorspace.ColorSpace CieLab;
+    property public final androidx.compose.ui.graphics.colorspace.ColorSpace CieXyz;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb DciP3;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb DisplayP3;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb ExtendedSrgb;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb LinearExtendedSrgb;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb LinearSrgb;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb Ntsc1953;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb ProPhotoRgb;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb SmpteC;
+    property public final androidx.compose.ui.graphics.colorspace.Rgb Srgb;
+    field public static final androidx.compose.ui.graphics.colorspace.ColorSpaces INSTANCE;
+  }
+
+  public class Connector {
+    method public final androidx.compose.ui.graphics.colorspace.ColorSpace getDestination();
+    method public final int getRenderIntent();
+    method public final androidx.compose.ui.graphics.colorspace.ColorSpace getSource();
+    method public final float[] transform(float r, float g, float b);
+    method public float[] transform(float[] v);
+    property public final androidx.compose.ui.graphics.colorspace.ColorSpace destination;
+    property public final int renderIntent;
+    property public final androidx.compose.ui.graphics.colorspace.ColorSpace source;
+  }
+
+  public final class Illuminant {
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getA();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getB();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getC();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD50();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD55();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD60();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD65();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getD75();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getE();
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint A;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint B;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint C;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D50;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D55;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D60;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D65;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint D75;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint E;
+    field public static final androidx.compose.ui.graphics.colorspace.Illuminant INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class RenderIntent {
+    ctor public RenderIntent();
+  }
+
+  public static final class RenderIntent.Companion {
+    method public int getAbsolute();
+    method public int getPerceptual();
+    method public int getRelative();
+    method public int getSaturation();
+    property public final int Absolute;
+    property public final int Perceptual;
+    property public final int Relative;
+    property public final int Saturation;
+  }
+
+  public final class Rgb extends androidx.compose.ui.graphics.colorspace.ColorSpace {
+    ctor public Rgb(String name, float[] toXYZ, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> oetf, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> eotf);
+    ctor public Rgb(String name, float[] primaries, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> oetf, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> eotf, float min, float max);
+    ctor public Rgb(String name, float[] toXYZ, androidx.compose.ui.graphics.colorspace.TransferParameters function);
+    ctor public Rgb(String name, float[] primaries, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, androidx.compose.ui.graphics.colorspace.TransferParameters function);
+    ctor public Rgb(String name, float[] toXYZ, double gamma);
+    ctor public Rgb(String name, float[] primaries, androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint, double gamma);
+    method public float[] fromLinear(float r, float g, float b);
+    method public float[] fromLinear(float[] v);
+    method public float[] fromXyz(float[] v);
+    method public kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> getEotf();
+    method public float[] getInverseTransform();
+    method public float[] getInverseTransform(float[] inverseTransform);
+    method public float getMaxValue(int component);
+    method public float getMinValue(int component);
+    method public kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> getOetf();
+    method public float[] getPrimaries();
+    method public float[] getPrimaries(float[] primaries);
+    method public androidx.compose.ui.graphics.colorspace.TransferParameters? getTransferParameters();
+    method public float[] getTransform();
+    method public float[] getTransform(float[] transform);
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint getWhitePoint();
+    method public boolean isWideGamut();
+    method public float[] toLinear(float r, float g, float b);
+    method public float[] toLinear(float[] v);
+    method public float[] toXyz(float[] v);
+    property public final kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> eotf;
+    property public boolean isSrgb;
+    property public boolean isWideGamut;
+    property public final kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> oetf;
+    property public final androidx.compose.ui.graphics.colorspace.TransferParameters? transferParameters;
+    property public final androidx.compose.ui.graphics.colorspace.WhitePoint whitePoint;
+  }
+
+  public final class TransferParameters {
+    ctor public TransferParameters(double gamma, double a, double b, double c, double d, optional double e, optional double f);
+    method public double component1();
+    method public double component2();
+    method public double component3();
+    method public double component4();
+    method public double component5();
+    method public double component6();
+    method public double component7();
+    method public androidx.compose.ui.graphics.colorspace.TransferParameters copy(double gamma, double a, double b, double c, double d, double e, double f);
+    method public double getA();
+    method public double getB();
+    method public double getC();
+    method public double getD();
+    method public double getE();
+    method public double getF();
+    method public double getGamma();
+    property public final double a;
+    property public final double b;
+    property public final double c;
+    property public final double d;
+    property public final double e;
+    property public final double f;
+    property public final double gamma;
+  }
+
+  public final class WhitePoint {
+    ctor public WhitePoint(float x, float y);
+    ctor public WhitePoint(float x, float y, float z);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.colorspace.WhitePoint copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+}
+
+package androidx.compose.ui.graphics.drawscope {
+
+  public final class CanvasDrawScope implements androidx.compose.ui.graphics.drawscope.DrawScope {
+    ctor public CanvasDrawScope();
+    method public inline void draw(androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.graphics.Canvas canvas, long size, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public void drawArc(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawArc(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawCircle(androidx.compose.ui.graphics.Brush brush, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawCircle(long color, float radius, long center, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, long topLeft, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, long srcOffset, long srcSize, long dstOffset, long dstSize, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawLine(androidx.compose.ui.graphics.Brush brush, long start, long end, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawLine(long color, long start, long end, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawOval(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawOval(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, long color, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, long color, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, androidx.compose.ui.graphics.Brush brush, float strokeWidth, int cap, androidx.compose.ui.graphics.PathEffect? pathEffect, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRect(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRect(long color, long topLeft, long size, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRoundRect(androidx.compose.ui.graphics.Brush brush, long topLeft, long size, long cornerRadius, float alpha, androidx.compose.ui.graphics.drawscope.DrawStyle style, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public void drawRoundRect(long color, long topLeft, long size, long cornerRadius, androidx.compose.ui.graphics.drawscope.DrawStyle style, float alpha, androidx.compose.ui.graphics.ColorFilter? colorFilter, int blendMode);
+    method public float getDensity();
+    method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
+    method public float getFontScale();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    property public float density;
+    property public androidx.compose.ui.graphics.drawscope.DrawContext drawContext;
+    property public float fontScale;
+    property public androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    field @kotlin.PublishedApi internal final androidx.compose.ui.graphics.drawscope.CanvasDrawScope.DrawParams drawParams;
+  }
+
+  @kotlin.PublishedApi internal static final class CanvasDrawScope.DrawParams {
+    ctor public CanvasDrawScope.DrawParams(optional androidx.compose.ui.unit.Density density, optional androidx.compose.ui.unit.LayoutDirection layoutDirection, optional androidx.compose.ui.graphics.Canvas canvas, optional long size);
+    method public androidx.compose.ui.unit.Density component1();
+    method public androidx.compose.ui.unit.LayoutDirection component2();
+    method public androidx.compose.ui.graphics.Canvas component3();
+    method public long component4-NH-jbRc();
+    method internal boolean equals(Object? other);
+    method public androidx.compose.ui.graphics.Canvas getCanvas();
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public long getSize();
+    method internal int hashCode();
+    method public void setCanvas(androidx.compose.ui.graphics.Canvas canvas);
+    method public void setDensity(androidx.compose.ui.unit.Density density);
+    method public void setLayoutDirection(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public void setSize(long size);
+    method internal String toString();
+    property public final androidx.compose.ui.graphics.Canvas canvas;
+    property public final androidx.compose.ui.unit.Density density;
+    property public final androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public final long size;
+  }
+
+  public final class CanvasDrawScopeKt {
+  }
+
+  public interface ContentDrawScope extends androidx.compose.ui.graphics.drawscope.DrawScope {
+    method public void drawContent();
+  }
+
+  public interface DrawContext {
+    method public androidx.compose.ui.graphics.Canvas getCanvas();
+    method public long getSize();
+    method public androidx.compose.ui.graphics.drawscope.DrawTransform getTransform();
+    method public void setSize(long size);
+    property public abstract androidx.compose.ui.graphics.Canvas canvas;
+    property public abstract long size;
+    property public abstract androidx.compose.ui.graphics.drawscope.DrawTransform transform;
+  }
+
+  @androidx.compose.ui.graphics.drawscope.DrawScopeMarker public interface DrawScope extends androidx.compose.ui.unit.Density {
+    method public void drawArc(androidx.compose.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawArc(long color, float startAngle, float sweepAngle, boolean useCenter, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawCircle(androidx.compose.ui.graphics.Brush brush, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawCircle(long color, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public default void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode, optional int filterQuality);
+    method @Deprecated public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawLine(androidx.compose.ui.graphics.Brush brush, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawLine(long color, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawOval(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawOval(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, long color, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPath(androidx.compose.ui.graphics.Path path, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, long color, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawPoints(java.util.List<androidx.compose.ui.geometry.Offset> points, int pointMode, androidx.compose.ui.graphics.Brush brush, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRect(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRect(long color, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRoundRect(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional long cornerRadius, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public void drawRoundRect(long color, optional long topLeft, optional long size, optional long cornerRadius, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method public default long getCenter();
+    method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public default long getSize();
+    property public default long center;
+    property public abstract androidx.compose.ui.graphics.drawscope.DrawContext drawContext;
+    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public default long size;
+    field public static final androidx.compose.ui.graphics.drawscope.DrawScope.Companion Companion;
+  }
+
+  public static final class DrawScope.Companion {
+    method public int getDefaultBlendMode();
+    method public int getDefaultFilterQuality();
+    property public final int DefaultBlendMode;
+    property public final int DefaultFilterQuality;
+  }
+
+  public final class DrawScopeKt {
+    method public static inline void clipPath(androidx.compose.ui.graphics.drawscope.DrawScope, androidx.compose.ui.graphics.Path path, optional int clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void clipRect(androidx.compose.ui.graphics.drawscope.DrawScope, optional float left, optional float top, optional float right, optional float bottom, optional int clipOp, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void drawIntoCanvas(androidx.compose.ui.graphics.drawscope.DrawScope, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.Canvas,kotlin.Unit> block);
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, float inset, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawScope, optional float horizontal, optional float vertical, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void rotate(androidx.compose.ui.graphics.drawscope.DrawScope, float degrees, optional long pivot, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void rotateRad(androidx.compose.ui.graphics.drawscope.DrawScope, float radians, optional long pivot, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void scale(androidx.compose.ui.graphics.drawscope.DrawScope, float scaleX, float scaleY, optional long pivot, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void scale(androidx.compose.ui.graphics.drawscope.DrawScope, float scale, optional long pivot, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void translate(androidx.compose.ui.graphics.drawscope.DrawScope, optional float left, optional float top, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public static inline void withTransform(androidx.compose.ui.graphics.drawscope.DrawScope, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawTransform,kotlin.Unit> transformBlock, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> drawBlock);
+  }
+
+  @kotlin.DslMarker public @interface DrawScopeMarker {
+  }
+
+  public abstract sealed class DrawStyle {
+  }
+
+  @androidx.compose.ui.graphics.drawscope.DrawScopeMarker public interface DrawTransform {
+    method public void clipPath(androidx.compose.ui.graphics.Path path, optional int clipOp);
+    method public void clipRect(optional float left, optional float top, optional float right, optional float bottom, optional int clipOp);
+    method public default long getCenter();
+    method public long getSize();
+    method public void inset(float left, float top, float right, float bottom);
+    method public void rotate(float degrees, optional long pivot);
+    method public void scale(float scaleX, float scaleY, optional long pivot);
+    method public void transform(float[] matrix);
+    method public void translate(optional float left, optional float top);
+    property public default long center;
+    property public abstract long size;
+  }
+
+  public final class DrawTransformKt {
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawTransform, optional float horizontal, optional float vertical);
+    method public static inline void inset(androidx.compose.ui.graphics.drawscope.DrawTransform, float inset);
+    method public static inline void rotateRad(androidx.compose.ui.graphics.drawscope.DrawTransform, float radians, optional long pivot);
+    method public static inline void scale(androidx.compose.ui.graphics.drawscope.DrawTransform, float scale, optional long pivot);
+  }
+
+  public final class Fill extends androidx.compose.ui.graphics.drawscope.DrawStyle {
+    field public static final androidx.compose.ui.graphics.drawscope.Fill INSTANCE;
+  }
+
+  public final class Stroke extends androidx.compose.ui.graphics.drawscope.DrawStyle {
+    ctor public Stroke(optional float width, optional float miter, optional int cap, optional int join, optional androidx.compose.ui.graphics.PathEffect? pathEffect);
+    method public int getCap();
+    method public int getJoin();
+    method public float getMiter();
+    method public androidx.compose.ui.graphics.PathEffect? getPathEffect();
+    method public float getWidth();
+    property public final int cap;
+    property public final int join;
+    property public final float miter;
+    property public final androidx.compose.ui.graphics.PathEffect? pathEffect;
+    property public final float width;
+    field public static final androidx.compose.ui.graphics.drawscope.Stroke.Companion Companion;
+    field public static final float DefaultMiter = 4.0f;
+    field public static final float HairlineWidth = 0.0f;
+  }
+
+  public static final class Stroke.Companion {
+    method public int getDefaultCap();
+    method public int getDefaultJoin();
+    property public final int DefaultCap;
+    property public final int DefaultJoin;
+  }
+
+}
+
+package androidx.compose.ui.graphics.painter {
+
+  public final class BitmapPainter extends androidx.compose.ui.graphics.painter.Painter {
+    ctor public BitmapPainter(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize);
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public long intrinsicSize;
+  }
+
+  public final class BitmapPainterKt {
+    method public static androidx.compose.ui.graphics.painter.BitmapPainter BitmapPainter(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional int filterQuality);
+  }
+
+  public final class BrushPainter extends androidx.compose.ui.graphics.painter.Painter {
+    ctor public BrushPainter(androidx.compose.ui.graphics.Brush brush);
+    method public androidx.compose.ui.graphics.Brush getBrush();
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public final androidx.compose.ui.graphics.Brush brush;
+    property public long intrinsicSize;
+  }
+
+  public final class ColorPainter extends androidx.compose.ui.graphics.painter.Painter {
+    ctor public ColorPainter(long color);
+    method public long getColor();
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public final long color;
+    property public long intrinsicSize;
+  }
+
+  public abstract class Painter {
+    ctor public Painter();
+    method protected boolean applyAlpha(float alpha);
+    method protected boolean applyColorFilter(androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method protected boolean applyLayoutDirection(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public final void draw(androidx.compose.ui.graphics.drawscope.DrawScope, long size, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+    method public abstract long getIntrinsicSize();
+    method protected abstract void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public abstract long intrinsicSize;
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector {
+
+  public final class PathBuilder {
+    ctor public PathBuilder();
+    method public androidx.compose.ui.graphics.vector.PathBuilder arcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float x1, float y1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder arcToRelative(float a, float b, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float dx1, float dy1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder close();
+    method public androidx.compose.ui.graphics.vector.PathBuilder curveTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public androidx.compose.ui.graphics.vector.PathBuilder curveToRelative(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getNodes();
+    method public androidx.compose.ui.graphics.vector.PathBuilder horizontalLineTo(float x);
+    method public androidx.compose.ui.graphics.vector.PathBuilder horizontalLineToRelative(float dx);
+    method public androidx.compose.ui.graphics.vector.PathBuilder lineTo(float x, float y);
+    method public androidx.compose.ui.graphics.vector.PathBuilder lineToRelative(float dx, float dy);
+    method public androidx.compose.ui.graphics.vector.PathBuilder moveTo(float x, float y);
+    method public androidx.compose.ui.graphics.vector.PathBuilder moveToRelative(float dx, float dy);
+    method public androidx.compose.ui.graphics.vector.PathBuilder quadTo(float x1, float y1, float x2, float y2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder quadToRelative(float dx1, float dy1, float dx2, float dy2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveCurveTo(float x1, float y1, float x2, float y2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveCurveToRelative(float dx1, float dy1, float dx2, float dy2);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveQuadTo(float x1, float y1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder reflectiveQuadToRelative(float dx1, float dy1);
+    method public androidx.compose.ui.graphics.vector.PathBuilder verticalLineTo(float y);
+    method public androidx.compose.ui.graphics.vector.PathBuilder verticalLineToRelative(float dy);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class PathNode {
+    method public final boolean isCurve();
+    method public final boolean isQuad();
+    property public final boolean isCurve;
+    property public final boolean isQuad;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.ArcTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.ArcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartX, float arcStartY);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public boolean component4();
+    method public boolean component5();
+    method public float component6();
+    method public float component7();
+    method public androidx.compose.ui.graphics.vector.PathNode.ArcTo copy(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartX, float arcStartY);
+    method public float getArcStartX();
+    method public float getArcStartY();
+    method public float getHorizontalEllipseRadius();
+    method public float getTheta();
+    method public float getVerticalEllipseRadius();
+    method public boolean isMoreThanHalf();
+    method public boolean isPositiveArc();
+    property public final float arcStartX;
+    property public final float arcStartY;
+    property public final float horizontalEllipseRadius;
+    property public final boolean isMoreThanHalf;
+    property public final boolean isPositiveArc;
+    property public final float theta;
+    property public final float verticalEllipseRadius;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.Close extends androidx.compose.ui.graphics.vector.PathNode {
+    field public static final androidx.compose.ui.graphics.vector.PathNode.Close INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.CurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.CurveTo(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public float component5();
+    method public float component6();
+    method public androidx.compose.ui.graphics.vector.PathNode.CurveTo copy(float x1, float y1, float x2, float y2, float x3, float y3);
+    method public float getX1();
+    method public float getX2();
+    method public float getX3();
+    method public float getY1();
+    method public float getY2();
+    method public float getY3();
+    property public final float x1;
+    property public final float x2;
+    property public final float x3;
+    property public final float y1;
+    property public final float y2;
+    property public final float y3;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.HorizontalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.HorizontalTo(float x);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.HorizontalTo copy(float x);
+    method public float getX();
+    property public final float x;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.LineTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.LineTo(float x, float y);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.LineTo copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.MoveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.MoveTo(float x, float y);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.MoveTo copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.QuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.QuadTo(float x1, float y1, float x2, float y2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.QuadTo copy(float x1, float y1, float x2, float y2);
+    method public float getX1();
+    method public float getX2();
+    method public float getY1();
+    method public float getY2();
+    property public final float x1;
+    property public final float x2;
+    property public final float y1;
+    property public final float y2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.ReflectiveCurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.ReflectiveCurveTo(float x1, float y1, float x2, float y2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.ReflectiveCurveTo copy(float x1, float y1, float x2, float y2);
+    method public float getX1();
+    method public float getX2();
+    method public float getY1();
+    method public float getY2();
+    property public final float x1;
+    property public final float x2;
+    property public final float y1;
+    property public final float y2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.ReflectiveQuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.ReflectiveQuadTo(float x, float y);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.ReflectiveQuadTo copy(float x, float y);
+    method public float getX();
+    method public float getY();
+    property public final float x;
+    property public final float y;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeArcTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeArcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartDx, float arcStartDy);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public boolean component4();
+    method public boolean component5();
+    method public float component6();
+    method public float component7();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeArcTo copy(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartDx, float arcStartDy);
+    method public float getArcStartDx();
+    method public float getArcStartDy();
+    method public float getHorizontalEllipseRadius();
+    method public float getTheta();
+    method public float getVerticalEllipseRadius();
+    method public boolean isMoreThanHalf();
+    method public boolean isPositiveArc();
+    property public final float arcStartDx;
+    property public final float arcStartDy;
+    property public final float horizontalEllipseRadius;
+    property public final boolean isMoreThanHalf;
+    property public final boolean isPositiveArc;
+    property public final float theta;
+    property public final float verticalEllipseRadius;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeCurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeCurveTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public float component5();
+    method public float component6();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeCurveTo copy(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
+    method public float getDx1();
+    method public float getDx2();
+    method public float getDx3();
+    method public float getDy1();
+    method public float getDy2();
+    method public float getDy3();
+    property public final float dx1;
+    property public final float dx2;
+    property public final float dx3;
+    property public final float dy1;
+    property public final float dy2;
+    property public final float dy3;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeHorizontalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeHorizontalTo(float dx);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeHorizontalTo copy(float dx);
+    method public float getDx();
+    property public final float dx;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeLineTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeLineTo(float dx, float dy);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeLineTo copy(float dx, float dy);
+    method public float getDx();
+    method public float getDy();
+    property public final float dx;
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeMoveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeMoveTo(float dx, float dy);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeMoveTo copy(float dx, float dy);
+    method public float getDx();
+    method public float getDy();
+    property public final float dx;
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeQuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeQuadTo(float dx1, float dy1, float dx2, float dy2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeQuadTo copy(float dx1, float dy1, float dx2, float dy2);
+    method public float getDx1();
+    method public float getDx2();
+    method public float getDy1();
+    method public float getDy2();
+    property public final float dx1;
+    property public final float dx2;
+    property public final float dy1;
+    property public final float dy2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeReflectiveCurveTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeReflectiveCurveTo(float dx1, float dy1, float dx2, float dy2);
+    method public float component1();
+    method public float component2();
+    method public float component3();
+    method public float component4();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeReflectiveCurveTo copy(float dx1, float dy1, float dx2, float dy2);
+    method public float getDx1();
+    method public float getDx2();
+    method public float getDy1();
+    method public float getDy2();
+    property public final float dx1;
+    property public final float dx2;
+    property public final float dy1;
+    property public final float dy2;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeReflectiveQuadTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeReflectiveQuadTo(float dx, float dy);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeReflectiveQuadTo copy(float dx, float dy);
+    method public float getDx();
+    method public float getDy();
+    property public final float dx;
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.RelativeVerticalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.RelativeVerticalTo(float dy);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.RelativeVerticalTo copy(float dy);
+    method public float getDy();
+    property public final float dy;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class PathNode.VerticalTo extends androidx.compose.ui.graphics.vector.PathNode {
+    ctor public PathNode.VerticalTo(float y);
+    method public float component1();
+    method public androidx.compose.ui.graphics.vector.PathNode.VerticalTo copy(float y);
+    method public float getY();
+    property public final float y;
+  }
+
+  public final class PathNodeKt {
+  }
+
+  public final class PathParser {
+    ctor public PathParser();
+    method public androidx.compose.ui.graphics.vector.PathParser addPathNodes(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> nodes);
+    method public void clear();
+    method public androidx.compose.ui.graphics.vector.PathParser parsePathString(String pathData);
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> toNodes();
+    method public androidx.compose.ui.graphics.Path toPath(optional androidx.compose.ui.graphics.Path target);
+  }
+
+}
+
diff --git a/compose/ui/ui-graphics/api/restricted_current.ignore b/compose/ui/ui-graphics/api/restricted_current.ignore
new file mode 100644
index 0000000..3ccbf6c
--- /dev/null
+++ b/compose/ui/ui-graphics/api/restricted_current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedMethod: androidx.compose.ui.graphics.drawscope.DrawScope#offsetSize(long, long):
+    Removed method androidx.compose.ui.graphics.drawscope.DrawScope.offsetSize(long,long)
diff --git a/compose/ui/ui-graphics/api/restricted_current.txt b/compose/ui/ui-graphics/api/restricted_current.txt
index 5db489a..ced5908 100644
--- a/compose/ui/ui-graphics/api/restricted_current.txt
+++ b/compose/ui/ui-graphics/api/restricted_current.txt
@@ -330,6 +330,12 @@
 
   @androidx.compose.runtime.Immutable public final inline class Color {
     ctor public Color();
+    method @androidx.compose.runtime.Stable public operator float component1();
+    method @androidx.compose.runtime.Stable public operator float component2();
+    method @androidx.compose.runtime.Stable public operator float component3();
+    method @androidx.compose.runtime.Stable public operator float component4();
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.graphics.colorspace.ColorSpace! component5();
+    method @androidx.compose.runtime.Stable public long copy(optional float alpha, optional float red, optional float green, optional float blue);
     method public long getValue();
     property public final long value;
   }
@@ -389,7 +395,10 @@
 
   public final inline class ColorMatrix {
     ctor public ColorMatrix();
+    method public inline operator float get(int row, int column);
     method public float[] getValues();
+    method public inline operator void set(int row, int column, float v);
+    method public operator void timesAssign(float[] colorMatrix);
     property public final float[] values;
   }
 
@@ -467,7 +476,10 @@
 
   public final inline class Matrix {
     ctor public Matrix();
+    method public inline operator float get(int row, int column);
     method public float[] getValues();
+    method public inline operator void set(int row, int column, float v);
+    method public operator void timesAssign(float[] m);
     property public final float[] values;
   }
 
@@ -563,6 +575,7 @@
   }
 
   public final class PaintKt {
+    method public static androidx.compose.ui.graphics.Paint! Paint();
     field public static final float DefaultAlpha = 1.0f;
   }
 
@@ -708,6 +721,7 @@
 
   public final class RectangleShapeKt {
     method public static androidx.compose.ui.graphics.Shape getRectangleShape();
+    property public static final androidx.compose.ui.graphics.Shape RectangleShape;
   }
 
   @androidx.compose.runtime.Immutable public abstract sealed class RenderEffect {
@@ -1149,7 +1163,7 @@
     method public void drawCircle(long color, optional float radius, optional long center, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
     method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long topLeft, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
     method public default void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode, optional int filterQuality);
-    method public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
+    method @Deprecated public void drawImage(androidx.compose.ui.graphics.ImageBitmap image, optional long srcOffset, optional long srcSize, optional long dstOffset, optional long dstSize, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
     method public void drawLine(androidx.compose.ui.graphics.Brush brush, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
     method public void drawLine(long color, long start, long end, optional float strokeWidth, optional int cap, optional androidx.compose.ui.graphics.PathEffect? pathEffect, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
     method public void drawOval(androidx.compose.ui.graphics.Brush brush, optional long topLeft, optional long size, optional float alpha, optional androidx.compose.ui.graphics.drawscope.DrawStyle style, optional androidx.compose.ui.graphics.ColorFilter? colorFilter, optional int blendMode);
@@ -1166,7 +1180,6 @@
     method public androidx.compose.ui.graphics.drawscope.DrawContext getDrawContext();
     method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
     method public default long getSize();
-    method public long offsetSize(long, long offset);
     property public default long center;
     property public abstract androidx.compose.ui.graphics.drawscope.DrawContext drawContext;
     property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
diff --git a/compose/ui/ui-graphics/build.gradle b/compose/ui/ui-graphics/build.gradle
index 26340f2..d5ceabb 100644
--- a/compose/ui/ui-graphics/build.gradle
+++ b/compose/ui/ui-graphics/build.gradle
@@ -85,6 +85,7 @@
             }
 
             skikoMain {
+                dependsOn(commonMain)
                 dependencies {
                     api(libs.skikoCommon)
                 }
diff --git a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedCanvas.skiko.kt b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedCanvas.skiko.kt
index b2b81f3..dac089b 100644
--- a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedCanvas.skiko.kt
+++ b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedCanvas.skiko.kt
@@ -200,6 +200,11 @@
         paint: Paint
     ) {
         val bitmap = image.asSkiaBitmap()
+        // TODO(gorshenev): need to use skiko's .use() rather than jvm one here.
+        // But can't do that as skiko is jvmTarget=11 for now, so can't inline
+        // into jvmTarget=8 compose.
+        // After this issue is resolved use:
+        //     import org.jetbrains.skia.impl.use
         Image.makeFromBitmap(bitmap).use { skiaImage ->
             skia.drawImageRect(
                 skiaImage,
diff --git a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaImageAsset.skiko.kt b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaImageAsset.skiko.kt
index bc92d05..fa11fe8f 100644
--- a/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaImageAsset.skiko.kt
+++ b/compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaImageAsset.skiko.kt
@@ -110,7 +110,7 @@
         )
         val imageInfo = ImageInfo(colorInfo, width, height)
         val bytesPerPixel = 4
-        val bytes = bitmap.readPixels(imageInfo, stride * bytesPerPixel.toLong(), startX, startY)!!
+        val bytes = bitmap.readPixels(imageInfo, stride * bytesPerPixel, startX, startY)!!
         bytes.putBytesInto(buffer, bufferOffset, bytes.size / bytesPerPixel)
     }
 }
diff --git a/compose/ui/ui-test-font/api/1.1.0-beta02.txt b/compose/ui/ui-test-font/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-test-font/api/1.1.0-beta02.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/ui/ui-test-font/api/public_plus_experimental_1.1.0-beta02.txt b/compose/ui/ui-test-font/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-test-font/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/ui/ui-test-font/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to compose/ui/ui-test-font/api/res-1.1.0-beta02.txt
diff --git a/compose/ui/ui-test-font/api/restricted_1.1.0-beta02.txt b/compose/ui/ui-test-font/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-test-font/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/ui/ui-test-junit4/api/1.1.0-beta02.txt b/compose/ui/ui-test-junit4/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..6c590bb
--- /dev/null
+++ b/compose/ui/ui-test-junit4/api/1.1.0-beta02.txt
@@ -0,0 +1,84 @@
+// Signature format: 4.0
+package androidx.compose.ui.test.junit4 {
+
+  public final class AndroidComposeTestRule<R extends org.junit.rules.TestRule, A extends androidx.activity.ComponentActivity> implements androidx.compose.ui.test.junit4.ComposeContentTestRule {
+    ctor public AndroidComposeTestRule(R activityRule, kotlin.jvm.functions.Function1<? super R,? extends A> activityProvider);
+    method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
+    method public suspend Object? awaitIdle(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public A getActivity();
+    method public R getActivityRule();
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.test.MainTestClock getMainClock();
+    method public androidx.compose.ui.test.SemanticsNodeInteractionCollection onAllNodes(androidx.compose.ui.test.SemanticsMatcher matcher, boolean useUnmergedTree);
+    method public androidx.compose.ui.test.SemanticsNodeInteraction onNode(androidx.compose.ui.test.SemanticsMatcher matcher, boolean useUnmergedTree);
+    method public void registerIdlingResource(androidx.compose.ui.test.IdlingResource idlingResource);
+    method public <T> T! runOnIdle(kotlin.jvm.functions.Function0<? extends T> action);
+    method public <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
+    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+    method public void unregisterIdlingResource(androidx.compose.ui.test.IdlingResource idlingResource);
+    method public void waitForIdle();
+    method public void waitUntil(long timeoutMillis, kotlin.jvm.functions.Function0<java.lang.Boolean> condition);
+    property public final A activity;
+    property public final R activityRule;
+    property public androidx.compose.ui.unit.Density density;
+    property public androidx.compose.ui.test.MainTestClock mainClock;
+  }
+
+  public final class AndroidComposeTestRule.AndroidComposeStatement extends org.junit.runners.model.Statement {
+    ctor public AndroidComposeTestRule.AndroidComposeStatement(org.junit.runners.model.Statement base);
+    method public void evaluate();
+  }
+
+  public final class AndroidComposeTestRule_androidKt {
+    method public static <A extends androidx.activity.ComponentActivity> androidx.compose.ui.test.junit4.AndroidComposeTestRule<androidx.test.ext.junit.rules.ActivityScenarioRule<A>,A> createAndroidComposeRule(Class<A> activityClass);
+    method public static inline <reified A extends androidx.activity.ComponentActivity> androidx.compose.ui.test.junit4.AndroidComposeTestRule<androidx.test.ext.junit.rules.ActivityScenarioRule<A>,A>! createAndroidComposeRule();
+    method public static androidx.compose.ui.test.junit4.ComposeContentTestRule createComposeRule();
+    method public static androidx.compose.ui.test.junit4.ComposeTestRule createEmptyComposeRule();
+  }
+
+  public final class AndroidSynchronization_androidKt {
+  }
+
+  public interface ComposeContentTestRule extends androidx.compose.ui.test.junit4.ComposeTestRule {
+    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+  }
+
+  public interface ComposeTestRule extends org.junit.rules.TestRule androidx.compose.ui.test.SemanticsNodeInteractionsProvider {
+    method public suspend Object? awaitIdle(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.test.MainTestClock getMainClock();
+    method public void registerIdlingResource(androidx.compose.ui.test.IdlingResource idlingResource);
+    method public <T> T! runOnIdle(kotlin.jvm.functions.Function0<? extends T> action);
+    method public <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
+    method public void unregisterIdlingResource(androidx.compose.ui.test.IdlingResource idlingResource);
+    method public void waitForIdle();
+    method public void waitUntil(optional long timeoutMillis, kotlin.jvm.functions.Function0<java.lang.Boolean> condition);
+    property public abstract androidx.compose.ui.unit.Density density;
+    property public abstract androidx.compose.ui.test.MainTestClock mainClock;
+  }
+
+  public final class StateRestorationTester {
+    ctor public StateRestorationTester(androidx.compose.ui.test.junit4.ComposeContentTestRule composeTestRule);
+    method public void emulateSavedInstanceStateRestore();
+    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+  }
+
+}
+
+package androidx.compose.ui.test.junit4.android {
+
+  public final class ComposeIdlingResource_androidKt {
+  }
+
+  public final class ComposeNotIdleException extends java.lang.Throwable {
+    ctor public ComposeNotIdleException(String? message, Throwable? cause);
+  }
+
+  public final class ComposeRootRegistry_androidKt {
+  }
+
+  public final class EspressoLink_androidKt {
+  }
+
+}
+
diff --git a/compose/ui/ui-test-junit4/api/public_plus_experimental_1.1.0-beta02.txt b/compose/ui/ui-test-junit4/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..6c590bb
--- /dev/null
+++ b/compose/ui/ui-test-junit4/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,84 @@
+// Signature format: 4.0
+package androidx.compose.ui.test.junit4 {
+
+  public final class AndroidComposeTestRule<R extends org.junit.rules.TestRule, A extends androidx.activity.ComponentActivity> implements androidx.compose.ui.test.junit4.ComposeContentTestRule {
+    ctor public AndroidComposeTestRule(R activityRule, kotlin.jvm.functions.Function1<? super R,? extends A> activityProvider);
+    method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
+    method public suspend Object? awaitIdle(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public A getActivity();
+    method public R getActivityRule();
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.test.MainTestClock getMainClock();
+    method public androidx.compose.ui.test.SemanticsNodeInteractionCollection onAllNodes(androidx.compose.ui.test.SemanticsMatcher matcher, boolean useUnmergedTree);
+    method public androidx.compose.ui.test.SemanticsNodeInteraction onNode(androidx.compose.ui.test.SemanticsMatcher matcher, boolean useUnmergedTree);
+    method public void registerIdlingResource(androidx.compose.ui.test.IdlingResource idlingResource);
+    method public <T> T! runOnIdle(kotlin.jvm.functions.Function0<? extends T> action);
+    method public <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
+    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+    method public void unregisterIdlingResource(androidx.compose.ui.test.IdlingResource idlingResource);
+    method public void waitForIdle();
+    method public void waitUntil(long timeoutMillis, kotlin.jvm.functions.Function0<java.lang.Boolean> condition);
+    property public final A activity;
+    property public final R activityRule;
+    property public androidx.compose.ui.unit.Density density;
+    property public androidx.compose.ui.test.MainTestClock mainClock;
+  }
+
+  public final class AndroidComposeTestRule.AndroidComposeStatement extends org.junit.runners.model.Statement {
+    ctor public AndroidComposeTestRule.AndroidComposeStatement(org.junit.runners.model.Statement base);
+    method public void evaluate();
+  }
+
+  public final class AndroidComposeTestRule_androidKt {
+    method public static <A extends androidx.activity.ComponentActivity> androidx.compose.ui.test.junit4.AndroidComposeTestRule<androidx.test.ext.junit.rules.ActivityScenarioRule<A>,A> createAndroidComposeRule(Class<A> activityClass);
+    method public static inline <reified A extends androidx.activity.ComponentActivity> androidx.compose.ui.test.junit4.AndroidComposeTestRule<androidx.test.ext.junit.rules.ActivityScenarioRule<A>,A>! createAndroidComposeRule();
+    method public static androidx.compose.ui.test.junit4.ComposeContentTestRule createComposeRule();
+    method public static androidx.compose.ui.test.junit4.ComposeTestRule createEmptyComposeRule();
+  }
+
+  public final class AndroidSynchronization_androidKt {
+  }
+
+  public interface ComposeContentTestRule extends androidx.compose.ui.test.junit4.ComposeTestRule {
+    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+  }
+
+  public interface ComposeTestRule extends org.junit.rules.TestRule androidx.compose.ui.test.SemanticsNodeInteractionsProvider {
+    method public suspend Object? awaitIdle(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.test.MainTestClock getMainClock();
+    method public void registerIdlingResource(androidx.compose.ui.test.IdlingResource idlingResource);
+    method public <T> T! runOnIdle(kotlin.jvm.functions.Function0<? extends T> action);
+    method public <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
+    method public void unregisterIdlingResource(androidx.compose.ui.test.IdlingResource idlingResource);
+    method public void waitForIdle();
+    method public void waitUntil(optional long timeoutMillis, kotlin.jvm.functions.Function0<java.lang.Boolean> condition);
+    property public abstract androidx.compose.ui.unit.Density density;
+    property public abstract androidx.compose.ui.test.MainTestClock mainClock;
+  }
+
+  public final class StateRestorationTester {
+    ctor public StateRestorationTester(androidx.compose.ui.test.junit4.ComposeContentTestRule composeTestRule);
+    method public void emulateSavedInstanceStateRestore();
+    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+  }
+
+}
+
+package androidx.compose.ui.test.junit4.android {
+
+  public final class ComposeIdlingResource_androidKt {
+  }
+
+  public final class ComposeNotIdleException extends java.lang.Throwable {
+    ctor public ComposeNotIdleException(String? message, Throwable? cause);
+  }
+
+  public final class ComposeRootRegistry_androidKt {
+  }
+
+  public final class EspressoLink_androidKt {
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/ui/ui-test-junit4/api/res-1.1.0-beta02.txt
similarity index 100%
rename from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
rename to compose/ui/ui-test-junit4/api/res-1.1.0-beta02.txt
diff --git a/compose/ui/ui-test-junit4/api/restricted_1.1.0-beta02.txt b/compose/ui/ui-test-junit4/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..6c590bb
--- /dev/null
+++ b/compose/ui/ui-test-junit4/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,84 @@
+// Signature format: 4.0
+package androidx.compose.ui.test.junit4 {
+
+  public final class AndroidComposeTestRule<R extends org.junit.rules.TestRule, A extends androidx.activity.ComponentActivity> implements androidx.compose.ui.test.junit4.ComposeContentTestRule {
+    ctor public AndroidComposeTestRule(R activityRule, kotlin.jvm.functions.Function1<? super R,? extends A> activityProvider);
+    method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
+    method public suspend Object? awaitIdle(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public A getActivity();
+    method public R getActivityRule();
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.test.MainTestClock getMainClock();
+    method public androidx.compose.ui.test.SemanticsNodeInteractionCollection onAllNodes(androidx.compose.ui.test.SemanticsMatcher matcher, boolean useUnmergedTree);
+    method public androidx.compose.ui.test.SemanticsNodeInteraction onNode(androidx.compose.ui.test.SemanticsMatcher matcher, boolean useUnmergedTree);
+    method public void registerIdlingResource(androidx.compose.ui.test.IdlingResource idlingResource);
+    method public <T> T! runOnIdle(kotlin.jvm.functions.Function0<? extends T> action);
+    method public <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
+    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+    method public void unregisterIdlingResource(androidx.compose.ui.test.IdlingResource idlingResource);
+    method public void waitForIdle();
+    method public void waitUntil(long timeoutMillis, kotlin.jvm.functions.Function0<java.lang.Boolean> condition);
+    property public final A activity;
+    property public final R activityRule;
+    property public androidx.compose.ui.unit.Density density;
+    property public androidx.compose.ui.test.MainTestClock mainClock;
+  }
+
+  public final class AndroidComposeTestRule.AndroidComposeStatement extends org.junit.runners.model.Statement {
+    ctor public AndroidComposeTestRule.AndroidComposeStatement(org.junit.runners.model.Statement base);
+    method public void evaluate();
+  }
+
+  public final class AndroidComposeTestRule_androidKt {
+    method public static <A extends androidx.activity.ComponentActivity> androidx.compose.ui.test.junit4.AndroidComposeTestRule<androidx.test.ext.junit.rules.ActivityScenarioRule<A>,A> createAndroidComposeRule(Class<A> activityClass);
+    method public static inline <reified A extends androidx.activity.ComponentActivity> androidx.compose.ui.test.junit4.AndroidComposeTestRule<androidx.test.ext.junit.rules.ActivityScenarioRule<A>,A>! createAndroidComposeRule();
+    method public static androidx.compose.ui.test.junit4.ComposeContentTestRule createComposeRule();
+    method public static androidx.compose.ui.test.junit4.ComposeTestRule createEmptyComposeRule();
+  }
+
+  public final class AndroidSynchronization_androidKt {
+  }
+
+  public interface ComposeContentTestRule extends androidx.compose.ui.test.junit4.ComposeTestRule {
+    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+  }
+
+  public interface ComposeTestRule extends org.junit.rules.TestRule androidx.compose.ui.test.SemanticsNodeInteractionsProvider {
+    method public suspend Object? awaitIdle(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.test.MainTestClock getMainClock();
+    method public void registerIdlingResource(androidx.compose.ui.test.IdlingResource idlingResource);
+    method public <T> T! runOnIdle(kotlin.jvm.functions.Function0<? extends T> action);
+    method public <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
+    method public void unregisterIdlingResource(androidx.compose.ui.test.IdlingResource idlingResource);
+    method public void waitForIdle();
+    method public void waitUntil(optional long timeoutMillis, kotlin.jvm.functions.Function0<java.lang.Boolean> condition);
+    property public abstract androidx.compose.ui.unit.Density density;
+    property public abstract androidx.compose.ui.test.MainTestClock mainClock;
+  }
+
+  public final class StateRestorationTester {
+    ctor public StateRestorationTester(androidx.compose.ui.test.junit4.ComposeContentTestRule composeTestRule);
+    method public void emulateSavedInstanceStateRestore();
+    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> composable);
+  }
+
+}
+
+package androidx.compose.ui.test.junit4.android {
+
+  public final class ComposeIdlingResource_androidKt {
+  }
+
+  public final class ComposeNotIdleException extends java.lang.Throwable {
+    ctor public ComposeNotIdleException(String? message, Throwable? cause);
+  }
+
+  public final class ComposeRootRegistry_androidKt {
+  }
+
+  public final class EspressoLink_androidKt {
+  }
+
+}
+
diff --git a/compose/ui/ui-test-junit4/build.gradle b/compose/ui/ui-test-junit4/build.gradle
index 4487e2a..21e551d 100644
--- a/compose/ui/ui-test-junit4/build.gradle
+++ b/compose/ui/ui-test-junit4/build.gradle
@@ -48,8 +48,8 @@
         implementation("androidx.annotation:annotation:1.1.0")
         implementation("androidx.lifecycle:lifecycle-common:2.3.0")
         implementation("androidx.lifecycle:lifecycle-runtime:2.3.0")
-        implementation("androidx.test:core:1.3.0")
-        implementation("androidx.test:monitor:1.3.0")
+        implementation("androidx.test:core:1.4.0")
+        implementation("androidx.test:monitor:1.4.0")
         implementation(libs.espressoCore)
         implementation(libs.espressoIdlingResource)
         implementation(libs.kotlinCoroutinesCore)
diff --git a/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/AndroidComposeTestRule.android.kt b/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/AndroidComposeTestRule.android.kt
index 4d02aa27..7de95ff 100644
--- a/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/AndroidComposeTestRule.android.kt
+++ b/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/AndroidComposeTestRule.android.kt
@@ -175,17 +175,15 @@
     private val idlingStrategy: IdlingStrategy by lazy { idlingStrategyFactory.invoke() }
 
     private val recomposer: Recomposer
-    private val testCoroutineDispatcher: TestCoroutineDispatcher
+    private val testCoroutineDispatcher = TestCoroutineDispatcher()
+    private val frameCoroutineScope = CoroutineScope(testCoroutineDispatcher)
     private val recomposerApplyCoroutineScope: CoroutineScope
-    private val frameCoroutineScope: CoroutineScope
     private val coroutineExceptionHandler = UncaughtExceptionHandler()
 
     override val mainClock: MainTestClock
         get() = mainClockImpl
 
     init {
-        testCoroutineDispatcher = TestCoroutineDispatcher()
-        frameCoroutineScope = CoroutineScope(testCoroutineDispatcher)
         val frameClock = TestMonotonicFrameClock(frameCoroutineScope)
         mainClockImpl = MainTestClockImpl(testCoroutineDispatcher, frameClock)
         val infiniteAnimationPolicy = object : InfiniteAnimationPolicy {
@@ -201,11 +199,9 @@
                 coroutineExceptionHandler + Job()
         )
         recomposer = Recomposer(recomposerApplyCoroutineScope.coroutineContext)
-            .also { recomposerApplyCoroutineScope.launch { it.runRecomposeAndApplyChanges() } }
         composeIdlingResource = ComposeIdlingResource(
             composeRootRegistry, mainClockImpl, recomposer
         )
-        registerIdlingResource(composeIdlingResource)
     }
 
     private var idlingStrategyFactory: () -> IdlingStrategy = {
@@ -232,6 +228,10 @@
             .outerRule { base, _ -> composeRootRegistry.getStatementFor(base) }
             .around { base, _ -> idlingResourceRegistry.getStatementFor(base) }
             .around { base, _ -> idlingStrategy.getStatementFor(base) }
+            .around { base, _ -> CleanupCoroutinesStatement(base) }
+            .around { base, _ -> RecomposerStatement(base) }
+            .around { base, _ -> ComposeIdlingResourceStatement(base) }
+            .around { base, _ -> TextInputServiceStatement(base) }
             .around { base, _ -> AndroidComposeStatement(base) }
             .around(activityRule)
             .apply(base, description)
@@ -336,35 +336,11 @@
         idlingResourceRegistry.unregisterIdlingResource(idlingResource)
     }
 
-    inner class AndroidComposeStatement(
-        private val base: Statement
-    ) : Statement() {
-
-        @OptIn(InternalComposeUiApi::class)
+    inner class AndroidComposeStatement(private val base: Statement) : Statement() {
         override fun evaluate() {
-            WindowRecomposerPolicy.withFactory({ recomposer }) {
-                evaluateInner()
-            }
-        }
-
-        @OptIn(InternalComposeUiApi::class)
-        private fun evaluateInner() {
-            val oldTextInputFactory = textInputServiceFactory
             try {
-                textInputServiceFactory = {
-                    TextInputServiceForTests(it)
-                }
                 base.evaluate()
             } finally {
-                textInputServiceFactory = oldTextInputFactory
-                recomposer.cancel()
-                // FYI: Not canceling these scope below would end up cleanupTestCoroutines
-                // throwing errors on active coroutines
-                recomposerApplyCoroutineScope.cancel()
-                frameCoroutineScope.cancel()
-                coroutineExceptionHandler.throwUncaught()
-                @OptIn(ExperimentalCoroutinesApi::class)
-                testCoroutineDispatcher.cleanupTestCoroutines()
                 // Dispose the content
                 if (disposeContentHook != null) {
                     runOnUiThread {
@@ -386,6 +362,70 @@
         }
     }
 
+    private inner class RecomposerStatement(private val base: Statement) : Statement() {
+        override fun evaluate() {
+            @OptIn(InternalComposeUiApi::class)
+            WindowRecomposerPolicy.withFactory({ recomposer }) {
+                evaluateWithWindowRecomposer()
+            }
+        }
+
+        private fun evaluateWithWindowRecomposer() {
+            try {
+                // Start the recomposer:
+                recomposerApplyCoroutineScope.launch {
+                    recomposer.runRecomposeAndApplyChanges()
+                }
+                base.evaluate()
+            } finally {
+                // Stop the recomposer:
+                recomposer.cancel()
+                // Cancel our scope to ensure there are no active coroutines when
+                // cleanupTestCoroutines is called in the CleanupCoroutinesStatement
+                recomposerApplyCoroutineScope.cancel()
+            }
+        }
+    }
+
+    private inner class CleanupCoroutinesStatement(private val base: Statement) : Statement() {
+        override fun evaluate() {
+            try {
+                base.evaluate()
+            } finally {
+                frameCoroutineScope.cancel()
+                coroutineExceptionHandler.throwUncaught()
+                @OptIn(ExperimentalCoroutinesApi::class)
+                testCoroutineDispatcher.cleanupTestCoroutines()
+            }
+        }
+    }
+
+    private inner class ComposeIdlingResourceStatement(private val base: Statement) : Statement() {
+        override fun evaluate() {
+            try {
+                registerIdlingResource(composeIdlingResource)
+                base.evaluate()
+            } finally {
+                unregisterIdlingResource(composeIdlingResource)
+            }
+        }
+    }
+
+    private class TextInputServiceStatement(private val base: Statement) : Statement() {
+        @OptIn(InternalComposeUiApi::class)
+        override fun evaluate() {
+            val oldTextInputFactory = textInputServiceFactory
+            try {
+                textInputServiceFactory = {
+                    TextInputServiceForTests(it)
+                }
+                base.evaluate()
+            } finally {
+                textInputServiceFactory = oldTextInputFactory
+            }
+        }
+    }
+
     override fun onNode(
         matcher: SemanticsMatcher,
         useUnmergedTree: Boolean
diff --git a/compose/ui/ui-test-manifest/api/1.1.0-beta02.txt b/compose/ui/ui-test-manifest/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-test-manifest/api/1.1.0-beta02.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/ui/ui-test-manifest/api/public_plus_experimental_1.1.0-beta02.txt b/compose/ui/ui-test-manifest/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-test-manifest/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/ui/ui-test-manifest/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to compose/ui/ui-test-manifest/api/res-1.1.0-beta02.txt
diff --git a/compose/ui/ui-test-manifest/api/restricted_1.1.0-beta02.txt b/compose/ui/ui-test-manifest/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/compose/ui/ui-test-manifest/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/ui/ui-test/api/1.1.0-beta02.txt b/compose/ui/ui-test/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..59d20ee
--- /dev/null
+++ b/compose/ui/ui-test/api/1.1.0-beta02.txt
@@ -0,0 +1,392 @@
+// Signature format: 4.0
+package androidx.compose.ui.test {
+
+  public final class ActionsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performClick(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method @Deprecated public static androidx.compose.ui.test.SemanticsNodeInteraction performGesture(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.GestureScope,kotlin.Unit> block);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performMultiModalInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.MultiModalInjectionScope,kotlin.Unit> block);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollTo(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToIndex(androidx.compose.ui.test.SemanticsNodeInteraction, int index);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToKey(androidx.compose.ui.test.SemanticsNodeInteraction, Object key);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToNode(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static <T extends kotlin.Function<? extends java.lang.Boolean>> androidx.compose.ui.test.SemanticsNodeInteraction performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<T>> key, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> invocation);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> key);
+    method @Deprecated public static <T extends kotlin.Function<? extends java.lang.Boolean>> void performSemanticsActionUnit(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<T>> key, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> invocation);
+    method @Deprecated public static void performSemanticsActionUnit(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<? extends java.lang.Boolean>>> key);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performTouchInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.TouchInjectionScope,kotlin.Unit> block);
+  }
+
+  public final class Actions_androidKt {
+  }
+
+  public final class AndroidAssertions_androidKt {
+  }
+
+  public final class AndroidImageHelpers_androidKt {
+    method @RequiresApi(android.os.Build.VERSION_CODES.O) public static androidx.compose.ui.graphics.ImageBitmap captureToImage(androidx.compose.ui.test.SemanticsNodeInteraction);
+  }
+
+  public final class AndroidInputDispatcher_androidKt {
+  }
+
+  public final class AndroidOutput_androidKt {
+  }
+
+  public final class AssertionsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assert(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher, optional kotlin.jvm.functions.Function0<java.lang.String>? messagePrefixOnError);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAll(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAny(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, java.lang.String... values);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertCountEquals(androidx.compose.ui.test.SemanticsNodeInteractionCollection, int expectedSize);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasNoClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsDisplayed(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsEnabled(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsFocused(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotDisplayed(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotEnabled(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotFocused(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotSelected(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsOff(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsOn(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsSelectable(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsSelected(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsToggleable(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertRangeInfoEquals(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.ProgressBarRangeInfo value);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String![] values, optional boolean includeEditableText);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertValueEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value);
+  }
+
+  public final class BoundsAssertionsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHeightIsAtLeast(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHeightIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedHeight);
+    method public static void assertIsEqualTo(float, float expected, String subject, optional float tolerance);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertLeftPositionInRootIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertPositionInRootIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTopPositionInRootIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTouchHeightIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTouchWidthIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedWidth);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsAtLeast(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinWidth);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedWidth);
+    method public static float getAlignmentLinePosition(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public static androidx.compose.ui.unit.DpRect getBoundsInRoot(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.unit.DpRect getUnclippedBoundsInRoot(androidx.compose.ui.test.SemanticsNodeInteraction);
+  }
+
+  public final class ComposeTimeoutException extends java.lang.Throwable {
+    ctor public ComposeTimeoutException(String? message);
+  }
+
+  public final class ErrorMessagesKt {
+  }
+
+  public final class FiltersKt {
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnyAncestor(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnyChild(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnyDescendant(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnySibling(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasClickAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescription(String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescriptionExactly(java.lang.String... values);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasImeAction(int actionType);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasNoClickAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasNoScrollAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasParent(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasProgressBarRangeInfo(androidx.compose.ui.semantics.ProgressBarRangeInfo rangeInfo);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToIndexAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToKeyAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToNodeAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasSetTextAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasStateDescription(String value);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasTestTag(String testTag);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasText(String text, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasTextExactly(String![] textValues, optional boolean includeEditableText);
+    method public static androidx.compose.ui.test.SemanticsMatcher isDialog();
+    method public static androidx.compose.ui.test.SemanticsMatcher isEnabled();
+    method public static androidx.compose.ui.test.SemanticsMatcher isFocusable();
+    method public static androidx.compose.ui.test.SemanticsMatcher isFocused();
+    method public static androidx.compose.ui.test.SemanticsMatcher isHeading();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotEnabled();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotFocusable();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotFocused();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotSelected();
+    method public static androidx.compose.ui.test.SemanticsMatcher isOff();
+    method public static androidx.compose.ui.test.SemanticsMatcher isOn();
+    method public static androidx.compose.ui.test.SemanticsMatcher isPopup();
+    method public static androidx.compose.ui.test.SemanticsMatcher isRoot();
+    method public static androidx.compose.ui.test.SemanticsMatcher isSelectable();
+    method public static androidx.compose.ui.test.SemanticsMatcher isSelected();
+    method public static androidx.compose.ui.test.SemanticsMatcher isToggleable();
+  }
+
+  public final class FindersKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onAllNodesWithContentDescription(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String label, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onAllNodesWithTag(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String testTag, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onAllNodesWithText(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String text, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onNodeWithContentDescription(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String label, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onNodeWithTag(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String testTag, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onNodeWithText(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String text, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onRoot(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, optional boolean useUnmergedTree);
+  }
+
+  @Deprecated public final class GestureScope {
+    ctor @Deprecated public GestureScope(androidx.compose.ui.semantics.SemanticsNode node, androidx.compose.ui.test.TestContext testContext);
+    method @Deprecated public long getVisibleSize();
+    property public final long visibleSize;
+  }
+
+  public final class GestureScopeKt {
+    method @Deprecated public static void cancel(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void click(androidx.compose.ui.test.GestureScope, optional long position);
+    method @Deprecated public static void doubleClick(androidx.compose.ui.test.GestureScope, optional long position, optional long delayMillis);
+    method @Deprecated public static void down(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method @Deprecated public static void down(androidx.compose.ui.test.GestureScope, long position);
+    method @Deprecated public static inline float getBottom(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getBottomCenter(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getBottomLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getBottomRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getCenter(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getCenterLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getCenterRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getCenterX(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getCenterY(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline int getHeight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getTop(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getTopCenter(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getTopLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getTopRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline int getWidth(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void longClick(androidx.compose.ui.test.GestureScope, optional long position, optional long durationMillis);
+    method @Deprecated public static void move(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void moveBy(androidx.compose.ui.test.GestureScope, int pointerId, long delta);
+    method @Deprecated public static void moveBy(androidx.compose.ui.test.GestureScope, long delta);
+    method @Deprecated public static void movePointerBy(androidx.compose.ui.test.GestureScope, int pointerId, long delta);
+    method @Deprecated public static void movePointerTo(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method @Deprecated public static void moveTo(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method @Deprecated public static void moveTo(androidx.compose.ui.test.GestureScope, long position);
+    method @Deprecated public static long percentOffset(androidx.compose.ui.test.GestureScope, optional float x, optional float y);
+    method @Deprecated public static void pinch(androidx.compose.ui.test.GestureScope, long start0, long end0, long start1, long end1, optional long durationMillis);
+    method @Deprecated public static void swipe(androidx.compose.ui.test.GestureScope, long start, long end, optional long durationMillis);
+    method @Deprecated public static void swipeDown(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void swipeLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void swipeRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void swipeUp(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void swipeWithVelocity(androidx.compose.ui.test.GestureScope, long start, long end, float endVelocity, optional long durationMillis);
+    method @Deprecated public static void up(androidx.compose.ui.test.GestureScope, optional int pointerId);
+  }
+
+  public interface IdlingResource {
+    method public default String? getDiagnosticMessageIfBusy();
+    method public boolean isIdleNow();
+    property public abstract boolean isIdleNow;
+  }
+
+  public interface InjectionScope extends androidx.compose.ui.unit.Density {
+    method public void advanceEventTime(optional long durationMillis);
+    method public void dispose();
+    method public void flush();
+    method public default float getBottom();
+    method public default long getBottomCenter();
+    method public default long getBottomLeft();
+    method public default long getBottomRight();
+    method public default long getCenter();
+    method public default long getCenterLeft();
+    method public default long getCenterRight();
+    method public default float getCenterX();
+    method public default float getCenterY();
+    method public default long getEventPeriodMillis();
+    method public default int getHeight();
+    method public default float getLeft();
+    method public default float getRight();
+    method public default float getTop();
+    method public default long getTopCenter();
+    method public default long getTopLeft();
+    method public default long getTopRight();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    method public long getVisibleSize();
+    method public default int getWidth();
+    method public default long percentOffset(optional float x, optional float y);
+    property public default float bottom;
+    property public default long bottomCenter;
+    property public default long bottomLeft;
+    property public default long bottomRight;
+    property public default long center;
+    property public default long centerLeft;
+    property public default long centerRight;
+    property public default float centerX;
+    property public default float centerY;
+    property public default long eventPeriodMillis;
+    property public default int height;
+    property public default float left;
+    property public default float right;
+    property public default float top;
+    property public default long topCenter;
+    property public default long topLeft;
+    property public default long topRight;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+    property public abstract long visibleSize;
+    property public default int width;
+  }
+
+  public final class KeyInputHelpersKt {
+    method public static boolean performKeyPress(androidx.compose.ui.test.SemanticsNodeInteraction, android.view.KeyEvent keyEvent);
+  }
+
+  public interface MainTestClock {
+    method public void advanceTimeBy(long milliseconds, optional boolean ignoreFrameDuration);
+    method public void advanceTimeByFrame();
+    method public void advanceTimeUntil(optional long timeoutMillis, kotlin.jvm.functions.Function0<java.lang.Boolean> condition);
+    method public boolean getAutoAdvance();
+    method public long getCurrentTime();
+    method public void setAutoAdvance(boolean autoAdvance);
+    property public abstract boolean autoAdvance;
+    property public abstract long currentTime;
+  }
+
+  public final class MouseInjectionScopeKt {
+  }
+
+  public sealed interface MultiModalInjectionScope extends androidx.compose.ui.test.InjectionScope {
+    method public androidx.compose.ui.test.TouchInjectionScope getTouch();
+    property public abstract androidx.compose.ui.test.TouchInjectionScope Touch;
+  }
+
+  public final class OutputKt {
+    method public static void printToLog(androidx.compose.ui.test.SemanticsNodeInteraction, String tag, optional int maxDepth);
+    method public static void printToLog(androidx.compose.ui.test.SemanticsNodeInteractionCollection, String tag, optional int maxDepth);
+    method public static String printToString(androidx.compose.ui.test.SemanticsNodeInteraction, optional int maxDepth);
+    method public static String printToString(androidx.compose.ui.test.SemanticsNodeInteractionCollection, optional int maxDepth);
+  }
+
+  public final class SelectionResult {
+    ctor public SelectionResult(java.util.List<androidx.compose.ui.semantics.SemanticsNode> selectedNodes, optional String? customErrorOnNoMatch);
+    method public String? getCustomErrorOnNoMatch();
+    method public java.util.List<androidx.compose.ui.semantics.SemanticsNode> getSelectedNodes();
+    property public final String? customErrorOnNoMatch;
+    property public final java.util.List<androidx.compose.ui.semantics.SemanticsNode> selectedNodes;
+  }
+
+  public final class SelectorsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection filter(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction filterToOne(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onAncestors(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onChild(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onChildAt(androidx.compose.ui.test.SemanticsNodeInteraction, int index);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onChildren(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onFirst(androidx.compose.ui.test.SemanticsNodeInteractionCollection);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onLast(androidx.compose.ui.test.SemanticsNodeInteractionCollection);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onParent(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onSibling(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onSiblings(androidx.compose.ui.test.SemanticsNodeInteraction);
+  }
+
+  public final class SemanticsMatcher {
+    ctor public SemanticsMatcher(String description, kotlin.jvm.functions.Function1<? super androidx.compose.ui.semantics.SemanticsNode,java.lang.Boolean> matcher);
+    method public infix androidx.compose.ui.test.SemanticsMatcher and(androidx.compose.ui.test.SemanticsMatcher other);
+    method public String getDescription();
+    method public boolean matches(androidx.compose.ui.semantics.SemanticsNode node);
+    method public boolean matchesAny(Iterable<androidx.compose.ui.semantics.SemanticsNode> nodes);
+    method public operator androidx.compose.ui.test.SemanticsMatcher not();
+    method public infix androidx.compose.ui.test.SemanticsMatcher or(androidx.compose.ui.test.SemanticsMatcher other);
+    property public final String description;
+    field public static final androidx.compose.ui.test.SemanticsMatcher.Companion Companion;
+  }
+
+  public static final class SemanticsMatcher.Companion {
+    method public <T> androidx.compose.ui.test.SemanticsMatcher expectValue(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, T? expectedValue);
+    method public <T> androidx.compose.ui.test.SemanticsMatcher keyIsDefined(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key);
+    method public <T> androidx.compose.ui.test.SemanticsMatcher keyNotDefined(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key);
+  }
+
+  public final class SemanticsNodeInteraction {
+    ctor public SemanticsNodeInteraction(androidx.compose.ui.test.TestContext testContext, boolean useUnmergedTree, androidx.compose.ui.test.SemanticsSelector selector);
+    ctor public SemanticsNodeInteraction(androidx.compose.ui.test.TestContext testContext, boolean useUnmergedTree, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public void assertDoesNotExist();
+    method public androidx.compose.ui.test.SemanticsNodeInteraction assertExists(optional String? errorMessageOnFail);
+    method public androidx.compose.ui.semantics.SemanticsNode fetchSemanticsNode(optional String? errorMessageOnFail);
+  }
+
+  public final class SemanticsNodeInteractionCollection {
+    ctor public SemanticsNodeInteractionCollection(androidx.compose.ui.test.TestContext testContext, boolean useUnmergedTree, androidx.compose.ui.test.SemanticsSelector selector);
+    ctor public SemanticsNodeInteractionCollection(androidx.compose.ui.test.TestContext testContext, boolean useUnmergedTree, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public java.util.List<androidx.compose.ui.semantics.SemanticsNode> fetchSemanticsNodes(optional boolean atLeastOneRootRequired, optional String? errorMessageOnFail);
+    method public operator androidx.compose.ui.test.SemanticsNodeInteraction get(int index);
+  }
+
+  public interface SemanticsNodeInteractionsProvider {
+    method public androidx.compose.ui.test.SemanticsNodeInteractionCollection onAllNodes(androidx.compose.ui.test.SemanticsMatcher matcher, optional boolean useUnmergedTree);
+    method public androidx.compose.ui.test.SemanticsNodeInteraction onNode(androidx.compose.ui.test.SemanticsMatcher matcher, optional boolean useUnmergedTree);
+  }
+
+  public final class SemanticsSelector {
+    ctor public SemanticsSelector(String description, boolean requiresExactlyOneNode, optional androidx.compose.ui.test.SemanticsSelector? chainedInputSelector, kotlin.jvm.functions.Function1<? super java.lang.Iterable<androidx.compose.ui.semantics.SemanticsNode>,androidx.compose.ui.test.SelectionResult> selector);
+    method public String getDescription();
+    method public androidx.compose.ui.test.SelectionResult map(Iterable<androidx.compose.ui.semantics.SemanticsNode> nodes, String errorOnFail);
+    property public final String description;
+  }
+
+  public final class SemanticsSelectorKt {
+  }
+
+  public final class TestContext {
+  }
+
+  public final class TestMonotonicFrameClock_jvmKt {
+  }
+
+  public final class TestOwnerKt {
+  }
+
+  public final class TextActionsKt {
+    method public static void performImeAction(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static void performTextClearance(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static void performTextInput(androidx.compose.ui.test.SemanticsNodeInteraction, String text);
+    method public static void performTextReplacement(androidx.compose.ui.test.SemanticsNodeInteraction, String text);
+  }
+
+  public interface TouchInjectionScope extends androidx.compose.ui.test.InjectionScope {
+    method public void cancel(optional long delayMillis);
+    method public androidx.compose.ui.geometry.Offset? currentPosition(optional int pointerId);
+    method public void down(int pointerId, long position);
+    method public default void down(long position);
+    method public void move(optional long delayMillis);
+    method public default void moveBy(int pointerId, long delta, optional long delayMillis);
+    method public default void moveBy(long delta, optional long delayMillis);
+    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 default void updatePointerBy(int pointerId, long delta);
+    method public void updatePointerTo(int pointerId, long position);
+  }
+
+  public final class TouchInjectionScopeKt {
+    method public static void click(androidx.compose.ui.test.TouchInjectionScope, optional long position);
+    method public static void doubleClick(androidx.compose.ui.test.TouchInjectionScope, optional long position, optional long delayMillis);
+    method public static void longClick(androidx.compose.ui.test.TouchInjectionScope, optional long position, optional long durationMillis);
+    method public static void pinch(androidx.compose.ui.test.TouchInjectionScope, long start0, long end0, long start1, long end1, optional long durationMillis);
+    method public static void swipe(androidx.compose.ui.test.TouchInjectionScope, long start, long end, optional long durationMillis);
+    method public static void swipe(androidx.compose.ui.test.TouchInjectionScope, kotlin.jvm.functions.Function1<? super java.lang.Long,androidx.compose.ui.geometry.Offset> curve, long durationMillis, optional java.util.List<java.lang.Long> keyTimes);
+    method public static void swipeDown(androidx.compose.ui.test.TouchInjectionScope, optional float startY, optional float endY, optional long durationMillis);
+    method public static void swipeLeft(androidx.compose.ui.test.TouchInjectionScope, optional float startX, optional float endX, optional long durationMillis);
+    method public static void swipeRight(androidx.compose.ui.test.TouchInjectionScope, optional float startX, optional float endX, optional long durationMillis);
+    method public static void swipeUp(androidx.compose.ui.test.TouchInjectionScope, optional float startY, optional float endY, optional long durationMillis);
+    method public static void swipeWithVelocity(androidx.compose.ui.test.TouchInjectionScope, long start, long end, float endVelocity, optional long durationMillis);
+  }
+
+  public final class UtilsKt {
+  }
+
+}
+
+package androidx.compose.ui.test.android {
+
+  public final class WindowCapture_androidKt {
+  }
+
+}
+
diff --git a/compose/ui/ui-test/api/current.txt b/compose/ui/ui-test/api/current.txt
index 722e434..59d20ee 100644
--- a/compose/ui/ui-test/api/current.txt
+++ b/compose/ui/ui-test/api/current.txt
@@ -11,6 +11,8 @@
     method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToNode(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher);
     method public static <T extends kotlin.Function<? extends java.lang.Boolean>> androidx.compose.ui.test.SemanticsNodeInteraction performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<T>> key, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> invocation);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> key);
+    method @Deprecated public static <T extends kotlin.Function<? extends java.lang.Boolean>> void performSemanticsActionUnit(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<T>> key, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> invocation);
+    method @Deprecated public static void performSemanticsActionUnit(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<? extends java.lang.Boolean>>> key);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction performTouchInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.TouchInjectionScope,kotlin.Unit> block);
   }
 
diff --git a/compose/ui/ui-test/api/public_plus_experimental_1.1.0-beta02.txt b/compose/ui/ui-test/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..be615e4
--- /dev/null
+++ b/compose/ui/ui-test/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,484 @@
+// Signature format: 4.0
+package androidx.compose.ui.test {
+
+  public final class ActionsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performClick(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method @Deprecated public static androidx.compose.ui.test.SemanticsNodeInteraction performGesture(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.GestureScope,kotlin.Unit> block);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static androidx.compose.ui.test.SemanticsNodeInteraction performMouseInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.MouseInjectionScope,kotlin.Unit> block);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performMultiModalInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.MultiModalInjectionScope,kotlin.Unit> block);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollTo(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToIndex(androidx.compose.ui.test.SemanticsNodeInteraction, int index);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToKey(androidx.compose.ui.test.SemanticsNodeInteraction, Object key);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToNode(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static <T extends kotlin.Function<? extends java.lang.Boolean>> androidx.compose.ui.test.SemanticsNodeInteraction performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<T>> key, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> invocation);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> key);
+    method @Deprecated public static <T extends kotlin.Function<? extends java.lang.Boolean>> void performSemanticsActionUnit(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<T>> key, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> invocation);
+    method @Deprecated public static void performSemanticsActionUnit(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<? extends java.lang.Boolean>>> key);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performTouchInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.TouchInjectionScope,kotlin.Unit> block);
+  }
+
+  public final class Actions_androidKt {
+  }
+
+  public final class AndroidAssertions_androidKt {
+  }
+
+  public final class AndroidImageHelpers_androidKt {
+    method @RequiresApi(android.os.Build.VERSION_CODES.O) public static androidx.compose.ui.graphics.ImageBitmap captureToImage(androidx.compose.ui.test.SemanticsNodeInteraction);
+  }
+
+  public final class AndroidInputDispatcher_androidKt {
+  }
+
+  public final class AndroidOutput_androidKt {
+  }
+
+  public final class AssertionsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assert(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher, optional kotlin.jvm.functions.Function0<java.lang.String>? messagePrefixOnError);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAll(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAny(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, java.lang.String... values);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertCountEquals(androidx.compose.ui.test.SemanticsNodeInteractionCollection, int expectedSize);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasNoClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsDisplayed(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsEnabled(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsFocused(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotDisplayed(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotEnabled(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotFocused(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotSelected(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsOff(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsOn(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsSelectable(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsSelected(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsToggleable(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertRangeInfoEquals(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.ProgressBarRangeInfo value);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String![] values, optional boolean includeEditableText);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertValueEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value);
+  }
+
+  public final class BoundsAssertionsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHeightIsAtLeast(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHeightIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedHeight);
+    method public static void assertIsEqualTo(float, float expected, String subject, optional float tolerance);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertLeftPositionInRootIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertPositionInRootIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTopPositionInRootIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTouchHeightIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTouchWidthIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedWidth);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsAtLeast(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinWidth);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedWidth);
+    method public static float getAlignmentLinePosition(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public static androidx.compose.ui.unit.DpRect getBoundsInRoot(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.unit.DpRect getUnclippedBoundsInRoot(androidx.compose.ui.test.SemanticsNodeInteraction);
+  }
+
+  public final class ComposeTimeoutException extends java.lang.Throwable {
+    ctor public ComposeTimeoutException(String? message);
+  }
+
+  public final class ErrorMessagesKt {
+  }
+
+  @kotlin.RequiresOptIn(message="This testing API is experimental and is likely to be changed or removed entirely") public @interface ExperimentalTestApi {
+  }
+
+  public final class FiltersKt {
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnyAncestor(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnyChild(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnyDescendant(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnySibling(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasClickAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescription(String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescriptionExactly(java.lang.String... values);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasImeAction(int actionType);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasNoClickAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasNoScrollAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasParent(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasProgressBarRangeInfo(androidx.compose.ui.semantics.ProgressBarRangeInfo rangeInfo);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToIndexAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToKeyAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToNodeAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasSetTextAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasStateDescription(String value);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasTestTag(String testTag);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasText(String text, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasTextExactly(String![] textValues, optional boolean includeEditableText);
+    method public static androidx.compose.ui.test.SemanticsMatcher isDialog();
+    method public static androidx.compose.ui.test.SemanticsMatcher isEnabled();
+    method public static androidx.compose.ui.test.SemanticsMatcher isFocusable();
+    method public static androidx.compose.ui.test.SemanticsMatcher isFocused();
+    method public static androidx.compose.ui.test.SemanticsMatcher isHeading();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotEnabled();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotFocusable();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotFocused();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotSelected();
+    method public static androidx.compose.ui.test.SemanticsMatcher isOff();
+    method public static androidx.compose.ui.test.SemanticsMatcher isOn();
+    method public static androidx.compose.ui.test.SemanticsMatcher isPopup();
+    method public static androidx.compose.ui.test.SemanticsMatcher isRoot();
+    method public static androidx.compose.ui.test.SemanticsMatcher isSelectable();
+    method public static androidx.compose.ui.test.SemanticsMatcher isSelected();
+    method public static androidx.compose.ui.test.SemanticsMatcher isToggleable();
+  }
+
+  public final class FindersKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onAllNodesWithContentDescription(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String label, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onAllNodesWithTag(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String testTag, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onAllNodesWithText(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String text, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onNodeWithContentDescription(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String label, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onNodeWithTag(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String testTag, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onNodeWithText(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String text, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onRoot(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, optional boolean useUnmergedTree);
+  }
+
+  @Deprecated public final class GestureScope {
+    ctor @Deprecated public GestureScope(androidx.compose.ui.semantics.SemanticsNode node, androidx.compose.ui.test.TestContext testContext);
+    method @Deprecated public long getVisibleSize();
+    property public final long visibleSize;
+  }
+
+  public final class GestureScopeKt {
+    method @Deprecated @androidx.compose.ui.test.ExperimentalTestApi public static void advanceEventTime(androidx.compose.ui.test.GestureScope, long durationMillis);
+    method @Deprecated public static void cancel(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void click(androidx.compose.ui.test.GestureScope, optional long position);
+    method @Deprecated public static void doubleClick(androidx.compose.ui.test.GestureScope, optional long position, optional long delayMillis);
+    method @Deprecated public static void down(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method @Deprecated public static void down(androidx.compose.ui.test.GestureScope, long position);
+    method @Deprecated public static inline float getBottom(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getBottomCenter(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getBottomLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getBottomRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getCenter(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getCenterLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getCenterRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getCenterX(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getCenterY(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline int getHeight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getTop(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getTopCenter(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getTopLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getTopRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline int getWidth(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void longClick(androidx.compose.ui.test.GestureScope, optional long position, optional long durationMillis);
+    method @Deprecated public static void move(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void moveBy(androidx.compose.ui.test.GestureScope, int pointerId, long delta);
+    method @Deprecated public static void moveBy(androidx.compose.ui.test.GestureScope, long delta);
+    method @Deprecated public static void movePointerBy(androidx.compose.ui.test.GestureScope, int pointerId, long delta);
+    method @Deprecated public static void movePointerTo(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method @Deprecated public static void moveTo(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method @Deprecated public static void moveTo(androidx.compose.ui.test.GestureScope, long position);
+    method @Deprecated public static long percentOffset(androidx.compose.ui.test.GestureScope, optional float x, optional float y);
+    method @Deprecated public static void pinch(androidx.compose.ui.test.GestureScope, long start0, long end0, long start1, long end1, optional long durationMillis);
+    method @Deprecated public static void swipe(androidx.compose.ui.test.GestureScope, long start, long end, optional long durationMillis);
+    method @Deprecated public static void swipeDown(androidx.compose.ui.test.GestureScope);
+    method @Deprecated @androidx.compose.ui.test.ExperimentalTestApi public static void swipeDown(androidx.compose.ui.test.GestureScope, optional float startY, optional float endY, optional long durationMillis);
+    method @Deprecated public static void swipeLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated @androidx.compose.ui.test.ExperimentalTestApi public static void swipeLeft(androidx.compose.ui.test.GestureScope, optional float startX, optional float endX, optional long durationMillis);
+    method @Deprecated public static void swipeRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated @androidx.compose.ui.test.ExperimentalTestApi public static void swipeRight(androidx.compose.ui.test.GestureScope, optional float startX, optional float endX, optional long durationMillis);
+    method @Deprecated public static void swipeUp(androidx.compose.ui.test.GestureScope);
+    method @Deprecated @androidx.compose.ui.test.ExperimentalTestApi public static void swipeUp(androidx.compose.ui.test.GestureScope, optional float startY, optional float endY, optional long durationMillis);
+    method @Deprecated public static void swipeWithVelocity(androidx.compose.ui.test.GestureScope, long start, long end, float endVelocity, optional long durationMillis);
+    method @Deprecated public static void up(androidx.compose.ui.test.GestureScope, optional int pointerId);
+  }
+
+  public interface IdlingResource {
+    method public default String? getDiagnosticMessageIfBusy();
+    method public boolean isIdleNow();
+    property public abstract boolean isIdleNow;
+  }
+
+  public interface InjectionScope extends androidx.compose.ui.unit.Density {
+    method public void advanceEventTime(optional long durationMillis);
+    method public void dispose();
+    method public void flush();
+    method public default float getBottom();
+    method public default long getBottomCenter();
+    method public default long getBottomLeft();
+    method public default long getBottomRight();
+    method public default long getCenter();
+    method public default long getCenterLeft();
+    method public default long getCenterRight();
+    method public default float getCenterX();
+    method public default float getCenterY();
+    method public default long getEventPeriodMillis();
+    method public default int getHeight();
+    method public default float getLeft();
+    method public default float getRight();
+    method public default float getTop();
+    method public default long getTopCenter();
+    method public default long getTopLeft();
+    method public default long getTopRight();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    method public long getVisibleSize();
+    method public default int getWidth();
+    method public default long percentOffset(optional float x, optional float y);
+    property public default float bottom;
+    property public default long bottomCenter;
+    property public default long bottomLeft;
+    property public default long bottomRight;
+    property public default long center;
+    property public default long centerLeft;
+    property public default long centerRight;
+    property public default float centerX;
+    property public default float centerY;
+    property public default long eventPeriodMillis;
+    property public default int height;
+    property public default float left;
+    property public default float right;
+    property public default float top;
+    property public default long topCenter;
+    property public default long topLeft;
+    property public default long topRight;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+    property public abstract long visibleSize;
+    property public default int width;
+  }
+
+  @kotlin.RequiresOptIn(message="This is internal API for Compose modules that may change frequently and without warning.") public @interface InternalTestApi {
+  }
+
+  public final class KeyInputHelpersKt {
+    method public static boolean performKeyPress(androidx.compose.ui.test.SemanticsNodeInteraction, android.view.KeyEvent keyEvent);
+  }
+
+  public interface MainTestClock {
+    method public void advanceTimeBy(long milliseconds, optional boolean ignoreFrameDuration);
+    method public void advanceTimeByFrame();
+    method public void advanceTimeUntil(optional long timeoutMillis, kotlin.jvm.functions.Function0<java.lang.Boolean> condition);
+    method public boolean getAutoAdvance();
+    method public long getCurrentTime();
+    method public void setAutoAdvance(boolean autoAdvance);
+    property public abstract boolean autoAdvance;
+    property public abstract long currentTime;
+  }
+
+  @androidx.compose.ui.test.ExperimentalTestApi public final inline class MouseButton {
+    ctor public MouseButton();
+    method public int getButtonId();
+    property public final int buttonId;
+  }
+
+  @androidx.compose.ui.test.ExperimentalTestApi public static final class MouseButton.Companion {
+    method public int getPrimary();
+    method public int getSecondary();
+    method public int getTertiary();
+    property public final int Primary;
+    property public final int Secondary;
+    property public final int Tertiary;
+  }
+
+  @androidx.compose.ui.test.ExperimentalTestApi public interface MouseInjectionScope extends androidx.compose.ui.test.InjectionScope {
+    method public void cancel(optional long delayMillis);
+    method public void enter(optional long position, optional long delayMillis);
+    method public void exit(optional long position, optional long delayMillis);
+    method public long getCurrentPosition();
+    method public default void moveBy(long delta, optional long delayMillis);
+    method public void moveTo(long position, optional long delayMillis);
+    method public void press(optional int button);
+    method public void release(optional int button);
+    method public void scroll(float delta, optional int scrollWheel);
+    method public default void updatePointerBy(long delta);
+    method public void updatePointerTo(long position);
+    property public abstract long currentPosition;
+  }
+
+  public final class MouseInjectionScopeKt {
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void animateAlong(androidx.compose.ui.test.MouseInjectionScope, kotlin.jvm.functions.Function1<? super java.lang.Long,androidx.compose.ui.geometry.Offset> curve, optional long durationMillis);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void animateBy(androidx.compose.ui.test.MouseInjectionScope, long delta, optional long durationMillis);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void animateTo(androidx.compose.ui.test.MouseInjectionScope, long position, optional long durationMillis);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void click(androidx.compose.ui.test.MouseInjectionScope, optional long position);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void doubleClick(androidx.compose.ui.test.MouseInjectionScope, optional long position);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void dragAndDrop(androidx.compose.ui.test.MouseInjectionScope, long start, long end, optional long durationMillis);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void longClick(androidx.compose.ui.test.MouseInjectionScope, optional long position);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void rightClick(androidx.compose.ui.test.MouseInjectionScope, optional long position);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void smoothScroll(androidx.compose.ui.test.MouseInjectionScope, float scrollAmount, optional long durationMillis, optional int scrollWheel);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void tripleClick(androidx.compose.ui.test.MouseInjectionScope, optional long position);
+  }
+
+  public sealed interface MultiModalInjectionScope extends androidx.compose.ui.test.InjectionScope {
+    method @androidx.compose.ui.test.ExperimentalTestApi public androidx.compose.ui.test.MouseInjectionScope getMouse();
+    method public androidx.compose.ui.test.TouchInjectionScope getTouch();
+    property @androidx.compose.ui.test.ExperimentalTestApi public abstract androidx.compose.ui.test.MouseInjectionScope Mouse;
+    property public abstract androidx.compose.ui.test.TouchInjectionScope Touch;
+  }
+
+  public final class OutputKt {
+    method public static void printToLog(androidx.compose.ui.test.SemanticsNodeInteraction, String tag, optional int maxDepth);
+    method public static void printToLog(androidx.compose.ui.test.SemanticsNodeInteractionCollection, String tag, optional int maxDepth);
+    method public static String printToString(androidx.compose.ui.test.SemanticsNodeInteraction, optional int maxDepth);
+    method public static String printToString(androidx.compose.ui.test.SemanticsNodeInteractionCollection, optional int maxDepth);
+  }
+
+  @androidx.compose.ui.test.ExperimentalTestApi public final inline class ScrollWheel {
+    ctor public ScrollWheel();
+    method public int getValue();
+    property public final int value;
+  }
+
+  @androidx.compose.ui.test.ExperimentalTestApi public static final class ScrollWheel.Companion {
+    method public int getHorizontal();
+    method public int getVertical();
+    property public final int Horizontal;
+    property public final int Vertical;
+  }
+
+  public final class SelectionResult {
+    ctor public SelectionResult(java.util.List<androidx.compose.ui.semantics.SemanticsNode> selectedNodes, optional String? customErrorOnNoMatch);
+    method public String? getCustomErrorOnNoMatch();
+    method public java.util.List<androidx.compose.ui.semantics.SemanticsNode> getSelectedNodes();
+    property public final String? customErrorOnNoMatch;
+    property public final java.util.List<androidx.compose.ui.semantics.SemanticsNode> selectedNodes;
+  }
+
+  public final class SelectorsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection filter(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction filterToOne(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onAncestors(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onChild(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onChildAt(androidx.compose.ui.test.SemanticsNodeInteraction, int index);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onChildren(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onFirst(androidx.compose.ui.test.SemanticsNodeInteractionCollection);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onLast(androidx.compose.ui.test.SemanticsNodeInteractionCollection);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onParent(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onSibling(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onSiblings(androidx.compose.ui.test.SemanticsNodeInteraction);
+  }
+
+  public final class SemanticsMatcher {
+    ctor public SemanticsMatcher(String description, kotlin.jvm.functions.Function1<? super androidx.compose.ui.semantics.SemanticsNode,java.lang.Boolean> matcher);
+    method public infix androidx.compose.ui.test.SemanticsMatcher and(androidx.compose.ui.test.SemanticsMatcher other);
+    method public String getDescription();
+    method public boolean matches(androidx.compose.ui.semantics.SemanticsNode node);
+    method public boolean matchesAny(Iterable<androidx.compose.ui.semantics.SemanticsNode> nodes);
+    method public operator androidx.compose.ui.test.SemanticsMatcher not();
+    method public infix androidx.compose.ui.test.SemanticsMatcher or(androidx.compose.ui.test.SemanticsMatcher other);
+    property public final String description;
+    field public static final androidx.compose.ui.test.SemanticsMatcher.Companion Companion;
+  }
+
+  public static final class SemanticsMatcher.Companion {
+    method public <T> androidx.compose.ui.test.SemanticsMatcher expectValue(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, T? expectedValue);
+    method public <T> androidx.compose.ui.test.SemanticsMatcher keyIsDefined(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key);
+    method public <T> androidx.compose.ui.test.SemanticsMatcher keyNotDefined(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key);
+  }
+
+  public final class SemanticsNodeInteraction {
+    ctor public SemanticsNodeInteraction(androidx.compose.ui.test.TestContext testContext, boolean useUnmergedTree, androidx.compose.ui.test.SemanticsSelector selector);
+    ctor public SemanticsNodeInteraction(androidx.compose.ui.test.TestContext testContext, boolean useUnmergedTree, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public void assertDoesNotExist();
+    method public androidx.compose.ui.test.SemanticsNodeInteraction assertExists(optional String? errorMessageOnFail);
+    method public androidx.compose.ui.semantics.SemanticsNode fetchSemanticsNode(optional String? errorMessageOnFail);
+  }
+
+  public final class SemanticsNodeInteractionCollection {
+    ctor public SemanticsNodeInteractionCollection(androidx.compose.ui.test.TestContext testContext, boolean useUnmergedTree, androidx.compose.ui.test.SemanticsSelector selector);
+    ctor public SemanticsNodeInteractionCollection(androidx.compose.ui.test.TestContext testContext, boolean useUnmergedTree, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public java.util.List<androidx.compose.ui.semantics.SemanticsNode> fetchSemanticsNodes(optional boolean atLeastOneRootRequired, optional String? errorMessageOnFail);
+    method public operator androidx.compose.ui.test.SemanticsNodeInteraction get(int index);
+  }
+
+  public interface SemanticsNodeInteractionsProvider {
+    method public androidx.compose.ui.test.SemanticsNodeInteractionCollection onAllNodes(androidx.compose.ui.test.SemanticsMatcher matcher, optional boolean useUnmergedTree);
+    method public androidx.compose.ui.test.SemanticsNodeInteraction onNode(androidx.compose.ui.test.SemanticsMatcher matcher, optional boolean useUnmergedTree);
+  }
+
+  public final class SemanticsSelector {
+    ctor public SemanticsSelector(String description, boolean requiresExactlyOneNode, optional androidx.compose.ui.test.SemanticsSelector? chainedInputSelector, kotlin.jvm.functions.Function1<? super java.lang.Iterable<androidx.compose.ui.semantics.SemanticsNode>,androidx.compose.ui.test.SelectionResult> selector);
+    method public String getDescription();
+    method public androidx.compose.ui.test.SelectionResult map(Iterable<androidx.compose.ui.semantics.SemanticsNode> nodes, String errorOnFail);
+    property public final String description;
+  }
+
+  public final class SemanticsSelectorKt {
+  }
+
+  public final class TestContext {
+  }
+
+  @kotlinx.coroutines.ExperimentalCoroutinesApi public final class TestMonotonicFrameClock implements androidx.compose.runtime.MonotonicFrameClock {
+    ctor public TestMonotonicFrameClock(kotlinx.coroutines.CoroutineScope coroutineScope, kotlinx.coroutines.test.DelayController delayController, optional long frameDelayNanos);
+    method public long getFrameDelayNanos();
+    method public boolean getHasAwaiters();
+    method public suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+    property public final long frameDelayNanos;
+    property public final boolean hasAwaiters;
+  }
+
+  public final class TestMonotonicFrameClock_jvmKt {
+    method @kotlinx.coroutines.ExperimentalCoroutinesApi public static androidx.compose.ui.test.TestMonotonicFrameClock TestMonotonicFrameClock(kotlinx.coroutines.CoroutineScope coroutineScope, optional long frameDelayNanos);
+    method @kotlinx.coroutines.ExperimentalCoroutinesApi public static long getFrameDelayMillis(androidx.compose.ui.test.TestMonotonicFrameClock);
+  }
+
+  @androidx.compose.ui.test.InternalTestApi public interface TestOwner {
+    method public androidx.compose.ui.test.MainTestClock getMainClock();
+    method public java.util.Set<androidx.compose.ui.node.RootForTest> getRoots(boolean atLeastOneRootExpected);
+    method public <T> T! runOnUiThread(kotlin.jvm.functions.Function0<? extends T> action);
+    method public void sendImeAction(androidx.compose.ui.semantics.SemanticsNode node, int actionSpecified);
+    method public void sendTextInputCommand(androidx.compose.ui.semantics.SemanticsNode node, java.util.List<? extends androidx.compose.ui.text.input.EditCommand> command);
+    property public abstract androidx.compose.ui.test.MainTestClock mainClock;
+  }
+
+  public final class TestOwnerKt {
+    method @androidx.compose.ui.test.InternalTestApi public static androidx.compose.ui.test.TestContext createTestContext(androidx.compose.ui.test.TestOwner owner);
+  }
+
+  public final class TextActionsKt {
+    method public static void performImeAction(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static void performTextClearance(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static void performTextInput(androidx.compose.ui.test.SemanticsNodeInteraction, String text);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void performTextInputSelection(androidx.compose.ui.test.SemanticsNodeInteraction, long selection);
+    method public static void performTextReplacement(androidx.compose.ui.test.SemanticsNodeInteraction, String text);
+  }
+
+  public interface TouchInjectionScope extends androidx.compose.ui.test.InjectionScope {
+    method public void cancel(optional long delayMillis);
+    method public androidx.compose.ui.geometry.Offset? currentPosition(optional int pointerId);
+    method public void down(int pointerId, long position);
+    method public default void down(long position);
+    method public void move(optional long delayMillis);
+    method public default void moveBy(int pointerId, long delta, optional long delayMillis);
+    method public default void moveBy(long delta, optional long delayMillis);
+    method public default void moveTo(int pointerId, long position, optional long delayMillis);
+    method public default void moveTo(long position, optional long delayMillis);
+    method @androidx.compose.ui.test.ExperimentalTestApi public default void moveWithHistory(java.util.List<java.lang.Long> relativeHistoricalTimes, java.util.List<androidx.compose.ui.geometry.Offset> historicalCoordinates, optional long delayMillis);
+    method @androidx.compose.ui.test.ExperimentalTestApi public void moveWithHistoryMultiPointer(java.util.List<java.lang.Long> relativeHistoricalTimes, java.util.List<? extends java.util.List<androidx.compose.ui.geometry.Offset>> historicalCoordinates, optional long delayMillis);
+    method public void up(optional int pointerId);
+    method public default void updatePointerBy(int pointerId, long delta);
+    method public void updatePointerTo(int pointerId, long position);
+  }
+
+  public final class TouchInjectionScopeKt {
+    method public static void click(androidx.compose.ui.test.TouchInjectionScope, optional long position);
+    method public static void doubleClick(androidx.compose.ui.test.TouchInjectionScope, optional long position, optional long delayMillis);
+    method public static void longClick(androidx.compose.ui.test.TouchInjectionScope, optional long position, optional long durationMillis);
+    method @androidx.compose.ui.test.ExperimentalTestApi public static void multiTouchSwipe(androidx.compose.ui.test.TouchInjectionScope, java.util.List<? extends kotlin.jvm.functions.Function1<? super java.lang.Long,androidx.compose.ui.geometry.Offset>> curves, long durationMillis, optional java.util.List<java.lang.Long> keyTimes);
+    method public static void pinch(androidx.compose.ui.test.TouchInjectionScope, long start0, long end0, long start1, long end1, optional long durationMillis);
+    method public static void swipe(androidx.compose.ui.test.TouchInjectionScope, long start, long end, optional long durationMillis);
+    method public static void swipe(androidx.compose.ui.test.TouchInjectionScope, kotlin.jvm.functions.Function1<? super java.lang.Long,androidx.compose.ui.geometry.Offset> curve, long durationMillis, optional java.util.List<java.lang.Long> keyTimes);
+    method public static void swipeDown(androidx.compose.ui.test.TouchInjectionScope, optional float startY, optional float endY, optional long durationMillis);
+    method public static void swipeLeft(androidx.compose.ui.test.TouchInjectionScope, optional float startX, optional float endX, optional long durationMillis);
+    method public static void swipeRight(androidx.compose.ui.test.TouchInjectionScope, optional float startX, optional float endX, optional long durationMillis);
+    method public static void swipeUp(androidx.compose.ui.test.TouchInjectionScope, optional float startY, optional float endY, optional long durationMillis);
+    method public static void swipeWithVelocity(androidx.compose.ui.test.TouchInjectionScope, long start, long end, float endVelocity, optional long durationMillis);
+  }
+
+  public final class UtilsKt {
+  }
+
+}
+
+package androidx.compose.ui.test.android {
+
+  public final class WindowCapture_androidKt {
+  }
+
+}
+
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 af5ea70..be615e4 100644
--- a/compose/ui/ui-test/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-test/api/public_plus_experimental_current.txt
@@ -12,6 +12,8 @@
     method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToNode(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher);
     method public static <T extends kotlin.Function<? extends java.lang.Boolean>> androidx.compose.ui.test.SemanticsNodeInteraction performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<T>> key, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> invocation);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> key);
+    method @Deprecated public static <T extends kotlin.Function<? extends java.lang.Boolean>> void performSemanticsActionUnit(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<T>> key, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> invocation);
+    method @Deprecated public static void performSemanticsActionUnit(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<? extends java.lang.Boolean>>> key);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction performTouchInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.TouchInjectionScope,kotlin.Unit> block);
   }
 
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/ui/ui-test/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to compose/ui/ui-test/api/res-1.1.0-beta02.txt
diff --git a/compose/ui/ui-test/api/restricted_1.1.0-beta02.txt b/compose/ui/ui-test/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..61a145d
--- /dev/null
+++ b/compose/ui/ui-test/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,393 @@
+// Signature format: 4.0
+package androidx.compose.ui.test {
+
+  public final class ActionsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performClick(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method @Deprecated public static androidx.compose.ui.test.SemanticsNodeInteraction performGesture(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.GestureScope,kotlin.Unit> block);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performMultiModalInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.MultiModalInjectionScope,kotlin.Unit> block);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollTo(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToIndex(androidx.compose.ui.test.SemanticsNodeInteraction, int index);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToKey(androidx.compose.ui.test.SemanticsNodeInteraction, Object key);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToNode(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static <T extends kotlin.Function<? extends java.lang.Boolean>> androidx.compose.ui.test.SemanticsNodeInteraction performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<T>> key, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> invocation);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> key);
+    method @Deprecated public static <T extends kotlin.Function<? extends java.lang.Boolean>> void performSemanticsActionUnit(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<T>> key, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> invocation);
+    method @Deprecated public static void performSemanticsActionUnit(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<? extends java.lang.Boolean>>> key);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction performTouchInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.TouchInjectionScope,kotlin.Unit> block);
+  }
+
+  public final class Actions_androidKt {
+  }
+
+  public final class AndroidAssertions_androidKt {
+  }
+
+  public final class AndroidImageHelpers_androidKt {
+    method @RequiresApi(android.os.Build.VERSION_CODES.O) public static androidx.compose.ui.graphics.ImageBitmap captureToImage(androidx.compose.ui.test.SemanticsNodeInteraction);
+  }
+
+  public final class AndroidInputDispatcher_androidKt {
+  }
+
+  public final class AndroidOutput_androidKt {
+  }
+
+  public final class AssertionsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assert(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher, optional kotlin.jvm.functions.Function0<java.lang.String>? messagePrefixOnError);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAll(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertAny(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertContentDescriptionEquals(androidx.compose.ui.test.SemanticsNodeInteraction, java.lang.String... values);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection assertCountEquals(androidx.compose.ui.test.SemanticsNodeInteractionCollection, int expectedSize);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHasNoClickAction(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsDisplayed(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsEnabled(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsFocused(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotDisplayed(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotEnabled(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotFocused(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsNotSelected(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsOff(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsOn(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsSelectable(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsSelected(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertIsToggleable(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertRangeInfoEquals(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.ProgressBarRangeInfo value);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextContains(androidx.compose.ui.test.SemanticsNodeInteraction, String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTextEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String![] values, optional boolean includeEditableText);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertValueEquals(androidx.compose.ui.test.SemanticsNodeInteraction, String value);
+  }
+
+  public final class BoundsAssertionsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHeightIsAtLeast(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertHeightIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedHeight);
+    method public static void assertIsEqualTo(float, float expected, String subject, optional float tolerance);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertLeftPositionInRootIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertPositionInRootIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedLeft, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTopPositionInRootIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedTop);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTouchHeightIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedHeight);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertTouchWidthIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedWidth);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsAtLeast(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedMinWidth);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction assertWidthIsEqualTo(androidx.compose.ui.test.SemanticsNodeInteraction, float expectedWidth);
+    method public static float getAlignmentLinePosition(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public static androidx.compose.ui.unit.DpRect getBoundsInRoot(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.unit.DpRect getUnclippedBoundsInRoot(androidx.compose.ui.test.SemanticsNodeInteraction);
+  }
+
+  public final class ComposeTimeoutException extends java.lang.Throwable {
+    ctor public ComposeTimeoutException(String? message);
+  }
+
+  public final class ErrorMessagesKt {
+  }
+
+  public final class FiltersKt {
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnyAncestor(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnyChild(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnyDescendant(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasAnySibling(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasClickAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescription(String value, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasContentDescriptionExactly(java.lang.String... values);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasImeAction(int actionType);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasNoClickAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasNoScrollAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasParent(androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasProgressBarRangeInfo(androidx.compose.ui.semantics.ProgressBarRangeInfo rangeInfo);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToIndexAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToKeyAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToNodeAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasSetTextAction();
+    method public static androidx.compose.ui.test.SemanticsMatcher hasStateDescription(String value);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasTestTag(String testTag);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasText(String text, optional boolean substring, optional boolean ignoreCase);
+    method public static androidx.compose.ui.test.SemanticsMatcher hasTextExactly(String![] textValues, optional boolean includeEditableText);
+    method public static androidx.compose.ui.test.SemanticsMatcher isDialog();
+    method public static androidx.compose.ui.test.SemanticsMatcher isEnabled();
+    method public static androidx.compose.ui.test.SemanticsMatcher isFocusable();
+    method public static androidx.compose.ui.test.SemanticsMatcher isFocused();
+    method public static androidx.compose.ui.test.SemanticsMatcher isHeading();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotEnabled();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotFocusable();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotFocused();
+    method public static androidx.compose.ui.test.SemanticsMatcher isNotSelected();
+    method public static androidx.compose.ui.test.SemanticsMatcher isOff();
+    method public static androidx.compose.ui.test.SemanticsMatcher isOn();
+    method public static androidx.compose.ui.test.SemanticsMatcher isPopup();
+    method public static androidx.compose.ui.test.SemanticsMatcher isRoot();
+    method public static androidx.compose.ui.test.SemanticsMatcher isSelectable();
+    method public static androidx.compose.ui.test.SemanticsMatcher isSelected();
+    method public static androidx.compose.ui.test.SemanticsMatcher isToggleable();
+  }
+
+  public final class FindersKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onAllNodesWithContentDescription(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String label, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onAllNodesWithTag(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String testTag, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onAllNodesWithText(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String text, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onNodeWithContentDescription(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String label, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onNodeWithTag(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String testTag, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onNodeWithText(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, String text, optional boolean substring, optional boolean ignoreCase, optional boolean useUnmergedTree);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onRoot(androidx.compose.ui.test.SemanticsNodeInteractionsProvider, optional boolean useUnmergedTree);
+  }
+
+  @Deprecated public final class GestureScope {
+    ctor @Deprecated public GestureScope(androidx.compose.ui.semantics.SemanticsNode node, androidx.compose.ui.test.TestContext testContext);
+    method @Deprecated public long getVisibleSize();
+    property public final long visibleSize;
+    field @Deprecated @kotlin.PublishedApi internal final androidx.compose.ui.test.MultiModalInjectionScope delegateScope;
+  }
+
+  public final class GestureScopeKt {
+    method @Deprecated public static void cancel(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void click(androidx.compose.ui.test.GestureScope, optional long position);
+    method @Deprecated public static void doubleClick(androidx.compose.ui.test.GestureScope, optional long position, optional long delayMillis);
+    method @Deprecated public static void down(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method @Deprecated public static void down(androidx.compose.ui.test.GestureScope, long position);
+    method @Deprecated public static inline float getBottom(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getBottomCenter(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getBottomLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getBottomRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getCenter(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getCenterLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getCenterRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getCenterX(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getCenterY(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline int getHeight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline float getTop(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getTopCenter(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getTopLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static long getTopRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static inline int getWidth(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void longClick(androidx.compose.ui.test.GestureScope, optional long position, optional long durationMillis);
+    method @Deprecated public static void move(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void moveBy(androidx.compose.ui.test.GestureScope, int pointerId, long delta);
+    method @Deprecated public static void moveBy(androidx.compose.ui.test.GestureScope, long delta);
+    method @Deprecated public static void movePointerBy(androidx.compose.ui.test.GestureScope, int pointerId, long delta);
+    method @Deprecated public static void movePointerTo(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method @Deprecated public static void moveTo(androidx.compose.ui.test.GestureScope, int pointerId, long position);
+    method @Deprecated public static void moveTo(androidx.compose.ui.test.GestureScope, long position);
+    method @Deprecated public static long percentOffset(androidx.compose.ui.test.GestureScope, optional float x, optional float y);
+    method @Deprecated public static void pinch(androidx.compose.ui.test.GestureScope, long start0, long end0, long start1, long end1, optional long durationMillis);
+    method @Deprecated public static void swipe(androidx.compose.ui.test.GestureScope, long start, long end, optional long durationMillis);
+    method @Deprecated public static void swipeDown(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void swipeLeft(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void swipeRight(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void swipeUp(androidx.compose.ui.test.GestureScope);
+    method @Deprecated public static void swipeWithVelocity(androidx.compose.ui.test.GestureScope, long start, long end, float endVelocity, optional long durationMillis);
+    method @Deprecated public static void up(androidx.compose.ui.test.GestureScope, optional int pointerId);
+  }
+
+  public interface IdlingResource {
+    method public default String? getDiagnosticMessageIfBusy();
+    method public boolean isIdleNow();
+    property public abstract boolean isIdleNow;
+  }
+
+  public interface InjectionScope extends androidx.compose.ui.unit.Density {
+    method public void advanceEventTime(optional long durationMillis);
+    method public void dispose();
+    method public void flush();
+    method public default float getBottom();
+    method public default long getBottomCenter();
+    method public default long getBottomLeft();
+    method public default long getBottomRight();
+    method public default long getCenter();
+    method public default long getCenterLeft();
+    method public default long getCenterRight();
+    method public default float getCenterX();
+    method public default float getCenterY();
+    method public default long getEventPeriodMillis();
+    method public default int getHeight();
+    method public default float getLeft();
+    method public default float getRight();
+    method public default float getTop();
+    method public default long getTopCenter();
+    method public default long getTopLeft();
+    method public default long getTopRight();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    method public long getVisibleSize();
+    method public default int getWidth();
+    method public default long percentOffset(optional float x, optional float y);
+    property public default float bottom;
+    property public default long bottomCenter;
+    property public default long bottomLeft;
+    property public default long bottomRight;
+    property public default long center;
+    property public default long centerLeft;
+    property public default long centerRight;
+    property public default float centerX;
+    property public default float centerY;
+    property public default long eventPeriodMillis;
+    property public default int height;
+    property public default float left;
+    property public default float right;
+    property public default float top;
+    property public default long topCenter;
+    property public default long topLeft;
+    property public default long topRight;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+    property public abstract long visibleSize;
+    property public default int width;
+  }
+
+  public final class KeyInputHelpersKt {
+    method public static boolean performKeyPress(androidx.compose.ui.test.SemanticsNodeInteraction, android.view.KeyEvent keyEvent);
+  }
+
+  public interface MainTestClock {
+    method public void advanceTimeBy(long milliseconds, optional boolean ignoreFrameDuration);
+    method public void advanceTimeByFrame();
+    method public void advanceTimeUntil(optional long timeoutMillis, kotlin.jvm.functions.Function0<java.lang.Boolean> condition);
+    method public boolean getAutoAdvance();
+    method public long getCurrentTime();
+    method public void setAutoAdvance(boolean autoAdvance);
+    property public abstract boolean autoAdvance;
+    property public abstract long currentTime;
+  }
+
+  public final class MouseInjectionScopeKt {
+  }
+
+  public sealed interface MultiModalInjectionScope extends androidx.compose.ui.test.InjectionScope {
+    method public androidx.compose.ui.test.TouchInjectionScope getTouch();
+    property public abstract androidx.compose.ui.test.TouchInjectionScope Touch;
+  }
+
+  public final class OutputKt {
+    method public static void printToLog(androidx.compose.ui.test.SemanticsNodeInteraction, String tag, optional int maxDepth);
+    method public static void printToLog(androidx.compose.ui.test.SemanticsNodeInteractionCollection, String tag, optional int maxDepth);
+    method public static String printToString(androidx.compose.ui.test.SemanticsNodeInteraction, optional int maxDepth);
+    method public static String printToString(androidx.compose.ui.test.SemanticsNodeInteractionCollection, optional int maxDepth);
+  }
+
+  public final class SelectionResult {
+    ctor public SelectionResult(java.util.List<androidx.compose.ui.semantics.SemanticsNode> selectedNodes, optional String? customErrorOnNoMatch);
+    method public String? getCustomErrorOnNoMatch();
+    method public java.util.List<androidx.compose.ui.semantics.SemanticsNode> getSelectedNodes();
+    property public final String? customErrorOnNoMatch;
+    property public final java.util.List<androidx.compose.ui.semantics.SemanticsNode> selectedNodes;
+  }
+
+  public final class SelectorsKt {
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection filter(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction filterToOne(androidx.compose.ui.test.SemanticsNodeInteractionCollection, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onAncestors(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onChild(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onChildAt(androidx.compose.ui.test.SemanticsNodeInteraction, int index);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onChildren(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onFirst(androidx.compose.ui.test.SemanticsNodeInteractionCollection);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onLast(androidx.compose.ui.test.SemanticsNodeInteractionCollection);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onParent(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteraction onSibling(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static androidx.compose.ui.test.SemanticsNodeInteractionCollection onSiblings(androidx.compose.ui.test.SemanticsNodeInteraction);
+  }
+
+  public final class SemanticsMatcher {
+    ctor public SemanticsMatcher(String description, kotlin.jvm.functions.Function1<? super androidx.compose.ui.semantics.SemanticsNode,java.lang.Boolean> matcher);
+    method public infix androidx.compose.ui.test.SemanticsMatcher and(androidx.compose.ui.test.SemanticsMatcher other);
+    method public String getDescription();
+    method public boolean matches(androidx.compose.ui.semantics.SemanticsNode node);
+    method public boolean matchesAny(Iterable<androidx.compose.ui.semantics.SemanticsNode> nodes);
+    method public operator androidx.compose.ui.test.SemanticsMatcher not();
+    method public infix androidx.compose.ui.test.SemanticsMatcher or(androidx.compose.ui.test.SemanticsMatcher other);
+    property public final String description;
+    field public static final androidx.compose.ui.test.SemanticsMatcher.Companion Companion;
+  }
+
+  public static final class SemanticsMatcher.Companion {
+    method public <T> androidx.compose.ui.test.SemanticsMatcher expectValue(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, T? expectedValue);
+    method public <T> androidx.compose.ui.test.SemanticsMatcher keyIsDefined(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key);
+    method public <T> androidx.compose.ui.test.SemanticsMatcher keyNotDefined(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key);
+  }
+
+  public final class SemanticsNodeInteraction {
+    ctor public SemanticsNodeInteraction(androidx.compose.ui.test.TestContext testContext, boolean useUnmergedTree, androidx.compose.ui.test.SemanticsSelector selector);
+    ctor public SemanticsNodeInteraction(androidx.compose.ui.test.TestContext testContext, boolean useUnmergedTree, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public void assertDoesNotExist();
+    method public androidx.compose.ui.test.SemanticsNodeInteraction assertExists(optional String? errorMessageOnFail);
+    method public androidx.compose.ui.semantics.SemanticsNode fetchSemanticsNode(optional String? errorMessageOnFail);
+  }
+
+  public final class SemanticsNodeInteractionCollection {
+    ctor public SemanticsNodeInteractionCollection(androidx.compose.ui.test.TestContext testContext, boolean useUnmergedTree, androidx.compose.ui.test.SemanticsSelector selector);
+    ctor public SemanticsNodeInteractionCollection(androidx.compose.ui.test.TestContext testContext, boolean useUnmergedTree, androidx.compose.ui.test.SemanticsMatcher matcher);
+    method public java.util.List<androidx.compose.ui.semantics.SemanticsNode> fetchSemanticsNodes(optional boolean atLeastOneRootRequired, optional String? errorMessageOnFail);
+    method public operator androidx.compose.ui.test.SemanticsNodeInteraction get(int index);
+  }
+
+  public interface SemanticsNodeInteractionsProvider {
+    method public androidx.compose.ui.test.SemanticsNodeInteractionCollection onAllNodes(androidx.compose.ui.test.SemanticsMatcher matcher, optional boolean useUnmergedTree);
+    method public androidx.compose.ui.test.SemanticsNodeInteraction onNode(androidx.compose.ui.test.SemanticsMatcher matcher, optional boolean useUnmergedTree);
+  }
+
+  public final class SemanticsSelector {
+    ctor public SemanticsSelector(String description, boolean requiresExactlyOneNode, optional androidx.compose.ui.test.SemanticsSelector? chainedInputSelector, kotlin.jvm.functions.Function1<? super java.lang.Iterable<androidx.compose.ui.semantics.SemanticsNode>,androidx.compose.ui.test.SelectionResult> selector);
+    method public String getDescription();
+    method public androidx.compose.ui.test.SelectionResult map(Iterable<androidx.compose.ui.semantics.SemanticsNode> nodes, String errorOnFail);
+    property public final String description;
+  }
+
+  public final class SemanticsSelectorKt {
+  }
+
+  public final class TestContext {
+  }
+
+  public final class TestMonotonicFrameClock_jvmKt {
+  }
+
+  public final class TestOwnerKt {
+  }
+
+  public final class TextActionsKt {
+    method public static void performImeAction(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static void performTextClearance(androidx.compose.ui.test.SemanticsNodeInteraction);
+    method public static void performTextInput(androidx.compose.ui.test.SemanticsNodeInteraction, String text);
+    method public static void performTextReplacement(androidx.compose.ui.test.SemanticsNodeInteraction, String text);
+  }
+
+  public interface TouchInjectionScope extends androidx.compose.ui.test.InjectionScope {
+    method public void cancel(optional long delayMillis);
+    method public androidx.compose.ui.geometry.Offset? currentPosition(optional int pointerId);
+    method public void down(int pointerId, long position);
+    method public default void down(long position);
+    method public void move(optional long delayMillis);
+    method public default void moveBy(int pointerId, long delta, optional long delayMillis);
+    method public default void moveBy(long delta, optional long delayMillis);
+    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 default void updatePointerBy(int pointerId, long delta);
+    method public void updatePointerTo(int pointerId, long position);
+  }
+
+  public final class TouchInjectionScopeKt {
+    method public static void click(androidx.compose.ui.test.TouchInjectionScope, optional long position);
+    method public static void doubleClick(androidx.compose.ui.test.TouchInjectionScope, optional long position, optional long delayMillis);
+    method public static void longClick(androidx.compose.ui.test.TouchInjectionScope, optional long position, optional long durationMillis);
+    method public static void pinch(androidx.compose.ui.test.TouchInjectionScope, long start0, long end0, long start1, long end1, optional long durationMillis);
+    method public static void swipe(androidx.compose.ui.test.TouchInjectionScope, long start, long end, optional long durationMillis);
+    method public static void swipe(androidx.compose.ui.test.TouchInjectionScope, kotlin.jvm.functions.Function1<? super java.lang.Long,androidx.compose.ui.geometry.Offset> curve, long durationMillis, optional java.util.List<java.lang.Long> keyTimes);
+    method public static void swipeDown(androidx.compose.ui.test.TouchInjectionScope, optional float startY, optional float endY, optional long durationMillis);
+    method public static void swipeLeft(androidx.compose.ui.test.TouchInjectionScope, optional float startX, optional float endX, optional long durationMillis);
+    method public static void swipeRight(androidx.compose.ui.test.TouchInjectionScope, optional float startX, optional float endX, optional long durationMillis);
+    method public static void swipeUp(androidx.compose.ui.test.TouchInjectionScope, optional float startY, optional float endY, optional long durationMillis);
+    method public static void swipeWithVelocity(androidx.compose.ui.test.TouchInjectionScope, long start, long end, float endVelocity, optional long durationMillis);
+  }
+
+  public final class UtilsKt {
+  }
+
+}
+
+package androidx.compose.ui.test.android {
+
+  public final class WindowCapture_androidKt {
+  }
+
+}
+
diff --git a/compose/ui/ui-test/api/restricted_current.txt b/compose/ui/ui-test/api/restricted_current.txt
index d951403..61a145d 100644
--- a/compose/ui/ui-test/api/restricted_current.txt
+++ b/compose/ui/ui-test/api/restricted_current.txt
@@ -11,6 +11,8 @@
     method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToNode(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher);
     method public static <T extends kotlin.Function<? extends java.lang.Boolean>> androidx.compose.ui.test.SemanticsNodeInteraction performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<T>> key, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> invocation);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> key);
+    method @Deprecated public static <T extends kotlin.Function<? extends java.lang.Boolean>> void performSemanticsActionUnit(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<T>> key, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> invocation);
+    method @Deprecated public static void performSemanticsActionUnit(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<? extends java.lang.Boolean>>> key);
     method public static androidx.compose.ui.test.SemanticsNodeInteraction performTouchInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.TouchInjectionScope,kotlin.Unit> block);
   }
 
diff --git a/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/DesktopInputDispatcher.desktop.kt b/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/DesktopInputDispatcher.desktop.kt
index bc21ff8..ecc9c54 100644
--- a/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/DesktopInputDispatcher.desktop.kt
+++ b/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/DesktopInputDispatcher.desktop.kt
@@ -23,18 +23,18 @@
 import androidx.compose.ui.input.pointer.TestPointerInputEventData
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.node.RootForTest
-import androidx.compose.ui.platform.DesktopRootForTest
+import androidx.compose.ui.platform.SkiaRootForTest
 
 internal actual fun createInputDispatcher(
     testContext: TestContext,
     root: RootForTest
 ): InputDispatcher {
-    return DesktopInputDispatcher(testContext, root as DesktopRootForTest)
+    return DesktopInputDispatcher(testContext, root as SkiaRootForTest)
 }
 
 internal class DesktopInputDispatcher(
     testContext: TestContext,
-    val root: DesktopRootForTest
+    val root: SkiaRootForTest
 ) : InputDispatcher(testContext, root) {
     companion object {
         var gesturePointerId = 0L
diff --git a/compose/ui/ui-text/api/1.1.0-beta02.txt b/compose/ui/ui-text/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..ee52a20
--- /dev/null
+++ b/compose/ui/ui-text/api/1.1.0-beta02.txt
@@ -0,0 +1,1193 @@
+// Signature format: 4.0
+package androidx.compose.ui.text {
+
+  public final class ActualAtomicReferenceJvmKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class AnnotatedString implements java.lang.CharSequence {
+    ctor public AnnotatedString(String text, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> spanStyles, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.ParagraphStyle>> paragraphStyles);
+    method public operator char get(int index);
+    method public int getLength();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.ParagraphStyle>> getParagraphStyles();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> getSpanStyles();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<java.lang.String>> getStringAnnotations(String tag, int start, int end);
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<java.lang.String>> getStringAnnotations(int start, int end);
+    method public String getText();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.TtsAnnotation>> getTtsAnnotations(int start, int end);
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.AnnotatedString plus(androidx.compose.ui.text.AnnotatedString other);
+    method public androidx.compose.ui.text.AnnotatedString subSequence(int startIndex, int endIndex);
+    method public androidx.compose.ui.text.AnnotatedString subSequence(long range);
+    property public int length;
+    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.ParagraphStyle>> paragraphStyles;
+    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> spanStyles;
+    property public final String text;
+  }
+
+  public static final class AnnotatedString.Builder {
+    ctor public AnnotatedString.Builder(optional int capacity);
+    ctor public AnnotatedString.Builder(String text);
+    ctor public AnnotatedString.Builder(androidx.compose.ui.text.AnnotatedString text);
+    method public void addStringAnnotation(String tag, String annotation, int start, int end);
+    method public void addStyle(androidx.compose.ui.text.SpanStyle style, int start, int end);
+    method public void addStyle(androidx.compose.ui.text.ParagraphStyle style, int start, int end);
+    method public void append(String text);
+    method public void append(char char);
+    method public void append(androidx.compose.ui.text.AnnotatedString text);
+    method public int getLength();
+    method public void pop();
+    method public void pop(int index);
+    method public int pushStringAnnotation(String tag, String annotation);
+    method public int pushStyle(androidx.compose.ui.text.SpanStyle style);
+    method public int pushStyle(androidx.compose.ui.text.ParagraphStyle style);
+    method public int pushTtsAnnotation(androidx.compose.ui.text.TtsAnnotation ttsAnnotation);
+    method public androidx.compose.ui.text.AnnotatedString toAnnotatedString();
+    property public final int length;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class AnnotatedString.Range<T> {
+    ctor public AnnotatedString.Range(T? item, int start, int end, String tag);
+    ctor public AnnotatedString.Range(T? item, int start, int end);
+    method public T! component1();
+    method public int component2();
+    method public int component3();
+    method public String component4();
+    method public androidx.compose.ui.text.AnnotatedString.Range<T> copy(T! item, int start, int end, String tag);
+    method public int getEnd();
+    method public T! getItem();
+    method public int getStart();
+    method public String getTag();
+    property public final int end;
+    property public final T! item;
+    property public final int start;
+    property public final String tag;
+  }
+
+  public final class AnnotatedStringKt {
+    method public static androidx.compose.ui.text.AnnotatedString AnnotatedString(String text, androidx.compose.ui.text.SpanStyle spanStyle, optional androidx.compose.ui.text.ParagraphStyle? paragraphStyle);
+    method public static androidx.compose.ui.text.AnnotatedString AnnotatedString(String text, androidx.compose.ui.text.ParagraphStyle paragraphStyle);
+    method public static inline androidx.compose.ui.text.AnnotatedString buildAnnotatedString(kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,kotlin.Unit> builder);
+    method public static androidx.compose.ui.text.AnnotatedString capitalize(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static androidx.compose.ui.text.AnnotatedString decapitalize(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static androidx.compose.ui.text.AnnotatedString toLowerCase(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static androidx.compose.ui.text.AnnotatedString toUpperCase(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static inline <R> R withStyle(androidx.compose.ui.text.AnnotatedString.Builder, androidx.compose.ui.text.SpanStyle style, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,? extends R> block);
+    method public static inline <R> R withStyle(androidx.compose.ui.text.AnnotatedString.Builder, androidx.compose.ui.text.ParagraphStyle style, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,? extends R> block);
+  }
+
+  public final class JvmAnnotatedString_jvmKt {
+  }
+
+  public final class JvmCharHelpers_androidKt {
+  }
+
+  public final class MultiParagraph {
+    ctor public MultiParagraph(androidx.compose.ui.text.MultiParagraphIntrinsics intrinsics, optional int maxLines, optional boolean ellipsis, float width);
+    ctor public MultiParagraph(androidx.compose.ui.text.AnnotatedString annotatedString, androidx.compose.ui.text.TextStyle style, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional int maxLines, optional boolean ellipsis, float width, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getBidiRunDirection(int offset);
+    method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.compose.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidExceedMaxLines();
+    method public float getFirstBaseline();
+    method public float getHeight();
+    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public androidx.compose.ui.text.MultiParagraphIntrinsics getIntrinsics();
+    method public float getLastBaseline();
+    method public float getLineBottom(int lineIndex);
+    method public int getLineCount();
+    method public int getLineEnd(int lineIndex, optional boolean visibleEnd);
+    method public int getLineForOffset(int offset);
+    method public int getLineForVerticalPosition(float vertical);
+    method public float getLineHeight(int lineIndex);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public int getLineStart(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public float getLineWidth(int lineIndex);
+    method public float getMaxIntrinsicWidth();
+    method public int getMaxLines();
+    method public float getMinIntrinsicWidth();
+    method public int getOffsetForPosition(long position);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getParagraphDirection(int offset);
+    method public androidx.compose.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.compose.ui.geometry.Rect> getPlaceholderRects();
+    method public float getWidth();
+    method public long getWordBoundary(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    method public void paint(androidx.compose.ui.graphics.Canvas canvas, optional long color, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? decoration);
+    property public final boolean didExceedMaxLines;
+    property public final float firstBaseline;
+    property public final float height;
+    property public final androidx.compose.ui.text.MultiParagraphIntrinsics intrinsics;
+    property public final float lastBaseline;
+    property public final int lineCount;
+    property public final float maxIntrinsicWidth;
+    property public final int maxLines;
+    property public final float minIntrinsicWidth;
+    property public final java.util.List<androidx.compose.ui.geometry.Rect> placeholderRects;
+    property public final float width;
+  }
+
+  public final class MultiParagraphIntrinsics implements androidx.compose.ui.text.ParagraphIntrinsics {
+    ctor public MultiParagraphIntrinsics(androidx.compose.ui.text.AnnotatedString annotatedString, androidx.compose.ui.text.TextStyle style, java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader);
+    method public androidx.compose.ui.text.AnnotatedString getAnnotatedString();
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> getPlaceholders();
+    property public final androidx.compose.ui.text.AnnotatedString annotatedString;
+    property public float maxIntrinsicWidth;
+    property public float minIntrinsicWidth;
+    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders;
+  }
+
+  public final class MultiParagraphIntrinsicsKt {
+  }
+
+  public final class MultiParagraphKt {
+  }
+
+  public interface Paragraph {
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getBidiRunDirection(int offset);
+    method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.compose.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidExceedMaxLines();
+    method public float getFirstBaseline();
+    method public float getHeight();
+    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public float getLastBaseline();
+    method public float getLineBottom(int lineIndex);
+    method public int getLineCount();
+    method public int getLineEnd(int lineIndex, optional boolean visibleEnd);
+    method public int getLineForOffset(int offset);
+    method public int getLineForVerticalPosition(float vertical);
+    method public float getLineHeight(int lineIndex);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public int getLineStart(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public float getLineWidth(int lineIndex);
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    method public int getOffsetForPosition(long position);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getParagraphDirection(int offset);
+    method public androidx.compose.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.compose.ui.geometry.Rect> getPlaceholderRects();
+    method public float getWidth();
+    method public long getWordBoundary(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    method public void paint(androidx.compose.ui.graphics.Canvas canvas, optional long color, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? textDecoration);
+    property public abstract boolean didExceedMaxLines;
+    property public abstract float firstBaseline;
+    property public abstract float height;
+    property public abstract float lastBaseline;
+    property public abstract int lineCount;
+    property public abstract float maxIntrinsicWidth;
+    property public abstract float minIntrinsicWidth;
+    property public abstract java.util.List<androidx.compose.ui.geometry.Rect> placeholderRects;
+    property public abstract float width;
+  }
+
+  public interface ParagraphIntrinsics {
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    property public abstract float maxIntrinsicWidth;
+    property public abstract float minIntrinsicWidth;
+  }
+
+  public final class ParagraphIntrinsicsKt {
+    method public static androidx.compose.ui.text.ParagraphIntrinsics ParagraphIntrinsics(String text, androidx.compose.ui.text.TextStyle style, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> spanStyles, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader);
+  }
+
+  public final class ParagraphKt {
+    method public static androidx.compose.ui.text.Paragraph Paragraph(String text, androidx.compose.ui.text.TextStyle style, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> spanStyles, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional int maxLines, optional boolean ellipsis, float width, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader);
+    method public static androidx.compose.ui.text.Paragraph Paragraph(androidx.compose.ui.text.ParagraphIntrinsics paragraphIntrinsics, optional int maxLines, optional boolean ellipsis, float width);
+  }
+
+  @androidx.compose.runtime.Immutable public final class ParagraphStyle {
+    ctor public ParagraphStyle(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method public androidx.compose.ui.text.ParagraphStyle copy(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method public operator boolean equals(Object? other);
+    method public long getLineHeight();
+    method public androidx.compose.ui.text.style.TextAlign? getTextAlign();
+    method public androidx.compose.ui.text.style.TextDirection? getTextDirection();
+    method public androidx.compose.ui.text.style.TextIndent? getTextIndent();
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.ParagraphStyle merge(optional androidx.compose.ui.text.ParagraphStyle? other);
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.ParagraphStyle plus(androidx.compose.ui.text.ParagraphStyle other);
+    property public final long lineHeight;
+    property public final androidx.compose.ui.text.style.TextAlign? textAlign;
+    property public final androidx.compose.ui.text.style.TextDirection? textDirection;
+    property public final androidx.compose.ui.text.style.TextIndent? textIndent;
+  }
+
+  public final class ParagraphStyleKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.ParagraphStyle lerp(androidx.compose.ui.text.ParagraphStyle start, androidx.compose.ui.text.ParagraphStyle stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class Placeholder {
+    ctor public Placeholder(long width, long height, int placeholderVerticalAlign);
+    method public androidx.compose.ui.text.Placeholder copy(optional long width, optional long height, optional int placeholderVerticalAlign);
+    method public operator boolean equals(Object? other);
+    method public long getHeight();
+    method public int getPlaceholderVerticalAlign();
+    method public long getWidth();
+    property public final long height;
+    property public final int placeholderVerticalAlign;
+    property public final long width;
+  }
+
+  public final inline class PlaceholderVerticalAlign {
+    ctor public PlaceholderVerticalAlign();
+  }
+
+  public static final class PlaceholderVerticalAlign.Companion {
+    method public int getAboveBaseline();
+    method public int getBottom();
+    method public int getCenter();
+    method public int getTextBottom();
+    method public int getTextCenter();
+    method public int getTextTop();
+    method public int getTop();
+    property public final int AboveBaseline;
+    property public final int Bottom;
+    property public final int Center;
+    property public final int TextBottom;
+    property public final int TextCenter;
+    property public final int TextTop;
+    property public final int Top;
+  }
+
+  public final class SaversKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class SpanStyle {
+    ctor public SpanStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow);
+    method public androidx.compose.ui.text.SpanStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow);
+    method public operator boolean equals(Object? other);
+    method public long getBackground();
+    method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift();
+    method public long getColor();
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public long getFontSize();
+    method public androidx.compose.ui.text.font.FontStyle? getFontStyle();
+    method public androidx.compose.ui.text.font.FontSynthesis? getFontSynthesis();
+    method public androidx.compose.ui.text.font.FontWeight? getFontWeight();
+    method public long getLetterSpacing();
+    method public androidx.compose.ui.text.intl.LocaleList? getLocaleList();
+    method public androidx.compose.ui.graphics.Shadow? getShadow();
+    method public androidx.compose.ui.text.style.TextDecoration? getTextDecoration();
+    method public androidx.compose.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.SpanStyle merge(optional androidx.compose.ui.text.SpanStyle? other);
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.SpanStyle plus(androidx.compose.ui.text.SpanStyle other);
+    property public final long background;
+    property public final androidx.compose.ui.text.style.BaselineShift? baselineShift;
+    property public final long color;
+    property public final androidx.compose.ui.text.font.FontFamily? fontFamily;
+    property public final String? fontFeatureSettings;
+    property public final long fontSize;
+    property public final androidx.compose.ui.text.font.FontStyle? fontStyle;
+    property public final androidx.compose.ui.text.font.FontSynthesis? fontSynthesis;
+    property public final androidx.compose.ui.text.font.FontWeight? fontWeight;
+    property public final long letterSpacing;
+    property public final androidx.compose.ui.text.intl.LocaleList? localeList;
+    property public final androidx.compose.ui.graphics.Shadow? shadow;
+    property public final androidx.compose.ui.text.style.TextDecoration? textDecoration;
+    property public final androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform;
+  }
+
+  public final class SpanStyleKt {
+    method public static androidx.compose.ui.text.SpanStyle lerp(androidx.compose.ui.text.SpanStyle start, androidx.compose.ui.text.SpanStyle stop, float fraction);
+  }
+
+  public final class StringKt {
+    method public static String capitalize(String, androidx.compose.ui.text.intl.Locale locale);
+    method public static String capitalize(String, androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static String decapitalize(String, androidx.compose.ui.text.intl.Locale locale);
+    method public static String decapitalize(String, androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static String toLowerCase(String, androidx.compose.ui.text.intl.Locale locale);
+    method public static String toLowerCase(String, androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static String toUpperCase(String, androidx.compose.ui.text.intl.Locale locale);
+    method public static String toUpperCase(String, androidx.compose.ui.text.intl.LocaleList localeList);
+  }
+
+  public final class TempListUtilsKt {
+  }
+
+  public final class TextLayoutInput {
+    ctor public TextLayoutInput(androidx.compose.ui.text.AnnotatedString text, androidx.compose.ui.text.TextStyle style, java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, int overflow, androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader, long constraints);
+    method public androidx.compose.ui.text.TextLayoutInput copy(optional androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.text.TextStyle style, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional int maxLines, optional boolean softWrap, optional int overflow, optional androidx.compose.ui.unit.Density density, optional androidx.compose.ui.unit.LayoutDirection layoutDirection, optional androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader, optional long constraints);
+    method public operator boolean equals(Object? other);
+    method public long getConstraints();
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public int getMaxLines();
+    method public int getOverflow();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> getPlaceholders();
+    method public androidx.compose.ui.text.font.Font.ResourceLoader getResourceLoader();
+    method public boolean getSoftWrap();
+    method public androidx.compose.ui.text.TextStyle getStyle();
+    method public androidx.compose.ui.text.AnnotatedString getText();
+    property public final long constraints;
+    property public final androidx.compose.ui.unit.Density density;
+    property public final androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public final int maxLines;
+    property public final int overflow;
+    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders;
+    property public final androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader;
+    property public final boolean softWrap;
+    property public final androidx.compose.ui.text.TextStyle style;
+    property public final androidx.compose.ui.text.AnnotatedString text;
+  }
+
+  public final class TextLayoutResult {
+    ctor public TextLayoutResult(androidx.compose.ui.text.TextLayoutInput layoutInput, androidx.compose.ui.text.MultiParagraph multiParagraph, long size);
+    method public androidx.compose.ui.text.TextLayoutResult copy(optional androidx.compose.ui.text.TextLayoutInput layoutInput, optional long size);
+    method public operator boolean equals(Object? other);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getBidiRunDirection(int offset);
+    method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.compose.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidOverflowHeight();
+    method public boolean getDidOverflowWidth();
+    method public float getFirstBaseline();
+    method public boolean getHasVisualOverflow();
+    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public float getLastBaseline();
+    method public androidx.compose.ui.text.TextLayoutInput getLayoutInput();
+    method public float getLineBottom(int lineIndex);
+    method public int getLineCount();
+    method public int getLineEnd(int lineIndex, optional boolean visibleEnd);
+    method public int getLineForOffset(int offset);
+    method public int getLineForVerticalPosition(float vertical);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public int getLineStart(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public androidx.compose.ui.text.MultiParagraph getMultiParagraph();
+    method public int getOffsetForPosition(long position);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getParagraphDirection(int offset);
+    method public androidx.compose.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.compose.ui.geometry.Rect> getPlaceholderRects();
+    method public long getSize();
+    method public long getWordBoundary(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    property public final boolean didOverflowHeight;
+    property public final boolean didOverflowWidth;
+    property public final float firstBaseline;
+    property public final boolean hasVisualOverflow;
+    property public final float lastBaseline;
+    property public final androidx.compose.ui.text.TextLayoutInput layoutInput;
+    property public final int lineCount;
+    property public final androidx.compose.ui.text.MultiParagraph multiParagraph;
+    property public final java.util.List<androidx.compose.ui.geometry.Rect> placeholderRects;
+    property public final long size;
+  }
+
+  public final class TextLayoutResultKt {
+    method @Deprecated public static androidx.compose.ui.text.TextLayoutResult createTextLayoutResult(optional androidx.compose.ui.text.TextLayoutInput layoutInput, optional androidx.compose.ui.text.MultiParagraph multiParagraph, optional long size);
+  }
+
+  public final class TextPainter {
+    method public void paint(androidx.compose.ui.graphics.Canvas canvas, androidx.compose.ui.text.TextLayoutResult textLayoutResult);
+    field public static final androidx.compose.ui.text.TextPainter INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class TextRange {
+    ctor public TextRange();
+    method public operator boolean contains(long other);
+    method public operator boolean contains(int offset);
+  }
+
+  public static final class TextRange.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class TextRangeKt {
+    method public static long TextRange(int start, int end);
+    method public static long TextRange(int index);
+    method public static String substring(CharSequence, long range);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextStyle {
+    ctor public TextStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method public androidx.compose.ui.text.TextStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method public long getBackground();
+    method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift();
+    method public long getColor();
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public long getFontSize();
+    method public androidx.compose.ui.text.font.FontStyle? getFontStyle();
+    method public androidx.compose.ui.text.font.FontSynthesis? getFontSynthesis();
+    method public androidx.compose.ui.text.font.FontWeight? getFontWeight();
+    method public long getLetterSpacing();
+    method public long getLineHeight();
+    method public androidx.compose.ui.text.intl.LocaleList? getLocaleList();
+    method public androidx.compose.ui.graphics.Shadow? getShadow();
+    method public androidx.compose.ui.text.style.TextAlign? getTextAlign();
+    method public androidx.compose.ui.text.style.TextDecoration? getTextDecoration();
+    method public androidx.compose.ui.text.style.TextDirection? getTextDirection();
+    method public androidx.compose.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
+    method public androidx.compose.ui.text.style.TextIndent? getTextIndent();
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.TextStyle merge(optional androidx.compose.ui.text.TextStyle? other);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.TextStyle merge(androidx.compose.ui.text.SpanStyle other);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.TextStyle merge(androidx.compose.ui.text.ParagraphStyle other);
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.TextStyle plus(androidx.compose.ui.text.TextStyle other);
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.TextStyle plus(androidx.compose.ui.text.ParagraphStyle other);
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.TextStyle plus(androidx.compose.ui.text.SpanStyle other);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.ParagraphStyle toParagraphStyle();
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.SpanStyle toSpanStyle();
+    property public final long background;
+    property public final androidx.compose.ui.text.style.BaselineShift? baselineShift;
+    property public final long color;
+    property public final androidx.compose.ui.text.font.FontFamily? fontFamily;
+    property public final String? fontFeatureSettings;
+    property public final long fontSize;
+    property public final androidx.compose.ui.text.font.FontStyle? fontStyle;
+    property public final androidx.compose.ui.text.font.FontSynthesis? fontSynthesis;
+    property public final androidx.compose.ui.text.font.FontWeight? fontWeight;
+    property public final long letterSpacing;
+    property public final long lineHeight;
+    property public final androidx.compose.ui.text.intl.LocaleList? localeList;
+    property public final androidx.compose.ui.graphics.Shadow? shadow;
+    property public final androidx.compose.ui.text.style.TextAlign? textAlign;
+    property public final androidx.compose.ui.text.style.TextDecoration? textDecoration;
+    property public final androidx.compose.ui.text.style.TextDirection? textDirection;
+    property public final androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform;
+    property public final androidx.compose.ui.text.style.TextIndent? textIndent;
+    field public static final androidx.compose.ui.text.TextStyle.Companion Companion;
+  }
+
+  public static final class TextStyle.Companion {
+    method public androidx.compose.ui.text.TextStyle getDefault();
+    property public final androidx.compose.ui.text.TextStyle Default;
+  }
+
+  public final class TextStyleKt {
+    method public static androidx.compose.ui.text.TextStyle lerp(androidx.compose.ui.text.TextStyle start, androidx.compose.ui.text.TextStyle stop, float fraction);
+    method public static androidx.compose.ui.text.TextStyle resolveDefaults(androidx.compose.ui.text.TextStyle style, androidx.compose.ui.unit.LayoutDirection direction);
+  }
+
+  public abstract sealed class TtsAnnotation {
+  }
+
+  public final class VerbatimTtsAnnotation extends androidx.compose.ui.text.TtsAnnotation {
+    ctor public VerbatimTtsAnnotation(String verbatim);
+    method public String getVerbatim();
+    property public final String verbatim;
+  }
+
+}
+
+package androidx.compose.ui.text.android {
+
+  public final class LayoutCompatKt {
+  }
+
+  public final class LayoutHelperKt {
+  }
+
+  public final class LayoutIntrinsicsKt {
+  }
+
+  public final class SpannedExtensionsKt {
+  }
+
+  public final class StaticLayoutFactoryKt {
+  }
+
+  public final class TempListUtilsKt {
+  }
+
+  public final class TextLayoutKt {
+  }
+
+}
+
+package androidx.compose.ui.text.android.style {
+
+  public final class PlaceholderSpanKt {
+  }
+
+}
+
+package androidx.compose.ui.text.font {
+
+  public final class AndroidFontKt {
+  }
+
+  public final class AndroidTypeface_androidKt {
+    method public static androidx.compose.ui.text.font.FontFamily FontFamily(android.graphics.Typeface typeface);
+    method public static androidx.compose.ui.text.font.Typeface Typeface(android.content.Context context, androidx.compose.ui.text.font.FontFamily fontFamily, optional java.util.List<kotlin.Pair<androidx.compose.ui.text.font.FontWeight,androidx.compose.ui.text.font.FontStyle>>? styles);
+    method public static androidx.compose.ui.text.font.Typeface Typeface(android.graphics.Typeface typeface);
+  }
+
+  public abstract sealed class FileBasedFontFamily extends androidx.compose.ui.text.font.FontFamily {
+  }
+
+  @androidx.compose.runtime.Immutable public interface Font {
+    method public int getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property public abstract int style;
+    property public abstract androidx.compose.ui.text.font.FontWeight weight;
+  }
+
+  public static interface Font.ResourceLoader {
+    method public Object load(androidx.compose.ui.text.font.Font font);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class FontFamily {
+    method public final boolean getCanLoadSynchronously();
+    property public final boolean canLoadSynchronously;
+    field public static final androidx.compose.ui.text.font.FontFamily.Companion Companion;
+  }
+
+  public static final class FontFamily.Companion {
+    method public androidx.compose.ui.text.font.GenericFontFamily getCursive();
+    method public androidx.compose.ui.text.font.SystemFontFamily getDefault();
+    method public androidx.compose.ui.text.font.GenericFontFamily getMonospace();
+    method public androidx.compose.ui.text.font.GenericFontFamily getSansSerif();
+    method public androidx.compose.ui.text.font.GenericFontFamily getSerif();
+    property public final androidx.compose.ui.text.font.GenericFontFamily Cursive;
+    property public final androidx.compose.ui.text.font.SystemFontFamily Default;
+    property public final androidx.compose.ui.text.font.GenericFontFamily Monospace;
+    property public final androidx.compose.ui.text.font.GenericFontFamily SansSerif;
+    property public final androidx.compose.ui.text.font.GenericFontFamily Serif;
+  }
+
+  public final class FontFamilyKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.FontFamily FontFamily(java.util.List<? extends androidx.compose.ui.text.font.Font> fonts);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.FontFamily FontFamily(androidx.compose.ui.text.font.Font... fonts);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.FontFamily FontFamily(androidx.compose.ui.text.font.Typeface typeface);
+  }
+
+  public final class FontKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.Font Font(int resId, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.FontFamily toFontFamily(androidx.compose.ui.text.font.Font);
+  }
+
+  @androidx.compose.runtime.Immutable public final class FontListFontFamily extends androidx.compose.ui.text.font.FileBasedFontFamily implements kotlin.jvm.internal.markers.KMappedMarker java.util.List<androidx.compose.ui.text.font.Font> {
+    method public java.util.List<androidx.compose.ui.text.font.Font> getFonts();
+    property public final java.util.List<androidx.compose.ui.text.font.Font> fonts;
+  }
+
+  public final inline class FontStyle {
+    ctor public FontStyle();
+    method public int getValue();
+    property public final int value;
+  }
+
+  public static final class FontStyle.Companion {
+    method public int getItalic();
+    method public int getNormal();
+    method public java.util.List<androidx.compose.ui.text.font.FontStyle> values();
+    property public final int Italic;
+    property public final int Normal;
+  }
+
+  public final inline class FontSynthesis {
+    ctor public FontSynthesis();
+  }
+
+  public static final class FontSynthesis.Companion {
+    method public int getAll();
+    method public int getNone();
+    method public int getStyle();
+    method public int getWeight();
+    property public final int All;
+    property public final int None;
+    property public final int Style;
+    property public final int Weight;
+  }
+
+  @androidx.compose.runtime.Immutable public final class FontWeight implements java.lang.Comparable<androidx.compose.ui.text.font.FontWeight> {
+    ctor public FontWeight(int weight);
+    method public operator int compareTo(androidx.compose.ui.text.font.FontWeight other);
+    method public int getWeight();
+    property public final int weight;
+    field public static final androidx.compose.ui.text.font.FontWeight.Companion Companion;
+  }
+
+  public static final class FontWeight.Companion {
+    method public androidx.compose.ui.text.font.FontWeight getBlack();
+    method public androidx.compose.ui.text.font.FontWeight getBold();
+    method public androidx.compose.ui.text.font.FontWeight getExtraBold();
+    method public androidx.compose.ui.text.font.FontWeight getExtraLight();
+    method public androidx.compose.ui.text.font.FontWeight getLight();
+    method public androidx.compose.ui.text.font.FontWeight getMedium();
+    method public androidx.compose.ui.text.font.FontWeight getNormal();
+    method public androidx.compose.ui.text.font.FontWeight getSemiBold();
+    method public androidx.compose.ui.text.font.FontWeight getThin();
+    method public androidx.compose.ui.text.font.FontWeight getW100();
+    method public androidx.compose.ui.text.font.FontWeight getW200();
+    method public androidx.compose.ui.text.font.FontWeight getW300();
+    method public androidx.compose.ui.text.font.FontWeight getW400();
+    method public androidx.compose.ui.text.font.FontWeight getW500();
+    method public androidx.compose.ui.text.font.FontWeight getW600();
+    method public androidx.compose.ui.text.font.FontWeight getW700();
+    method public androidx.compose.ui.text.font.FontWeight getW800();
+    method public androidx.compose.ui.text.font.FontWeight getW900();
+    property public final androidx.compose.ui.text.font.FontWeight Black;
+    property public final androidx.compose.ui.text.font.FontWeight Bold;
+    property public final androidx.compose.ui.text.font.FontWeight ExtraBold;
+    property public final androidx.compose.ui.text.font.FontWeight ExtraLight;
+    property public final androidx.compose.ui.text.font.FontWeight Light;
+    property public final androidx.compose.ui.text.font.FontWeight Medium;
+    property public final androidx.compose.ui.text.font.FontWeight Normal;
+    property public final androidx.compose.ui.text.font.FontWeight SemiBold;
+    property public final androidx.compose.ui.text.font.FontWeight Thin;
+    property public final androidx.compose.ui.text.font.FontWeight W100;
+    property public final androidx.compose.ui.text.font.FontWeight W200;
+    property public final androidx.compose.ui.text.font.FontWeight W300;
+    property public final androidx.compose.ui.text.font.FontWeight W400;
+    property public final androidx.compose.ui.text.font.FontWeight W500;
+    property public final androidx.compose.ui.text.font.FontWeight W600;
+    property public final androidx.compose.ui.text.font.FontWeight W700;
+    property public final androidx.compose.ui.text.font.FontWeight W800;
+    property public final androidx.compose.ui.text.font.FontWeight W900;
+  }
+
+  public final class FontWeightKt {
+    method public static androidx.compose.ui.text.font.FontWeight lerp(androidx.compose.ui.text.font.FontWeight start, androidx.compose.ui.text.font.FontWeight stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class GenericFontFamily extends androidx.compose.ui.text.font.SystemFontFamily {
+    method public String getName();
+    property public final String name;
+  }
+
+  public final class LoadedFontFamily extends androidx.compose.ui.text.font.FontFamily {
+    method public androidx.compose.ui.text.font.Typeface getTypeface();
+    property public final androidx.compose.ui.text.font.Typeface typeface;
+  }
+
+  public final class ResourceFont implements androidx.compose.ui.text.font.Font {
+    method public androidx.compose.ui.text.font.ResourceFont copy(optional int resId, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
+    method public int getResId();
+    method public int getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property public final int resId;
+    property public int style;
+    property public androidx.compose.ui.text.font.FontWeight weight;
+  }
+
+  public abstract sealed class SystemFontFamily extends androidx.compose.ui.text.font.FontFamily {
+  }
+
+  public interface Typeface {
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    property public abstract androidx.compose.ui.text.font.FontFamily? fontFamily;
+  }
+
+}
+
+package androidx.compose.ui.text.input {
+
+  public final class BackspaceCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public BackspaceCommand();
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  public final class CommitTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public CommitTextCommand(androidx.compose.ui.text.AnnotatedString annotatedString, int newCursorPosition);
+    ctor public CommitTextCommand(String text, int newCursorPosition);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public androidx.compose.ui.text.AnnotatedString getAnnotatedString();
+    method public int getNewCursorPosition();
+    method public String getText();
+    property public final androidx.compose.ui.text.AnnotatedString annotatedString;
+    property public final int newCursorPosition;
+    property public final String text;
+  }
+
+  public final class DeleteAllCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public DeleteAllCommand();
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  public final class DeleteSurroundingTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public DeleteSurroundingTextCommand(int lengthBeforeCursor, int lengthAfterCursor);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getLengthAfterCursor();
+    method public int getLengthBeforeCursor();
+    property public final int lengthAfterCursor;
+    property public final int lengthBeforeCursor;
+  }
+
+  public final class DeleteSurroundingTextInCodePointsCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public DeleteSurroundingTextInCodePointsCommand(int lengthBeforeCursor, int lengthAfterCursor);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getLengthAfterCursor();
+    method public int getLengthBeforeCursor();
+    property public final int lengthAfterCursor;
+    property public final int lengthBeforeCursor;
+  }
+
+  public interface EditCommand {
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  public final class EditCommandKt {
+  }
+
+  public final class EditProcessor {
+    ctor public EditProcessor();
+    method public androidx.compose.ui.text.input.TextFieldValue apply(java.util.List<? extends androidx.compose.ui.text.input.EditCommand> editCommands);
+    method public void reset(androidx.compose.ui.text.input.TextFieldValue value, androidx.compose.ui.text.input.TextInputSession? textInputSession);
+    method public androidx.compose.ui.text.input.TextFieldValue toTextFieldValue();
+  }
+
+  public final class EditingBuffer {
+    ctor public EditingBuffer(androidx.compose.ui.text.AnnotatedString text, long selection);
+  }
+
+  public final class EditingBufferKt {
+  }
+
+  public final class FinishComposingTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public FinishComposingTextCommand();
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  public final class GapBufferKt {
+  }
+
+  public final inline class ImeAction {
+    ctor public ImeAction();
+  }
+
+  public static final class ImeAction.Companion {
+    method public int getDefault();
+    method public int getDone();
+    method public int getGo();
+    method public int getNext();
+    method public int getNone();
+    method public int getPrevious();
+    method public int getSearch();
+    method public int getSend();
+    property public final int Default;
+    property public final int Done;
+    property public final int Go;
+    property public final int Next;
+    property public final int None;
+    property public final int Previous;
+    property public final int Search;
+    property public final int Send;
+  }
+
+  @androidx.compose.runtime.Immutable public final class ImeOptions {
+    ctor public ImeOptions(optional boolean singleLine, optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public androidx.compose.ui.text.input.ImeOptions copy(optional boolean singleLine, optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public boolean getAutoCorrect();
+    method public int getCapitalization();
+    method public int getImeAction();
+    method public int getKeyboardType();
+    method public boolean getSingleLine();
+    property public final boolean autoCorrect;
+    property public final int capitalization;
+    property public final int imeAction;
+    property public final int keyboardType;
+    property public final boolean singleLine;
+    field public static final androidx.compose.ui.text.input.ImeOptions.Companion Companion;
+  }
+
+  public static final class ImeOptions.Companion {
+    method public androidx.compose.ui.text.input.ImeOptions getDefault();
+    property public final androidx.compose.ui.text.input.ImeOptions Default;
+  }
+
+  @Deprecated public interface InputEventCallback {
+    method @Deprecated public void onEditCommands(java.util.List<? extends androidx.compose.ui.text.input.EditCommand> editCommands);
+    method @Deprecated public void onImeAction(int imeAction);
+  }
+
+  public final inline class KeyboardCapitalization {
+    ctor public KeyboardCapitalization();
+  }
+
+  public static final class KeyboardCapitalization.Companion {
+    method public int getCharacters();
+    method public int getNone();
+    method public int getSentences();
+    method public int getWords();
+    property public final int Characters;
+    property public final int None;
+    property public final int Sentences;
+    property public final int Words;
+  }
+
+  public final inline class KeyboardType {
+    ctor public KeyboardType();
+  }
+
+  public static final class KeyboardType.Companion {
+    method public int getAscii();
+    method public int getEmail();
+    method public int getNumber();
+    method public int getNumberPassword();
+    method public int getPassword();
+    method public int getPhone();
+    method public int getText();
+    method public int getUri();
+    property public final int Ascii;
+    property public final int Email;
+    property public final int Number;
+    property public final int NumberPassword;
+    property public final int Password;
+    property public final int Phone;
+    property public final int Text;
+    property public final int Uri;
+  }
+
+  public final class MoveCursorCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public MoveCursorCommand(int amount);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getAmount();
+    property public final int amount;
+  }
+
+  public interface OffsetMapping {
+    method public int originalToTransformed(int offset);
+    method public int transformedToOriginal(int offset);
+    field public static final androidx.compose.ui.text.input.OffsetMapping.Companion Companion;
+  }
+
+  public static final class OffsetMapping.Companion {
+    method public androidx.compose.ui.text.input.OffsetMapping getIdentity();
+    property public final androidx.compose.ui.text.input.OffsetMapping Identity;
+  }
+
+  public final class PasswordVisualTransformation implements androidx.compose.ui.text.input.VisualTransformation {
+    ctor public PasswordVisualTransformation(optional char mask);
+    method public androidx.compose.ui.text.input.TransformedText filter(androidx.compose.ui.text.AnnotatedString text);
+    method public char getMask();
+    property public final char mask;
+  }
+
+  public interface PlatformTextInputService {
+    method public void hideSoftwareKeyboard();
+    method public void notifyFocusedRect(androidx.compose.ui.geometry.Rect rect);
+    method public void showSoftwareKeyboard();
+    method public void startInput(androidx.compose.ui.text.input.TextFieldValue value, androidx.compose.ui.text.input.ImeOptions imeOptions, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.compose.ui.text.input.EditCommand>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.ImeAction,kotlin.Unit> onImeActionPerformed);
+    method public void stopInput();
+    method public void updateState(androidx.compose.ui.text.input.TextFieldValue? oldValue, androidx.compose.ui.text.input.TextFieldValue newValue);
+  }
+
+  public final class SetComposingRegionCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public SetComposingRegionCommand(int start, int end);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getEnd();
+    method public int getStart();
+    property public final int end;
+    property public final int start;
+  }
+
+  public final class SetComposingTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public SetComposingTextCommand(androidx.compose.ui.text.AnnotatedString annotatedString, int newCursorPosition);
+    ctor public SetComposingTextCommand(String text, int newCursorPosition);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public androidx.compose.ui.text.AnnotatedString getAnnotatedString();
+    method public int getNewCursorPosition();
+    method public String getText();
+    property public final androidx.compose.ui.text.AnnotatedString annotatedString;
+    property public final int newCursorPosition;
+    property public final String text;
+  }
+
+  public final class SetSelectionCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public SetSelectionCommand(int start, int end);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getEnd();
+    method public int getStart();
+    property public final int end;
+    property public final int start;
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextFieldValue {
+    ctor public TextFieldValue(androidx.compose.ui.text.AnnotatedString annotatedString, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    ctor public TextFieldValue(optional String text, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    method public androidx.compose.ui.text.input.TextFieldValue copy(optional androidx.compose.ui.text.AnnotatedString annotatedString, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    method public androidx.compose.ui.text.input.TextFieldValue copy(String text, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    method public androidx.compose.ui.text.AnnotatedString getAnnotatedString();
+    method public androidx.compose.ui.text.TextRange? getComposition();
+    method public long getSelection();
+    method public String getText();
+    property public final androidx.compose.ui.text.AnnotatedString annotatedString;
+    property public final androidx.compose.ui.text.TextRange? composition;
+    property public final long selection;
+    property public final String text;
+    field public static final androidx.compose.ui.text.input.TextFieldValue.Companion Companion;
+  }
+
+  public static final class TextFieldValue.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.ui.text.input.TextFieldValue,java.lang.Object> getSaver();
+    property public final androidx.compose.runtime.saveable.Saver<androidx.compose.ui.text.input.TextFieldValue,java.lang.Object> Saver;
+  }
+
+  public final class TextFieldValueKt {
+    method public static androidx.compose.ui.text.AnnotatedString getSelectedText(androidx.compose.ui.text.input.TextFieldValue);
+    method public static androidx.compose.ui.text.AnnotatedString getTextAfterSelection(androidx.compose.ui.text.input.TextFieldValue, int maxChars);
+    method public static androidx.compose.ui.text.AnnotatedString getTextBeforeSelection(androidx.compose.ui.text.input.TextFieldValue, int maxChars);
+  }
+
+  public class TextInputService {
+    ctor public TextInputService(androidx.compose.ui.text.input.PlatformTextInputService platformTextInputService);
+    method public final void hideSoftwareKeyboard();
+    method public final void showSoftwareKeyboard();
+    method public androidx.compose.ui.text.input.TextInputSession startInput(androidx.compose.ui.text.input.TextFieldValue value, androidx.compose.ui.text.input.ImeOptions imeOptions, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.compose.ui.text.input.EditCommand>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.ImeAction,kotlin.Unit> onImeActionPerformed);
+    method public void stopInput(androidx.compose.ui.text.input.TextInputSession session);
+  }
+
+  public final class TextInputSession {
+    ctor public TextInputSession(androidx.compose.ui.text.input.TextInputService textInputService, androidx.compose.ui.text.input.PlatformTextInputService platformTextInputService);
+    method public void dispose();
+    method public boolean hideSoftwareKeyboard();
+    method public boolean isOpen();
+    method public boolean notifyFocusedRect(androidx.compose.ui.geometry.Rect rect);
+    method public boolean showSoftwareKeyboard();
+    method public boolean updateState(androidx.compose.ui.text.input.TextFieldValue? oldValue, androidx.compose.ui.text.input.TextFieldValue newValue);
+    property public final boolean isOpen;
+  }
+
+  public final class TransformedText {
+    ctor public TransformedText(androidx.compose.ui.text.AnnotatedString text, androidx.compose.ui.text.input.OffsetMapping offsetMapping);
+    method public androidx.compose.ui.text.input.OffsetMapping getOffsetMapping();
+    method public androidx.compose.ui.text.AnnotatedString getText();
+    property public final androidx.compose.ui.text.input.OffsetMapping offsetMapping;
+    property public final androidx.compose.ui.text.AnnotatedString text;
+  }
+
+  @androidx.compose.runtime.Immutable public fun interface VisualTransformation {
+    method public androidx.compose.ui.text.input.TransformedText filter(androidx.compose.ui.text.AnnotatedString text);
+    field public static final androidx.compose.ui.text.input.VisualTransformation.Companion Companion;
+  }
+
+  public static final class VisualTransformation.Companion {
+    method public androidx.compose.ui.text.input.VisualTransformation getNone();
+    property public final androidx.compose.ui.text.input.VisualTransformation None;
+  }
+
+}
+
+package androidx.compose.ui.text.intl {
+
+  public final class AndroidPlatformLocale_androidKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class Locale {
+    ctor public Locale(String languageTag);
+    method public String getLanguage();
+    method public String getRegion();
+    method public String getScript();
+    method public String toLanguageTag();
+    property public final String language;
+    property public final String region;
+    property public final String script;
+    field public static final androidx.compose.ui.text.intl.Locale.Companion Companion;
+  }
+
+  public static final class Locale.Companion {
+    method public androidx.compose.ui.text.intl.Locale getCurrent();
+    property public final androidx.compose.ui.text.intl.Locale current;
+  }
+
+  @androidx.compose.runtime.Immutable public final class LocaleList implements java.util.Collection<androidx.compose.ui.text.intl.Locale> kotlin.jvm.internal.markers.KMappedMarker {
+    ctor public LocaleList(java.util.List<androidx.compose.ui.text.intl.Locale> localeList);
+    ctor public LocaleList(String languageTags);
+    ctor public LocaleList(androidx.compose.ui.text.intl.Locale... locales);
+    method public operator boolean contains(androidx.compose.ui.text.intl.Locale element);
+    method public boolean containsAll(java.util.Collection<E!> elements);
+    method public operator androidx.compose.ui.text.intl.Locale get(int i);
+    method public java.util.List<androidx.compose.ui.text.intl.Locale> getLocaleList();
+    method public int getSize();
+    method public boolean isEmpty();
+    method public java.util.Iterator<androidx.compose.ui.text.intl.Locale> iterator();
+    property public final java.util.List<androidx.compose.ui.text.intl.Locale> localeList;
+    property public int size;
+    field public static final androidx.compose.ui.text.intl.LocaleList.Companion Companion;
+  }
+
+  public static final class LocaleList.Companion {
+    method public androidx.compose.ui.text.intl.LocaleList getCurrent();
+    property public final androidx.compose.ui.text.intl.LocaleList current;
+  }
+
+  public final class PlatformLocaleKt {
+  }
+
+}
+
+package androidx.compose.ui.text.platform {
+
+  public final class AndroidAccessibilitySpannableString_androidKt {
+  }
+
+  public final class AndroidParagraphHelper_androidKt {
+  }
+
+  public final class AndroidParagraphIntrinsics_androidKt {
+  }
+
+  public final class AndroidParagraph_androidKt {
+  }
+
+  public final class AndroidStringDelegate_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.text.platform.extensions {
+
+  public final class LocaleExtensions_androidKt {
+  }
+
+  public final class PlaceholderExtensions_androidKt {
+  }
+
+  public final class SpannableExtensions_androidKt {
+  }
+
+  public final class TextPaintExtensions_androidKt {
+  }
+
+  public final class TtsAnnotationExtensions_androidKt {
+    method public static android.text.style.TtsSpan toSpan(androidx.compose.ui.text.TtsAnnotation);
+    method public static android.text.style.TtsSpan toSpan(androidx.compose.ui.text.VerbatimTtsAnnotation);
+  }
+
+}
+
+package androidx.compose.ui.text.style {
+
+  @androidx.compose.runtime.Immutable public final inline class BaselineShift {
+    ctor public BaselineShift();
+    method public float getMultiplier();
+    property public final float multiplier;
+  }
+
+  public static final class BaselineShift.Companion {
+    method public float getNone();
+    method public float getSubscript();
+    method public float getSuperscript();
+    property public final float None;
+    property public final float Subscript;
+    property public final float Superscript;
+  }
+
+  public final class BaselineShiftKt {
+    method @androidx.compose.runtime.Stable public static float lerp(float start, float stop, float fraction);
+  }
+
+  public enum ResolvedTextDirection {
+    enum_constant public static final androidx.compose.ui.text.style.ResolvedTextDirection Ltr;
+    enum_constant public static final androidx.compose.ui.text.style.ResolvedTextDirection Rtl;
+  }
+
+  public final inline class TextAlign {
+    ctor public TextAlign();
+  }
+
+  public static final class TextAlign.Companion {
+    method public int getCenter();
+    method public int getEnd();
+    method public int getJustify();
+    method public int getLeft();
+    method public int getRight();
+    method public int getStart();
+    method public java.util.List<androidx.compose.ui.text.style.TextAlign> values();
+    property public final int Center;
+    property public final int End;
+    property public final int Justify;
+    property public final int Left;
+    property public final int Right;
+    property public final int Start;
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextDecoration {
+    method public operator boolean contains(androidx.compose.ui.text.style.TextDecoration other);
+    method public operator boolean equals(Object? other);
+    method public int getMask();
+    method public operator androidx.compose.ui.text.style.TextDecoration plus(androidx.compose.ui.text.style.TextDecoration decoration);
+    property public final int mask;
+    field public static final androidx.compose.ui.text.style.TextDecoration.Companion Companion;
+  }
+
+  public static final class TextDecoration.Companion {
+    method public androidx.compose.ui.text.style.TextDecoration combine(java.util.List<androidx.compose.ui.text.style.TextDecoration> decorations);
+    method public androidx.compose.ui.text.style.TextDecoration getLineThrough();
+    method public androidx.compose.ui.text.style.TextDecoration getNone();
+    method public androidx.compose.ui.text.style.TextDecoration getUnderline();
+    property public final androidx.compose.ui.text.style.TextDecoration LineThrough;
+    property public final androidx.compose.ui.text.style.TextDecoration None;
+    property public final androidx.compose.ui.text.style.TextDecoration Underline;
+  }
+
+  public final inline class TextDirection {
+    ctor public TextDirection();
+  }
+
+  public static final class TextDirection.Companion {
+    method public int getContent();
+    method public int getContentOrLtr();
+    method public int getContentOrRtl();
+    method public int getLtr();
+    method public int getRtl();
+    property public final int Content;
+    property public final int ContentOrLtr;
+    property public final int ContentOrRtl;
+    property public final int Ltr;
+    property public final int Rtl;
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextGeometricTransform {
+    ctor public TextGeometricTransform(optional float scaleX, optional float skewX);
+    method public androidx.compose.ui.text.style.TextGeometricTransform copy(optional float scaleX, optional float skewX);
+    method public operator boolean equals(Object? other);
+    method public float getScaleX();
+    method public float getSkewX();
+    property public final float scaleX;
+    property public final float skewX;
+    field public static final androidx.compose.ui.text.style.TextGeometricTransform.Companion Companion;
+  }
+
+  public static final class TextGeometricTransform.Companion {
+  }
+
+  public final class TextGeometricTransformKt {
+    method public static androidx.compose.ui.text.style.TextGeometricTransform lerp(androidx.compose.ui.text.style.TextGeometricTransform start, androidx.compose.ui.text.style.TextGeometricTransform stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextIndent {
+    ctor public TextIndent(optional long firstLine, optional long restLine);
+    method public androidx.compose.ui.text.style.TextIndent copy(optional long firstLine, optional long restLine);
+    method public operator boolean equals(Object? other);
+    method public long getFirstLine();
+    method public long getRestLine();
+    property public final long firstLine;
+    property public final long restLine;
+    field public static final androidx.compose.ui.text.style.TextIndent.Companion Companion;
+  }
+
+  public static final class TextIndent.Companion {
+    method public androidx.compose.ui.text.style.TextIndent getNone();
+    property public final androidx.compose.ui.text.style.TextIndent None;
+  }
+
+  public final class TextIndentKt {
+    method public static androidx.compose.ui.text.style.TextIndent lerp(androidx.compose.ui.text.style.TextIndent start, androidx.compose.ui.text.style.TextIndent stop, float fraction);
+  }
+
+  public final inline class TextOverflow {
+    ctor public TextOverflow();
+  }
+
+  public static final class TextOverflow.Companion {
+    method public int getClip();
+    method public int getEllipsis();
+    method public int getVisible();
+    property public final int Clip;
+    property public final int Ellipsis;
+    property public final int Visible;
+  }
+
+}
+
diff --git a/compose/ui/ui-text/api/current.txt b/compose/ui/ui-text/api/current.txt
index 1a50053..ee52a20 100644
--- a/compose/ui/ui-text/api/current.txt
+++ b/compose/ui/ui-text/api/current.txt
@@ -392,6 +392,8 @@
 
   @androidx.compose.runtime.Immutable public final inline class TextRange {
     ctor public TextRange();
+    method public operator boolean contains(long other);
+    method public operator boolean contains(int offset);
   }
 
   public static final class TextRange.Companion {
diff --git a/compose/ui/ui-text/api/public_plus_experimental_1.1.0-beta02.txt b/compose/ui/ui-text/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..13fbf7b
--- /dev/null
+++ b/compose/ui/ui-text/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,1208 @@
+// Signature format: 4.0
+package androidx.compose.ui.text {
+
+  public final class ActualAtomicReferenceJvmKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class AnnotatedString implements java.lang.CharSequence {
+    ctor public AnnotatedString(String text, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> spanStyles, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.ParagraphStyle>> paragraphStyles);
+    method public operator char get(int index);
+    method public int getLength();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.ParagraphStyle>> getParagraphStyles();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> getSpanStyles();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<java.lang.String>> getStringAnnotations(String tag, int start, int end);
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<java.lang.String>> getStringAnnotations(int start, int end);
+    method public String getText();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.TtsAnnotation>> getTtsAnnotations(int start, int end);
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.AnnotatedString plus(androidx.compose.ui.text.AnnotatedString other);
+    method public androidx.compose.ui.text.AnnotatedString subSequence(int startIndex, int endIndex);
+    method public androidx.compose.ui.text.AnnotatedString subSequence(long range);
+    property public int length;
+    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.ParagraphStyle>> paragraphStyles;
+    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> spanStyles;
+    property public final String text;
+  }
+
+  public static final class AnnotatedString.Builder {
+    ctor public AnnotatedString.Builder(optional int capacity);
+    ctor public AnnotatedString.Builder(String text);
+    ctor public AnnotatedString.Builder(androidx.compose.ui.text.AnnotatedString text);
+    method public void addStringAnnotation(String tag, String annotation, int start, int end);
+    method public void addStyle(androidx.compose.ui.text.SpanStyle style, int start, int end);
+    method public void addStyle(androidx.compose.ui.text.ParagraphStyle style, int start, int end);
+    method @androidx.compose.ui.text.ExperimentalTextApi public void addTtsAnnotation(androidx.compose.ui.text.TtsAnnotation ttsAnnotation, int start, int end);
+    method public void append(String text);
+    method public void append(char char);
+    method public void append(androidx.compose.ui.text.AnnotatedString text);
+    method public int getLength();
+    method public void pop();
+    method public void pop(int index);
+    method public int pushStringAnnotation(String tag, String annotation);
+    method public int pushStyle(androidx.compose.ui.text.SpanStyle style);
+    method public int pushStyle(androidx.compose.ui.text.ParagraphStyle style);
+    method public int pushTtsAnnotation(androidx.compose.ui.text.TtsAnnotation ttsAnnotation);
+    method public androidx.compose.ui.text.AnnotatedString toAnnotatedString();
+    property public final int length;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class AnnotatedString.Range<T> {
+    ctor public AnnotatedString.Range(T? item, int start, int end, String tag);
+    ctor public AnnotatedString.Range(T? item, int start, int end);
+    method public T! component1();
+    method public int component2();
+    method public int component3();
+    method public String component4();
+    method public androidx.compose.ui.text.AnnotatedString.Range<T> copy(T! item, int start, int end, String tag);
+    method public int getEnd();
+    method public T! getItem();
+    method public int getStart();
+    method public String getTag();
+    property public final int end;
+    property public final T! item;
+    property public final int start;
+    property public final String tag;
+  }
+
+  public final class AnnotatedStringKt {
+    method public static androidx.compose.ui.text.AnnotatedString AnnotatedString(String text, androidx.compose.ui.text.SpanStyle spanStyle, optional androidx.compose.ui.text.ParagraphStyle? paragraphStyle);
+    method public static androidx.compose.ui.text.AnnotatedString AnnotatedString(String text, androidx.compose.ui.text.ParagraphStyle paragraphStyle);
+    method public static inline androidx.compose.ui.text.AnnotatedString buildAnnotatedString(kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,kotlin.Unit> builder);
+    method public static androidx.compose.ui.text.AnnotatedString capitalize(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static androidx.compose.ui.text.AnnotatedString decapitalize(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static androidx.compose.ui.text.AnnotatedString toLowerCase(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static androidx.compose.ui.text.AnnotatedString toUpperCase(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method @androidx.compose.ui.text.ExperimentalTextApi public static inline <R> R withAnnotation(androidx.compose.ui.text.AnnotatedString.Builder, String tag, String annotation, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,? extends R> block);
+    method @androidx.compose.ui.text.ExperimentalTextApi public static inline <R> R withAnnotation(androidx.compose.ui.text.AnnotatedString.Builder, androidx.compose.ui.text.TtsAnnotation ttsAnnotation, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,? extends R> block);
+    method public static inline <R> R withStyle(androidx.compose.ui.text.AnnotatedString.Builder, androidx.compose.ui.text.SpanStyle style, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,? extends R> block);
+    method public static inline <R> R withStyle(androidx.compose.ui.text.AnnotatedString.Builder, androidx.compose.ui.text.ParagraphStyle style, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,? extends R> block);
+  }
+
+  @kotlin.RequiresOptIn(message="This API is experimental and is likely to change in the future.") public @interface ExperimentalTextApi {
+  }
+
+  @kotlin.RequiresOptIn(level=kotlin.RequiresOptIn.Level, message="This is internal API that may change frequently and without warning.") @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface InternalTextApi {
+  }
+
+  public final class JvmAnnotatedString_jvmKt {
+  }
+
+  public final class JvmCharHelpers_androidKt {
+  }
+
+  public final class MultiParagraph {
+    ctor public MultiParagraph(androidx.compose.ui.text.MultiParagraphIntrinsics intrinsics, optional int maxLines, optional boolean ellipsis, float width);
+    ctor public MultiParagraph(androidx.compose.ui.text.AnnotatedString annotatedString, androidx.compose.ui.text.TextStyle style, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional int maxLines, optional boolean ellipsis, float width, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getBidiRunDirection(int offset);
+    method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.compose.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidExceedMaxLines();
+    method public float getFirstBaseline();
+    method public float getHeight();
+    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public androidx.compose.ui.text.MultiParagraphIntrinsics getIntrinsics();
+    method public float getLastBaseline();
+    method public float getLineBottom(int lineIndex);
+    method public int getLineCount();
+    method public int getLineEnd(int lineIndex, optional boolean visibleEnd);
+    method public int getLineForOffset(int offset);
+    method public int getLineForVerticalPosition(float vertical);
+    method public float getLineHeight(int lineIndex);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public int getLineStart(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public float getLineWidth(int lineIndex);
+    method public float getMaxIntrinsicWidth();
+    method public int getMaxLines();
+    method public float getMinIntrinsicWidth();
+    method public int getOffsetForPosition(long position);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getParagraphDirection(int offset);
+    method public androidx.compose.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.compose.ui.geometry.Rect> getPlaceholderRects();
+    method public float getWidth();
+    method public long getWordBoundary(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    method public void paint(androidx.compose.ui.graphics.Canvas canvas, optional long color, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? decoration);
+    property public final boolean didExceedMaxLines;
+    property public final float firstBaseline;
+    property public final float height;
+    property public final androidx.compose.ui.text.MultiParagraphIntrinsics intrinsics;
+    property public final float lastBaseline;
+    property public final int lineCount;
+    property public final float maxIntrinsicWidth;
+    property public final int maxLines;
+    property public final float minIntrinsicWidth;
+    property public final java.util.List<androidx.compose.ui.geometry.Rect> placeholderRects;
+    property public final float width;
+  }
+
+  public final class MultiParagraphIntrinsics implements androidx.compose.ui.text.ParagraphIntrinsics {
+    ctor public MultiParagraphIntrinsics(androidx.compose.ui.text.AnnotatedString annotatedString, androidx.compose.ui.text.TextStyle style, java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader);
+    method public androidx.compose.ui.text.AnnotatedString getAnnotatedString();
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> getPlaceholders();
+    property public final androidx.compose.ui.text.AnnotatedString annotatedString;
+    property public float maxIntrinsicWidth;
+    property public float minIntrinsicWidth;
+    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders;
+  }
+
+  public final class MultiParagraphIntrinsicsKt {
+  }
+
+  public final class MultiParagraphKt {
+  }
+
+  public interface Paragraph {
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getBidiRunDirection(int offset);
+    method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.compose.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidExceedMaxLines();
+    method public float getFirstBaseline();
+    method public float getHeight();
+    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public float getLastBaseline();
+    method public float getLineBottom(int lineIndex);
+    method public int getLineCount();
+    method public int getLineEnd(int lineIndex, optional boolean visibleEnd);
+    method public int getLineForOffset(int offset);
+    method public int getLineForVerticalPosition(float vertical);
+    method public float getLineHeight(int lineIndex);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public int getLineStart(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public float getLineWidth(int lineIndex);
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    method public int getOffsetForPosition(long position);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getParagraphDirection(int offset);
+    method public androidx.compose.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.compose.ui.geometry.Rect> getPlaceholderRects();
+    method public float getWidth();
+    method public long getWordBoundary(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    method public void paint(androidx.compose.ui.graphics.Canvas canvas, optional long color, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? textDecoration);
+    property public abstract boolean didExceedMaxLines;
+    property public abstract float firstBaseline;
+    property public abstract float height;
+    property public abstract float lastBaseline;
+    property public abstract int lineCount;
+    property public abstract float maxIntrinsicWidth;
+    property public abstract float minIntrinsicWidth;
+    property public abstract java.util.List<androidx.compose.ui.geometry.Rect> placeholderRects;
+    property public abstract float width;
+  }
+
+  public interface ParagraphIntrinsics {
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    property public abstract float maxIntrinsicWidth;
+    property public abstract float minIntrinsicWidth;
+  }
+
+  public final class ParagraphIntrinsicsKt {
+    method public static androidx.compose.ui.text.ParagraphIntrinsics ParagraphIntrinsics(String text, androidx.compose.ui.text.TextStyle style, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> spanStyles, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader);
+  }
+
+  public final class ParagraphKt {
+    method public static androidx.compose.ui.text.Paragraph Paragraph(String text, androidx.compose.ui.text.TextStyle style, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> spanStyles, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional int maxLines, optional boolean ellipsis, float width, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader);
+    method public static androidx.compose.ui.text.Paragraph Paragraph(androidx.compose.ui.text.ParagraphIntrinsics paragraphIntrinsics, optional int maxLines, optional boolean ellipsis, float width);
+  }
+
+  @androidx.compose.runtime.Immutable public final class ParagraphStyle {
+    ctor public ParagraphStyle(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method public androidx.compose.ui.text.ParagraphStyle copy(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method public operator boolean equals(Object? other);
+    method public long getLineHeight();
+    method public androidx.compose.ui.text.style.TextAlign? getTextAlign();
+    method public androidx.compose.ui.text.style.TextDirection? getTextDirection();
+    method public androidx.compose.ui.text.style.TextIndent? getTextIndent();
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.ParagraphStyle merge(optional androidx.compose.ui.text.ParagraphStyle? other);
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.ParagraphStyle plus(androidx.compose.ui.text.ParagraphStyle other);
+    property public final long lineHeight;
+    property public final androidx.compose.ui.text.style.TextAlign? textAlign;
+    property public final androidx.compose.ui.text.style.TextDirection? textDirection;
+    property public final androidx.compose.ui.text.style.TextIndent? textIndent;
+  }
+
+  public final class ParagraphStyleKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.ParagraphStyle lerp(androidx.compose.ui.text.ParagraphStyle start, androidx.compose.ui.text.ParagraphStyle stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class Placeholder {
+    ctor public Placeholder(long width, long height, int placeholderVerticalAlign);
+    method public androidx.compose.ui.text.Placeholder copy(optional long width, optional long height, optional int placeholderVerticalAlign);
+    method public operator boolean equals(Object? other);
+    method public long getHeight();
+    method public int getPlaceholderVerticalAlign();
+    method public long getWidth();
+    property public final long height;
+    property public final int placeholderVerticalAlign;
+    property public final long width;
+  }
+
+  public final inline class PlaceholderVerticalAlign {
+    ctor public PlaceholderVerticalAlign();
+  }
+
+  public static final class PlaceholderVerticalAlign.Companion {
+    method public int getAboveBaseline();
+    method public int getBottom();
+    method public int getCenter();
+    method public int getTextBottom();
+    method public int getTextCenter();
+    method public int getTextTop();
+    method public int getTop();
+    property public final int AboveBaseline;
+    property public final int Bottom;
+    property public final int Center;
+    property public final int TextBottom;
+    property public final int TextCenter;
+    property public final int TextTop;
+    property public final int Top;
+  }
+
+  public final class SaversKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class SpanStyle {
+    ctor public SpanStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow);
+    method public androidx.compose.ui.text.SpanStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow);
+    method public operator boolean equals(Object? other);
+    method public long getBackground();
+    method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift();
+    method public long getColor();
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public long getFontSize();
+    method public androidx.compose.ui.text.font.FontStyle? getFontStyle();
+    method public androidx.compose.ui.text.font.FontSynthesis? getFontSynthesis();
+    method public androidx.compose.ui.text.font.FontWeight? getFontWeight();
+    method public long getLetterSpacing();
+    method public androidx.compose.ui.text.intl.LocaleList? getLocaleList();
+    method public androidx.compose.ui.graphics.Shadow? getShadow();
+    method public androidx.compose.ui.text.style.TextDecoration? getTextDecoration();
+    method public androidx.compose.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.SpanStyle merge(optional androidx.compose.ui.text.SpanStyle? other);
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.SpanStyle plus(androidx.compose.ui.text.SpanStyle other);
+    property public final long background;
+    property public final androidx.compose.ui.text.style.BaselineShift? baselineShift;
+    property public final long color;
+    property public final androidx.compose.ui.text.font.FontFamily? fontFamily;
+    property public final String? fontFeatureSettings;
+    property public final long fontSize;
+    property public final androidx.compose.ui.text.font.FontStyle? fontStyle;
+    property public final androidx.compose.ui.text.font.FontSynthesis? fontSynthesis;
+    property public final androidx.compose.ui.text.font.FontWeight? fontWeight;
+    property public final long letterSpacing;
+    property public final androidx.compose.ui.text.intl.LocaleList? localeList;
+    property public final androidx.compose.ui.graphics.Shadow? shadow;
+    property public final androidx.compose.ui.text.style.TextDecoration? textDecoration;
+    property public final androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform;
+  }
+
+  public final class SpanStyleKt {
+    method public static androidx.compose.ui.text.SpanStyle lerp(androidx.compose.ui.text.SpanStyle start, androidx.compose.ui.text.SpanStyle stop, float fraction);
+  }
+
+  public final class StringKt {
+    method public static String capitalize(String, androidx.compose.ui.text.intl.Locale locale);
+    method public static String capitalize(String, androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static String decapitalize(String, androidx.compose.ui.text.intl.Locale locale);
+    method public static String decapitalize(String, androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static String toLowerCase(String, androidx.compose.ui.text.intl.Locale locale);
+    method public static String toLowerCase(String, androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static String toUpperCase(String, androidx.compose.ui.text.intl.Locale locale);
+    method public static String toUpperCase(String, androidx.compose.ui.text.intl.LocaleList localeList);
+  }
+
+  public final class TempListUtilsKt {
+  }
+
+  public final class TextLayoutInput {
+    ctor public TextLayoutInput(androidx.compose.ui.text.AnnotatedString text, androidx.compose.ui.text.TextStyle style, java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, int overflow, androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader, long constraints);
+    method public androidx.compose.ui.text.TextLayoutInput copy(optional androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.text.TextStyle style, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional int maxLines, optional boolean softWrap, optional int overflow, optional androidx.compose.ui.unit.Density density, optional androidx.compose.ui.unit.LayoutDirection layoutDirection, optional androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader, optional long constraints);
+    method public operator boolean equals(Object? other);
+    method public long getConstraints();
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public int getMaxLines();
+    method public int getOverflow();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> getPlaceholders();
+    method public androidx.compose.ui.text.font.Font.ResourceLoader getResourceLoader();
+    method public boolean getSoftWrap();
+    method public androidx.compose.ui.text.TextStyle getStyle();
+    method public androidx.compose.ui.text.AnnotatedString getText();
+    property public final long constraints;
+    property public final androidx.compose.ui.unit.Density density;
+    property public final androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public final int maxLines;
+    property public final int overflow;
+    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders;
+    property public final androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader;
+    property public final boolean softWrap;
+    property public final androidx.compose.ui.text.TextStyle style;
+    property public final androidx.compose.ui.text.AnnotatedString text;
+  }
+
+  public final class TextLayoutResult {
+    ctor public TextLayoutResult(androidx.compose.ui.text.TextLayoutInput layoutInput, androidx.compose.ui.text.MultiParagraph multiParagraph, long size);
+    method public androidx.compose.ui.text.TextLayoutResult copy(optional androidx.compose.ui.text.TextLayoutInput layoutInput, optional long size);
+    method public operator boolean equals(Object? other);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getBidiRunDirection(int offset);
+    method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.compose.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidOverflowHeight();
+    method public boolean getDidOverflowWidth();
+    method public float getFirstBaseline();
+    method public boolean getHasVisualOverflow();
+    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public float getLastBaseline();
+    method public androidx.compose.ui.text.TextLayoutInput getLayoutInput();
+    method public float getLineBottom(int lineIndex);
+    method public int getLineCount();
+    method public int getLineEnd(int lineIndex, optional boolean visibleEnd);
+    method public int getLineForOffset(int offset);
+    method public int getLineForVerticalPosition(float vertical);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public int getLineStart(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public androidx.compose.ui.text.MultiParagraph getMultiParagraph();
+    method public int getOffsetForPosition(long position);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getParagraphDirection(int offset);
+    method public androidx.compose.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.compose.ui.geometry.Rect> getPlaceholderRects();
+    method public long getSize();
+    method public long getWordBoundary(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    property public final boolean didOverflowHeight;
+    property public final boolean didOverflowWidth;
+    property public final float firstBaseline;
+    property public final boolean hasVisualOverflow;
+    property public final float lastBaseline;
+    property public final androidx.compose.ui.text.TextLayoutInput layoutInput;
+    property public final int lineCount;
+    property public final androidx.compose.ui.text.MultiParagraph multiParagraph;
+    property public final java.util.List<androidx.compose.ui.geometry.Rect> placeholderRects;
+    property public final long size;
+  }
+
+  public final class TextLayoutResultKt {
+    method @Deprecated public static androidx.compose.ui.text.TextLayoutResult createTextLayoutResult(optional androidx.compose.ui.text.TextLayoutInput layoutInput, optional androidx.compose.ui.text.MultiParagraph multiParagraph, optional long size);
+  }
+
+  public final class TextPainter {
+    method public void paint(androidx.compose.ui.graphics.Canvas canvas, androidx.compose.ui.text.TextLayoutResult textLayoutResult);
+    field public static final androidx.compose.ui.text.TextPainter INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class TextRange {
+    ctor public TextRange();
+    method public operator boolean contains(long other);
+    method public operator boolean contains(int offset);
+  }
+
+  public static final class TextRange.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class TextRangeKt {
+    method public static long TextRange(int start, int end);
+    method public static long TextRange(int index);
+    method public static String substring(CharSequence, long range);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextStyle {
+    ctor public TextStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method public androidx.compose.ui.text.TextStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method public long getBackground();
+    method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift();
+    method public long getColor();
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public long getFontSize();
+    method public androidx.compose.ui.text.font.FontStyle? getFontStyle();
+    method public androidx.compose.ui.text.font.FontSynthesis? getFontSynthesis();
+    method public androidx.compose.ui.text.font.FontWeight? getFontWeight();
+    method public long getLetterSpacing();
+    method public long getLineHeight();
+    method public androidx.compose.ui.text.intl.LocaleList? getLocaleList();
+    method public androidx.compose.ui.graphics.Shadow? getShadow();
+    method public androidx.compose.ui.text.style.TextAlign? getTextAlign();
+    method public androidx.compose.ui.text.style.TextDecoration? getTextDecoration();
+    method public androidx.compose.ui.text.style.TextDirection? getTextDirection();
+    method public androidx.compose.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
+    method public androidx.compose.ui.text.style.TextIndent? getTextIndent();
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.TextStyle merge(optional androidx.compose.ui.text.TextStyle? other);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.TextStyle merge(androidx.compose.ui.text.SpanStyle other);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.TextStyle merge(androidx.compose.ui.text.ParagraphStyle other);
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.TextStyle plus(androidx.compose.ui.text.TextStyle other);
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.TextStyle plus(androidx.compose.ui.text.ParagraphStyle other);
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.TextStyle plus(androidx.compose.ui.text.SpanStyle other);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.ParagraphStyle toParagraphStyle();
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.SpanStyle toSpanStyle();
+    property public final long background;
+    property public final androidx.compose.ui.text.style.BaselineShift? baselineShift;
+    property public final long color;
+    property public final androidx.compose.ui.text.font.FontFamily? fontFamily;
+    property public final String? fontFeatureSettings;
+    property public final long fontSize;
+    property public final androidx.compose.ui.text.font.FontStyle? fontStyle;
+    property public final androidx.compose.ui.text.font.FontSynthesis? fontSynthesis;
+    property public final androidx.compose.ui.text.font.FontWeight? fontWeight;
+    property public final long letterSpacing;
+    property public final long lineHeight;
+    property public final androidx.compose.ui.text.intl.LocaleList? localeList;
+    property public final androidx.compose.ui.graphics.Shadow? shadow;
+    property public final androidx.compose.ui.text.style.TextAlign? textAlign;
+    property public final androidx.compose.ui.text.style.TextDecoration? textDecoration;
+    property public final androidx.compose.ui.text.style.TextDirection? textDirection;
+    property public final androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform;
+    property public final androidx.compose.ui.text.style.TextIndent? textIndent;
+    field public static final androidx.compose.ui.text.TextStyle.Companion Companion;
+  }
+
+  public static final class TextStyle.Companion {
+    method public androidx.compose.ui.text.TextStyle getDefault();
+    property public final androidx.compose.ui.text.TextStyle Default;
+  }
+
+  public final class TextStyleKt {
+    method public static androidx.compose.ui.text.TextStyle lerp(androidx.compose.ui.text.TextStyle start, androidx.compose.ui.text.TextStyle stop, float fraction);
+    method public static androidx.compose.ui.text.TextStyle resolveDefaults(androidx.compose.ui.text.TextStyle style, androidx.compose.ui.unit.LayoutDirection direction);
+  }
+
+  public abstract sealed class TtsAnnotation {
+  }
+
+  public final class VerbatimTtsAnnotation extends androidx.compose.ui.text.TtsAnnotation {
+    ctor public VerbatimTtsAnnotation(String verbatim);
+    method public String getVerbatim();
+    property public final String verbatim;
+  }
+
+}
+
+package androidx.compose.ui.text.android {
+
+  @kotlin.RequiresOptIn(level=kotlin.RequiresOptIn.Level, message="This is internal API that may change frequently and without warning.") @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface InternalPlatformTextApi {
+  }
+
+  public final class LayoutCompatKt {
+  }
+
+  public final class LayoutHelperKt {
+  }
+
+  public final class LayoutIntrinsicsKt {
+  }
+
+  public final class SpannedExtensionsKt {
+  }
+
+  public final class StaticLayoutFactoryKt {
+  }
+
+  public final class TempListUtilsKt {
+  }
+
+  public final class TextLayoutKt {
+  }
+
+}
+
+package androidx.compose.ui.text.android.style {
+
+  public final class PlaceholderSpanKt {
+  }
+
+}
+
+package androidx.compose.ui.text.font {
+
+  public final class AndroidFontKt {
+    method @androidx.compose.runtime.Stable @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.font.Font Font(android.content.res.AssetManager assetManager, String path, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
+    method @androidx.compose.runtime.Stable @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.font.Font Font(java.io.File file, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
+    method @RequiresApi(26) @androidx.compose.runtime.Stable @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.font.Font Font(android.os.ParcelFileDescriptor fileDescriptor, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
+  }
+
+  public final class AndroidTypeface_androidKt {
+    method public static androidx.compose.ui.text.font.FontFamily FontFamily(android.graphics.Typeface typeface);
+    method public static androidx.compose.ui.text.font.Typeface Typeface(android.content.Context context, androidx.compose.ui.text.font.FontFamily fontFamily, optional java.util.List<kotlin.Pair<androidx.compose.ui.text.font.FontWeight,androidx.compose.ui.text.font.FontStyle>>? styles);
+    method public static androidx.compose.ui.text.font.Typeface Typeface(android.graphics.Typeface typeface);
+  }
+
+  public abstract sealed class FileBasedFontFamily extends androidx.compose.ui.text.font.FontFamily {
+  }
+
+  @androidx.compose.runtime.Immutable public interface Font {
+    method public int getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property public abstract int style;
+    property public abstract androidx.compose.ui.text.font.FontWeight weight;
+  }
+
+  public static interface Font.ResourceLoader {
+    method public Object load(androidx.compose.ui.text.font.Font font);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class FontFamily {
+    method public final boolean getCanLoadSynchronously();
+    property public final boolean canLoadSynchronously;
+    field public static final androidx.compose.ui.text.font.FontFamily.Companion Companion;
+  }
+
+  public static final class FontFamily.Companion {
+    method public androidx.compose.ui.text.font.GenericFontFamily getCursive();
+    method public androidx.compose.ui.text.font.SystemFontFamily getDefault();
+    method public androidx.compose.ui.text.font.GenericFontFamily getMonospace();
+    method public androidx.compose.ui.text.font.GenericFontFamily getSansSerif();
+    method public androidx.compose.ui.text.font.GenericFontFamily getSerif();
+    property public final androidx.compose.ui.text.font.GenericFontFamily Cursive;
+    property public final androidx.compose.ui.text.font.SystemFontFamily Default;
+    property public final androidx.compose.ui.text.font.GenericFontFamily Monospace;
+    property public final androidx.compose.ui.text.font.GenericFontFamily SansSerif;
+    property public final androidx.compose.ui.text.font.GenericFontFamily Serif;
+  }
+
+  public final class FontFamilyKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.FontFamily FontFamily(java.util.List<? extends androidx.compose.ui.text.font.Font> fonts);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.FontFamily FontFamily(androidx.compose.ui.text.font.Font... fonts);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.FontFamily FontFamily(androidx.compose.ui.text.font.Typeface typeface);
+  }
+
+  public final class FontKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.Font Font(int resId, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.FontFamily toFontFamily(androidx.compose.ui.text.font.Font);
+  }
+
+  @androidx.compose.runtime.Immutable public final class FontListFontFamily extends androidx.compose.ui.text.font.FileBasedFontFamily implements kotlin.jvm.internal.markers.KMappedMarker java.util.List<androidx.compose.ui.text.font.Font> {
+    method public java.util.List<androidx.compose.ui.text.font.Font> getFonts();
+    property public final java.util.List<androidx.compose.ui.text.font.Font> fonts;
+  }
+
+  public final inline class FontStyle {
+    ctor public FontStyle();
+    method public int getValue();
+    property public final int value;
+  }
+
+  public static final class FontStyle.Companion {
+    method public int getItalic();
+    method public int getNormal();
+    method public java.util.List<androidx.compose.ui.text.font.FontStyle> values();
+    property public final int Italic;
+    property public final int Normal;
+  }
+
+  public final inline class FontSynthesis {
+    ctor public FontSynthesis();
+  }
+
+  public static final class FontSynthesis.Companion {
+    method public int getAll();
+    method public int getNone();
+    method public int getStyle();
+    method public int getWeight();
+    property public final int All;
+    property public final int None;
+    property public final int Style;
+    property public final int Weight;
+  }
+
+  @androidx.compose.runtime.Immutable public final class FontWeight implements java.lang.Comparable<androidx.compose.ui.text.font.FontWeight> {
+    ctor public FontWeight(int weight);
+    method public operator int compareTo(androidx.compose.ui.text.font.FontWeight other);
+    method public int getWeight();
+    property public final int weight;
+    field public static final androidx.compose.ui.text.font.FontWeight.Companion Companion;
+  }
+
+  public static final class FontWeight.Companion {
+    method public androidx.compose.ui.text.font.FontWeight getBlack();
+    method public androidx.compose.ui.text.font.FontWeight getBold();
+    method public androidx.compose.ui.text.font.FontWeight getExtraBold();
+    method public androidx.compose.ui.text.font.FontWeight getExtraLight();
+    method public androidx.compose.ui.text.font.FontWeight getLight();
+    method public androidx.compose.ui.text.font.FontWeight getMedium();
+    method public androidx.compose.ui.text.font.FontWeight getNormal();
+    method public androidx.compose.ui.text.font.FontWeight getSemiBold();
+    method public androidx.compose.ui.text.font.FontWeight getThin();
+    method public androidx.compose.ui.text.font.FontWeight getW100();
+    method public androidx.compose.ui.text.font.FontWeight getW200();
+    method public androidx.compose.ui.text.font.FontWeight getW300();
+    method public androidx.compose.ui.text.font.FontWeight getW400();
+    method public androidx.compose.ui.text.font.FontWeight getW500();
+    method public androidx.compose.ui.text.font.FontWeight getW600();
+    method public androidx.compose.ui.text.font.FontWeight getW700();
+    method public androidx.compose.ui.text.font.FontWeight getW800();
+    method public androidx.compose.ui.text.font.FontWeight getW900();
+    property public final androidx.compose.ui.text.font.FontWeight Black;
+    property public final androidx.compose.ui.text.font.FontWeight Bold;
+    property public final androidx.compose.ui.text.font.FontWeight ExtraBold;
+    property public final androidx.compose.ui.text.font.FontWeight ExtraLight;
+    property public final androidx.compose.ui.text.font.FontWeight Light;
+    property public final androidx.compose.ui.text.font.FontWeight Medium;
+    property public final androidx.compose.ui.text.font.FontWeight Normal;
+    property public final androidx.compose.ui.text.font.FontWeight SemiBold;
+    property public final androidx.compose.ui.text.font.FontWeight Thin;
+    property public final androidx.compose.ui.text.font.FontWeight W100;
+    property public final androidx.compose.ui.text.font.FontWeight W200;
+    property public final androidx.compose.ui.text.font.FontWeight W300;
+    property public final androidx.compose.ui.text.font.FontWeight W400;
+    property public final androidx.compose.ui.text.font.FontWeight W500;
+    property public final androidx.compose.ui.text.font.FontWeight W600;
+    property public final androidx.compose.ui.text.font.FontWeight W700;
+    property public final androidx.compose.ui.text.font.FontWeight W800;
+    property public final androidx.compose.ui.text.font.FontWeight W900;
+  }
+
+  public final class FontWeightKt {
+    method public static androidx.compose.ui.text.font.FontWeight lerp(androidx.compose.ui.text.font.FontWeight start, androidx.compose.ui.text.font.FontWeight stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class GenericFontFamily extends androidx.compose.ui.text.font.SystemFontFamily {
+    method public String getName();
+    property public final String name;
+  }
+
+  public final class LoadedFontFamily extends androidx.compose.ui.text.font.FontFamily {
+    method public androidx.compose.ui.text.font.Typeface getTypeface();
+    property public final androidx.compose.ui.text.font.Typeface typeface;
+  }
+
+  public final class ResourceFont implements androidx.compose.ui.text.font.Font {
+    method public androidx.compose.ui.text.font.ResourceFont copy(optional int resId, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
+    method public int getResId();
+    method public int getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property public final int resId;
+    property public int style;
+    property public androidx.compose.ui.text.font.FontWeight weight;
+  }
+
+  public abstract sealed class SystemFontFamily extends androidx.compose.ui.text.font.FontFamily {
+  }
+
+  public interface Typeface {
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    property public abstract androidx.compose.ui.text.font.FontFamily? fontFamily;
+  }
+
+}
+
+package androidx.compose.ui.text.input {
+
+  public final class BackspaceCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public BackspaceCommand();
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  public final class CommitTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public CommitTextCommand(androidx.compose.ui.text.AnnotatedString annotatedString, int newCursorPosition);
+    ctor public CommitTextCommand(String text, int newCursorPosition);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public androidx.compose.ui.text.AnnotatedString getAnnotatedString();
+    method public int getNewCursorPosition();
+    method public String getText();
+    property public final androidx.compose.ui.text.AnnotatedString annotatedString;
+    property public final int newCursorPosition;
+    property public final String text;
+  }
+
+  public final class DeleteAllCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public DeleteAllCommand();
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  public final class DeleteSurroundingTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public DeleteSurroundingTextCommand(int lengthBeforeCursor, int lengthAfterCursor);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getLengthAfterCursor();
+    method public int getLengthBeforeCursor();
+    property public final int lengthAfterCursor;
+    property public final int lengthBeforeCursor;
+  }
+
+  public final class DeleteSurroundingTextInCodePointsCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public DeleteSurroundingTextInCodePointsCommand(int lengthBeforeCursor, int lengthAfterCursor);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getLengthAfterCursor();
+    method public int getLengthBeforeCursor();
+    property public final int lengthAfterCursor;
+    property public final int lengthBeforeCursor;
+  }
+
+  public interface EditCommand {
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  public final class EditCommandKt {
+  }
+
+  public final class EditProcessor {
+    ctor public EditProcessor();
+    method public androidx.compose.ui.text.input.TextFieldValue apply(java.util.List<? extends androidx.compose.ui.text.input.EditCommand> editCommands);
+    method public void reset(androidx.compose.ui.text.input.TextFieldValue value, androidx.compose.ui.text.input.TextInputSession? textInputSession);
+    method public androidx.compose.ui.text.input.TextFieldValue toTextFieldValue();
+  }
+
+  public final class EditingBuffer {
+    ctor public EditingBuffer(androidx.compose.ui.text.AnnotatedString text, long selection);
+  }
+
+  public final class EditingBufferKt {
+  }
+
+  public final class FinishComposingTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public FinishComposingTextCommand();
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  public final class GapBufferKt {
+  }
+
+  public final inline class ImeAction {
+    ctor public ImeAction();
+  }
+
+  public static final class ImeAction.Companion {
+    method public int getDefault();
+    method public int getDone();
+    method public int getGo();
+    method public int getNext();
+    method public int getNone();
+    method public int getPrevious();
+    method public int getSearch();
+    method public int getSend();
+    property public final int Default;
+    property public final int Done;
+    property public final int Go;
+    property public final int Next;
+    property public final int None;
+    property public final int Previous;
+    property public final int Search;
+    property public final int Send;
+  }
+
+  @androidx.compose.runtime.Immutable public final class ImeOptions {
+    ctor public ImeOptions(optional boolean singleLine, optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public androidx.compose.ui.text.input.ImeOptions copy(optional boolean singleLine, optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public boolean getAutoCorrect();
+    method public int getCapitalization();
+    method public int getImeAction();
+    method public int getKeyboardType();
+    method public boolean getSingleLine();
+    property public final boolean autoCorrect;
+    property public final int capitalization;
+    property public final int imeAction;
+    property public final int keyboardType;
+    property public final boolean singleLine;
+    field public static final androidx.compose.ui.text.input.ImeOptions.Companion Companion;
+  }
+
+  public static final class ImeOptions.Companion {
+    method public androidx.compose.ui.text.input.ImeOptions getDefault();
+    property public final androidx.compose.ui.text.input.ImeOptions Default;
+  }
+
+  @Deprecated public interface InputEventCallback {
+    method @Deprecated public void onEditCommands(java.util.List<? extends androidx.compose.ui.text.input.EditCommand> editCommands);
+    method @Deprecated public void onImeAction(int imeAction);
+  }
+
+  public final inline class KeyboardCapitalization {
+    ctor public KeyboardCapitalization();
+  }
+
+  public static final class KeyboardCapitalization.Companion {
+    method public int getCharacters();
+    method public int getNone();
+    method public int getSentences();
+    method public int getWords();
+    property public final int Characters;
+    property public final int None;
+    property public final int Sentences;
+    property public final int Words;
+  }
+
+  public final inline class KeyboardType {
+    ctor public KeyboardType();
+  }
+
+  public static final class KeyboardType.Companion {
+    method public int getAscii();
+    method public int getEmail();
+    method public int getNumber();
+    method public int getNumberPassword();
+    method public int getPassword();
+    method public int getPhone();
+    method public int getText();
+    method public int getUri();
+    property public final int Ascii;
+    property public final int Email;
+    property public final int Number;
+    property public final int NumberPassword;
+    property public final int Password;
+    property public final int Phone;
+    property public final int Text;
+    property public final int Uri;
+  }
+
+  public final class MoveCursorCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public MoveCursorCommand(int amount);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getAmount();
+    property public final int amount;
+  }
+
+  public interface OffsetMapping {
+    method public int originalToTransformed(int offset);
+    method public int transformedToOriginal(int offset);
+    field public static final androidx.compose.ui.text.input.OffsetMapping.Companion Companion;
+  }
+
+  public static final class OffsetMapping.Companion {
+    method public androidx.compose.ui.text.input.OffsetMapping getIdentity();
+    property public final androidx.compose.ui.text.input.OffsetMapping Identity;
+  }
+
+  public final class PasswordVisualTransformation implements androidx.compose.ui.text.input.VisualTransformation {
+    ctor public PasswordVisualTransformation(optional char mask);
+    method public androidx.compose.ui.text.input.TransformedText filter(androidx.compose.ui.text.AnnotatedString text);
+    method public char getMask();
+    property public final char mask;
+  }
+
+  public interface PlatformTextInputService {
+    method public void hideSoftwareKeyboard();
+    method public void notifyFocusedRect(androidx.compose.ui.geometry.Rect rect);
+    method public void showSoftwareKeyboard();
+    method public void startInput(androidx.compose.ui.text.input.TextFieldValue value, androidx.compose.ui.text.input.ImeOptions imeOptions, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.compose.ui.text.input.EditCommand>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.ImeAction,kotlin.Unit> onImeActionPerformed);
+    method public void stopInput();
+    method public void updateState(androidx.compose.ui.text.input.TextFieldValue? oldValue, androidx.compose.ui.text.input.TextFieldValue newValue);
+  }
+
+  public final class SetComposingRegionCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public SetComposingRegionCommand(int start, int end);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getEnd();
+    method public int getStart();
+    property public final int end;
+    property public final int start;
+  }
+
+  public final class SetComposingTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public SetComposingTextCommand(androidx.compose.ui.text.AnnotatedString annotatedString, int newCursorPosition);
+    ctor public SetComposingTextCommand(String text, int newCursorPosition);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public androidx.compose.ui.text.AnnotatedString getAnnotatedString();
+    method public int getNewCursorPosition();
+    method public String getText();
+    property public final androidx.compose.ui.text.AnnotatedString annotatedString;
+    property public final int newCursorPosition;
+    property public final String text;
+  }
+
+  public final class SetSelectionCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public SetSelectionCommand(int start, int end);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getEnd();
+    method public int getStart();
+    property public final int end;
+    property public final int start;
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextFieldValue {
+    ctor public TextFieldValue(androidx.compose.ui.text.AnnotatedString annotatedString, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    ctor public TextFieldValue(optional String text, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    method public androidx.compose.ui.text.input.TextFieldValue copy(optional androidx.compose.ui.text.AnnotatedString annotatedString, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    method public androidx.compose.ui.text.input.TextFieldValue copy(String text, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    method public androidx.compose.ui.text.AnnotatedString getAnnotatedString();
+    method public androidx.compose.ui.text.TextRange? getComposition();
+    method public long getSelection();
+    method public String getText();
+    property public final androidx.compose.ui.text.AnnotatedString annotatedString;
+    property public final androidx.compose.ui.text.TextRange? composition;
+    property public final long selection;
+    property public final String text;
+    field public static final androidx.compose.ui.text.input.TextFieldValue.Companion Companion;
+  }
+
+  public static final class TextFieldValue.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.ui.text.input.TextFieldValue,java.lang.Object> getSaver();
+    property public final androidx.compose.runtime.saveable.Saver<androidx.compose.ui.text.input.TextFieldValue,java.lang.Object> Saver;
+  }
+
+  public final class TextFieldValueKt {
+    method public static androidx.compose.ui.text.AnnotatedString getSelectedText(androidx.compose.ui.text.input.TextFieldValue);
+    method public static androidx.compose.ui.text.AnnotatedString getTextAfterSelection(androidx.compose.ui.text.input.TextFieldValue, int maxChars);
+    method public static androidx.compose.ui.text.AnnotatedString getTextBeforeSelection(androidx.compose.ui.text.input.TextFieldValue, int maxChars);
+  }
+
+  public class TextInputService {
+    ctor public TextInputService(androidx.compose.ui.text.input.PlatformTextInputService platformTextInputService);
+    method public final void hideSoftwareKeyboard();
+    method public final void showSoftwareKeyboard();
+    method public androidx.compose.ui.text.input.TextInputSession startInput(androidx.compose.ui.text.input.TextFieldValue value, androidx.compose.ui.text.input.ImeOptions imeOptions, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.compose.ui.text.input.EditCommand>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.ImeAction,kotlin.Unit> onImeActionPerformed);
+    method public void stopInput(androidx.compose.ui.text.input.TextInputSession session);
+  }
+
+  public final class TextInputSession {
+    ctor public TextInputSession(androidx.compose.ui.text.input.TextInputService textInputService, androidx.compose.ui.text.input.PlatformTextInputService platformTextInputService);
+    method public void dispose();
+    method public boolean hideSoftwareKeyboard();
+    method public boolean isOpen();
+    method public boolean notifyFocusedRect(androidx.compose.ui.geometry.Rect rect);
+    method public boolean showSoftwareKeyboard();
+    method public boolean updateState(androidx.compose.ui.text.input.TextFieldValue? oldValue, androidx.compose.ui.text.input.TextFieldValue newValue);
+    property public final boolean isOpen;
+  }
+
+  public final class TransformedText {
+    ctor public TransformedText(androidx.compose.ui.text.AnnotatedString text, androidx.compose.ui.text.input.OffsetMapping offsetMapping);
+    method public androidx.compose.ui.text.input.OffsetMapping getOffsetMapping();
+    method public androidx.compose.ui.text.AnnotatedString getText();
+    property public final androidx.compose.ui.text.input.OffsetMapping offsetMapping;
+    property public final androidx.compose.ui.text.AnnotatedString text;
+  }
+
+  @androidx.compose.runtime.Immutable public fun interface VisualTransformation {
+    method public androidx.compose.ui.text.input.TransformedText filter(androidx.compose.ui.text.AnnotatedString text);
+    field public static final androidx.compose.ui.text.input.VisualTransformation.Companion Companion;
+  }
+
+  public static final class VisualTransformation.Companion {
+    method public androidx.compose.ui.text.input.VisualTransformation getNone();
+    property public final androidx.compose.ui.text.input.VisualTransformation None;
+  }
+
+}
+
+package androidx.compose.ui.text.intl {
+
+  public final class AndroidPlatformLocale_androidKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class Locale {
+    ctor public Locale(String languageTag);
+    method public String getLanguage();
+    method public String getRegion();
+    method public String getScript();
+    method public String toLanguageTag();
+    property public final String language;
+    property public final String region;
+    property public final String script;
+    field public static final androidx.compose.ui.text.intl.Locale.Companion Companion;
+  }
+
+  public static final class Locale.Companion {
+    method public androidx.compose.ui.text.intl.Locale getCurrent();
+    property public final androidx.compose.ui.text.intl.Locale current;
+  }
+
+  @androidx.compose.runtime.Immutable public final class LocaleList implements java.util.Collection<androidx.compose.ui.text.intl.Locale> kotlin.jvm.internal.markers.KMappedMarker {
+    ctor public LocaleList(java.util.List<androidx.compose.ui.text.intl.Locale> localeList);
+    ctor public LocaleList(String languageTags);
+    ctor public LocaleList(androidx.compose.ui.text.intl.Locale... locales);
+    method public operator boolean contains(androidx.compose.ui.text.intl.Locale element);
+    method public boolean containsAll(java.util.Collection<E!> elements);
+    method public operator androidx.compose.ui.text.intl.Locale get(int i);
+    method public java.util.List<androidx.compose.ui.text.intl.Locale> getLocaleList();
+    method public int getSize();
+    method public boolean isEmpty();
+    method public java.util.Iterator<androidx.compose.ui.text.intl.Locale> iterator();
+    property public final java.util.List<androidx.compose.ui.text.intl.Locale> localeList;
+    property public int size;
+    field public static final androidx.compose.ui.text.intl.LocaleList.Companion Companion;
+  }
+
+  public static final class LocaleList.Companion {
+    method public androidx.compose.ui.text.intl.LocaleList getCurrent();
+    property public final androidx.compose.ui.text.intl.LocaleList current;
+  }
+
+  public final class PlatformLocaleKt {
+  }
+
+}
+
+package androidx.compose.ui.text.platform {
+
+  public final class AndroidAccessibilitySpannableString_androidKt {
+  }
+
+  public final class AndroidParagraphHelper_androidKt {
+  }
+
+  public final class AndroidParagraphIntrinsics_androidKt {
+  }
+
+  public final class AndroidParagraph_androidKt {
+  }
+
+  public final class AndroidStringDelegate_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.text.platform.extensions {
+
+  public final class LocaleExtensions_androidKt {
+  }
+
+  public final class PlaceholderExtensions_androidKt {
+  }
+
+  public final class SpannableExtensions_androidKt {
+  }
+
+  public final class TextPaintExtensions_androidKt {
+  }
+
+  public final class TtsAnnotationExtensions_androidKt {
+    method public static android.text.style.TtsSpan toSpan(androidx.compose.ui.text.TtsAnnotation);
+    method public static android.text.style.TtsSpan toSpan(androidx.compose.ui.text.VerbatimTtsAnnotation);
+  }
+
+}
+
+package androidx.compose.ui.text.style {
+
+  @androidx.compose.runtime.Immutable public final inline class BaselineShift {
+    ctor public BaselineShift();
+    method public float getMultiplier();
+    property public final float multiplier;
+  }
+
+  public static final class BaselineShift.Companion {
+    method public float getNone();
+    method public float getSubscript();
+    method public float getSuperscript();
+    property public final float None;
+    property public final float Subscript;
+    property public final float Superscript;
+  }
+
+  public final class BaselineShiftKt {
+    method @androidx.compose.runtime.Stable public static float lerp(float start, float stop, float fraction);
+  }
+
+  public enum ResolvedTextDirection {
+    enum_constant public static final androidx.compose.ui.text.style.ResolvedTextDirection Ltr;
+    enum_constant public static final androidx.compose.ui.text.style.ResolvedTextDirection Rtl;
+  }
+
+  public final inline class TextAlign {
+    ctor public TextAlign();
+  }
+
+  public static final class TextAlign.Companion {
+    method public int getCenter();
+    method public int getEnd();
+    method public int getJustify();
+    method public int getLeft();
+    method public int getRight();
+    method public int getStart();
+    method public java.util.List<androidx.compose.ui.text.style.TextAlign> values();
+    property public final int Center;
+    property public final int End;
+    property public final int Justify;
+    property public final int Left;
+    property public final int Right;
+    property public final int Start;
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextDecoration {
+    method public operator boolean contains(androidx.compose.ui.text.style.TextDecoration other);
+    method public operator boolean equals(Object? other);
+    method public int getMask();
+    method public operator androidx.compose.ui.text.style.TextDecoration plus(androidx.compose.ui.text.style.TextDecoration decoration);
+    property public final int mask;
+    field public static final androidx.compose.ui.text.style.TextDecoration.Companion Companion;
+  }
+
+  public static final class TextDecoration.Companion {
+    method public androidx.compose.ui.text.style.TextDecoration combine(java.util.List<androidx.compose.ui.text.style.TextDecoration> decorations);
+    method public androidx.compose.ui.text.style.TextDecoration getLineThrough();
+    method public androidx.compose.ui.text.style.TextDecoration getNone();
+    method public androidx.compose.ui.text.style.TextDecoration getUnderline();
+    property public final androidx.compose.ui.text.style.TextDecoration LineThrough;
+    property public final androidx.compose.ui.text.style.TextDecoration None;
+    property public final androidx.compose.ui.text.style.TextDecoration Underline;
+  }
+
+  public final inline class TextDirection {
+    ctor public TextDirection();
+  }
+
+  public static final class TextDirection.Companion {
+    method public int getContent();
+    method public int getContentOrLtr();
+    method public int getContentOrRtl();
+    method public int getLtr();
+    method public int getRtl();
+    property public final int Content;
+    property public final int ContentOrLtr;
+    property public final int ContentOrRtl;
+    property public final int Ltr;
+    property public final int Rtl;
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextGeometricTransform {
+    ctor public TextGeometricTransform(optional float scaleX, optional float skewX);
+    method public androidx.compose.ui.text.style.TextGeometricTransform copy(optional float scaleX, optional float skewX);
+    method public operator boolean equals(Object? other);
+    method public float getScaleX();
+    method public float getSkewX();
+    property public final float scaleX;
+    property public final float skewX;
+    field public static final androidx.compose.ui.text.style.TextGeometricTransform.Companion Companion;
+  }
+
+  public static final class TextGeometricTransform.Companion {
+  }
+
+  public final class TextGeometricTransformKt {
+    method public static androidx.compose.ui.text.style.TextGeometricTransform lerp(androidx.compose.ui.text.style.TextGeometricTransform start, androidx.compose.ui.text.style.TextGeometricTransform stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextIndent {
+    ctor public TextIndent(optional long firstLine, optional long restLine);
+    method public androidx.compose.ui.text.style.TextIndent copy(optional long firstLine, optional long restLine);
+    method public operator boolean equals(Object? other);
+    method public long getFirstLine();
+    method public long getRestLine();
+    property public final long firstLine;
+    property public final long restLine;
+    field public static final androidx.compose.ui.text.style.TextIndent.Companion Companion;
+  }
+
+  public static final class TextIndent.Companion {
+    method public androidx.compose.ui.text.style.TextIndent getNone();
+    property public final androidx.compose.ui.text.style.TextIndent None;
+  }
+
+  public final class TextIndentKt {
+    method public static androidx.compose.ui.text.style.TextIndent lerp(androidx.compose.ui.text.style.TextIndent start, androidx.compose.ui.text.style.TextIndent stop, float fraction);
+  }
+
+  public final inline class TextOverflow {
+    ctor public TextOverflow();
+  }
+
+  public static final class TextOverflow.Companion {
+    method public int getClip();
+    method public int getEllipsis();
+    method public int getVisible();
+    property public final int Clip;
+    property public final int Ellipsis;
+    property public final int Visible;
+  }
+
+}
+
diff --git a/compose/ui/ui-text/api/public_plus_experimental_current.txt b/compose/ui/ui-text/api/public_plus_experimental_current.txt
index fd96e1e..13fbf7b 100644
--- a/compose/ui/ui-text/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-text/api/public_plus_experimental_current.txt
@@ -401,6 +401,8 @@
 
   @androidx.compose.runtime.Immutable public final inline class TextRange {
     ctor public TextRange();
+    method public operator boolean contains(long other);
+    method public operator boolean contains(int offset);
   }
 
   public static final class TextRange.Companion {
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/ui/ui-text/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to compose/ui/ui-text/api/res-1.1.0-beta02.txt
diff --git a/compose/ui/ui-text/api/restricted_1.1.0-beta02.txt b/compose/ui/ui-text/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..ee52a20
--- /dev/null
+++ b/compose/ui/ui-text/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,1193 @@
+// Signature format: 4.0
+package androidx.compose.ui.text {
+
+  public final class ActualAtomicReferenceJvmKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class AnnotatedString implements java.lang.CharSequence {
+    ctor public AnnotatedString(String text, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> spanStyles, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.ParagraphStyle>> paragraphStyles);
+    method public operator char get(int index);
+    method public int getLength();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.ParagraphStyle>> getParagraphStyles();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> getSpanStyles();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<java.lang.String>> getStringAnnotations(String tag, int start, int end);
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<java.lang.String>> getStringAnnotations(int start, int end);
+    method public String getText();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.TtsAnnotation>> getTtsAnnotations(int start, int end);
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.AnnotatedString plus(androidx.compose.ui.text.AnnotatedString other);
+    method public androidx.compose.ui.text.AnnotatedString subSequence(int startIndex, int endIndex);
+    method public androidx.compose.ui.text.AnnotatedString subSequence(long range);
+    property public int length;
+    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.ParagraphStyle>> paragraphStyles;
+    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> spanStyles;
+    property public final String text;
+  }
+
+  public static final class AnnotatedString.Builder {
+    ctor public AnnotatedString.Builder(optional int capacity);
+    ctor public AnnotatedString.Builder(String text);
+    ctor public AnnotatedString.Builder(androidx.compose.ui.text.AnnotatedString text);
+    method public void addStringAnnotation(String tag, String annotation, int start, int end);
+    method public void addStyle(androidx.compose.ui.text.SpanStyle style, int start, int end);
+    method public void addStyle(androidx.compose.ui.text.ParagraphStyle style, int start, int end);
+    method public void append(String text);
+    method public void append(char char);
+    method public void append(androidx.compose.ui.text.AnnotatedString text);
+    method public int getLength();
+    method public void pop();
+    method public void pop(int index);
+    method public int pushStringAnnotation(String tag, String annotation);
+    method public int pushStyle(androidx.compose.ui.text.SpanStyle style);
+    method public int pushStyle(androidx.compose.ui.text.ParagraphStyle style);
+    method public int pushTtsAnnotation(androidx.compose.ui.text.TtsAnnotation ttsAnnotation);
+    method public androidx.compose.ui.text.AnnotatedString toAnnotatedString();
+    property public final int length;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class AnnotatedString.Range<T> {
+    ctor public AnnotatedString.Range(T? item, int start, int end, String tag);
+    ctor public AnnotatedString.Range(T? item, int start, int end);
+    method public T! component1();
+    method public int component2();
+    method public int component3();
+    method public String component4();
+    method public androidx.compose.ui.text.AnnotatedString.Range<T> copy(T! item, int start, int end, String tag);
+    method public int getEnd();
+    method public T! getItem();
+    method public int getStart();
+    method public String getTag();
+    property public final int end;
+    property public final T! item;
+    property public final int start;
+    property public final String tag;
+  }
+
+  public final class AnnotatedStringKt {
+    method public static androidx.compose.ui.text.AnnotatedString AnnotatedString(String text, androidx.compose.ui.text.SpanStyle spanStyle, optional androidx.compose.ui.text.ParagraphStyle? paragraphStyle);
+    method public static androidx.compose.ui.text.AnnotatedString AnnotatedString(String text, androidx.compose.ui.text.ParagraphStyle paragraphStyle);
+    method public static inline androidx.compose.ui.text.AnnotatedString buildAnnotatedString(kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,kotlin.Unit> builder);
+    method public static androidx.compose.ui.text.AnnotatedString capitalize(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static androidx.compose.ui.text.AnnotatedString decapitalize(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static androidx.compose.ui.text.AnnotatedString toLowerCase(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static androidx.compose.ui.text.AnnotatedString toUpperCase(androidx.compose.ui.text.AnnotatedString, optional androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static inline <R> R withStyle(androidx.compose.ui.text.AnnotatedString.Builder, androidx.compose.ui.text.SpanStyle style, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,? extends R> block);
+    method public static inline <R> R withStyle(androidx.compose.ui.text.AnnotatedString.Builder, androidx.compose.ui.text.ParagraphStyle style, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString.Builder,? extends R> block);
+  }
+
+  public final class JvmAnnotatedString_jvmKt {
+  }
+
+  public final class JvmCharHelpers_androidKt {
+  }
+
+  public final class MultiParagraph {
+    ctor public MultiParagraph(androidx.compose.ui.text.MultiParagraphIntrinsics intrinsics, optional int maxLines, optional boolean ellipsis, float width);
+    ctor public MultiParagraph(androidx.compose.ui.text.AnnotatedString annotatedString, androidx.compose.ui.text.TextStyle style, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional int maxLines, optional boolean ellipsis, float width, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getBidiRunDirection(int offset);
+    method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.compose.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidExceedMaxLines();
+    method public float getFirstBaseline();
+    method public float getHeight();
+    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public androidx.compose.ui.text.MultiParagraphIntrinsics getIntrinsics();
+    method public float getLastBaseline();
+    method public float getLineBottom(int lineIndex);
+    method public int getLineCount();
+    method public int getLineEnd(int lineIndex, optional boolean visibleEnd);
+    method public int getLineForOffset(int offset);
+    method public int getLineForVerticalPosition(float vertical);
+    method public float getLineHeight(int lineIndex);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public int getLineStart(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public float getLineWidth(int lineIndex);
+    method public float getMaxIntrinsicWidth();
+    method public int getMaxLines();
+    method public float getMinIntrinsicWidth();
+    method public int getOffsetForPosition(long position);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getParagraphDirection(int offset);
+    method public androidx.compose.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.compose.ui.geometry.Rect> getPlaceholderRects();
+    method public float getWidth();
+    method public long getWordBoundary(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    method public void paint(androidx.compose.ui.graphics.Canvas canvas, optional long color, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? decoration);
+    property public final boolean didExceedMaxLines;
+    property public final float firstBaseline;
+    property public final float height;
+    property public final androidx.compose.ui.text.MultiParagraphIntrinsics intrinsics;
+    property public final float lastBaseline;
+    property public final int lineCount;
+    property public final float maxIntrinsicWidth;
+    property public final int maxLines;
+    property public final float minIntrinsicWidth;
+    property public final java.util.List<androidx.compose.ui.geometry.Rect> placeholderRects;
+    property public final float width;
+  }
+
+  public final class MultiParagraphIntrinsics implements androidx.compose.ui.text.ParagraphIntrinsics {
+    ctor public MultiParagraphIntrinsics(androidx.compose.ui.text.AnnotatedString annotatedString, androidx.compose.ui.text.TextStyle style, java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader);
+    method public androidx.compose.ui.text.AnnotatedString getAnnotatedString();
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> getPlaceholders();
+    property public final androidx.compose.ui.text.AnnotatedString annotatedString;
+    property public float maxIntrinsicWidth;
+    property public float minIntrinsicWidth;
+    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders;
+  }
+
+  public final class MultiParagraphIntrinsicsKt {
+  }
+
+  public final class MultiParagraphKt {
+  }
+
+  public interface Paragraph {
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getBidiRunDirection(int offset);
+    method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.compose.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidExceedMaxLines();
+    method public float getFirstBaseline();
+    method public float getHeight();
+    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public float getLastBaseline();
+    method public float getLineBottom(int lineIndex);
+    method public int getLineCount();
+    method public int getLineEnd(int lineIndex, optional boolean visibleEnd);
+    method public int getLineForOffset(int offset);
+    method public int getLineForVerticalPosition(float vertical);
+    method public float getLineHeight(int lineIndex);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public int getLineStart(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public float getLineWidth(int lineIndex);
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    method public int getOffsetForPosition(long position);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getParagraphDirection(int offset);
+    method public androidx.compose.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.compose.ui.geometry.Rect> getPlaceholderRects();
+    method public float getWidth();
+    method public long getWordBoundary(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    method public void paint(androidx.compose.ui.graphics.Canvas canvas, optional long color, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? textDecoration);
+    property public abstract boolean didExceedMaxLines;
+    property public abstract float firstBaseline;
+    property public abstract float height;
+    property public abstract float lastBaseline;
+    property public abstract int lineCount;
+    property public abstract float maxIntrinsicWidth;
+    property public abstract float minIntrinsicWidth;
+    property public abstract java.util.List<androidx.compose.ui.geometry.Rect> placeholderRects;
+    property public abstract float width;
+  }
+
+  public interface ParagraphIntrinsics {
+    method public float getMaxIntrinsicWidth();
+    method public float getMinIntrinsicWidth();
+    property public abstract float maxIntrinsicWidth;
+    property public abstract float minIntrinsicWidth;
+  }
+
+  public final class ParagraphIntrinsicsKt {
+    method public static androidx.compose.ui.text.ParagraphIntrinsics ParagraphIntrinsics(String text, androidx.compose.ui.text.TextStyle style, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> spanStyles, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader);
+  }
+
+  public final class ParagraphKt {
+    method public static androidx.compose.ui.text.Paragraph Paragraph(String text, androidx.compose.ui.text.TextStyle style, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.SpanStyle>> spanStyles, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional int maxLines, optional boolean ellipsis, float width, androidx.compose.ui.unit.Density density, androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader);
+    method public static androidx.compose.ui.text.Paragraph Paragraph(androidx.compose.ui.text.ParagraphIntrinsics paragraphIntrinsics, optional int maxLines, optional boolean ellipsis, float width);
+  }
+
+  @androidx.compose.runtime.Immutable public final class ParagraphStyle {
+    ctor public ParagraphStyle(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method public androidx.compose.ui.text.ParagraphStyle copy(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method public operator boolean equals(Object? other);
+    method public long getLineHeight();
+    method public androidx.compose.ui.text.style.TextAlign? getTextAlign();
+    method public androidx.compose.ui.text.style.TextDirection? getTextDirection();
+    method public androidx.compose.ui.text.style.TextIndent? getTextIndent();
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.ParagraphStyle merge(optional androidx.compose.ui.text.ParagraphStyle? other);
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.ParagraphStyle plus(androidx.compose.ui.text.ParagraphStyle other);
+    property public final long lineHeight;
+    property public final androidx.compose.ui.text.style.TextAlign? textAlign;
+    property public final androidx.compose.ui.text.style.TextDirection? textDirection;
+    property public final androidx.compose.ui.text.style.TextIndent? textIndent;
+  }
+
+  public final class ParagraphStyleKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.ParagraphStyle lerp(androidx.compose.ui.text.ParagraphStyle start, androidx.compose.ui.text.ParagraphStyle stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class Placeholder {
+    ctor public Placeholder(long width, long height, int placeholderVerticalAlign);
+    method public androidx.compose.ui.text.Placeholder copy(optional long width, optional long height, optional int placeholderVerticalAlign);
+    method public operator boolean equals(Object? other);
+    method public long getHeight();
+    method public int getPlaceholderVerticalAlign();
+    method public long getWidth();
+    property public final long height;
+    property public final int placeholderVerticalAlign;
+    property public final long width;
+  }
+
+  public final inline class PlaceholderVerticalAlign {
+    ctor public PlaceholderVerticalAlign();
+  }
+
+  public static final class PlaceholderVerticalAlign.Companion {
+    method public int getAboveBaseline();
+    method public int getBottom();
+    method public int getCenter();
+    method public int getTextBottom();
+    method public int getTextCenter();
+    method public int getTextTop();
+    method public int getTop();
+    property public final int AboveBaseline;
+    property public final int Bottom;
+    property public final int Center;
+    property public final int TextBottom;
+    property public final int TextCenter;
+    property public final int TextTop;
+    property public final int Top;
+  }
+
+  public final class SaversKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class SpanStyle {
+    ctor public SpanStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow);
+    method public androidx.compose.ui.text.SpanStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow);
+    method public operator boolean equals(Object? other);
+    method public long getBackground();
+    method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift();
+    method public long getColor();
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public long getFontSize();
+    method public androidx.compose.ui.text.font.FontStyle? getFontStyle();
+    method public androidx.compose.ui.text.font.FontSynthesis? getFontSynthesis();
+    method public androidx.compose.ui.text.font.FontWeight? getFontWeight();
+    method public long getLetterSpacing();
+    method public androidx.compose.ui.text.intl.LocaleList? getLocaleList();
+    method public androidx.compose.ui.graphics.Shadow? getShadow();
+    method public androidx.compose.ui.text.style.TextDecoration? getTextDecoration();
+    method public androidx.compose.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.SpanStyle merge(optional androidx.compose.ui.text.SpanStyle? other);
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.SpanStyle plus(androidx.compose.ui.text.SpanStyle other);
+    property public final long background;
+    property public final androidx.compose.ui.text.style.BaselineShift? baselineShift;
+    property public final long color;
+    property public final androidx.compose.ui.text.font.FontFamily? fontFamily;
+    property public final String? fontFeatureSettings;
+    property public final long fontSize;
+    property public final androidx.compose.ui.text.font.FontStyle? fontStyle;
+    property public final androidx.compose.ui.text.font.FontSynthesis? fontSynthesis;
+    property public final androidx.compose.ui.text.font.FontWeight? fontWeight;
+    property public final long letterSpacing;
+    property public final androidx.compose.ui.text.intl.LocaleList? localeList;
+    property public final androidx.compose.ui.graphics.Shadow? shadow;
+    property public final androidx.compose.ui.text.style.TextDecoration? textDecoration;
+    property public final androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform;
+  }
+
+  public final class SpanStyleKt {
+    method public static androidx.compose.ui.text.SpanStyle lerp(androidx.compose.ui.text.SpanStyle start, androidx.compose.ui.text.SpanStyle stop, float fraction);
+  }
+
+  public final class StringKt {
+    method public static String capitalize(String, androidx.compose.ui.text.intl.Locale locale);
+    method public static String capitalize(String, androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static String decapitalize(String, androidx.compose.ui.text.intl.Locale locale);
+    method public static String decapitalize(String, androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static String toLowerCase(String, androidx.compose.ui.text.intl.Locale locale);
+    method public static String toLowerCase(String, androidx.compose.ui.text.intl.LocaleList localeList);
+    method public static String toUpperCase(String, androidx.compose.ui.text.intl.Locale locale);
+    method public static String toUpperCase(String, androidx.compose.ui.text.intl.LocaleList localeList);
+  }
+
+  public final class TempListUtilsKt {
+  }
+
+  public final class TextLayoutInput {
+    ctor public TextLayoutInput(androidx.compose.ui.text.AnnotatedString text, androidx.compose.ui.text.TextStyle style, java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, int maxLines, boolean softWrap, int overflow, androidx.compose.ui.unit.Density density, androidx.compose.ui.unit.LayoutDirection layoutDirection, androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader, long constraints);
+    method public androidx.compose.ui.text.TextLayoutInput copy(optional androidx.compose.ui.text.AnnotatedString text, optional androidx.compose.ui.text.TextStyle style, optional java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders, optional int maxLines, optional boolean softWrap, optional int overflow, optional androidx.compose.ui.unit.Density density, optional androidx.compose.ui.unit.LayoutDirection layoutDirection, optional androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader, optional long constraints);
+    method public operator boolean equals(Object? other);
+    method public long getConstraints();
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public int getMaxLines();
+    method public int getOverflow();
+    method public java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> getPlaceholders();
+    method public androidx.compose.ui.text.font.Font.ResourceLoader getResourceLoader();
+    method public boolean getSoftWrap();
+    method public androidx.compose.ui.text.TextStyle getStyle();
+    method public androidx.compose.ui.text.AnnotatedString getText();
+    property public final long constraints;
+    property public final androidx.compose.ui.unit.Density density;
+    property public final androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public final int maxLines;
+    property public final int overflow;
+    property public final java.util.List<androidx.compose.ui.text.AnnotatedString.Range<androidx.compose.ui.text.Placeholder>> placeholders;
+    property public final androidx.compose.ui.text.font.Font.ResourceLoader resourceLoader;
+    property public final boolean softWrap;
+    property public final androidx.compose.ui.text.TextStyle style;
+    property public final androidx.compose.ui.text.AnnotatedString text;
+  }
+
+  public final class TextLayoutResult {
+    ctor public TextLayoutResult(androidx.compose.ui.text.TextLayoutInput layoutInput, androidx.compose.ui.text.MultiParagraph multiParagraph, long size);
+    method public androidx.compose.ui.text.TextLayoutResult copy(optional androidx.compose.ui.text.TextLayoutInput layoutInput, optional long size);
+    method public operator boolean equals(Object? other);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getBidiRunDirection(int offset);
+    method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
+    method public androidx.compose.ui.geometry.Rect getCursorRect(int offset);
+    method public boolean getDidOverflowHeight();
+    method public boolean getDidOverflowWidth();
+    method public float getFirstBaseline();
+    method public boolean getHasVisualOverflow();
+    method public float getHorizontalPosition(int offset, boolean usePrimaryDirection);
+    method public float getLastBaseline();
+    method public androidx.compose.ui.text.TextLayoutInput getLayoutInput();
+    method public float getLineBottom(int lineIndex);
+    method public int getLineCount();
+    method public int getLineEnd(int lineIndex, optional boolean visibleEnd);
+    method public int getLineForOffset(int offset);
+    method public int getLineForVerticalPosition(float vertical);
+    method public float getLineLeft(int lineIndex);
+    method public float getLineRight(int lineIndex);
+    method public int getLineStart(int lineIndex);
+    method public float getLineTop(int lineIndex);
+    method public androidx.compose.ui.text.MultiParagraph getMultiParagraph();
+    method public int getOffsetForPosition(long position);
+    method public androidx.compose.ui.text.style.ResolvedTextDirection getParagraphDirection(int offset);
+    method public androidx.compose.ui.graphics.Path getPathForRange(int start, int end);
+    method public java.util.List<androidx.compose.ui.geometry.Rect> getPlaceholderRects();
+    method public long getSize();
+    method public long getWordBoundary(int offset);
+    method public boolean isLineEllipsized(int lineIndex);
+    property public final boolean didOverflowHeight;
+    property public final boolean didOverflowWidth;
+    property public final float firstBaseline;
+    property public final boolean hasVisualOverflow;
+    property public final float lastBaseline;
+    property public final androidx.compose.ui.text.TextLayoutInput layoutInput;
+    property public final int lineCount;
+    property public final androidx.compose.ui.text.MultiParagraph multiParagraph;
+    property public final java.util.List<androidx.compose.ui.geometry.Rect> placeholderRects;
+    property public final long size;
+  }
+
+  public final class TextLayoutResultKt {
+    method @Deprecated public static androidx.compose.ui.text.TextLayoutResult createTextLayoutResult(optional androidx.compose.ui.text.TextLayoutInput layoutInput, optional androidx.compose.ui.text.MultiParagraph multiParagraph, optional long size);
+  }
+
+  public final class TextPainter {
+    method public void paint(androidx.compose.ui.graphics.Canvas canvas, androidx.compose.ui.text.TextLayoutResult textLayoutResult);
+    field public static final androidx.compose.ui.text.TextPainter INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class TextRange {
+    ctor public TextRange();
+    method public operator boolean contains(long other);
+    method public operator boolean contains(int offset);
+  }
+
+  public static final class TextRange.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class TextRangeKt {
+    method public static long TextRange(int start, int end);
+    method public static long TextRange(int index);
+    method public static String substring(CharSequence, long range);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextStyle {
+    ctor public TextStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method public androidx.compose.ui.text.TextStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method public long getBackground();
+    method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift();
+    method public long getColor();
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    method public String? getFontFeatureSettings();
+    method public long getFontSize();
+    method public androidx.compose.ui.text.font.FontStyle? getFontStyle();
+    method public androidx.compose.ui.text.font.FontSynthesis? getFontSynthesis();
+    method public androidx.compose.ui.text.font.FontWeight? getFontWeight();
+    method public long getLetterSpacing();
+    method public long getLineHeight();
+    method public androidx.compose.ui.text.intl.LocaleList? getLocaleList();
+    method public androidx.compose.ui.graphics.Shadow? getShadow();
+    method public androidx.compose.ui.text.style.TextAlign? getTextAlign();
+    method public androidx.compose.ui.text.style.TextDecoration? getTextDecoration();
+    method public androidx.compose.ui.text.style.TextDirection? getTextDirection();
+    method public androidx.compose.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
+    method public androidx.compose.ui.text.style.TextIndent? getTextIndent();
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.TextStyle merge(optional androidx.compose.ui.text.TextStyle? other);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.TextStyle merge(androidx.compose.ui.text.SpanStyle other);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.TextStyle merge(androidx.compose.ui.text.ParagraphStyle other);
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.TextStyle plus(androidx.compose.ui.text.TextStyle other);
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.TextStyle plus(androidx.compose.ui.text.ParagraphStyle other);
+    method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.TextStyle plus(androidx.compose.ui.text.SpanStyle other);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.ParagraphStyle toParagraphStyle();
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.text.SpanStyle toSpanStyle();
+    property public final long background;
+    property public final androidx.compose.ui.text.style.BaselineShift? baselineShift;
+    property public final long color;
+    property public final androidx.compose.ui.text.font.FontFamily? fontFamily;
+    property public final String? fontFeatureSettings;
+    property public final long fontSize;
+    property public final androidx.compose.ui.text.font.FontStyle? fontStyle;
+    property public final androidx.compose.ui.text.font.FontSynthesis? fontSynthesis;
+    property public final androidx.compose.ui.text.font.FontWeight? fontWeight;
+    property public final long letterSpacing;
+    property public final long lineHeight;
+    property public final androidx.compose.ui.text.intl.LocaleList? localeList;
+    property public final androidx.compose.ui.graphics.Shadow? shadow;
+    property public final androidx.compose.ui.text.style.TextAlign? textAlign;
+    property public final androidx.compose.ui.text.style.TextDecoration? textDecoration;
+    property public final androidx.compose.ui.text.style.TextDirection? textDirection;
+    property public final androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform;
+    property public final androidx.compose.ui.text.style.TextIndent? textIndent;
+    field public static final androidx.compose.ui.text.TextStyle.Companion Companion;
+  }
+
+  public static final class TextStyle.Companion {
+    method public androidx.compose.ui.text.TextStyle getDefault();
+    property public final androidx.compose.ui.text.TextStyle Default;
+  }
+
+  public final class TextStyleKt {
+    method public static androidx.compose.ui.text.TextStyle lerp(androidx.compose.ui.text.TextStyle start, androidx.compose.ui.text.TextStyle stop, float fraction);
+    method public static androidx.compose.ui.text.TextStyle resolveDefaults(androidx.compose.ui.text.TextStyle style, androidx.compose.ui.unit.LayoutDirection direction);
+  }
+
+  public abstract sealed class TtsAnnotation {
+  }
+
+  public final class VerbatimTtsAnnotation extends androidx.compose.ui.text.TtsAnnotation {
+    ctor public VerbatimTtsAnnotation(String verbatim);
+    method public String getVerbatim();
+    property public final String verbatim;
+  }
+
+}
+
+package androidx.compose.ui.text.android {
+
+  public final class LayoutCompatKt {
+  }
+
+  public final class LayoutHelperKt {
+  }
+
+  public final class LayoutIntrinsicsKt {
+  }
+
+  public final class SpannedExtensionsKt {
+  }
+
+  public final class StaticLayoutFactoryKt {
+  }
+
+  public final class TempListUtilsKt {
+  }
+
+  public final class TextLayoutKt {
+  }
+
+}
+
+package androidx.compose.ui.text.android.style {
+
+  public final class PlaceholderSpanKt {
+  }
+
+}
+
+package androidx.compose.ui.text.font {
+
+  public final class AndroidFontKt {
+  }
+
+  public final class AndroidTypeface_androidKt {
+    method public static androidx.compose.ui.text.font.FontFamily FontFamily(android.graphics.Typeface typeface);
+    method public static androidx.compose.ui.text.font.Typeface Typeface(android.content.Context context, androidx.compose.ui.text.font.FontFamily fontFamily, optional java.util.List<kotlin.Pair<androidx.compose.ui.text.font.FontWeight,androidx.compose.ui.text.font.FontStyle>>? styles);
+    method public static androidx.compose.ui.text.font.Typeface Typeface(android.graphics.Typeface typeface);
+  }
+
+  public abstract sealed class FileBasedFontFamily extends androidx.compose.ui.text.font.FontFamily {
+  }
+
+  @androidx.compose.runtime.Immutable public interface Font {
+    method public int getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property public abstract int style;
+    property public abstract androidx.compose.ui.text.font.FontWeight weight;
+  }
+
+  public static interface Font.ResourceLoader {
+    method public Object load(androidx.compose.ui.text.font.Font font);
+  }
+
+  @androidx.compose.runtime.Immutable public abstract sealed class FontFamily {
+    method public final boolean getCanLoadSynchronously();
+    property public final boolean canLoadSynchronously;
+    field public static final androidx.compose.ui.text.font.FontFamily.Companion Companion;
+  }
+
+  public static final class FontFamily.Companion {
+    method public androidx.compose.ui.text.font.GenericFontFamily getCursive();
+    method public androidx.compose.ui.text.font.SystemFontFamily getDefault();
+    method public androidx.compose.ui.text.font.GenericFontFamily getMonospace();
+    method public androidx.compose.ui.text.font.GenericFontFamily getSansSerif();
+    method public androidx.compose.ui.text.font.GenericFontFamily getSerif();
+    property public final androidx.compose.ui.text.font.GenericFontFamily Cursive;
+    property public final androidx.compose.ui.text.font.SystemFontFamily Default;
+    property public final androidx.compose.ui.text.font.GenericFontFamily Monospace;
+    property public final androidx.compose.ui.text.font.GenericFontFamily SansSerif;
+    property public final androidx.compose.ui.text.font.GenericFontFamily Serif;
+  }
+
+  public final class FontFamilyKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.FontFamily FontFamily(java.util.List<? extends androidx.compose.ui.text.font.Font> fonts);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.FontFamily FontFamily(androidx.compose.ui.text.font.Font... fonts);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.FontFamily FontFamily(androidx.compose.ui.text.font.Typeface typeface);
+  }
+
+  public final class FontKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.Font Font(int resId, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.text.font.FontFamily toFontFamily(androidx.compose.ui.text.font.Font);
+  }
+
+  @androidx.compose.runtime.Immutable public final class FontListFontFamily extends androidx.compose.ui.text.font.FileBasedFontFamily implements kotlin.jvm.internal.markers.KMappedMarker java.util.List<androidx.compose.ui.text.font.Font> {
+    method public java.util.List<androidx.compose.ui.text.font.Font> getFonts();
+    property public final java.util.List<androidx.compose.ui.text.font.Font> fonts;
+  }
+
+  public final inline class FontStyle {
+    ctor public FontStyle();
+    method public int getValue();
+    property public final int value;
+  }
+
+  public static final class FontStyle.Companion {
+    method public int getItalic();
+    method public int getNormal();
+    method public java.util.List<androidx.compose.ui.text.font.FontStyle> values();
+    property public final int Italic;
+    property public final int Normal;
+  }
+
+  public final inline class FontSynthesis {
+    ctor public FontSynthesis();
+  }
+
+  public static final class FontSynthesis.Companion {
+    method public int getAll();
+    method public int getNone();
+    method public int getStyle();
+    method public int getWeight();
+    property public final int All;
+    property public final int None;
+    property public final int Style;
+    property public final int Weight;
+  }
+
+  @androidx.compose.runtime.Immutable public final class FontWeight implements java.lang.Comparable<androidx.compose.ui.text.font.FontWeight> {
+    ctor public FontWeight(int weight);
+    method public operator int compareTo(androidx.compose.ui.text.font.FontWeight other);
+    method public int getWeight();
+    property public final int weight;
+    field public static final androidx.compose.ui.text.font.FontWeight.Companion Companion;
+  }
+
+  public static final class FontWeight.Companion {
+    method public androidx.compose.ui.text.font.FontWeight getBlack();
+    method public androidx.compose.ui.text.font.FontWeight getBold();
+    method public androidx.compose.ui.text.font.FontWeight getExtraBold();
+    method public androidx.compose.ui.text.font.FontWeight getExtraLight();
+    method public androidx.compose.ui.text.font.FontWeight getLight();
+    method public androidx.compose.ui.text.font.FontWeight getMedium();
+    method public androidx.compose.ui.text.font.FontWeight getNormal();
+    method public androidx.compose.ui.text.font.FontWeight getSemiBold();
+    method public androidx.compose.ui.text.font.FontWeight getThin();
+    method public androidx.compose.ui.text.font.FontWeight getW100();
+    method public androidx.compose.ui.text.font.FontWeight getW200();
+    method public androidx.compose.ui.text.font.FontWeight getW300();
+    method public androidx.compose.ui.text.font.FontWeight getW400();
+    method public androidx.compose.ui.text.font.FontWeight getW500();
+    method public androidx.compose.ui.text.font.FontWeight getW600();
+    method public androidx.compose.ui.text.font.FontWeight getW700();
+    method public androidx.compose.ui.text.font.FontWeight getW800();
+    method public androidx.compose.ui.text.font.FontWeight getW900();
+    property public final androidx.compose.ui.text.font.FontWeight Black;
+    property public final androidx.compose.ui.text.font.FontWeight Bold;
+    property public final androidx.compose.ui.text.font.FontWeight ExtraBold;
+    property public final androidx.compose.ui.text.font.FontWeight ExtraLight;
+    property public final androidx.compose.ui.text.font.FontWeight Light;
+    property public final androidx.compose.ui.text.font.FontWeight Medium;
+    property public final androidx.compose.ui.text.font.FontWeight Normal;
+    property public final androidx.compose.ui.text.font.FontWeight SemiBold;
+    property public final androidx.compose.ui.text.font.FontWeight Thin;
+    property public final androidx.compose.ui.text.font.FontWeight W100;
+    property public final androidx.compose.ui.text.font.FontWeight W200;
+    property public final androidx.compose.ui.text.font.FontWeight W300;
+    property public final androidx.compose.ui.text.font.FontWeight W400;
+    property public final androidx.compose.ui.text.font.FontWeight W500;
+    property public final androidx.compose.ui.text.font.FontWeight W600;
+    property public final androidx.compose.ui.text.font.FontWeight W700;
+    property public final androidx.compose.ui.text.font.FontWeight W800;
+    property public final androidx.compose.ui.text.font.FontWeight W900;
+  }
+
+  public final class FontWeightKt {
+    method public static androidx.compose.ui.text.font.FontWeight lerp(androidx.compose.ui.text.font.FontWeight start, androidx.compose.ui.text.font.FontWeight stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class GenericFontFamily extends androidx.compose.ui.text.font.SystemFontFamily {
+    method public String getName();
+    property public final String name;
+  }
+
+  public final class LoadedFontFamily extends androidx.compose.ui.text.font.FontFamily {
+    method public androidx.compose.ui.text.font.Typeface getTypeface();
+    property public final androidx.compose.ui.text.font.Typeface typeface;
+  }
+
+  public final class ResourceFont implements androidx.compose.ui.text.font.Font {
+    method public androidx.compose.ui.text.font.ResourceFont copy(optional int resId, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
+    method public int getResId();
+    method public int getStyle();
+    method public androidx.compose.ui.text.font.FontWeight getWeight();
+    property public final int resId;
+    property public int style;
+    property public androidx.compose.ui.text.font.FontWeight weight;
+  }
+
+  public abstract sealed class SystemFontFamily extends androidx.compose.ui.text.font.FontFamily {
+  }
+
+  public interface Typeface {
+    method public androidx.compose.ui.text.font.FontFamily? getFontFamily();
+    property public abstract androidx.compose.ui.text.font.FontFamily? fontFamily;
+  }
+
+}
+
+package androidx.compose.ui.text.input {
+
+  public final class BackspaceCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public BackspaceCommand();
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  public final class CommitTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public CommitTextCommand(androidx.compose.ui.text.AnnotatedString annotatedString, int newCursorPosition);
+    ctor public CommitTextCommand(String text, int newCursorPosition);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public androidx.compose.ui.text.AnnotatedString getAnnotatedString();
+    method public int getNewCursorPosition();
+    method public String getText();
+    property public final androidx.compose.ui.text.AnnotatedString annotatedString;
+    property public final int newCursorPosition;
+    property public final String text;
+  }
+
+  public final class DeleteAllCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public DeleteAllCommand();
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  public final class DeleteSurroundingTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public DeleteSurroundingTextCommand(int lengthBeforeCursor, int lengthAfterCursor);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getLengthAfterCursor();
+    method public int getLengthBeforeCursor();
+    property public final int lengthAfterCursor;
+    property public final int lengthBeforeCursor;
+  }
+
+  public final class DeleteSurroundingTextInCodePointsCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public DeleteSurroundingTextInCodePointsCommand(int lengthBeforeCursor, int lengthAfterCursor);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getLengthAfterCursor();
+    method public int getLengthBeforeCursor();
+    property public final int lengthAfterCursor;
+    property public final int lengthBeforeCursor;
+  }
+
+  public interface EditCommand {
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  public final class EditCommandKt {
+  }
+
+  public final class EditProcessor {
+    ctor public EditProcessor();
+    method public androidx.compose.ui.text.input.TextFieldValue apply(java.util.List<? extends androidx.compose.ui.text.input.EditCommand> editCommands);
+    method public void reset(androidx.compose.ui.text.input.TextFieldValue value, androidx.compose.ui.text.input.TextInputSession? textInputSession);
+    method public androidx.compose.ui.text.input.TextFieldValue toTextFieldValue();
+  }
+
+  public final class EditingBuffer {
+    ctor public EditingBuffer(androidx.compose.ui.text.AnnotatedString text, long selection);
+  }
+
+  public final class EditingBufferKt {
+  }
+
+  public final class FinishComposingTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public FinishComposingTextCommand();
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+  }
+
+  public final class GapBufferKt {
+  }
+
+  public final inline class ImeAction {
+    ctor public ImeAction();
+  }
+
+  public static final class ImeAction.Companion {
+    method public int getDefault();
+    method public int getDone();
+    method public int getGo();
+    method public int getNext();
+    method public int getNone();
+    method public int getPrevious();
+    method public int getSearch();
+    method public int getSend();
+    property public final int Default;
+    property public final int Done;
+    property public final int Go;
+    property public final int Next;
+    property public final int None;
+    property public final int Previous;
+    property public final int Search;
+    property public final int Send;
+  }
+
+  @androidx.compose.runtime.Immutable public final class ImeOptions {
+    ctor public ImeOptions(optional boolean singleLine, optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public androidx.compose.ui.text.input.ImeOptions copy(optional boolean singleLine, optional int capitalization, optional boolean autoCorrect, optional int keyboardType, optional int imeAction);
+    method public boolean getAutoCorrect();
+    method public int getCapitalization();
+    method public int getImeAction();
+    method public int getKeyboardType();
+    method public boolean getSingleLine();
+    property public final boolean autoCorrect;
+    property public final int capitalization;
+    property public final int imeAction;
+    property public final int keyboardType;
+    property public final boolean singleLine;
+    field public static final androidx.compose.ui.text.input.ImeOptions.Companion Companion;
+  }
+
+  public static final class ImeOptions.Companion {
+    method public androidx.compose.ui.text.input.ImeOptions getDefault();
+    property public final androidx.compose.ui.text.input.ImeOptions Default;
+  }
+
+  @Deprecated public interface InputEventCallback {
+    method @Deprecated public void onEditCommands(java.util.List<? extends androidx.compose.ui.text.input.EditCommand> editCommands);
+    method @Deprecated public void onImeAction(int imeAction);
+  }
+
+  public final inline class KeyboardCapitalization {
+    ctor public KeyboardCapitalization();
+  }
+
+  public static final class KeyboardCapitalization.Companion {
+    method public int getCharacters();
+    method public int getNone();
+    method public int getSentences();
+    method public int getWords();
+    property public final int Characters;
+    property public final int None;
+    property public final int Sentences;
+    property public final int Words;
+  }
+
+  public final inline class KeyboardType {
+    ctor public KeyboardType();
+  }
+
+  public static final class KeyboardType.Companion {
+    method public int getAscii();
+    method public int getEmail();
+    method public int getNumber();
+    method public int getNumberPassword();
+    method public int getPassword();
+    method public int getPhone();
+    method public int getText();
+    method public int getUri();
+    property public final int Ascii;
+    property public final int Email;
+    property public final int Number;
+    property public final int NumberPassword;
+    property public final int Password;
+    property public final int Phone;
+    property public final int Text;
+    property public final int Uri;
+  }
+
+  public final class MoveCursorCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public MoveCursorCommand(int amount);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getAmount();
+    property public final int amount;
+  }
+
+  public interface OffsetMapping {
+    method public int originalToTransformed(int offset);
+    method public int transformedToOriginal(int offset);
+    field public static final androidx.compose.ui.text.input.OffsetMapping.Companion Companion;
+  }
+
+  public static final class OffsetMapping.Companion {
+    method public androidx.compose.ui.text.input.OffsetMapping getIdentity();
+    property public final androidx.compose.ui.text.input.OffsetMapping Identity;
+  }
+
+  public final class PasswordVisualTransformation implements androidx.compose.ui.text.input.VisualTransformation {
+    ctor public PasswordVisualTransformation(optional char mask);
+    method public androidx.compose.ui.text.input.TransformedText filter(androidx.compose.ui.text.AnnotatedString text);
+    method public char getMask();
+    property public final char mask;
+  }
+
+  public interface PlatformTextInputService {
+    method public void hideSoftwareKeyboard();
+    method public void notifyFocusedRect(androidx.compose.ui.geometry.Rect rect);
+    method public void showSoftwareKeyboard();
+    method public void startInput(androidx.compose.ui.text.input.TextFieldValue value, androidx.compose.ui.text.input.ImeOptions imeOptions, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.compose.ui.text.input.EditCommand>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.ImeAction,kotlin.Unit> onImeActionPerformed);
+    method public void stopInput();
+    method public void updateState(androidx.compose.ui.text.input.TextFieldValue? oldValue, androidx.compose.ui.text.input.TextFieldValue newValue);
+  }
+
+  public final class SetComposingRegionCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public SetComposingRegionCommand(int start, int end);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getEnd();
+    method public int getStart();
+    property public final int end;
+    property public final int start;
+  }
+
+  public final class SetComposingTextCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public SetComposingTextCommand(androidx.compose.ui.text.AnnotatedString annotatedString, int newCursorPosition);
+    ctor public SetComposingTextCommand(String text, int newCursorPosition);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public androidx.compose.ui.text.AnnotatedString getAnnotatedString();
+    method public int getNewCursorPosition();
+    method public String getText();
+    property public final androidx.compose.ui.text.AnnotatedString annotatedString;
+    property public final int newCursorPosition;
+    property public final String text;
+  }
+
+  public final class SetSelectionCommand implements androidx.compose.ui.text.input.EditCommand {
+    ctor public SetSelectionCommand(int start, int end);
+    method public void applyTo(androidx.compose.ui.text.input.EditingBuffer buffer);
+    method public int getEnd();
+    method public int getStart();
+    property public final int end;
+    property public final int start;
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextFieldValue {
+    ctor public TextFieldValue(androidx.compose.ui.text.AnnotatedString annotatedString, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    ctor public TextFieldValue(optional String text, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    method public androidx.compose.ui.text.input.TextFieldValue copy(optional androidx.compose.ui.text.AnnotatedString annotatedString, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    method public androidx.compose.ui.text.input.TextFieldValue copy(String text, optional long selection, optional androidx.compose.ui.text.TextRange? composition);
+    method public androidx.compose.ui.text.AnnotatedString getAnnotatedString();
+    method public androidx.compose.ui.text.TextRange? getComposition();
+    method public long getSelection();
+    method public String getText();
+    property public final androidx.compose.ui.text.AnnotatedString annotatedString;
+    property public final androidx.compose.ui.text.TextRange? composition;
+    property public final long selection;
+    property public final String text;
+    field public static final androidx.compose.ui.text.input.TextFieldValue.Companion Companion;
+  }
+
+  public static final class TextFieldValue.Companion {
+    method public androidx.compose.runtime.saveable.Saver<androidx.compose.ui.text.input.TextFieldValue,java.lang.Object> getSaver();
+    property public final androidx.compose.runtime.saveable.Saver<androidx.compose.ui.text.input.TextFieldValue,java.lang.Object> Saver;
+  }
+
+  public final class TextFieldValueKt {
+    method public static androidx.compose.ui.text.AnnotatedString getSelectedText(androidx.compose.ui.text.input.TextFieldValue);
+    method public static androidx.compose.ui.text.AnnotatedString getTextAfterSelection(androidx.compose.ui.text.input.TextFieldValue, int maxChars);
+    method public static androidx.compose.ui.text.AnnotatedString getTextBeforeSelection(androidx.compose.ui.text.input.TextFieldValue, int maxChars);
+  }
+
+  public class TextInputService {
+    ctor public TextInputService(androidx.compose.ui.text.input.PlatformTextInputService platformTextInputService);
+    method public final void hideSoftwareKeyboard();
+    method public final void showSoftwareKeyboard();
+    method public androidx.compose.ui.text.input.TextInputSession startInput(androidx.compose.ui.text.input.TextFieldValue value, androidx.compose.ui.text.input.ImeOptions imeOptions, kotlin.jvm.functions.Function1<? super java.util.List<? extends androidx.compose.ui.text.input.EditCommand>,kotlin.Unit> onEditCommand, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.input.ImeAction,kotlin.Unit> onImeActionPerformed);
+    method public void stopInput(androidx.compose.ui.text.input.TextInputSession session);
+  }
+
+  public final class TextInputSession {
+    ctor public TextInputSession(androidx.compose.ui.text.input.TextInputService textInputService, androidx.compose.ui.text.input.PlatformTextInputService platformTextInputService);
+    method public void dispose();
+    method public boolean hideSoftwareKeyboard();
+    method public boolean isOpen();
+    method public boolean notifyFocusedRect(androidx.compose.ui.geometry.Rect rect);
+    method public boolean showSoftwareKeyboard();
+    method public boolean updateState(androidx.compose.ui.text.input.TextFieldValue? oldValue, androidx.compose.ui.text.input.TextFieldValue newValue);
+    property public final boolean isOpen;
+  }
+
+  public final class TransformedText {
+    ctor public TransformedText(androidx.compose.ui.text.AnnotatedString text, androidx.compose.ui.text.input.OffsetMapping offsetMapping);
+    method public androidx.compose.ui.text.input.OffsetMapping getOffsetMapping();
+    method public androidx.compose.ui.text.AnnotatedString getText();
+    property public final androidx.compose.ui.text.input.OffsetMapping offsetMapping;
+    property public final androidx.compose.ui.text.AnnotatedString text;
+  }
+
+  @androidx.compose.runtime.Immutable public fun interface VisualTransformation {
+    method public androidx.compose.ui.text.input.TransformedText filter(androidx.compose.ui.text.AnnotatedString text);
+    field public static final androidx.compose.ui.text.input.VisualTransformation.Companion Companion;
+  }
+
+  public static final class VisualTransformation.Companion {
+    method public androidx.compose.ui.text.input.VisualTransformation getNone();
+    property public final androidx.compose.ui.text.input.VisualTransformation None;
+  }
+
+}
+
+package androidx.compose.ui.text.intl {
+
+  public final class AndroidPlatformLocale_androidKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class Locale {
+    ctor public Locale(String languageTag);
+    method public String getLanguage();
+    method public String getRegion();
+    method public String getScript();
+    method public String toLanguageTag();
+    property public final String language;
+    property public final String region;
+    property public final String script;
+    field public static final androidx.compose.ui.text.intl.Locale.Companion Companion;
+  }
+
+  public static final class Locale.Companion {
+    method public androidx.compose.ui.text.intl.Locale getCurrent();
+    property public final androidx.compose.ui.text.intl.Locale current;
+  }
+
+  @androidx.compose.runtime.Immutable public final class LocaleList implements java.util.Collection<androidx.compose.ui.text.intl.Locale> kotlin.jvm.internal.markers.KMappedMarker {
+    ctor public LocaleList(java.util.List<androidx.compose.ui.text.intl.Locale> localeList);
+    ctor public LocaleList(String languageTags);
+    ctor public LocaleList(androidx.compose.ui.text.intl.Locale... locales);
+    method public operator boolean contains(androidx.compose.ui.text.intl.Locale element);
+    method public boolean containsAll(java.util.Collection<E!> elements);
+    method public operator androidx.compose.ui.text.intl.Locale get(int i);
+    method public java.util.List<androidx.compose.ui.text.intl.Locale> getLocaleList();
+    method public int getSize();
+    method public boolean isEmpty();
+    method public java.util.Iterator<androidx.compose.ui.text.intl.Locale> iterator();
+    property public final java.util.List<androidx.compose.ui.text.intl.Locale> localeList;
+    property public int size;
+    field public static final androidx.compose.ui.text.intl.LocaleList.Companion Companion;
+  }
+
+  public static final class LocaleList.Companion {
+    method public androidx.compose.ui.text.intl.LocaleList getCurrent();
+    property public final androidx.compose.ui.text.intl.LocaleList current;
+  }
+
+  public final class PlatformLocaleKt {
+  }
+
+}
+
+package androidx.compose.ui.text.platform {
+
+  public final class AndroidAccessibilitySpannableString_androidKt {
+  }
+
+  public final class AndroidParagraphHelper_androidKt {
+  }
+
+  public final class AndroidParagraphIntrinsics_androidKt {
+  }
+
+  public final class AndroidParagraph_androidKt {
+  }
+
+  public final class AndroidStringDelegate_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.text.platform.extensions {
+
+  public final class LocaleExtensions_androidKt {
+  }
+
+  public final class PlaceholderExtensions_androidKt {
+  }
+
+  public final class SpannableExtensions_androidKt {
+  }
+
+  public final class TextPaintExtensions_androidKt {
+  }
+
+  public final class TtsAnnotationExtensions_androidKt {
+    method public static android.text.style.TtsSpan toSpan(androidx.compose.ui.text.TtsAnnotation);
+    method public static android.text.style.TtsSpan toSpan(androidx.compose.ui.text.VerbatimTtsAnnotation);
+  }
+
+}
+
+package androidx.compose.ui.text.style {
+
+  @androidx.compose.runtime.Immutable public final inline class BaselineShift {
+    ctor public BaselineShift();
+    method public float getMultiplier();
+    property public final float multiplier;
+  }
+
+  public static final class BaselineShift.Companion {
+    method public float getNone();
+    method public float getSubscript();
+    method public float getSuperscript();
+    property public final float None;
+    property public final float Subscript;
+    property public final float Superscript;
+  }
+
+  public final class BaselineShiftKt {
+    method @androidx.compose.runtime.Stable public static float lerp(float start, float stop, float fraction);
+  }
+
+  public enum ResolvedTextDirection {
+    enum_constant public static final androidx.compose.ui.text.style.ResolvedTextDirection Ltr;
+    enum_constant public static final androidx.compose.ui.text.style.ResolvedTextDirection Rtl;
+  }
+
+  public final inline class TextAlign {
+    ctor public TextAlign();
+  }
+
+  public static final class TextAlign.Companion {
+    method public int getCenter();
+    method public int getEnd();
+    method public int getJustify();
+    method public int getLeft();
+    method public int getRight();
+    method public int getStart();
+    method public java.util.List<androidx.compose.ui.text.style.TextAlign> values();
+    property public final int Center;
+    property public final int End;
+    property public final int Justify;
+    property public final int Left;
+    property public final int Right;
+    property public final int Start;
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextDecoration {
+    method public operator boolean contains(androidx.compose.ui.text.style.TextDecoration other);
+    method public operator boolean equals(Object? other);
+    method public int getMask();
+    method public operator androidx.compose.ui.text.style.TextDecoration plus(androidx.compose.ui.text.style.TextDecoration decoration);
+    property public final int mask;
+    field public static final androidx.compose.ui.text.style.TextDecoration.Companion Companion;
+  }
+
+  public static final class TextDecoration.Companion {
+    method public androidx.compose.ui.text.style.TextDecoration combine(java.util.List<androidx.compose.ui.text.style.TextDecoration> decorations);
+    method public androidx.compose.ui.text.style.TextDecoration getLineThrough();
+    method public androidx.compose.ui.text.style.TextDecoration getNone();
+    method public androidx.compose.ui.text.style.TextDecoration getUnderline();
+    property public final androidx.compose.ui.text.style.TextDecoration LineThrough;
+    property public final androidx.compose.ui.text.style.TextDecoration None;
+    property public final androidx.compose.ui.text.style.TextDecoration Underline;
+  }
+
+  public final inline class TextDirection {
+    ctor public TextDirection();
+  }
+
+  public static final class TextDirection.Companion {
+    method public int getContent();
+    method public int getContentOrLtr();
+    method public int getContentOrRtl();
+    method public int getLtr();
+    method public int getRtl();
+    property public final int Content;
+    property public final int ContentOrLtr;
+    property public final int ContentOrRtl;
+    property public final int Ltr;
+    property public final int Rtl;
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextGeometricTransform {
+    ctor public TextGeometricTransform(optional float scaleX, optional float skewX);
+    method public androidx.compose.ui.text.style.TextGeometricTransform copy(optional float scaleX, optional float skewX);
+    method public operator boolean equals(Object? other);
+    method public float getScaleX();
+    method public float getSkewX();
+    property public final float scaleX;
+    property public final float skewX;
+    field public static final androidx.compose.ui.text.style.TextGeometricTransform.Companion Companion;
+  }
+
+  public static final class TextGeometricTransform.Companion {
+  }
+
+  public final class TextGeometricTransformKt {
+    method public static androidx.compose.ui.text.style.TextGeometricTransform lerp(androidx.compose.ui.text.style.TextGeometricTransform start, androidx.compose.ui.text.style.TextGeometricTransform stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final class TextIndent {
+    ctor public TextIndent(optional long firstLine, optional long restLine);
+    method public androidx.compose.ui.text.style.TextIndent copy(optional long firstLine, optional long restLine);
+    method public operator boolean equals(Object? other);
+    method public long getFirstLine();
+    method public long getRestLine();
+    property public final long firstLine;
+    property public final long restLine;
+    field public static final androidx.compose.ui.text.style.TextIndent.Companion Companion;
+  }
+
+  public static final class TextIndent.Companion {
+    method public androidx.compose.ui.text.style.TextIndent getNone();
+    property public final androidx.compose.ui.text.style.TextIndent None;
+  }
+
+  public final class TextIndentKt {
+    method public static androidx.compose.ui.text.style.TextIndent lerp(androidx.compose.ui.text.style.TextIndent start, androidx.compose.ui.text.style.TextIndent stop, float fraction);
+  }
+
+  public final inline class TextOverflow {
+    ctor public TextOverflow();
+  }
+
+  public static final class TextOverflow.Companion {
+    method public int getClip();
+    method public int getEllipsis();
+    method public int getVisible();
+    property public final int Clip;
+    property public final int Ellipsis;
+    property public final int Visible;
+  }
+
+}
+
diff --git a/compose/ui/ui-text/api/restricted_current.txt b/compose/ui/ui-text/api/restricted_current.txt
index 1a50053..ee52a20 100644
--- a/compose/ui/ui-text/api/restricted_current.txt
+++ b/compose/ui/ui-text/api/restricted_current.txt
@@ -392,6 +392,8 @@
 
   @androidx.compose.runtime.Immutable public final inline class TextRange {
     ctor public TextRange();
+    method public operator boolean contains(long other);
+    method public operator boolean contains(int offset);
   }
 
   public static final class TextRange.Companion {
diff --git a/compose/ui/ui-text/benchmark/build.gradle b/compose/ui/ui-text/benchmark/build.gradle
index 3851b26..3de164b 100644
--- a/compose/ui/ui-text/benchmark/build.gradle
+++ b/compose/ui/ui-text/benchmark/build.gradle
@@ -24,9 +24,7 @@
 
 dependencies {
     kotlinPlugin project(":compose:compiler:compiler")
-
     implementation project(":benchmark:benchmark-junit4")
-    implementation project(":benchmark:benchmark-macro-junit4")
     implementation project(":compose:runtime:runtime")
     implementation project(":compose:ui:ui-test-junit4")
     implementation(libs.kotlinStdlib)
diff --git a/compose/ui/ui-text/build.gradle b/compose/ui/ui-text/build.gradle
index c2649ff..e192d68 100644
--- a/compose/ui/ui-text/build.gradle
+++ b/compose/ui/ui-text/build.gradle
@@ -105,6 +105,7 @@
             }
 
             skikoMain {
+                dependsOn(commonMain)
                 dependencies {
                     api(libs.skikoCommon)
                 }
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
new file mode 100644
index 0000000..ce49429
--- /dev/null
+++ b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopParagraphIntrinsics.desktop.kt
@@ -0,0 +1,29 @@
+/*
+ * 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.ui.text.platform
+
+import androidx.compose.ui.text.style.ResolvedTextDirection
+
+internal actual fun String.contentBasedTextDirection(): ResolvedTextDirection? {
+    for (char in this) {
+        when (char.directionality) {
+            CharDirectionality.LEFT_TO_RIGHT -> return ResolvedTextDirection.Ltr
+            CharDirectionality.RIGHT_TO_LEFT -> return ResolvedTextDirection.Rtl
+            else -> continue
+        }
+    }
+    return null
+}
diff --git a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/SkiaParagraphIntrinsics.skiko.kt b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/SkiaParagraphIntrinsics.skiko.kt
index 03b8d1f..e54ff9b 100644
--- a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/SkiaParagraphIntrinsics.skiko.kt
+++ b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/SkiaParagraphIntrinsics.skiko.kt
@@ -87,14 +87,7 @@
         }
     }
 
-    private fun contentBasedTextDirection(): ResolvedTextDirection? {
-        for (char in text) {
-            when (char.directionality) {
-                CharDirectionality.LEFT_TO_RIGHT -> return ResolvedTextDirection.Ltr
-                CharDirectionality.RIGHT_TO_LEFT -> return ResolvedTextDirection.Rtl
-                else -> continue
-            }
-        }
-        return null
-    }
+    private fun contentBasedTextDirection() = text.contentBasedTextDirection()
 }
+
+internal expect fun String.contentBasedTextDirection(): ResolvedTextDirection?
\ No newline at end of file
diff --git a/compose/ui/ui-tooling-data/api/1.1.0-beta02.txt b/compose/ui/ui-tooling-data/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..ab1e1a2
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/1.1.0-beta02.txt
@@ -0,0 +1,8 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling.data {
+
+  public final class SlotTreeKt {
+  }
+
+}
+
diff --git a/compose/ui/ui-tooling-data/api/public_plus_experimental_1.1.0-beta02.txt b/compose/ui/ui-tooling-data/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..df276cc
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,101 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling.data {
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public final class CallGroup extends androidx.compose.ui.tooling.data.Group {
+    ctor public CallGroup(Object? key, String? name, androidx.compose.ui.unit.IntRect box, androidx.compose.ui.tooling.data.SourceLocation? location, java.util.List<androidx.compose.ui.tooling.data.ParameterInformation> parameters, java.util.Collection<?> data, java.util.Collection<? extends androidx.compose.ui.tooling.data.Group> children);
+    property public java.util.List<androidx.compose.ui.tooling.data.ParameterInformation> parameters;
+  }
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public abstract sealed class Group {
+    method public final androidx.compose.ui.unit.IntRect getBox();
+    method public final java.util.Collection<androidx.compose.ui.tooling.data.Group> getChildren();
+    method public final java.util.Collection<java.lang.Object> getData();
+    method public final Object? getKey();
+    method public final androidx.compose.ui.tooling.data.SourceLocation? getLocation();
+    method public java.util.List<androidx.compose.ui.layout.ModifierInfo> getModifierInfo();
+    method public final String? getName();
+    method public java.util.List<androidx.compose.ui.tooling.data.ParameterInformation> getParameters();
+    property public final androidx.compose.ui.unit.IntRect box;
+    property public final java.util.Collection<androidx.compose.ui.tooling.data.Group> children;
+    property public final java.util.Collection<java.lang.Object> data;
+    property public final Object? key;
+    property public final androidx.compose.ui.tooling.data.SourceLocation? location;
+    property public java.util.List<androidx.compose.ui.layout.ModifierInfo> modifierInfo;
+    property public final String? name;
+    property public java.util.List<androidx.compose.ui.tooling.data.ParameterInformation> parameters;
+  }
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public final class JoinedKey {
+    ctor public JoinedKey(Object? left, Object? right);
+    method public Object? component1();
+    method public Object? component2();
+    method public androidx.compose.ui.tooling.data.JoinedKey copy(Object? left, Object? right);
+    method public Object? getLeft();
+    method public Object? getRight();
+    property public final Object? left;
+    property public final Object? right;
+  }
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public final class NodeGroup extends androidx.compose.ui.tooling.data.Group {
+    ctor public NodeGroup(Object? key, Object node, androidx.compose.ui.unit.IntRect box, java.util.Collection<?> data, java.util.List<androidx.compose.ui.layout.ModifierInfo> modifierInfo, java.util.Collection<? extends androidx.compose.ui.tooling.data.Group> children);
+    method public Object getNode();
+    property public java.util.List<androidx.compose.ui.layout.ModifierInfo> modifierInfo;
+    property public final Object node;
+  }
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public final class ParameterInformation {
+    ctor public ParameterInformation(String name, Object? value, boolean fromDefault, boolean static, boolean compared, String? inlineClass, boolean stable);
+    method public String component1();
+    method public Object? component2();
+    method public boolean component3();
+    method public boolean component4();
+    method public boolean component5();
+    method public String? component6();
+    method public boolean component7();
+    method public androidx.compose.ui.tooling.data.ParameterInformation copy(String name, Object? value, boolean fromDefault, boolean static, boolean compared, String? inlineClass, boolean stable);
+    method public boolean getCompared();
+    method public boolean getFromDefault();
+    method public String? getInlineClass();
+    method public String getName();
+    method public boolean getStable();
+    method public boolean getStatic();
+    method public Object? getValue();
+    property public final boolean compared;
+    property public final boolean fromDefault;
+    property public final String? inlineClass;
+    property public final String name;
+    property public final boolean stable;
+    property public final boolean static;
+    property public final Object? value;
+  }
+
+  public final class SlotTreeKt {
+    method @androidx.compose.ui.tooling.data.UiToolingDataApi public static androidx.compose.ui.tooling.data.Group asTree(androidx.compose.runtime.tooling.CompositionData);
+    method @androidx.compose.ui.tooling.data.UiToolingDataApi public static String? getPosition(androidx.compose.ui.tooling.data.Group);
+  }
+
+  @androidx.compose.ui.tooling.data.UiToolingDataApi public final class SourceLocation {
+    ctor public SourceLocation(int lineNumber, int offset, int length, String? sourceFile, int packageHash);
+    method public int component1();
+    method public int component2();
+    method public int component3();
+    method public String? component4();
+    method public int component5();
+    method public androidx.compose.ui.tooling.data.SourceLocation copy(int lineNumber, int offset, int length, String? sourceFile, int packageHash);
+    method public int getLength();
+    method public int getLineNumber();
+    method public int getOffset();
+    method public int getPackageHash();
+    method public String? getSourceFile();
+    property public final int length;
+    property public final int lineNumber;
+    property public final int offset;
+    property public final int packageHash;
+    property public final String? sourceFile;
+  }
+
+  @kotlin.RequiresOptIn(message="This API is for tooling only and is likely to change in the future.") public @interface UiToolingDataApi {
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/ui/ui-tooling-data/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to compose/ui/ui-tooling-data/api/res-1.1.0-beta02.txt
diff --git a/compose/ui/ui-tooling-data/api/restricted_1.1.0-beta02.txt b/compose/ui/ui-tooling-data/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..ab1e1a2
--- /dev/null
+++ b/compose/ui/ui-tooling-data/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,8 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling.data {
+
+  public final class SlotTreeKt {
+  }
+
+}
+
diff --git a/compose/ui/ui-tooling-preview/api/1.1.0-beta02.txt b/compose/ui/ui-tooling-preview/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..5edf923
--- /dev/null
+++ b/compose/ui/ui-tooling-preview/api/1.1.0-beta02.txt
@@ -0,0 +1,91 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling.preview {
+
+  public final class Devices {
+    field public static final String AUTOMOTIVE_1024p = "id:automotive_1024p_landscape";
+    field public static final String DEFAULT = "";
+    field public static final androidx.compose.ui.tooling.preview.Devices INSTANCE;
+    field public static final String NEXUS_10 = "name:Nexus 10";
+    field public static final String NEXUS_5 = "id:Nexus 5";
+    field public static final String NEXUS_5X = "id:Nexus 5X";
+    field public static final String NEXUS_6 = "id:Nexus 6";
+    field public static final String NEXUS_6P = "id:Nexus 6P";
+    field public static final String NEXUS_7 = "id:Nexus 7";
+    field public static final String NEXUS_7_2013 = "id:Nexus 7 2013";
+    field public static final String NEXUS_9 = "id:Nexus 9";
+    field public static final String PIXEL = "id:pixel";
+    field public static final String PIXEL_2 = "id:pixel_2";
+    field public static final String PIXEL_2_XL = "id:pixel_2_xl";
+    field public static final String PIXEL_3 = "id:pixel_3";
+    field public static final String PIXEL_3A = "id:pixel_3a";
+    field public static final String PIXEL_3A_XL = "id:pixel_3a_xl";
+    field public static final String PIXEL_3_XL = "id:pixel_3_xl";
+    field public static final String PIXEL_4 = "id:pixel_4";
+    field public static final String PIXEL_4_XL = "id:pixel_4_xl";
+    field public static final String PIXEL_C = "id:pixel_c";
+    field public static final String PIXEL_XL = "id:pixel_xl";
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface Preview {
+    method public abstract int apiLevel() default -1;
+    method public abstract long backgroundColor() default 0;
+    method public abstract String device() default androidx.compose.ui.tooling.preview.Devices.DEFAULT;
+    method public abstract float fontScale() default 1.0;
+    method public abstract String group() default "";
+    method public abstract int heightDp() default -1;
+    method public abstract String locale() default "";
+    method public abstract String name() default "";
+    method public abstract boolean showBackground() default false;
+    method public abstract boolean showSystemUi() default false;
+    method public abstract int uiMode() default 0;
+    method public abstract int widthDp() default -1;
+    property public abstract int apiLevel;
+    property public abstract long backgroundColor;
+    property public abstract String device;
+    property public abstract float fontScale;
+    property public abstract String group;
+    property public abstract int heightDp;
+    property public abstract String locale;
+    property public abstract String name;
+    property public abstract boolean showBackground;
+    property public abstract boolean showSystemUi;
+    property public abstract int uiMode;
+    property public abstract int widthDp;
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface PreviewParameter {
+    method public abstract int limit() default kotlin.jvm.internal.IntCompanionObject.MAX_VALUE;
+    method public abstract kotlin.reflect.KClass<? extends androidx.compose.ui.tooling.preview.PreviewParameterProvider<?>> provider();
+    property public abstract int limit;
+    property public abstract kotlin.reflect.KClass<? extends androidx.compose.ui.tooling.preview.PreviewParameterProvider<?>> provider;
+  }
+
+  public interface PreviewParameterProvider<T> {
+    method public default int getCount();
+    method public kotlin.sequences.Sequence<T> getValues();
+    property public default int count;
+    property public abstract kotlin.sequences.Sequence<T> values;
+  }
+
+}
+
+package androidx.compose.ui.tooling.preview.datasource {
+
+  public class CollectionPreviewParameterProvider<T> implements androidx.compose.ui.tooling.preview.PreviewParameterProvider<T> {
+    ctor public CollectionPreviewParameterProvider(java.util.Collection<? extends T> collection);
+    method public kotlin.sequences.Sequence<T> getValues();
+    property public kotlin.sequences.Sequence<T> values;
+  }
+
+  public final class LoremIpsum implements androidx.compose.ui.tooling.preview.PreviewParameterProvider<java.lang.String> {
+    ctor public LoremIpsum(int words);
+    ctor public LoremIpsum();
+    method public kotlin.sequences.Sequence<java.lang.String> getValues();
+    property public kotlin.sequences.Sequence<java.lang.String> values;
+  }
+
+  public final class LoremIpsumKt {
+  }
+
+}
+
diff --git a/compose/ui/ui-tooling-preview/api/public_plus_experimental_1.1.0-beta02.txt b/compose/ui/ui-tooling-preview/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..5edf923
--- /dev/null
+++ b/compose/ui/ui-tooling-preview/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,91 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling.preview {
+
+  public final class Devices {
+    field public static final String AUTOMOTIVE_1024p = "id:automotive_1024p_landscape";
+    field public static final String DEFAULT = "";
+    field public static final androidx.compose.ui.tooling.preview.Devices INSTANCE;
+    field public static final String NEXUS_10 = "name:Nexus 10";
+    field public static final String NEXUS_5 = "id:Nexus 5";
+    field public static final String NEXUS_5X = "id:Nexus 5X";
+    field public static final String NEXUS_6 = "id:Nexus 6";
+    field public static final String NEXUS_6P = "id:Nexus 6P";
+    field public static final String NEXUS_7 = "id:Nexus 7";
+    field public static final String NEXUS_7_2013 = "id:Nexus 7 2013";
+    field public static final String NEXUS_9 = "id:Nexus 9";
+    field public static final String PIXEL = "id:pixel";
+    field public static final String PIXEL_2 = "id:pixel_2";
+    field public static final String PIXEL_2_XL = "id:pixel_2_xl";
+    field public static final String PIXEL_3 = "id:pixel_3";
+    field public static final String PIXEL_3A = "id:pixel_3a";
+    field public static final String PIXEL_3A_XL = "id:pixel_3a_xl";
+    field public static final String PIXEL_3_XL = "id:pixel_3_xl";
+    field public static final String PIXEL_4 = "id:pixel_4";
+    field public static final String PIXEL_4_XL = "id:pixel_4_xl";
+    field public static final String PIXEL_C = "id:pixel_c";
+    field public static final String PIXEL_XL = "id:pixel_xl";
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface Preview {
+    method public abstract int apiLevel() default -1;
+    method public abstract long backgroundColor() default 0;
+    method public abstract String device() default androidx.compose.ui.tooling.preview.Devices.DEFAULT;
+    method public abstract float fontScale() default 1.0;
+    method public abstract String group() default "";
+    method public abstract int heightDp() default -1;
+    method public abstract String locale() default "";
+    method public abstract String name() default "";
+    method public abstract boolean showBackground() default false;
+    method public abstract boolean showSystemUi() default false;
+    method public abstract int uiMode() default 0;
+    method public abstract int widthDp() default -1;
+    property public abstract int apiLevel;
+    property public abstract long backgroundColor;
+    property public abstract String device;
+    property public abstract float fontScale;
+    property public abstract String group;
+    property public abstract int heightDp;
+    property public abstract String locale;
+    property public abstract String name;
+    property public abstract boolean showBackground;
+    property public abstract boolean showSystemUi;
+    property public abstract int uiMode;
+    property public abstract int widthDp;
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface PreviewParameter {
+    method public abstract int limit() default kotlin.jvm.internal.IntCompanionObject.MAX_VALUE;
+    method public abstract kotlin.reflect.KClass<? extends androidx.compose.ui.tooling.preview.PreviewParameterProvider<?>> provider();
+    property public abstract int limit;
+    property public abstract kotlin.reflect.KClass<? extends androidx.compose.ui.tooling.preview.PreviewParameterProvider<?>> provider;
+  }
+
+  public interface PreviewParameterProvider<T> {
+    method public default int getCount();
+    method public kotlin.sequences.Sequence<T> getValues();
+    property public default int count;
+    property public abstract kotlin.sequences.Sequence<T> values;
+  }
+
+}
+
+package androidx.compose.ui.tooling.preview.datasource {
+
+  public class CollectionPreviewParameterProvider<T> implements androidx.compose.ui.tooling.preview.PreviewParameterProvider<T> {
+    ctor public CollectionPreviewParameterProvider(java.util.Collection<? extends T> collection);
+    method public kotlin.sequences.Sequence<T> getValues();
+    property public kotlin.sequences.Sequence<T> values;
+  }
+
+  public final class LoremIpsum implements androidx.compose.ui.tooling.preview.PreviewParameterProvider<java.lang.String> {
+    ctor public LoremIpsum(int words);
+    ctor public LoremIpsum();
+    method public kotlin.sequences.Sequence<java.lang.String> getValues();
+    property public kotlin.sequences.Sequence<java.lang.String> values;
+  }
+
+  public final class LoremIpsumKt {
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/ui/ui-tooling-preview/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to compose/ui/ui-tooling-preview/api/res-1.1.0-beta02.txt
diff --git a/compose/ui/ui-tooling-preview/api/restricted_1.1.0-beta02.txt b/compose/ui/ui-tooling-preview/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..5edf923
--- /dev/null
+++ b/compose/ui/ui-tooling-preview/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,91 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling.preview {
+
+  public final class Devices {
+    field public static final String AUTOMOTIVE_1024p = "id:automotive_1024p_landscape";
+    field public static final String DEFAULT = "";
+    field public static final androidx.compose.ui.tooling.preview.Devices INSTANCE;
+    field public static final String NEXUS_10 = "name:Nexus 10";
+    field public static final String NEXUS_5 = "id:Nexus 5";
+    field public static final String NEXUS_5X = "id:Nexus 5X";
+    field public static final String NEXUS_6 = "id:Nexus 6";
+    field public static final String NEXUS_6P = "id:Nexus 6P";
+    field public static final String NEXUS_7 = "id:Nexus 7";
+    field public static final String NEXUS_7_2013 = "id:Nexus 7 2013";
+    field public static final String NEXUS_9 = "id:Nexus 9";
+    field public static final String PIXEL = "id:pixel";
+    field public static final String PIXEL_2 = "id:pixel_2";
+    field public static final String PIXEL_2_XL = "id:pixel_2_xl";
+    field public static final String PIXEL_3 = "id:pixel_3";
+    field public static final String PIXEL_3A = "id:pixel_3a";
+    field public static final String PIXEL_3A_XL = "id:pixel_3a_xl";
+    field public static final String PIXEL_3_XL = "id:pixel_3_xl";
+    field public static final String PIXEL_4 = "id:pixel_4";
+    field public static final String PIXEL_4_XL = "id:pixel_4_xl";
+    field public static final String PIXEL_C = "id:pixel_c";
+    field public static final String PIXEL_XL = "id:pixel_xl";
+  }
+
+  @kotlin.annotation.MustBeDocumented @kotlin.annotation.Repeatable @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface Preview {
+    method public abstract int apiLevel() default -1;
+    method public abstract long backgroundColor() default 0;
+    method public abstract String device() default androidx.compose.ui.tooling.preview.Devices.DEFAULT;
+    method public abstract float fontScale() default 1.0;
+    method public abstract String group() default "";
+    method public abstract int heightDp() default -1;
+    method public abstract String locale() default "";
+    method public abstract String name() default "";
+    method public abstract boolean showBackground() default false;
+    method public abstract boolean showSystemUi() default false;
+    method public abstract int uiMode() default 0;
+    method public abstract int widthDp() default -1;
+    property public abstract int apiLevel;
+    property public abstract long backgroundColor;
+    property public abstract String device;
+    property public abstract float fontScale;
+    property public abstract String group;
+    property public abstract int heightDp;
+    property public abstract String locale;
+    property public abstract String name;
+    property public abstract boolean showBackground;
+    property public abstract boolean showSystemUi;
+    property public abstract int uiMode;
+    property public abstract int widthDp;
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface PreviewParameter {
+    method public abstract int limit() default kotlin.jvm.internal.IntCompanionObject.MAX_VALUE;
+    method public abstract kotlin.reflect.KClass<? extends androidx.compose.ui.tooling.preview.PreviewParameterProvider<?>> provider();
+    property public abstract int limit;
+    property public abstract kotlin.reflect.KClass<? extends androidx.compose.ui.tooling.preview.PreviewParameterProvider<?>> provider;
+  }
+
+  public interface PreviewParameterProvider<T> {
+    method public default int getCount();
+    method public kotlin.sequences.Sequence<T> getValues();
+    property public default int count;
+    property public abstract kotlin.sequences.Sequence<T> values;
+  }
+
+}
+
+package androidx.compose.ui.tooling.preview.datasource {
+
+  public class CollectionPreviewParameterProvider<T> implements androidx.compose.ui.tooling.preview.PreviewParameterProvider<T> {
+    ctor public CollectionPreviewParameterProvider(java.util.Collection<? extends T> collection);
+    method public kotlin.sequences.Sequence<T> getValues();
+    property public kotlin.sequences.Sequence<T> values;
+  }
+
+  public final class LoremIpsum implements androidx.compose.ui.tooling.preview.PreviewParameterProvider<java.lang.String> {
+    ctor public LoremIpsum(int words);
+    ctor public LoremIpsum();
+    method public kotlin.sequences.Sequence<java.lang.String> getValues();
+    property public kotlin.sequences.Sequence<java.lang.String> values;
+  }
+
+  public final class LoremIpsumKt {
+  }
+
+}
+
diff --git a/compose/ui/ui-tooling/api/1.1.0-beta02.txt b/compose/ui/ui-tooling/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..2f0241d
--- /dev/null
+++ b/compose/ui/ui-tooling/api/1.1.0-beta02.txt
@@ -0,0 +1,22 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling {
+
+  public final class ComposeViewAdapterKt {
+  }
+
+  public final class InspectableKt {
+    method @Deprecated @androidx.compose.runtime.Composable public static void InInspectionModeOnly(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class PreviewUtilsKt {
+  }
+
+}
+
+package androidx.compose.ui.tooling.animation {
+
+  public final class ComposeAnimationParserKt {
+  }
+
+}
+
diff --git a/compose/ui/ui-tooling/api/public_plus_experimental_1.1.0-beta02.txt b/compose/ui/ui-tooling/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..2f0241d
--- /dev/null
+++ b/compose/ui/ui-tooling/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,22 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling {
+
+  public final class ComposeViewAdapterKt {
+  }
+
+  public final class InspectableKt {
+    method @Deprecated @androidx.compose.runtime.Composable public static void InInspectionModeOnly(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class PreviewUtilsKt {
+  }
+
+}
+
+package androidx.compose.ui.tooling.animation {
+
+  public final class ComposeAnimationParserKt {
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/ui/ui-tooling/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to compose/ui/ui-tooling/api/res-1.1.0-beta02.txt
diff --git a/compose/ui/ui-tooling/api/restricted_1.1.0-beta02.txt b/compose/ui/ui-tooling/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..2f0241d
--- /dev/null
+++ b/compose/ui/ui-tooling/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,22 @@
+// Signature format: 4.0
+package androidx.compose.ui.tooling {
+
+  public final class ComposeViewAdapterKt {
+  }
+
+  public final class InspectableKt {
+    method @Deprecated @androidx.compose.runtime.Composable public static void InInspectionModeOnly(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class PreviewUtilsKt {
+  }
+
+}
+
+package androidx.compose.ui.tooling.animation {
+
+  public final class ComposeAnimationParserKt {
+  }
+
+}
+
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ComposeViewAdapter.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ComposeViewAdapter.kt
index 9e42082..61f7b32 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ComposeViewAdapter.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ComposeViewAdapter.kt
@@ -33,7 +33,6 @@
 import androidx.activity.result.ActivityResultRegistryOwner
 import androidx.activity.result.contract.ActivityResultContract
 import androidx.annotation.VisibleForTesting
-import androidx.compose.animation.core.InternalAnimationApi
 import androidx.compose.animation.core.Transition
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Composition
@@ -312,7 +311,6 @@
      * the ones we've got source information for.
      */
     @Suppress("UNCHECKED_CAST")
-    @OptIn(InternalAnimationApi::class)
     private fun findAndTrackTransitions() {
         @Suppress("UNCHECKED_CAST")
         fun List<Group>.findTransitionObjects(): List<Transition<Any>> {
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/ComposeAnimationParser.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/ComposeAnimationParser.kt
index 994e5f2..cdae952 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/ComposeAnimationParser.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/ComposeAnimationParser.kt
@@ -17,7 +17,6 @@
 package androidx.compose.ui.tooling.animation
 
 import android.util.Log
-import androidx.compose.animation.core.InternalAnimationApi
 import androidx.compose.animation.core.Transition
 import androidx.compose.animation.tooling.ComposeAnimation
 import androidx.compose.animation.tooling.ComposeAnimationType
@@ -58,7 +57,6 @@
 /**
  * [ComposeAnimation] of type [ComposeAnimationType.ANIMATED_VISIBILITY].
  */
-@OptIn(InternalAnimationApi::class)
 internal class AnimatedVisibilityComposeAnimation(parent: Transition<Any>, parentLabel: String?) :
     ComposeAnimation {
     override val type = ComposeAnimationType.ANIMATED_VISIBILITY
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 544114c..1ce973f 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
@@ -18,7 +18,6 @@
 
 import android.util.Log
 import androidx.annotation.VisibleForTesting
-import androidx.compose.animation.core.InternalAnimationApi
 import androidx.compose.animation.core.Transition
 import androidx.compose.animation.core.TweenSpec
 import androidx.compose.animation.core.SnapSpec
@@ -46,7 +45,6 @@
  *
  * @suppress
  */
-@OptIn(InternalAnimationApi::class)
 internal open class PreviewAnimationClock(private val setAnimationsTimeCallback: () -> Unit = {}) {
 
     private val TAG = "PreviewAnimationClock"
@@ -55,15 +53,17 @@
 
     /**
      * Set of tracked [TransitionComposeAnimation]s, each one having a [Transition] object that
-     * is used in [setClockTime], where we call [Transition.seek], and in [getAnimatedProperties],
-     * where we get the animation values.
+     * is used in [setClockTime], where we call
+     * [Transition.setPlaytimeAfterInitialAndTargetStateEstablished],
+     * and in [getAnimatedProperties], where we get the animation values.
      */
     @VisibleForTesting
     internal val trackedTransitions = hashSetOf<TransitionComposeAnimation>()
 
     /**
      * Set of tracked [AnimatedVisibilityComposeAnimation]s, each one having a [Transition] object
-     * representing the parent and used in [setClockTime], where we call [Transition.seek]. Each
+     * representing the parent and used in [setClockTime], where we call
+     * [Transition.setPlaytimeAfterInitialAndTargetStateEstablished]. Each
      * [AnimatedVisibilityComposeAnimation] also has another [Transition] object representing the
      * child transition used in [getAnimatedProperties], where we get the animation values.
      */
@@ -131,7 +131,11 @@
         val composeAnimation = parent.parseAnimatedVisibility()
         // Call seek on the first frame to get the correct duration
         val (current, target) = animatedVisibilityStates[parent]!!.toCurrentTargetPair()
-        parent.seek(initialState = current, targetState = target, 0)
+        parent.setPlaytimeAfterInitialAndTargetStateEstablished(
+            initialState = current,
+            targetState = target,
+            0
+        )
         trackedAnimatedVisibility.add(composeAnimation)
         notifySubscribe(composeAnimation)
     }
@@ -283,14 +287,18 @@
         trackedTransitions.forEach { composeAnimation ->
             composeAnimation.animationObject.let {
                 val states = transitionStates[it] ?: return@let
-                it.seek(states.current, states.target, timeNs)
+                it.setPlaytimeAfterInitialAndTargetStateEstablished(
+                    states.current,
+                    states.target,
+                    timeNs
+                )
             }
         }
         trackedAnimatedVisibility.forEach { composeAnimation ->
             composeAnimation.animationObject.let {
                 val (current, target) =
                     animatedVisibilityStates[it]?.toCurrentTargetPair() ?: return@let
-                it.seek(current, target, timeNs)
+                it.setPlaytimeAfterInitialAndTargetStateEstablished(current, target, timeNs)
             }
         }
         setAnimationsTimeCallback.invoke()
diff --git a/compose/ui/ui-unit/api/1.1.0-beta02.txt b/compose/ui/ui-unit/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..dfe02d7
--- /dev/null
+++ b/compose/ui/ui-unit/api/1.1.0-beta02.txt
@@ -0,0 +1,354 @@
+// Signature format: 4.0
+package androidx.compose.ui.unit {
+
+  public final class AndroidDensity_androidKt {
+    method public static androidx.compose.ui.unit.Density Density(android.content.Context context);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Constraints {
+    ctor public Constraints();
+  }
+
+  public static final class Constraints.Companion {
+    method @androidx.compose.runtime.Stable public long fixed(int width, int height);
+    method @androidx.compose.runtime.Stable public long fixedHeight(int height);
+    method @androidx.compose.runtime.Stable public long fixedWidth(int width);
+  }
+
+  public final class ConstraintsKt {
+    method @androidx.compose.runtime.Stable public static long Constraints(optional int minWidth, optional int maxWidth, optional int minHeight, optional int maxHeight);
+    method public static long constrain(long, long otherConstraints);
+    method @androidx.compose.runtime.Stable public static long constrain(long, long size);
+    method @androidx.compose.runtime.Stable public static int constrainHeight(long, int height);
+    method @androidx.compose.runtime.Stable public static int constrainWidth(long, int width);
+    method @androidx.compose.runtime.Stable public static boolean isSatisfiedBy(long, long size);
+    method @androidx.compose.runtime.Stable public static long offset(long, optional int horizontal, optional int vertical);
+  }
+
+  @androidx.compose.runtime.Immutable public interface Density {
+    method public float getDensity();
+    method public float getFontScale();
+    method @androidx.compose.runtime.Stable public default int roundToPx(float);
+    method @androidx.compose.runtime.Stable public default int roundToPx(long);
+    method @androidx.compose.runtime.Stable public default float toDp(long);
+    method @androidx.compose.runtime.Stable public default float toDp(int);
+    method @androidx.compose.runtime.Stable public default float toDp(float);
+    method @androidx.compose.runtime.Stable public default long toDpSize(long);
+    method @androidx.compose.runtime.Stable public default float toPx(float);
+    method @androidx.compose.runtime.Stable public default float toPx(long);
+    method @androidx.compose.runtime.Stable public default androidx.compose.ui.geometry.Rect toRect(androidx.compose.ui.unit.DpRect);
+    method @androidx.compose.runtime.Stable public default long toSize(long);
+    method @androidx.compose.runtime.Stable public default long toSp(float);
+    method @androidx.compose.runtime.Stable public default long toSp(int);
+    method @androidx.compose.runtime.Stable public default long toSp(float);
+    property public abstract float density;
+    property public abstract float fontScale;
+  }
+
+  public final class DensityKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.Density Density(float density, optional float fontScale);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Dp implements java.lang.Comparable<androidx.compose.ui.unit.Dp> {
+    ctor public Dp();
+    method @androidx.compose.runtime.Stable public operator int compareTo(float other);
+    method @androidx.compose.runtime.Stable public inline operator float div(float other);
+    method @androidx.compose.runtime.Stable public inline operator float div(int other);
+    method @androidx.compose.runtime.Stable public inline operator float div(float other);
+    method public float getValue();
+    method @androidx.compose.runtime.Stable public inline operator float minus(float other);
+    method @androidx.compose.runtime.Stable public inline operator float plus(float other);
+    method @androidx.compose.runtime.Stable public inline operator float times(float other);
+    method @androidx.compose.runtime.Stable public inline operator float times(int other);
+    method @androidx.compose.runtime.Stable public inline operator float unaryMinus();
+    property public final float value;
+  }
+
+  public static final class Dp.Companion {
+    method public float getHairline();
+    method public float getInfinity();
+    method public float getUnspecified();
+    property public final float Hairline;
+    property public final float Infinity;
+    property public final float Unspecified;
+  }
+
+  public final class DpKt {
+    method @androidx.compose.runtime.Stable public static long DpOffset(float x, float y);
+    method @androidx.compose.runtime.Stable public static long DpSize(float width, float height);
+    method @androidx.compose.runtime.Stable public static inline float coerceAtLeast(float, float minimumValue);
+    method @androidx.compose.runtime.Stable public static inline float coerceAtMost(float, float maximumValue);
+    method @androidx.compose.runtime.Stable public static inline float coerceIn(float, float minimumValue, float maximumValue);
+    method public static long getCenter(long);
+    method public static inline float getDp(int);
+    method public static inline float getDp(double);
+    method public static inline float getDp(float);
+    method public static inline float getHeight(androidx.compose.ui.unit.DpRect);
+    method public static inline long getSize(androidx.compose.ui.unit.DpRect);
+    method public static inline float getWidth(androidx.compose.ui.unit.DpRect);
+    method public static inline boolean isFinite(float);
+    method public static inline boolean isSpecified(float);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isUnspecified(float);
+    method public static inline boolean isUnspecified(long);
+    method public static inline boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static float lerp(float start, float stop, float fraction);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static inline float max(float a, float b);
+    method @androidx.compose.runtime.Stable public static inline float min(float a, float b);
+    method public static inline float takeOrElse(float, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.Dp> block);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.DpOffset> block);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.DpSize> block);
+    method @androidx.compose.runtime.Stable public static inline operator float times(float, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times(double, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times(int, float other);
+    method @androidx.compose.runtime.Stable public static inline operator long times(int, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times(float, long size);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class DpOffset {
+    ctor public DpOffset();
+    method @androidx.compose.runtime.Stable public inline operator long minus(long other);
+    method @androidx.compose.runtime.Stable public inline operator long plus(long other);
+  }
+
+  public static final class DpOffset.Companion {
+    method public long getUnspecified();
+    method public long getZero();
+    property public final long Unspecified;
+    property public final long Zero;
+  }
+
+  @androidx.compose.runtime.Immutable public final class DpRect {
+    ctor public DpRect(@androidx.compose.runtime.Stable float left, @androidx.compose.runtime.Stable float top, @androidx.compose.runtime.Stable float right, @androidx.compose.runtime.Stable float bottom);
+    ctor public DpRect(long origin, long size);
+    method public float component1-D9Ej5fM();
+    method public float component2-D9Ej5fM();
+    method public float component3-D9Ej5fM();
+    method public float component4-D9Ej5fM();
+    method public androidx.compose.ui.unit.DpRect copy-a9UjIt4(float left, float top, float right, float bottom);
+    method public float getBottom();
+    method public float getLeft();
+    method public float getRight();
+    method public float getTop();
+    property public final float bottom;
+    property public final float left;
+    property public final float right;
+    property public final float top;
+    field public static final androidx.compose.ui.unit.DpRect.Companion Companion;
+  }
+
+  public static final class DpRect.Companion {
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class DpSize {
+    ctor public DpSize();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(int other);
+    method @androidx.compose.runtime.Stable public operator long div(float other);
+    method @androidx.compose.runtime.Stable public inline operator long minus(long other);
+    method @androidx.compose.runtime.Stable public inline operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long times(int other);
+    method @androidx.compose.runtime.Stable public operator long times(float other);
+  }
+
+  public static final class DpSize.Companion {
+    method public long getUnspecified();
+    method public long getZero();
+    property public final long Unspecified;
+    property public final long Zero;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class IntOffset {
+    ctor public IntOffset();
+    method @androidx.compose.runtime.Stable public operator int component1();
+    method @androidx.compose.runtime.Stable public operator int component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public inline operator long minus(long other);
+    method @androidx.compose.runtime.Stable public inline operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long rem(int operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public inline operator long unaryMinus();
+  }
+
+  public static final class IntOffset.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class IntOffsetKt {
+    method @androidx.compose.runtime.Stable public static long IntOffset(int x, int y);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static operator long minus(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long minus(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long plus(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long plus(long, long offset);
+    method @androidx.compose.runtime.Stable public static inline long round(long);
+    method @androidx.compose.runtime.Stable public static inline long toOffset(long);
+  }
+
+  @androidx.compose.runtime.Immutable public final class IntRect {
+    ctor public IntRect(@androidx.compose.runtime.Stable int left, @androidx.compose.runtime.Stable int top, @androidx.compose.runtime.Stable int right, @androidx.compose.runtime.Stable int bottom);
+    method public int component1();
+    method public int component2();
+    method public int component3();
+    method public int component4();
+    method public boolean contains(long offset);
+    method public androidx.compose.ui.unit.IntRect copy(int left, int top, int right, int bottom);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect deflate(int delta);
+    method public int getBottom();
+    method public long getBottomCenter();
+    method public long getBottomLeft();
+    method public long getBottomRight();
+    method public long getCenter();
+    method public long getCenterLeft();
+    method public long getCenterRight();
+    method public int getHeight();
+    method public int getLeft();
+    method public int getMaxDimension();
+    method public int getMinDimension();
+    method public int getRight();
+    method public long getSize();
+    method public int getTop();
+    method public long getTopCenter();
+    method public long getTopLeft();
+    method public long getTopRight();
+    method public int getWidth();
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect inflate(int delta);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect intersect(androidx.compose.ui.unit.IntRect other);
+    method public boolean isEmpty();
+    method public boolean overlaps(androidx.compose.ui.unit.IntRect other);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect translate(long offset);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect translate(int translateX, int translateY);
+    property public final int bottom;
+    property public final long bottomCenter;
+    property public final long bottomLeft;
+    property public final long bottomRight;
+    property public final long center;
+    property public final long centerLeft;
+    property public final long centerRight;
+    property public final int height;
+    property public final boolean isEmpty;
+    property public final int left;
+    property public final int maxDimension;
+    property public final int minDimension;
+    property public final int right;
+    property public final long size;
+    property public final int top;
+    property public final long topCenter;
+    property public final long topLeft;
+    property public final long topRight;
+    property public final int width;
+    field public static final androidx.compose.ui.unit.IntRect.Companion Companion;
+  }
+
+  public static final class IntRect.Companion {
+    method public androidx.compose.ui.unit.IntRect getZero();
+    property public final androidx.compose.ui.unit.IntRect Zero;
+  }
+
+  public final class IntRectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect(long offset, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect(long center, int radius);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect lerp(androidx.compose.ui.unit.IntRect start, androidx.compose.ui.unit.IntRect stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class IntSize {
+    ctor public IntSize();
+    method @androidx.compose.runtime.Stable public inline operator int component1();
+    method @androidx.compose.runtime.Stable public inline operator int component2();
+    method @androidx.compose.runtime.Stable public operator long div(int other);
+    method @androidx.compose.runtime.Stable public operator long times(int other);
+  }
+
+  public static final class IntSize.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class IntSizeKt {
+    method @androidx.compose.runtime.Stable public static long IntSize(int width, int height);
+    method public static long getCenter(long);
+    method @androidx.compose.runtime.Stable public static operator long times(int, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect toIntRect(long);
+    method @androidx.compose.runtime.Stable public static long toSize(long);
+  }
+
+  public enum LayoutDirection {
+    enum_constant public static final androidx.compose.ui.unit.LayoutDirection Ltr;
+    enum_constant public static final androidx.compose.ui.unit.LayoutDirection Rtl;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class TextUnit {
+    ctor public TextUnit();
+    method public inline operator int compareTo(long other);
+    method public inline operator long div(float other);
+    method public inline operator long div(double other);
+    method public inline operator long div(int other);
+    method public inline operator long times(float other);
+    method public inline operator long times(double other);
+    method public inline operator long times(int other);
+    method public inline operator long unaryMinus();
+  }
+
+  public static final class TextUnit.Companion {
+    method public long getUnspecified();
+    property public final long Unspecified;
+  }
+
+  public final class TextUnitKt {
+    method public static long getEm(float);
+    method public static long getEm(double);
+    method public static long getEm(int);
+    method public static long getSp(float);
+    method public static long getSp(double);
+    method public static long getSp(int);
+    method public static inline boolean isSpecified(long);
+    method public static boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.TextUnit> block);
+    method @androidx.compose.runtime.Stable public static inline operator long times(float, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long times(double, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long times(int, long other);
+  }
+
+  public final inline class TextUnitType {
+    ctor public TextUnitType();
+  }
+
+  public static final class TextUnitType.Companion {
+    method public long getEm();
+    method public long getSp();
+    method public long getUnspecified();
+    property public final long Em;
+    property public final long Sp;
+    property public final long Unspecified;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Velocity {
+    ctor public Velocity();
+    method @androidx.compose.runtime.Stable public operator float component1();
+    method @androidx.compose.runtime.Stable public operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public operator long minus(long other);
+    method @androidx.compose.runtime.Stable public operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long rem(float operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public operator long unaryMinus();
+  }
+
+  public static final class Velocity.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class VelocityKt {
+    method @androidx.compose.runtime.Stable public static long Velocity(float x, float y);
+  }
+
+}
+
diff --git a/compose/ui/ui-unit/api/current.txt b/compose/ui/ui-unit/api/current.txt
index c800b19..dfe02d7 100644
--- a/compose/ui/ui-unit/api/current.txt
+++ b/compose/ui/ui-unit/api/current.txt
@@ -52,7 +52,15 @@
   @androidx.compose.runtime.Immutable public final inline class Dp implements java.lang.Comparable<androidx.compose.ui.unit.Dp> {
     ctor public Dp();
     method @androidx.compose.runtime.Stable public operator int compareTo(float other);
+    method @androidx.compose.runtime.Stable public inline operator float div(float other);
+    method @androidx.compose.runtime.Stable public inline operator float div(int other);
+    method @androidx.compose.runtime.Stable public inline operator float div(float other);
     method public float getValue();
+    method @androidx.compose.runtime.Stable public inline operator float minus(float other);
+    method @androidx.compose.runtime.Stable public inline operator float plus(float other);
+    method @androidx.compose.runtime.Stable public inline operator float times(float other);
+    method @androidx.compose.runtime.Stable public inline operator float times(int other);
+    method @androidx.compose.runtime.Stable public inline operator float unaryMinus();
     property public final float value;
   }
 
@@ -102,6 +110,8 @@
 
   @androidx.compose.runtime.Immutable public final inline class DpOffset {
     ctor public DpOffset();
+    method @androidx.compose.runtime.Stable public inline operator long minus(long other);
+    method @androidx.compose.runtime.Stable public inline operator long plus(long other);
   }
 
   public static final class DpOffset.Companion {
@@ -135,6 +145,14 @@
 
   @androidx.compose.runtime.Immutable public final inline class DpSize {
     ctor public DpSize();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(int other);
+    method @androidx.compose.runtime.Stable public operator long div(float other);
+    method @androidx.compose.runtime.Stable public inline operator long minus(long other);
+    method @androidx.compose.runtime.Stable public inline operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long times(int other);
+    method @androidx.compose.runtime.Stable public operator long times(float other);
   }
 
   public static final class DpSize.Companion {
@@ -146,6 +164,14 @@
 
   @androidx.compose.runtime.Immutable public final inline class IntOffset {
     ctor public IntOffset();
+    method @androidx.compose.runtime.Stable public operator int component1();
+    method @androidx.compose.runtime.Stable public operator int component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public inline operator long minus(long other);
+    method @androidx.compose.runtime.Stable public inline operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long rem(int operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public inline operator long unaryMinus();
   }
 
   public static final class IntOffset.Companion {
@@ -233,6 +259,10 @@
 
   @androidx.compose.runtime.Immutable public final inline class IntSize {
     ctor public IntSize();
+    method @androidx.compose.runtime.Stable public inline operator int component1();
+    method @androidx.compose.runtime.Stable public inline operator int component2();
+    method @androidx.compose.runtime.Stable public operator long div(int other);
+    method @androidx.compose.runtime.Stable public operator long times(int other);
   }
 
   public static final class IntSize.Companion {
@@ -255,6 +285,14 @@
 
   @androidx.compose.runtime.Immutable public final inline class TextUnit {
     ctor public TextUnit();
+    method public inline operator int compareTo(long other);
+    method public inline operator long div(float other);
+    method public inline operator long div(double other);
+    method public inline operator long div(int other);
+    method public inline operator long times(float other);
+    method public inline operator long times(double other);
+    method public inline operator long times(int other);
+    method public inline operator long unaryMinus();
   }
 
   public static final class TextUnit.Companion {
@@ -293,6 +331,14 @@
 
   @androidx.compose.runtime.Immutable public final inline class Velocity {
     ctor public Velocity();
+    method @androidx.compose.runtime.Stable public operator float component1();
+    method @androidx.compose.runtime.Stable public operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public operator long minus(long other);
+    method @androidx.compose.runtime.Stable public operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long rem(float operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public operator long unaryMinus();
   }
 
   public static final class Velocity.Companion {
diff --git a/compose/ui/ui-unit/api/public_plus_experimental_1.1.0-beta02.txt b/compose/ui/ui-unit/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..d800789
--- /dev/null
+++ b/compose/ui/ui-unit/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,358 @@
+// Signature format: 4.0
+package androidx.compose.ui.unit {
+
+  public final class AndroidDensity_androidKt {
+    method public static androidx.compose.ui.unit.Density Density(android.content.Context context);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Constraints {
+    ctor public Constraints();
+  }
+
+  public static final class Constraints.Companion {
+    method @androidx.compose.runtime.Stable public long fixed(int width, int height);
+    method @androidx.compose.runtime.Stable public long fixedHeight(int height);
+    method @androidx.compose.runtime.Stable public long fixedWidth(int width);
+  }
+
+  public final class ConstraintsKt {
+    method @androidx.compose.runtime.Stable public static long Constraints(optional int minWidth, optional int maxWidth, optional int minHeight, optional int maxHeight);
+    method public static long constrain(long, long otherConstraints);
+    method @androidx.compose.runtime.Stable public static long constrain(long, long size);
+    method @androidx.compose.runtime.Stable public static int constrainHeight(long, int height);
+    method @androidx.compose.runtime.Stable public static int constrainWidth(long, int width);
+    method @androidx.compose.runtime.Stable public static boolean isSatisfiedBy(long, long size);
+    method @androidx.compose.runtime.Stable public static long offset(long, optional int horizontal, optional int vertical);
+  }
+
+  @androidx.compose.runtime.Immutable public interface Density {
+    method public float getDensity();
+    method public float getFontScale();
+    method @androidx.compose.runtime.Stable public default int roundToPx(float);
+    method @androidx.compose.runtime.Stable public default int roundToPx(long);
+    method @androidx.compose.runtime.Stable public default float toDp(long);
+    method @androidx.compose.runtime.Stable public default float toDp(int);
+    method @androidx.compose.runtime.Stable public default float toDp(float);
+    method @androidx.compose.runtime.Stable public default long toDpSize(long);
+    method @androidx.compose.runtime.Stable public default float toPx(float);
+    method @androidx.compose.runtime.Stable public default float toPx(long);
+    method @androidx.compose.runtime.Stable public default androidx.compose.ui.geometry.Rect toRect(androidx.compose.ui.unit.DpRect);
+    method @androidx.compose.runtime.Stable public default long toSize(long);
+    method @androidx.compose.runtime.Stable public default long toSp(float);
+    method @androidx.compose.runtime.Stable public default long toSp(int);
+    method @androidx.compose.runtime.Stable public default long toSp(float);
+    property public abstract float density;
+    property public abstract float fontScale;
+  }
+
+  public final class DensityKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.Density Density(float density, optional float fontScale);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Dp implements java.lang.Comparable<androidx.compose.ui.unit.Dp> {
+    ctor public Dp();
+    method @androidx.compose.runtime.Stable public operator int compareTo(float other);
+    method @androidx.compose.runtime.Stable public inline operator float div(float other);
+    method @androidx.compose.runtime.Stable public inline operator float div(int other);
+    method @androidx.compose.runtime.Stable public inline operator float div(float other);
+    method public float getValue();
+    method @androidx.compose.runtime.Stable public inline operator float minus(float other);
+    method @androidx.compose.runtime.Stable public inline operator float plus(float other);
+    method @androidx.compose.runtime.Stable public inline operator float times(float other);
+    method @androidx.compose.runtime.Stable public inline operator float times(int other);
+    method @androidx.compose.runtime.Stable public inline operator float unaryMinus();
+    property public final float value;
+  }
+
+  public static final class Dp.Companion {
+    method public float getHairline();
+    method public float getInfinity();
+    method public float getUnspecified();
+    property public final float Hairline;
+    property public final float Infinity;
+    property public final float Unspecified;
+  }
+
+  public final class DpKt {
+    method @androidx.compose.runtime.Stable public static long DpOffset(float x, float y);
+    method @androidx.compose.runtime.Stable public static long DpSize(float width, float height);
+    method @androidx.compose.runtime.Stable public static inline float coerceAtLeast(float, float minimumValue);
+    method @androidx.compose.runtime.Stable public static inline float coerceAtMost(float, float maximumValue);
+    method @androidx.compose.runtime.Stable public static inline float coerceIn(float, float minimumValue, float maximumValue);
+    method public static long getCenter(long);
+    method public static inline float getDp(int);
+    method public static inline float getDp(double);
+    method public static inline float getDp(float);
+    method public static inline float getHeight(androidx.compose.ui.unit.DpRect);
+    method public static inline long getSize(androidx.compose.ui.unit.DpRect);
+    method public static inline float getWidth(androidx.compose.ui.unit.DpRect);
+    method public static inline boolean isFinite(float);
+    method public static inline boolean isSpecified(float);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isUnspecified(float);
+    method public static inline boolean isUnspecified(long);
+    method public static inline boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static float lerp(float start, float stop, float fraction);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static inline float max(float a, float b);
+    method @androidx.compose.runtime.Stable public static inline float min(float a, float b);
+    method public static inline float takeOrElse(float, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.Dp> block);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.DpOffset> block);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.DpSize> block);
+    method @androidx.compose.runtime.Stable public static inline operator float times(float, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times(double, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times(int, float other);
+    method @androidx.compose.runtime.Stable public static inline operator long times(int, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times(float, long size);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class DpOffset {
+    ctor public DpOffset();
+    method @androidx.compose.runtime.Stable public inline operator long minus(long other);
+    method @androidx.compose.runtime.Stable public inline operator long plus(long other);
+  }
+
+  public static final class DpOffset.Companion {
+    method public long getUnspecified();
+    method public long getZero();
+    property public final long Unspecified;
+    property public final long Zero;
+  }
+
+  @androidx.compose.runtime.Immutable public final class DpRect {
+    ctor public DpRect(@androidx.compose.runtime.Stable float left, @androidx.compose.runtime.Stable float top, @androidx.compose.runtime.Stable float right, @androidx.compose.runtime.Stable float bottom);
+    ctor public DpRect(long origin, long size);
+    method public float component1-D9Ej5fM();
+    method public float component2-D9Ej5fM();
+    method public float component3-D9Ej5fM();
+    method public float component4-D9Ej5fM();
+    method public androidx.compose.ui.unit.DpRect copy-a9UjIt4(float left, float top, float right, float bottom);
+    method public float getBottom();
+    method public float getLeft();
+    method public float getRight();
+    method public float getTop();
+    property public final float bottom;
+    property public final float left;
+    property public final float right;
+    property public final float top;
+    field public static final androidx.compose.ui.unit.DpRect.Companion Companion;
+  }
+
+  public static final class DpRect.Companion {
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class DpSize {
+    ctor public DpSize();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(int other);
+    method @androidx.compose.runtime.Stable public operator long div(float other);
+    method @androidx.compose.runtime.Stable public inline operator long minus(long other);
+    method @androidx.compose.runtime.Stable public inline operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long times(int other);
+    method @androidx.compose.runtime.Stable public operator long times(float other);
+  }
+
+  public static final class DpSize.Companion {
+    method public long getUnspecified();
+    method public long getZero();
+    property public final long Unspecified;
+    property public final long Zero;
+  }
+
+  @kotlin.RequiresOptIn(message="This API is experimental and is likely to change in the future.") public @interface ExperimentalUnitApi {
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class IntOffset {
+    ctor public IntOffset();
+    method @androidx.compose.runtime.Stable public operator int component1();
+    method @androidx.compose.runtime.Stable public operator int component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public inline operator long minus(long other);
+    method @androidx.compose.runtime.Stable public inline operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long rem(int operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public inline operator long unaryMinus();
+  }
+
+  public static final class IntOffset.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class IntOffsetKt {
+    method @androidx.compose.runtime.Stable public static long IntOffset(int x, int y);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static operator long minus(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long minus(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long plus(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long plus(long, long offset);
+    method @androidx.compose.runtime.Stable public static inline long round(long);
+    method @androidx.compose.runtime.Stable public static inline long toOffset(long);
+  }
+
+  @androidx.compose.runtime.Immutable public final class IntRect {
+    ctor public IntRect(@androidx.compose.runtime.Stable int left, @androidx.compose.runtime.Stable int top, @androidx.compose.runtime.Stable int right, @androidx.compose.runtime.Stable int bottom);
+    method public int component1();
+    method public int component2();
+    method public int component3();
+    method public int component4();
+    method public boolean contains(long offset);
+    method public androidx.compose.ui.unit.IntRect copy(int left, int top, int right, int bottom);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect deflate(int delta);
+    method public int getBottom();
+    method public long getBottomCenter();
+    method public long getBottomLeft();
+    method public long getBottomRight();
+    method public long getCenter();
+    method public long getCenterLeft();
+    method public long getCenterRight();
+    method public int getHeight();
+    method public int getLeft();
+    method public int getMaxDimension();
+    method public int getMinDimension();
+    method public int getRight();
+    method public long getSize();
+    method public int getTop();
+    method public long getTopCenter();
+    method public long getTopLeft();
+    method public long getTopRight();
+    method public int getWidth();
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect inflate(int delta);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect intersect(androidx.compose.ui.unit.IntRect other);
+    method public boolean isEmpty();
+    method public boolean overlaps(androidx.compose.ui.unit.IntRect other);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect translate(long offset);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect translate(int translateX, int translateY);
+    property public final int bottom;
+    property public final long bottomCenter;
+    property public final long bottomLeft;
+    property public final long bottomRight;
+    property public final long center;
+    property public final long centerLeft;
+    property public final long centerRight;
+    property public final int height;
+    property public final boolean isEmpty;
+    property public final int left;
+    property public final int maxDimension;
+    property public final int minDimension;
+    property public final int right;
+    property public final long size;
+    property public final int top;
+    property public final long topCenter;
+    property public final long topLeft;
+    property public final long topRight;
+    property public final int width;
+    field public static final androidx.compose.ui.unit.IntRect.Companion Companion;
+  }
+
+  public static final class IntRect.Companion {
+    method public androidx.compose.ui.unit.IntRect getZero();
+    property public final androidx.compose.ui.unit.IntRect Zero;
+  }
+
+  public final class IntRectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect(long offset, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect(long center, int radius);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect lerp(androidx.compose.ui.unit.IntRect start, androidx.compose.ui.unit.IntRect stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class IntSize {
+    ctor public IntSize();
+    method @androidx.compose.runtime.Stable public inline operator int component1();
+    method @androidx.compose.runtime.Stable public inline operator int component2();
+    method @androidx.compose.runtime.Stable public operator long div(int other);
+    method @androidx.compose.runtime.Stable public operator long times(int other);
+  }
+
+  public static final class IntSize.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class IntSizeKt {
+    method @androidx.compose.runtime.Stable public static long IntSize(int width, int height);
+    method public static long getCenter(long);
+    method @androidx.compose.runtime.Stable public static operator long times(int, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect toIntRect(long);
+    method @androidx.compose.runtime.Stable public static long toSize(long);
+  }
+
+  public enum LayoutDirection {
+    enum_constant public static final androidx.compose.ui.unit.LayoutDirection Ltr;
+    enum_constant public static final androidx.compose.ui.unit.LayoutDirection Rtl;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class TextUnit {
+    ctor public TextUnit();
+    method public inline operator int compareTo(long other);
+    method public inline operator long div(float other);
+    method public inline operator long div(double other);
+    method public inline operator long div(int other);
+    method public inline operator long times(float other);
+    method public inline operator long times(double other);
+    method public inline operator long times(int other);
+    method public inline operator long unaryMinus();
+  }
+
+  public static final class TextUnit.Companion {
+    method public long getUnspecified();
+    property public final long Unspecified;
+  }
+
+  public final class TextUnitKt {
+    method @androidx.compose.ui.unit.ExperimentalUnitApi public static long TextUnit(float value, long type);
+    method public static long getEm(float);
+    method public static long getEm(double);
+    method public static long getEm(int);
+    method public static long getSp(float);
+    method public static long getSp(double);
+    method public static long getSp(int);
+    method public static inline boolean isSpecified(long);
+    method public static boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.TextUnit> block);
+    method @androidx.compose.runtime.Stable public static inline operator long times(float, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long times(double, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long times(int, long other);
+  }
+
+  public final inline class TextUnitType {
+    ctor public TextUnitType();
+  }
+
+  public static final class TextUnitType.Companion {
+    method public long getEm();
+    method public long getSp();
+    method public long getUnspecified();
+    property public final long Em;
+    property public final long Sp;
+    property public final long Unspecified;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Velocity {
+    ctor public Velocity();
+    method @androidx.compose.runtime.Stable public operator float component1();
+    method @androidx.compose.runtime.Stable public operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public operator long minus(long other);
+    method @androidx.compose.runtime.Stable public operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long rem(float operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public operator long unaryMinus();
+  }
+
+  public static final class Velocity.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class VelocityKt {
+    method @androidx.compose.runtime.Stable public static long Velocity(float x, float y);
+  }
+
+}
+
diff --git a/compose/ui/ui-unit/api/public_plus_experimental_current.txt b/compose/ui/ui-unit/api/public_plus_experimental_current.txt
index 284ff88..d800789 100644
--- a/compose/ui/ui-unit/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-unit/api/public_plus_experimental_current.txt
@@ -52,7 +52,15 @@
   @androidx.compose.runtime.Immutable public final inline class Dp implements java.lang.Comparable<androidx.compose.ui.unit.Dp> {
     ctor public Dp();
     method @androidx.compose.runtime.Stable public operator int compareTo(float other);
+    method @androidx.compose.runtime.Stable public inline operator float div(float other);
+    method @androidx.compose.runtime.Stable public inline operator float div(int other);
+    method @androidx.compose.runtime.Stable public inline operator float div(float other);
     method public float getValue();
+    method @androidx.compose.runtime.Stable public inline operator float minus(float other);
+    method @androidx.compose.runtime.Stable public inline operator float plus(float other);
+    method @androidx.compose.runtime.Stable public inline operator float times(float other);
+    method @androidx.compose.runtime.Stable public inline operator float times(int other);
+    method @androidx.compose.runtime.Stable public inline operator float unaryMinus();
     property public final float value;
   }
 
@@ -102,6 +110,8 @@
 
   @androidx.compose.runtime.Immutable public final inline class DpOffset {
     ctor public DpOffset();
+    method @androidx.compose.runtime.Stable public inline operator long minus(long other);
+    method @androidx.compose.runtime.Stable public inline operator long plus(long other);
   }
 
   public static final class DpOffset.Companion {
@@ -135,6 +145,14 @@
 
   @androidx.compose.runtime.Immutable public final inline class DpSize {
     ctor public DpSize();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(int other);
+    method @androidx.compose.runtime.Stable public operator long div(float other);
+    method @androidx.compose.runtime.Stable public inline operator long minus(long other);
+    method @androidx.compose.runtime.Stable public inline operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long times(int other);
+    method @androidx.compose.runtime.Stable public operator long times(float other);
   }
 
   public static final class DpSize.Companion {
@@ -149,6 +167,14 @@
 
   @androidx.compose.runtime.Immutable public final inline class IntOffset {
     ctor public IntOffset();
+    method @androidx.compose.runtime.Stable public operator int component1();
+    method @androidx.compose.runtime.Stable public operator int component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public inline operator long minus(long other);
+    method @androidx.compose.runtime.Stable public inline operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long rem(int operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public inline operator long unaryMinus();
   }
 
   public static final class IntOffset.Companion {
@@ -236,6 +262,10 @@
 
   @androidx.compose.runtime.Immutable public final inline class IntSize {
     ctor public IntSize();
+    method @androidx.compose.runtime.Stable public inline operator int component1();
+    method @androidx.compose.runtime.Stable public inline operator int component2();
+    method @androidx.compose.runtime.Stable public operator long div(int other);
+    method @androidx.compose.runtime.Stable public operator long times(int other);
   }
 
   public static final class IntSize.Companion {
@@ -258,6 +288,14 @@
 
   @androidx.compose.runtime.Immutable public final inline class TextUnit {
     ctor public TextUnit();
+    method public inline operator int compareTo(long other);
+    method public inline operator long div(float other);
+    method public inline operator long div(double other);
+    method public inline operator long div(int other);
+    method public inline operator long times(float other);
+    method public inline operator long times(double other);
+    method public inline operator long times(int other);
+    method public inline operator long unaryMinus();
   }
 
   public static final class TextUnit.Companion {
@@ -297,6 +335,14 @@
 
   @androidx.compose.runtime.Immutable public final inline class Velocity {
     ctor public Velocity();
+    method @androidx.compose.runtime.Stable public operator float component1();
+    method @androidx.compose.runtime.Stable public operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public operator long minus(long other);
+    method @androidx.compose.runtime.Stable public operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long rem(float operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public operator long unaryMinus();
   }
 
   public static final class Velocity.Companion {
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/ui/ui-unit/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to compose/ui/ui-unit/api/res-1.1.0-beta02.txt
diff --git a/compose/ui/ui-unit/api/restricted_1.1.0-beta02.txt b/compose/ui/ui-unit/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..321a992
--- /dev/null
+++ b/compose/ui/ui-unit/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,358 @@
+// Signature format: 4.0
+package androidx.compose.ui.unit {
+
+  public final class AndroidDensity_androidKt {
+    method public static androidx.compose.ui.unit.Density Density(android.content.Context context);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Constraints {
+    ctor public Constraints();
+  }
+
+  public static final class Constraints.Companion {
+    method @androidx.compose.runtime.Stable public long fixed(int width, int height);
+    method @androidx.compose.runtime.Stable public long fixedHeight(int height);
+    method @androidx.compose.runtime.Stable public long fixedWidth(int width);
+  }
+
+  public final class ConstraintsKt {
+    method @androidx.compose.runtime.Stable public static long Constraints(optional int minWidth, optional int maxWidth, optional int minHeight, optional int maxHeight);
+    method public static long constrain(long, long otherConstraints);
+    method @androidx.compose.runtime.Stable public static long constrain(long, long size);
+    method @androidx.compose.runtime.Stable public static int constrainHeight(long, int height);
+    method @androidx.compose.runtime.Stable public static int constrainWidth(long, int width);
+    method @androidx.compose.runtime.Stable public static boolean isSatisfiedBy(long, long size);
+    method @androidx.compose.runtime.Stable public static long offset(long, optional int horizontal, optional int vertical);
+  }
+
+  @androidx.compose.runtime.Immutable public interface Density {
+    method public float getDensity();
+    method public float getFontScale();
+    method @androidx.compose.runtime.Stable public default int roundToPx(float);
+    method @androidx.compose.runtime.Stable public default int roundToPx(long);
+    method @androidx.compose.runtime.Stable public default float toDp(long);
+    method @androidx.compose.runtime.Stable public default float toDp(int);
+    method @androidx.compose.runtime.Stable public default float toDp(float);
+    method @androidx.compose.runtime.Stable public default long toDpSize(long);
+    method @androidx.compose.runtime.Stable public default float toPx(float);
+    method @androidx.compose.runtime.Stable public default float toPx(long);
+    method @androidx.compose.runtime.Stable public default androidx.compose.ui.geometry.Rect toRect(androidx.compose.ui.unit.DpRect);
+    method @androidx.compose.runtime.Stable public default long toSize(long);
+    method @androidx.compose.runtime.Stable public default long toSp(float);
+    method @androidx.compose.runtime.Stable public default long toSp(int);
+    method @androidx.compose.runtime.Stable public default long toSp(float);
+    property public abstract float density;
+    property public abstract float fontScale;
+  }
+
+  public final class DensityKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.Density Density(float density, optional float fontScale);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Dp implements java.lang.Comparable<androidx.compose.ui.unit.Dp> {
+    ctor public Dp();
+    method @androidx.compose.runtime.Stable public operator int compareTo(float other);
+    method @androidx.compose.runtime.Stable public inline operator float div(float other);
+    method @androidx.compose.runtime.Stable public inline operator float div(int other);
+    method @androidx.compose.runtime.Stable public inline operator float div(float other);
+    method public float getValue();
+    method @androidx.compose.runtime.Stable public inline operator float minus(float other);
+    method @androidx.compose.runtime.Stable public inline operator float plus(float other);
+    method @androidx.compose.runtime.Stable public inline operator float times(float other);
+    method @androidx.compose.runtime.Stable public inline operator float times(int other);
+    method @androidx.compose.runtime.Stable public inline operator float unaryMinus();
+    property public final float value;
+  }
+
+  public static final class Dp.Companion {
+    method public float getHairline();
+    method public float getInfinity();
+    method public float getUnspecified();
+    property public final float Hairline;
+    property public final float Infinity;
+    property public final float Unspecified;
+  }
+
+  public final class DpKt {
+    method @androidx.compose.runtime.Stable public static long DpOffset(float x, float y);
+    method @androidx.compose.runtime.Stable public static long DpSize(float width, float height);
+    method @androidx.compose.runtime.Stable public static inline float coerceAtLeast(float, float minimumValue);
+    method @androidx.compose.runtime.Stable public static inline float coerceAtMost(float, float maximumValue);
+    method @androidx.compose.runtime.Stable public static inline float coerceIn(float, float minimumValue, float maximumValue);
+    method public static long getCenter(long);
+    method public static inline float getDp(int);
+    method public static inline float getDp(double);
+    method public static inline float getDp(float);
+    method public static inline float getHeight(androidx.compose.ui.unit.DpRect);
+    method public static inline long getSize(androidx.compose.ui.unit.DpRect);
+    method public static inline float getWidth(androidx.compose.ui.unit.DpRect);
+    method public static inline boolean isFinite(float);
+    method public static inline boolean isSpecified(float);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isUnspecified(float);
+    method public static inline boolean isUnspecified(long);
+    method public static inline boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static float lerp(float start, float stop, float fraction);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static inline float max(float a, float b);
+    method @androidx.compose.runtime.Stable public static inline float min(float a, float b);
+    method public static inline float takeOrElse(float, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.Dp> block);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.DpOffset> block);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.DpSize> block);
+    method @androidx.compose.runtime.Stable public static inline operator float times(float, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times(double, float other);
+    method @androidx.compose.runtime.Stable public static inline operator float times(int, float other);
+    method @androidx.compose.runtime.Stable public static inline operator long times(int, long size);
+    method @androidx.compose.runtime.Stable public static inline operator long times(float, long size);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class DpOffset {
+    ctor public DpOffset();
+    method @androidx.compose.runtime.Stable public inline operator long minus(long other);
+    method @androidx.compose.runtime.Stable public inline operator long plus(long other);
+  }
+
+  public static final class DpOffset.Companion {
+    method public long getUnspecified();
+    method public long getZero();
+    property public final long Unspecified;
+    property public final long Zero;
+  }
+
+  @androidx.compose.runtime.Immutable public final class DpRect {
+    ctor public DpRect(@androidx.compose.runtime.Stable float left, @androidx.compose.runtime.Stable float top, @androidx.compose.runtime.Stable float right, @androidx.compose.runtime.Stable float bottom);
+    ctor public DpRect(long origin, long size);
+    method public float component1-D9Ej5fM();
+    method public float component2-D9Ej5fM();
+    method public float component3-D9Ej5fM();
+    method public float component4-D9Ej5fM();
+    method public androidx.compose.ui.unit.DpRect copy-a9UjIt4(float left, float top, float right, float bottom);
+    method public float getBottom();
+    method public float getLeft();
+    method public float getRight();
+    method public float getTop();
+    property public final float bottom;
+    property public final float left;
+    property public final float right;
+    property public final float top;
+    field public static final androidx.compose.ui.unit.DpRect.Companion Companion;
+  }
+
+  public static final class DpRect.Companion {
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class DpSize {
+    ctor public DpSize();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(int other);
+    method @androidx.compose.runtime.Stable public operator long div(float other);
+    method @androidx.compose.runtime.Stable public inline operator long minus(long other);
+    method @androidx.compose.runtime.Stable public inline operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long times(int other);
+    method @androidx.compose.runtime.Stable public operator long times(float other);
+  }
+
+  public static final class DpSize.Companion {
+    method public long getUnspecified();
+    method public long getZero();
+    property public final long Unspecified;
+    property public final long Zero;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class IntOffset {
+    ctor public IntOffset();
+    method @androidx.compose.runtime.Stable public operator int component1();
+    method @androidx.compose.runtime.Stable public operator int component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public inline operator long minus(long other);
+    method @androidx.compose.runtime.Stable public inline operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long rem(int operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public inline operator long unaryMinus();
+  }
+
+  public static final class IntOffset.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class IntOffsetKt {
+    method @androidx.compose.runtime.Stable public static long IntOffset(int x, int y);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method @androidx.compose.runtime.Stable public static operator long minus(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long minus(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long plus(long, long offset);
+    method @androidx.compose.runtime.Stable public static operator long plus(long, long offset);
+    method @androidx.compose.runtime.Stable public static inline long round(long);
+    method @androidx.compose.runtime.Stable public static inline long toOffset(long);
+  }
+
+  @androidx.compose.runtime.Immutable public final class IntRect {
+    ctor public IntRect(@androidx.compose.runtime.Stable int left, @androidx.compose.runtime.Stable int top, @androidx.compose.runtime.Stable int right, @androidx.compose.runtime.Stable int bottom);
+    method public int component1();
+    method public int component2();
+    method public int component3();
+    method public int component4();
+    method public boolean contains(long offset);
+    method public androidx.compose.ui.unit.IntRect copy(int left, int top, int right, int bottom);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect deflate(int delta);
+    method public int getBottom();
+    method public long getBottomCenter();
+    method public long getBottomLeft();
+    method public long getBottomRight();
+    method public long getCenter();
+    method public long getCenterLeft();
+    method public long getCenterRight();
+    method public int getHeight();
+    method public int getLeft();
+    method public int getMaxDimension();
+    method public int getMinDimension();
+    method public int getRight();
+    method public long getSize();
+    method public int getTop();
+    method public long getTopCenter();
+    method public long getTopLeft();
+    method public long getTopRight();
+    method public int getWidth();
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect inflate(int delta);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect intersect(androidx.compose.ui.unit.IntRect other);
+    method public boolean isEmpty();
+    method public boolean overlaps(androidx.compose.ui.unit.IntRect other);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect translate(long offset);
+    method @androidx.compose.runtime.Stable public androidx.compose.ui.unit.IntRect translate(int translateX, int translateY);
+    property public final int bottom;
+    property public final long bottomCenter;
+    property public final long bottomLeft;
+    property public final long bottomRight;
+    property public final long center;
+    property public final long centerLeft;
+    property public final long centerRight;
+    property public final int height;
+    property public final boolean isEmpty;
+    property public final int left;
+    property public final int maxDimension;
+    property public final int minDimension;
+    property public final int right;
+    property public final long size;
+    property public final int top;
+    property public final long topCenter;
+    property public final long topLeft;
+    property public final long topRight;
+    property public final int width;
+    field public static final androidx.compose.ui.unit.IntRect.Companion Companion;
+  }
+
+  public static final class IntRect.Companion {
+    method public androidx.compose.ui.unit.IntRect getZero();
+    property public final androidx.compose.ui.unit.IntRect Zero;
+  }
+
+  public final class IntRectKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect(long offset, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect(long topLeft, long bottomRight);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect IntRect(long center, int radius);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect lerp(androidx.compose.ui.unit.IntRect start, androidx.compose.ui.unit.IntRect stop, float fraction);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class IntSize {
+    ctor public IntSize();
+    method @androidx.compose.runtime.Stable public inline operator int component1();
+    method @androidx.compose.runtime.Stable public inline operator int component2();
+    method @androidx.compose.runtime.Stable public operator long div(int other);
+    method @androidx.compose.runtime.Stable public operator long times(int other);
+  }
+
+  public static final class IntSize.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class IntSizeKt {
+    method @androidx.compose.runtime.Stable public static long IntSize(int width, int height);
+    method public static long getCenter(long);
+    method @androidx.compose.runtime.Stable public static operator long times(int, long size);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.unit.IntRect toIntRect(long);
+    method @androidx.compose.runtime.Stable public static long toSize(long);
+  }
+
+  public enum LayoutDirection {
+    enum_constant public static final androidx.compose.ui.unit.LayoutDirection Ltr;
+    enum_constant public static final androidx.compose.ui.unit.LayoutDirection Rtl;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class TextUnit {
+    ctor public TextUnit();
+    method public inline operator int compareTo(long other);
+    method public inline operator long div(float other);
+    method public inline operator long div(double other);
+    method public inline operator long div(int other);
+    method public inline operator long times(float other);
+    method public inline operator long times(double other);
+    method public inline operator long times(int other);
+    method public inline operator long unaryMinus();
+  }
+
+  public static final class TextUnit.Companion {
+    method public long getUnspecified();
+    property public final long Unspecified;
+  }
+
+  public final class TextUnitKt {
+    method @kotlin.PublishedApi internal static void checkArithmetic(long a);
+    method @kotlin.PublishedApi internal static void checkArithmetic(long a, long b);
+    method @kotlin.PublishedApi internal static void checkArithmetic(long a, long b, long c);
+    method public static long getEm(float);
+    method public static long getEm(double);
+    method public static long getEm(int);
+    method public static long getSp(float);
+    method public static long getSp(double);
+    method public static long getSp(int);
+    method public static inline boolean isSpecified(long);
+    method public static boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method @kotlin.PublishedApi internal static long pack(long unitType, float v);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.TextUnit> block);
+    method @androidx.compose.runtime.Stable public static inline operator long times(float, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long times(double, long other);
+    method @androidx.compose.runtime.Stable public static inline operator long times(int, long other);
+  }
+
+  public final inline class TextUnitType {
+    ctor public TextUnitType();
+  }
+
+  public static final class TextUnitType.Companion {
+    method public long getEm();
+    method public long getSp();
+    method public long getUnspecified();
+    property public final long Em;
+    property public final long Sp;
+    property public final long Unspecified;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Velocity {
+    ctor public Velocity();
+    method @androidx.compose.runtime.Stable public operator float component1();
+    method @androidx.compose.runtime.Stable public operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public operator long minus(long other);
+    method @androidx.compose.runtime.Stable public operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long rem(float operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public operator long unaryMinus();
+  }
+
+  public static final class Velocity.Companion {
+    method public long getZero();
+    property public final long Zero;
+  }
+
+  public final class VelocityKt {
+    method @androidx.compose.runtime.Stable public static long Velocity(float x, float y);
+  }
+
+}
+
diff --git a/compose/ui/ui-unit/api/restricted_current.txt b/compose/ui/ui-unit/api/restricted_current.txt
index d891eaf..321a992 100644
--- a/compose/ui/ui-unit/api/restricted_current.txt
+++ b/compose/ui/ui-unit/api/restricted_current.txt
@@ -52,7 +52,15 @@
   @androidx.compose.runtime.Immutable public final inline class Dp implements java.lang.Comparable<androidx.compose.ui.unit.Dp> {
     ctor public Dp();
     method @androidx.compose.runtime.Stable public operator int compareTo(float other);
+    method @androidx.compose.runtime.Stable public inline operator float div(float other);
+    method @androidx.compose.runtime.Stable public inline operator float div(int other);
+    method @androidx.compose.runtime.Stable public inline operator float div(float other);
     method public float getValue();
+    method @androidx.compose.runtime.Stable public inline operator float minus(float other);
+    method @androidx.compose.runtime.Stable public inline operator float plus(float other);
+    method @androidx.compose.runtime.Stable public inline operator float times(float other);
+    method @androidx.compose.runtime.Stable public inline operator float times(int other);
+    method @androidx.compose.runtime.Stable public inline operator float unaryMinus();
     property public final float value;
   }
 
@@ -102,6 +110,8 @@
 
   @androidx.compose.runtime.Immutable public final inline class DpOffset {
     ctor public DpOffset();
+    method @androidx.compose.runtime.Stable public inline operator long minus(long other);
+    method @androidx.compose.runtime.Stable public inline operator long plus(long other);
   }
 
   public static final class DpOffset.Companion {
@@ -135,6 +145,14 @@
 
   @androidx.compose.runtime.Immutable public final inline class DpSize {
     ctor public DpSize();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(int other);
+    method @androidx.compose.runtime.Stable public operator long div(float other);
+    method @androidx.compose.runtime.Stable public inline operator long minus(long other);
+    method @androidx.compose.runtime.Stable public inline operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long times(int other);
+    method @androidx.compose.runtime.Stable public operator long times(float other);
   }
 
   public static final class DpSize.Companion {
@@ -146,6 +164,14 @@
 
   @androidx.compose.runtime.Immutable public final inline class IntOffset {
     ctor public IntOffset();
+    method @androidx.compose.runtime.Stable public operator int component1();
+    method @androidx.compose.runtime.Stable public operator int component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public inline operator long minus(long other);
+    method @androidx.compose.runtime.Stable public inline operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long rem(int operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public inline operator long unaryMinus();
   }
 
   public static final class IntOffset.Companion {
@@ -233,6 +259,10 @@
 
   @androidx.compose.runtime.Immutable public final inline class IntSize {
     ctor public IntSize();
+    method @androidx.compose.runtime.Stable public inline operator int component1();
+    method @androidx.compose.runtime.Stable public inline operator int component2();
+    method @androidx.compose.runtime.Stable public operator long div(int other);
+    method @androidx.compose.runtime.Stable public operator long times(int other);
   }
 
   public static final class IntSize.Companion {
@@ -255,6 +285,14 @@
 
   @androidx.compose.runtime.Immutable public final inline class TextUnit {
     ctor public TextUnit();
+    method public inline operator int compareTo(long other);
+    method public inline operator long div(float other);
+    method public inline operator long div(double other);
+    method public inline operator long div(int other);
+    method public inline operator long times(float other);
+    method public inline operator long times(double other);
+    method public inline operator long times(int other);
+    method public inline operator long unaryMinus();
   }
 
   public static final class TextUnit.Companion {
@@ -297,6 +335,14 @@
 
   @androidx.compose.runtime.Immutable public final inline class Velocity {
     ctor public Velocity();
+    method @androidx.compose.runtime.Stable public operator float component1();
+    method @androidx.compose.runtime.Stable public operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public operator long minus(long other);
+    method @androidx.compose.runtime.Stable public operator long plus(long other);
+    method @androidx.compose.runtime.Stable public operator long rem(float operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+    method @androidx.compose.runtime.Stable public operator long unaryMinus();
   }
 
   public static final class Velocity.Companion {
diff --git a/compose/ui/ui-util/api/1.1.0-beta02.txt b/compose/ui/ui-util/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..b71072e
--- /dev/null
+++ b/compose/ui/ui-util/api/1.1.0-beta02.txt
@@ -0,0 +1,36 @@
+// Signature format: 4.0
+package androidx.compose.ui.util {
+
+  public final class AndroidTrace_androidKt {
+    method public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+  public final class InlineClassHelperKt {
+    method public static inline long packFloats(float val1, float val2);
+    method public static inline long packInts(int val1, int val2);
+    method public static inline float unpackFloat1(long value);
+    method public static inline float unpackFloat2(long value);
+    method public static inline int unpackInt1(long value);
+    method public static inline int unpackInt2(long value);
+  }
+
+  public final class ListUtilsKt {
+    method public static inline <T> boolean fastAll(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public static inline <T> boolean fastAny(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public static inline <T> T? fastFirstOrNull(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public static inline <T> void fastForEach(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> action);
+    method public static inline <T> void fastForEachIndexed(java.util.List<? extends T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+    method public static inline <T, R> java.util.List<R> fastMap(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+    method public static inline <T, R, C extends java.util.Collection<? super R>> C fastMapTo(java.util.List<? extends T>, C destination, kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+    method public static inline <T, R extends java.lang.Comparable<? super R>> T? fastMaxBy(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,? extends R> selector);
+    method public static inline <T> int fastSumBy(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,java.lang.Integer> selector);
+  }
+
+  public final class MathHelpersKt {
+    method public static float lerp(float start, float stop, float fraction);
+    method public static int lerp(int start, int stop, float fraction);
+    method public static long lerp(long start, long stop, float fraction);
+  }
+
+}
+
diff --git a/compose/ui/ui-util/api/public_plus_experimental_1.1.0-beta02.txt b/compose/ui/ui-util/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..b71072e
--- /dev/null
+++ b/compose/ui/ui-util/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,36 @@
+// Signature format: 4.0
+package androidx.compose.ui.util {
+
+  public final class AndroidTrace_androidKt {
+    method public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+  public final class InlineClassHelperKt {
+    method public static inline long packFloats(float val1, float val2);
+    method public static inline long packInts(int val1, int val2);
+    method public static inline float unpackFloat1(long value);
+    method public static inline float unpackFloat2(long value);
+    method public static inline int unpackInt1(long value);
+    method public static inline int unpackInt2(long value);
+  }
+
+  public final class ListUtilsKt {
+    method public static inline <T> boolean fastAll(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public static inline <T> boolean fastAny(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public static inline <T> T? fastFirstOrNull(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public static inline <T> void fastForEach(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> action);
+    method public static inline <T> void fastForEachIndexed(java.util.List<? extends T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+    method public static inline <T, R> java.util.List<R> fastMap(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+    method public static inline <T, R, C extends java.util.Collection<? super R>> C fastMapTo(java.util.List<? extends T>, C destination, kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+    method public static inline <T, R extends java.lang.Comparable<? super R>> T? fastMaxBy(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,? extends R> selector);
+    method public static inline <T> int fastSumBy(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,java.lang.Integer> selector);
+  }
+
+  public final class MathHelpersKt {
+    method public static float lerp(float start, float stop, float fraction);
+    method public static int lerp(int start, int stop, float fraction);
+    method public static long lerp(long start, long stop, float fraction);
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/ui/ui-util/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to compose/ui/ui-util/api/res-1.1.0-beta02.txt
diff --git a/compose/ui/ui-util/api/restricted_1.1.0-beta02.txt b/compose/ui/ui-util/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..b71072e
--- /dev/null
+++ b/compose/ui/ui-util/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,36 @@
+// Signature format: 4.0
+package androidx.compose.ui.util {
+
+  public final class AndroidTrace_androidKt {
+    method public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+  }
+
+  public final class InlineClassHelperKt {
+    method public static inline long packFloats(float val1, float val2);
+    method public static inline long packInts(int val1, int val2);
+    method public static inline float unpackFloat1(long value);
+    method public static inline float unpackFloat2(long value);
+    method public static inline int unpackInt1(long value);
+    method public static inline int unpackInt2(long value);
+  }
+
+  public final class ListUtilsKt {
+    method public static inline <T> boolean fastAll(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public static inline <T> boolean fastAny(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public static inline <T> T? fastFirstOrNull(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method public static inline <T> void fastForEach(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> action);
+    method public static inline <T> void fastForEachIndexed(java.util.List<? extends T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+    method public static inline <T, R> java.util.List<R> fastMap(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+    method public static inline <T, R, C extends java.util.Collection<? super R>> C fastMapTo(java.util.List<? extends T>, C destination, kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+    method public static inline <T, R extends java.lang.Comparable<? super R>> T? fastMaxBy(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,? extends R> selector);
+    method public static inline <T> int fastSumBy(java.util.List<? extends T>, kotlin.jvm.functions.Function1<? super T,java.lang.Integer> selector);
+  }
+
+  public final class MathHelpersKt {
+    method public static float lerp(float start, float stop, float fraction);
+    method public static int lerp(int start, int stop, float fraction);
+    method public static long lerp(long start, long stop, float fraction);
+  }
+
+}
+
diff --git a/compose/ui/ui-viewbinding/api/1.1.0-beta02.txt b/compose/ui/ui-viewbinding/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..07ba909
--- /dev/null
+++ b/compose/ui/ui-viewbinding/api/1.1.0-beta02.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.compose.ui.viewinterop {
+
+  public final class AndroidViewBindingKt {
+    method @androidx.compose.runtime.Composable public static <T extends androidx.viewbinding.ViewBinding> void AndroidViewBinding(kotlin.jvm.functions.Function3<? super android.view.LayoutInflater,? super android.view.ViewGroup,? super java.lang.Boolean,? extends T> factory, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update);
+  }
+
+}
+
diff --git a/compose/ui/ui-viewbinding/api/public_plus_experimental_1.1.0-beta02.txt b/compose/ui/ui-viewbinding/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..07ba909
--- /dev/null
+++ b/compose/ui/ui-viewbinding/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.compose.ui.viewinterop {
+
+  public final class AndroidViewBindingKt {
+    method @androidx.compose.runtime.Composable public static <T extends androidx.viewbinding.ViewBinding> void AndroidViewBinding(kotlin.jvm.functions.Function3<? super android.view.LayoutInflater,? super android.view.ViewGroup,? super java.lang.Boolean,? extends T> factory, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update);
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/ui/ui-viewbinding/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to compose/ui/ui-viewbinding/api/res-1.1.0-beta02.txt
diff --git a/compose/ui/ui-viewbinding/api/restricted_1.1.0-beta02.txt b/compose/ui/ui-viewbinding/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..07ba909
--- /dev/null
+++ b/compose/ui/ui-viewbinding/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.compose.ui.viewinterop {
+
+  public final class AndroidViewBindingKt {
+    method @androidx.compose.runtime.Composable public static <T extends androidx.viewbinding.ViewBinding> void AndroidViewBinding(kotlin.jvm.functions.Function3<? super android.view.LayoutInflater,? super android.view.ViewGroup,? super java.lang.Boolean,? extends T> factory, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update);
+  }
+
+}
+
diff --git a/compose/ui/ui/api/1.1.0-beta02.txt b/compose/ui/ui/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..da7f726
--- /dev/null
+++ b/compose/ui/ui/api/1.1.0-beta02.txt
@@ -0,0 +1,2884 @@
+// Signature format: 4.0
+package androidx.compose.ui {
+
+  public final class AbsoluteAlignment {
+    method public androidx.compose.ui.Alignment getBottomLeft();
+    method public androidx.compose.ui.Alignment getBottomRight();
+    method public androidx.compose.ui.Alignment getCenterLeft();
+    method public androidx.compose.ui.Alignment getCenterRight();
+    method public androidx.compose.ui.Alignment.Horizontal getLeft();
+    method public androidx.compose.ui.Alignment.Horizontal getRight();
+    method public androidx.compose.ui.Alignment getTopLeft();
+    method public androidx.compose.ui.Alignment getTopRight();
+    property public final androidx.compose.ui.Alignment BottomLeft;
+    property public final androidx.compose.ui.Alignment BottomRight;
+    property public final androidx.compose.ui.Alignment CenterLeft;
+    property public final androidx.compose.ui.Alignment CenterRight;
+    property public final androidx.compose.ui.Alignment.Horizontal Left;
+    property public final androidx.compose.ui.Alignment.Horizontal Right;
+    property public final androidx.compose.ui.Alignment TopLeft;
+    property public final androidx.compose.ui.Alignment TopRight;
+    field public static final androidx.compose.ui.AbsoluteAlignment INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public fun interface Alignment {
+    method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    field public static final androidx.compose.ui.Alignment.Companion Companion;
+  }
+
+  public static final class Alignment.Companion {
+    method public androidx.compose.ui.Alignment.Vertical getBottom();
+    method public androidx.compose.ui.Alignment getBottomCenter();
+    method public androidx.compose.ui.Alignment getBottomEnd();
+    method public androidx.compose.ui.Alignment getBottomStart();
+    method public androidx.compose.ui.Alignment getCenter();
+    method public androidx.compose.ui.Alignment getCenterEnd();
+    method public androidx.compose.ui.Alignment.Horizontal getCenterHorizontally();
+    method public androidx.compose.ui.Alignment getCenterStart();
+    method public androidx.compose.ui.Alignment.Vertical getCenterVertically();
+    method public androidx.compose.ui.Alignment.Horizontal getEnd();
+    method public androidx.compose.ui.Alignment.Horizontal getStart();
+    method public androidx.compose.ui.Alignment.Vertical getTop();
+    method public androidx.compose.ui.Alignment getTopCenter();
+    method public androidx.compose.ui.Alignment getTopEnd();
+    method public androidx.compose.ui.Alignment getTopStart();
+    property public final androidx.compose.ui.Alignment.Vertical Bottom;
+    property public final androidx.compose.ui.Alignment BottomCenter;
+    property public final androidx.compose.ui.Alignment BottomEnd;
+    property public final androidx.compose.ui.Alignment BottomStart;
+    property public final androidx.compose.ui.Alignment Center;
+    property public final androidx.compose.ui.Alignment CenterEnd;
+    property public final androidx.compose.ui.Alignment.Horizontal CenterHorizontally;
+    property public final androidx.compose.ui.Alignment CenterStart;
+    property public final androidx.compose.ui.Alignment.Vertical CenterVertically;
+    property public final androidx.compose.ui.Alignment.Horizontal End;
+    property public final androidx.compose.ui.Alignment.Horizontal Start;
+    property public final androidx.compose.ui.Alignment.Vertical Top;
+    property public final androidx.compose.ui.Alignment TopCenter;
+    property public final androidx.compose.ui.Alignment TopEnd;
+    property public final androidx.compose.ui.Alignment TopStart;
+  }
+
+  @androidx.compose.runtime.Stable public static fun interface Alignment.Horizontal {
+    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  @androidx.compose.runtime.Stable public static fun interface Alignment.Vertical {
+    method public int align(int size, int space);
+  }
+
+  @androidx.compose.runtime.Immutable public final class BiasAbsoluteAlignment implements androidx.compose.ui.Alignment {
+    ctor public BiasAbsoluteAlignment(float horizontalBias, float verticalBias);
+    method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public androidx.compose.ui.BiasAbsoluteAlignment copy(float horizontalBias, float verticalBias);
+  }
+
+  @androidx.compose.runtime.Immutable public static final class BiasAbsoluteAlignment.Horizontal implements androidx.compose.ui.Alignment.Horizontal {
+    ctor public BiasAbsoluteAlignment.Horizontal(float bias);
+    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public androidx.compose.ui.BiasAbsoluteAlignment.Horizontal copy(float bias);
+  }
+
+  @androidx.compose.runtime.Immutable public final class BiasAlignment implements androidx.compose.ui.Alignment {
+    ctor public BiasAlignment(float horizontalBias, float verticalBias);
+    method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.BiasAlignment copy(float horizontalBias, float verticalBias);
+    method public float getHorizontalBias();
+    method public float getVerticalBias();
+    property public final float horizontalBias;
+    property public final float verticalBias;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class BiasAlignment.Horizontal implements androidx.compose.ui.Alignment.Horizontal {
+    ctor public BiasAlignment.Horizontal(float bias);
+    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public androidx.compose.ui.BiasAlignment.Horizontal copy(float bias);
+  }
+
+  @androidx.compose.runtime.Immutable public static final class BiasAlignment.Vertical implements androidx.compose.ui.Alignment.Vertical {
+    ctor public BiasAlignment.Vertical(float bias);
+    method public int align(int size, int space);
+    method public androidx.compose.ui.BiasAlignment.Vertical copy(float bias);
+  }
+
+  public final class CombinedModifier implements androidx.compose.ui.Modifier {
+    ctor public CombinedModifier(androidx.compose.ui.Modifier outer, androidx.compose.ui.Modifier inner);
+    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.compose.ui.Modifier.Element,? extends R> operation);
+    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.compose.ui.Modifier.Element,? super R,? extends R> operation);
+  }
+
+  public final class ComposedModifierKt {
+    method public static androidx.compose.ui.Modifier composed(androidx.compose.ui.Modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier,? extends androidx.compose.ui.Modifier> factory);
+    method public static androidx.compose.ui.Modifier materialize(androidx.compose.runtime.Composer, androidx.compose.ui.Modifier modifier);
+  }
+
+  @androidx.compose.runtime.Stable public interface Modifier {
+    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.compose.ui.Modifier.Element,? extends R> operation);
+    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.compose.ui.Modifier.Element,? super R,? extends R> operation);
+    method public default infix androidx.compose.ui.Modifier then(androidx.compose.ui.Modifier other);
+    field public static final androidx.compose.ui.Modifier.Companion Companion;
+  }
+
+  public static final class Modifier.Companion implements androidx.compose.ui.Modifier {
+    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.compose.ui.Modifier.Element,? extends R> operation);
+    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.compose.ui.Modifier.Element,? super R,? extends R> operation);
+  }
+
+  public static interface Modifier.Element extends androidx.compose.ui.Modifier {
+    method public default boolean all(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public default boolean any(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public default <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.compose.ui.Modifier.Element,? extends R> operation);
+    method public default <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.compose.ui.Modifier.Element,? super R,? extends R> operation);
+  }
+
+  public final class TempListUtilsKt {
+  }
+
+  public final class ZIndexModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier zIndex(androidx.compose.ui.Modifier, float zIndex);
+  }
+
+}
+
+package androidx.compose.ui.autofill {
+
+  public final class AndroidAutofillType_androidKt {
+  }
+
+  public final class AndroidAutofill_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.draw {
+
+  public final class AlphaKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier alpha(androidx.compose.ui.Modifier, float alpha);
+  }
+
+  public final class BlurKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier blur(androidx.compose.ui.Modifier, float radiusX, float radiusY, optional androidx.compose.ui.graphics.Shape edgeTreatment);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier blur(androidx.compose.ui.Modifier, float radius, optional androidx.compose.ui.graphics.Shape edgeTreatment);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class BlurredEdgeTreatment {
+    ctor public BlurredEdgeTreatment();
+    method public androidx.compose.ui.graphics.Shape? getShape();
+    property public final androidx.compose.ui.graphics.Shape? shape;
+  }
+
+  public static final class BlurredEdgeTreatment.Companion {
+    method public androidx.compose.ui.graphics.Shape getRectangle();
+    method public androidx.compose.ui.graphics.Shape getUnbounded();
+    property public final androidx.compose.ui.graphics.Shape Rectangle;
+    property public final androidx.compose.ui.graphics.Shape Unbounded;
+  }
+
+  public interface BuildDrawCacheParams {
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public long getSize();
+    property public abstract androidx.compose.ui.unit.Density density;
+    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public abstract long size;
+  }
+
+  public final class CacheDrawScope implements androidx.compose.ui.unit.Density {
+    method public float getDensity();
+    method public float getFontScale();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public long getSize();
+    method public androidx.compose.ui.draw.DrawResult onDrawBehind(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public androidx.compose.ui.draw.DrawResult onDrawWithContent(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.ContentDrawScope,kotlin.Unit> block);
+    property public float density;
+    property public float fontScale;
+    property public final androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public final long size;
+  }
+
+  public final class ClipKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier clip(androidx.compose.ui.Modifier, androidx.compose.ui.graphics.Shape shape);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier clipToBounds(androidx.compose.ui.Modifier);
+  }
+
+  public interface DrawCacheModifier extends androidx.compose.ui.draw.DrawModifier {
+    method public void onBuildCache(androidx.compose.ui.draw.BuildDrawCacheParams params);
+  }
+
+  public interface DrawModifier extends androidx.compose.ui.Modifier.Element {
+    method public void draw(androidx.compose.ui.graphics.drawscope.ContentDrawScope);
+  }
+
+  public final class DrawModifierKt {
+    method public static androidx.compose.ui.Modifier drawBehind(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> onDraw);
+    method public static androidx.compose.ui.Modifier drawWithCache(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.draw.CacheDrawScope,androidx.compose.ui.draw.DrawResult> onBuildDrawCache);
+    method public static androidx.compose.ui.Modifier drawWithContent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.ContentDrawScope,kotlin.Unit> onDraw);
+  }
+
+  public final class DrawResult {
+  }
+
+  public final class PainterModifierKt {
+    method public static androidx.compose.ui.Modifier paint(androidx.compose.ui.Modifier, androidx.compose.ui.graphics.painter.Painter painter, optional boolean sizeToIntrinsics, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+  }
+
+  public final class RotateKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier rotate(androidx.compose.ui.Modifier, float degrees);
+  }
+
+  public final class ScaleKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier scale(androidx.compose.ui.Modifier, float scaleX, float scaleY);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier scale(androidx.compose.ui.Modifier, float scale);
+  }
+
+  public final class ShadowKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier shadow(androidx.compose.ui.Modifier, float elevation, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip);
+  }
+
+}
+
+package androidx.compose.ui.focus {
+
+  public final class FocusChangedModifierKt {
+    method public static androidx.compose.ui.Modifier onFocusChanged(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusState,kotlin.Unit> onFocusChanged);
+  }
+
+  public final inline class FocusDirection {
+    ctor public FocusDirection();
+  }
+
+  public static final class FocusDirection.Companion {
+    method public int getDown();
+    method public int getIn();
+    method public int getLeft();
+    method public int getNext();
+    method public int getOut();
+    method public int getPrevious();
+    method public int getRight();
+    method public int getUp();
+    property public final int Down;
+    property public final int In;
+    property public final int Left;
+    property public final int Next;
+    property public final int Out;
+    property public final int Previous;
+    property public final int Right;
+    property public final int Up;
+  }
+
+  public interface FocusEventModifier extends androidx.compose.ui.Modifier.Element {
+    method public void onFocusEvent(androidx.compose.ui.focus.FocusState focusState);
+  }
+
+  public final class FocusEventModifierKt {
+    method public static androidx.compose.ui.Modifier onFocusEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusState,kotlin.Unit> onFocusEvent);
+  }
+
+  public interface FocusManager {
+    method public void clearFocus(optional boolean force);
+    method public boolean moveFocus(int focusDirection);
+  }
+
+  public final class FocusManagerKt {
+  }
+
+  public final class FocusModifierKt {
+    method @Deprecated public static androidx.compose.ui.Modifier focusModifier(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier focusTarget(androidx.compose.ui.Modifier);
+  }
+
+  public final class FocusNodeUtilsKt {
+  }
+
+  public final class FocusOrder {
+    ctor public FocusOrder();
+    method public androidx.compose.ui.focus.FocusRequester getDown();
+    method public androidx.compose.ui.focus.FocusRequester getEnd();
+    method public androidx.compose.ui.focus.FocusRequester getLeft();
+    method public androidx.compose.ui.focus.FocusRequester getNext();
+    method public androidx.compose.ui.focus.FocusRequester getPrevious();
+    method public androidx.compose.ui.focus.FocusRequester getRight();
+    method public androidx.compose.ui.focus.FocusRequester getStart();
+    method public androidx.compose.ui.focus.FocusRequester getUp();
+    method public void setDown(androidx.compose.ui.focus.FocusRequester down);
+    method public void setEnd(androidx.compose.ui.focus.FocusRequester end);
+    method public void setLeft(androidx.compose.ui.focus.FocusRequester left);
+    method public void setNext(androidx.compose.ui.focus.FocusRequester next);
+    method public void setPrevious(androidx.compose.ui.focus.FocusRequester previous);
+    method public void setRight(androidx.compose.ui.focus.FocusRequester right);
+    method public void setStart(androidx.compose.ui.focus.FocusRequester start);
+    method public void setUp(androidx.compose.ui.focus.FocusRequester up);
+    property public final androidx.compose.ui.focus.FocusRequester down;
+    property public final androidx.compose.ui.focus.FocusRequester end;
+    property public final androidx.compose.ui.focus.FocusRequester left;
+    property public final androidx.compose.ui.focus.FocusRequester next;
+    property public final androidx.compose.ui.focus.FocusRequester previous;
+    property public final androidx.compose.ui.focus.FocusRequester right;
+    property public final androidx.compose.ui.focus.FocusRequester start;
+    property public final androidx.compose.ui.focus.FocusRequester up;
+  }
+
+  public interface FocusOrderModifier extends androidx.compose.ui.Modifier.Element {
+    method public void populateFocusOrder(androidx.compose.ui.focus.FocusOrder focusOrder);
+  }
+
+  public final class FocusOrderModifierKt {
+    method public static androidx.compose.ui.Modifier focusOrder(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusOrder,kotlin.Unit> focusOrderReceiver);
+    method public static androidx.compose.ui.Modifier focusOrder(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester);
+    method public static androidx.compose.ui.Modifier focusOrder(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusOrder,kotlin.Unit> focusOrderReceiver);
+  }
+
+  public interface FocusProperties {
+    method public boolean getCanFocus();
+    method public void setCanFocus(boolean canFocus);
+    property public abstract boolean canFocus;
+  }
+
+  public final class FocusPropertiesKt {
+    method public static androidx.compose.ui.Modifier focusProperties(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusProperties,kotlin.Unit> scope);
+  }
+
+  public final class FocusRequester {
+    ctor public FocusRequester();
+    method public boolean captureFocus();
+    method public boolean freeFocus();
+    method public void requestFocus();
+    field public static final androidx.compose.ui.focus.FocusRequester.Companion Companion;
+  }
+
+  public static final class FocusRequester.Companion {
+    method public androidx.compose.ui.focus.FocusRequester getDefault();
+    property public final androidx.compose.ui.focus.FocusRequester Default;
+  }
+
+  public final class FocusRequesterKt {
+  }
+
+  public interface FocusRequesterModifier extends androidx.compose.ui.Modifier.Element {
+    method public androidx.compose.ui.focus.FocusRequester getFocusRequester();
+    property public abstract androidx.compose.ui.focus.FocusRequester focusRequester;
+  }
+
+  public final class FocusRequesterModifierKt {
+    method public static androidx.compose.ui.Modifier focusRequester(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester);
+  }
+
+  public interface FocusState {
+    method public boolean getHasFocus();
+    method public boolean isCaptured();
+    method public boolean isFocused();
+    property public abstract boolean hasFocus;
+    property public abstract boolean isCaptured;
+    property public abstract boolean isFocused;
+  }
+
+  public final class FocusTransactionsKt {
+  }
+
+  public final class FocusTraversalKt {
+  }
+
+  public final class OneDimensionalFocusSearchKt {
+  }
+
+  public final class TwoDimensionalFocusSearchKt {
+  }
+
+}
+
+package androidx.compose.ui.graphics {
+
+  public final class GraphicsLayerModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional androidx.compose.ui.graphics.RenderEffect? renderEffect);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> block);
+    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier toolingGraphicsLayer(androidx.compose.ui.Modifier);
+  }
+
+  public interface GraphicsLayerScope extends androidx.compose.ui.unit.Density {
+    method public float getAlpha();
+    method public float getCameraDistance();
+    method public boolean getClip();
+    method public default androidx.compose.ui.graphics.RenderEffect? getRenderEffect();
+    method public float getRotationX();
+    method public float getRotationY();
+    method public float getRotationZ();
+    method public float getScaleX();
+    method public float getScaleY();
+    method public float getShadowElevation();
+    method public androidx.compose.ui.graphics.Shape getShape();
+    method public long getTransformOrigin();
+    method public float getTranslationX();
+    method public float getTranslationY();
+    method public void setAlpha(float alpha);
+    method public void setCameraDistance(float cameraDistance);
+    method public void setClip(boolean clip);
+    method public default void setRenderEffect(androidx.compose.ui.graphics.RenderEffect? _);
+    method public void setRotationX(float rotationX);
+    method public void setRotationY(float rotationY);
+    method public void setRotationZ(float rotationZ);
+    method public void setScaleX(float scaleX);
+    method public void setScaleY(float scaleY);
+    method public void setShadowElevation(float shadowElevation);
+    method public void setShape(androidx.compose.ui.graphics.Shape shape);
+    method public void setTransformOrigin(long transformOrigin);
+    method public void setTranslationX(float translationX);
+    method public void setTranslationY(float translationY);
+    property public abstract float alpha;
+    property public abstract float cameraDistance;
+    property public abstract boolean clip;
+    property public default androidx.compose.ui.graphics.RenderEffect? renderEffect;
+    property public abstract float rotationX;
+    property public abstract float rotationY;
+    property public abstract float rotationZ;
+    property public abstract float scaleX;
+    property public abstract float scaleY;
+    property public abstract float shadowElevation;
+    property public abstract androidx.compose.ui.graphics.Shape shape;
+    property public abstract long transformOrigin;
+    property public abstract float translationX;
+    property public abstract float translationY;
+  }
+
+  public final class GraphicsLayerScopeKt {
+    method public static androidx.compose.ui.graphics.GraphicsLayerScope GraphicsLayerScope();
+    field public static final float DefaultCameraDistance = 8.0f;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class TransformOrigin {
+    ctor public TransformOrigin();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+  }
+
+  public static final class TransformOrigin.Companion {
+    method public long getCenter();
+    property public final long Center;
+  }
+
+  public final class TransformOriginKt {
+    method public static long TransformOrigin(float pivotFractionX, float pivotFractionY);
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector {
+
+  @androidx.compose.runtime.Immutable public final class ImageVector {
+    method public float getDefaultHeight();
+    method public float getDefaultWidth();
+    method public String getName();
+    method public androidx.compose.ui.graphics.vector.VectorGroup getRoot();
+    method public int getTintBlendMode();
+    method public long getTintColor();
+    method public float getViewportHeight();
+    method public float getViewportWidth();
+    property public final float defaultHeight;
+    property public final float defaultWidth;
+    property public final String name;
+    property public final androidx.compose.ui.graphics.vector.VectorGroup root;
+    property public final int tintBlendMode;
+    property public final long tintColor;
+    property public final float viewportHeight;
+    property public final float viewportWidth;
+    field public static final androidx.compose.ui.graphics.vector.ImageVector.Companion Companion;
+  }
+
+  public static final class ImageVector.Builder {
+    ctor public ImageVector.Builder(optional String name, float defaultWidth, float defaultHeight, float viewportWidth, float viewportHeight, optional long tintColor, optional int tintBlendMode);
+    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addGroup(optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData);
+    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addPath(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+    method public androidx.compose.ui.graphics.vector.ImageVector build();
+    method public androidx.compose.ui.graphics.vector.ImageVector.Builder clearGroup();
+  }
+
+  public static final class ImageVector.Companion {
+  }
+
+  public final class ImageVectorKt {
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder group(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,kotlin.Unit> block);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder path(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+  }
+
+  public abstract sealed class VNode {
+    method public abstract void draw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    method public final void invalidate();
+  }
+
+  public final class VectorApplier extends androidx.compose.runtime.AbstractApplier<androidx.compose.ui.graphics.vector.VNode> {
+    ctor public VectorApplier(androidx.compose.ui.graphics.vector.VNode root);
+    method public void insertBottomUp(int index, androidx.compose.ui.graphics.vector.VNode instance);
+    method public void insertTopDown(int index, androidx.compose.ui.graphics.vector.VNode instance);
+    method public void move(int from, int to, int count);
+    method protected void onClear();
+    method public void remove(int index, int count);
+  }
+
+  public final class VectorComposeKt {
+    method @androidx.compose.runtime.Composable public static void Group(optional String name, optional float rotation, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Path(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+  }
+
+  public interface VectorConfig {
+    method public default <T> T! getOrDefault(androidx.compose.ui.graphics.vector.VectorProperty<T> property, T? defaultValue);
+  }
+
+  @androidx.compose.runtime.Immutable public final class VectorGroup extends androidx.compose.ui.graphics.vector.VectorNode implements java.lang.Iterable<androidx.compose.ui.graphics.vector.VectorNode> kotlin.jvm.internal.markers.KMappedMarker {
+    method public operator androidx.compose.ui.graphics.vector.VectorNode get(int index);
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getClipPathData();
+    method public String getName();
+    method public float getPivotX();
+    method public float getPivotY();
+    method public float getRotation();
+    method public float getScaleX();
+    method public float getScaleY();
+    method public int getSize();
+    method public float getTranslationX();
+    method public float getTranslationY();
+    method public java.util.Iterator<androidx.compose.ui.graphics.vector.VectorNode> iterator();
+    property public final java.util.List<androidx.compose.ui.graphics.vector.PathNode> clipPathData;
+    property public final String name;
+    property public final float pivotX;
+    property public final float pivotY;
+    property public final float rotation;
+    property public final float scaleX;
+    property public final float scaleY;
+    property public final int size;
+    property public final float translationX;
+    property public final float translationY;
+  }
+
+  public final class VectorKt {
+    method public static inline java.util.List<androidx.compose.ui.graphics.vector.PathNode> PathData(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
+    method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> addPathNodes(String? pathStr);
+    method public static int getDefaultFillType();
+    method public static int getDefaultStrokeLineCap();
+    method public static int getDefaultStrokeLineJoin();
+    method public static int getDefaultTintBlendMode();
+    method public static long getDefaultTintColor();
+    method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> getEmptyPath();
+    property public static final int DefaultFillType;
+    property public static final int DefaultStrokeLineCap;
+    property public static final int DefaultStrokeLineJoin;
+    property public static final int DefaultTintBlendMode;
+    property public static final long DefaultTintColor;
+    property public static final java.util.List<androidx.compose.ui.graphics.vector.PathNode> EmptyPath;
+    field public static final String DefaultGroupName = "";
+    field public static final String DefaultPathName = "";
+    field public static final float DefaultPivotX = 0.0f;
+    field public static final float DefaultPivotY = 0.0f;
+    field public static final float DefaultRotation = 0.0f;
+    field public static final float DefaultScaleX = 1.0f;
+    field public static final float DefaultScaleY = 1.0f;
+    field public static final float DefaultStrokeLineMiter = 4.0f;
+    field public static final float DefaultStrokeLineWidth = 0.0f;
+    field public static final float DefaultTranslationX = 0.0f;
+    field public static final float DefaultTranslationY = 0.0f;
+    field public static final float DefaultTrimPathEnd = 1.0f;
+    field public static final float DefaultTrimPathOffset = 0.0f;
+    field public static final float DefaultTrimPathStart = 0.0f;
+  }
+
+  public abstract sealed class VectorNode {
+  }
+
+  public final class VectorPainter extends androidx.compose.ui.graphics.painter.Painter {
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public long intrinsicSize;
+  }
+
+  public final class VectorPainterKt {
+    method @androidx.compose.runtime.Composable public static void RenderVectorGroup(androidx.compose.ui.graphics.vector.VectorGroup group, optional java.util.Map<java.lang.String,? extends androidx.compose.ui.graphics.vector.VectorConfig> configs);
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional int tintBlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(androidx.compose.ui.graphics.vector.ImageVector image);
+    field public static final String RootGroupName = "VectorRootGroup";
+  }
+
+  @androidx.compose.runtime.Immutable public final class VectorPath extends androidx.compose.ui.graphics.vector.VectorNode {
+    method public androidx.compose.ui.graphics.Brush? getFill();
+    method public float getFillAlpha();
+    method public String getName();
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getPathData();
+    method public int getPathFillType();
+    method public androidx.compose.ui.graphics.Brush? getStroke();
+    method public float getStrokeAlpha();
+    method public int getStrokeLineCap();
+    method public int getStrokeLineJoin();
+    method public float getStrokeLineMiter();
+    method public float getStrokeLineWidth();
+    method public float getTrimPathEnd();
+    method public float getTrimPathOffset();
+    method public float getTrimPathStart();
+    property public final androidx.compose.ui.graphics.Brush? fill;
+    property public final float fillAlpha;
+    property public final String name;
+    property public final java.util.List<androidx.compose.ui.graphics.vector.PathNode> pathData;
+    property public final int pathFillType;
+    property public final androidx.compose.ui.graphics.Brush? stroke;
+    property public final float strokeAlpha;
+    property public final int strokeLineCap;
+    property public final int strokeLineJoin;
+    property public final float strokeLineMiter;
+    property public final float strokeLineWidth;
+    property public final float trimPathEnd;
+    property public final float trimPathOffset;
+    property public final float trimPathStart;
+  }
+
+  public abstract sealed class VectorProperty<T> {
+  }
+
+  public static final class VectorProperty.Fill extends androidx.compose.ui.graphics.vector.VectorProperty<androidx.compose.ui.graphics.Brush> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.Fill INSTANCE;
+  }
+
+  public static final class VectorProperty.FillAlpha extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.FillAlpha INSTANCE;
+  }
+
+  public static final class VectorProperty.PathData extends androidx.compose.ui.graphics.vector.VectorProperty<java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode>> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.PathData INSTANCE;
+  }
+
+  public static final class VectorProperty.PivotX extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.PivotX INSTANCE;
+  }
+
+  public static final class VectorProperty.PivotY extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.PivotY INSTANCE;
+  }
+
+  public static final class VectorProperty.Rotation extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.Rotation INSTANCE;
+  }
+
+  public static final class VectorProperty.ScaleX extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.ScaleX INSTANCE;
+  }
+
+  public static final class VectorProperty.ScaleY extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.ScaleY INSTANCE;
+  }
+
+  public static final class VectorProperty.Stroke extends androidx.compose.ui.graphics.vector.VectorProperty<androidx.compose.ui.graphics.Brush> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.Stroke INSTANCE;
+  }
+
+  public static final class VectorProperty.StrokeAlpha extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.StrokeAlpha INSTANCE;
+  }
+
+  public static final class VectorProperty.StrokeLineWidth extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.StrokeLineWidth INSTANCE;
+  }
+
+  public static final class VectorProperty.TranslateX extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TranslateX INSTANCE;
+  }
+
+  public static final class VectorProperty.TranslateY extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TranslateY INSTANCE;
+  }
+
+  public static final class VectorProperty.TrimPathEnd extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TrimPathEnd INSTANCE;
+  }
+
+  public static final class VectorProperty.TrimPathOffset extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TrimPathOffset INSTANCE;
+  }
+
+  public static final class VectorProperty.TrimPathStart extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TrimPathStart INSTANCE;
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector.compat {
+
+  public final class XmlVectorParser_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.hapticfeedback {
+
+  public interface HapticFeedback {
+    method public void performHapticFeedback(int hapticFeedbackType);
+  }
+
+  public final inline class HapticFeedbackType {
+    ctor public HapticFeedbackType();
+  }
+
+  public static final class HapticFeedbackType.Companion {
+    method public int getLongPress();
+    method public int getTextHandleMove();
+    method public java.util.List<androidx.compose.ui.hapticfeedback.HapticFeedbackType> values();
+    property public final int LongPress;
+    property public final int TextHandleMove;
+  }
+
+}
+
+package androidx.compose.ui.input {
+
+  public final inline class InputMode {
+    ctor public InputMode();
+  }
+
+  public static final class InputMode.Companion {
+    method public int getKeyboard();
+    method public int getTouch();
+    property public final int Keyboard;
+    property public final int Touch;
+  }
+
+  public interface InputModeManager {
+    method public int getInputMode();
+    property public abstract int inputMode;
+  }
+
+}
+
+package androidx.compose.ui.input.key {
+
+  public final inline class Key {
+    ctor public Key();
+    method public long getKeyCode();
+    property public final long keyCode;
+  }
+
+  public static final class Key.Companion {
+    method public long getA();
+    method public long getAllApps();
+    method public long getAltLeft();
+    method public long getAltRight();
+    method public long getApostrophe();
+    method public long getAppSwitch();
+    method public long getAssist();
+    method public long getAt();
+    method public long getAvReceiverInput();
+    method public long getAvReceiverPower();
+    method public long getB();
+    method public long getBack();
+    method public long getBackslash();
+    method public long getBackspace();
+    method public long getBookmark();
+    method public long getBreak();
+    method public long getBrightnessDown();
+    method public long getBrightnessUp();
+    method public long getBrowser();
+    method public long getButton1();
+    method public long getButton10();
+    method public long getButton11();
+    method public long getButton12();
+    method public long getButton13();
+    method public long getButton14();
+    method public long getButton15();
+    method public long getButton16();
+    method public long getButton2();
+    method public long getButton3();
+    method public long getButton4();
+    method public long getButton5();
+    method public long getButton6();
+    method public long getButton7();
+    method public long getButton8();
+    method public long getButton9();
+    method public long getButtonA();
+    method public long getButtonB();
+    method public long getButtonC();
+    method public long getButtonL1();
+    method public long getButtonL2();
+    method public long getButtonMode();
+    method public long getButtonR1();
+    method public long getButtonR2();
+    method public long getButtonSelect();
+    method public long getButtonStart();
+    method public long getButtonThumbLeft();
+    method public long getButtonThumbRight();
+    method public long getButtonX();
+    method public long getButtonY();
+    method public long getButtonZ();
+    method public long getC();
+    method public long getCalculator();
+    method public long getCalendar();
+    method public long getCall();
+    method public long getCamera();
+    method public long getCapsLock();
+    method public long getCaptions();
+    method public long getChannelDown();
+    method public long getChannelUp();
+    method public long getClear();
+    method public long getComma();
+    method public long getContacts();
+    method public long getCopy();
+    method public long getCtrlLeft();
+    method public long getCtrlRight();
+    method public long getCut();
+    method public long getD();
+    method public long getDelete();
+    method public long getDirectionCenter();
+    method public long getDirectionDown();
+    method public long getDirectionDownLeft();
+    method public long getDirectionDownRight();
+    method public long getDirectionLeft();
+    method public long getDirectionRight();
+    method public long getDirectionUp();
+    method public long getDirectionUpLeft();
+    method public long getDirectionUpRight();
+    method public long getDvr();
+    method public long getE();
+    method public long getEight();
+    method public long getEisu();
+    method public long getEndCall();
+    method public long getEnter();
+    method public long getEnvelope();
+    method public long getEquals();
+    method public long getEscape();
+    method public long getF();
+    method public long getF1();
+    method public long getF10();
+    method public long getF11();
+    method public long getF12();
+    method public long getF2();
+    method public long getF3();
+    method public long getF4();
+    method public long getF5();
+    method public long getF6();
+    method public long getF7();
+    method public long getF8();
+    method public long getF9();
+    method public long getFive();
+    method public long getFocus();
+    method public long getForward();
+    method public long getFour();
+    method public long getFunction();
+    method public long getG();
+    method public long getGrave();
+    method public long getGuide();
+    method public long getH();
+    method public long getHeadsetHook();
+    method public long getHelp();
+    method public long getHenkan();
+    method public long getHome();
+    method public long getI();
+    method public long getInfo();
+    method public long getInsert();
+    method public long getJ();
+    method public long getK();
+    method public long getKana();
+    method public long getKatakanaHiragana();
+    method public long getL();
+    method public long getLanguageSwitch();
+    method public long getLastChannel();
+    method public long getLeftBracket();
+    method public long getM();
+    method public long getMannerMode();
+    method public long getMediaAudioTrack();
+    method public long getMediaClose();
+    method public long getMediaEject();
+    method public long getMediaFastForward();
+    method public long getMediaNext();
+    method public long getMediaPause();
+    method public long getMediaPlay();
+    method public long getMediaPlayPause();
+    method public long getMediaPrevious();
+    method public long getMediaRecord();
+    method public long getMediaRewind();
+    method public long getMediaSkipBackward();
+    method public long getMediaSkipForward();
+    method public long getMediaStepBackward();
+    method public long getMediaStepForward();
+    method public long getMediaStop();
+    method public long getMediaTopMenu();
+    method public long getMenu();
+    method public long getMetaLeft();
+    method public long getMetaRight();
+    method public long getMicrophoneMute();
+    method public long getMinus();
+    method public long getMoveEnd();
+    method public long getMoveHome();
+    method public long getMuhenkan();
+    method public long getMultiply();
+    method public long getMusic();
+    method public long getN();
+    method public long getNavigateIn();
+    method public long getNavigateNext();
+    method public long getNavigateOut();
+    method public long getNavigatePrevious();
+    method public long getNine();
+    method public long getNotification();
+    method public long getNumLock();
+    method public long getNumPad0();
+    method public long getNumPad1();
+    method public long getNumPad2();
+    method public long getNumPad3();
+    method public long getNumPad4();
+    method public long getNumPad5();
+    method public long getNumPad6();
+    method public long getNumPad7();
+    method public long getNumPad8();
+    method public long getNumPad9();
+    method public long getNumPadAdd();
+    method public long getNumPadComma();
+    method public long getNumPadDivide();
+    method public long getNumPadDot();
+    method public long getNumPadEnter();
+    method public long getNumPadEquals();
+    method public long getNumPadLeftParenthesis();
+    method public long getNumPadMultiply();
+    method public long getNumPadRightParenthesis();
+    method public long getNumPadSubtract();
+    method public long getNumber();
+    method public long getO();
+    method public long getOne();
+    method public long getP();
+    method public long getPageDown();
+    method public long getPageUp();
+    method public long getPairing();
+    method public long getPaste();
+    method public long getPeriod();
+    method public long getPictureSymbols();
+    method public long getPlus();
+    method public long getPound();
+    method public long getPower();
+    method public long getPrintScreen();
+    method public long getProfileSwitch();
+    method public long getProgramBlue();
+    method public long getProgramGreen();
+    method public long getProgramRed();
+    method public long getProgramYellow();
+    method public long getQ();
+    method public long getR();
+    method public long getRefresh();
+    method public long getRightBracket();
+    method public long getRo();
+    method public long getS();
+    method public long getScrollLock();
+    method public long getSearch();
+    method public long getSemicolon();
+    method public long getSetTopBoxInput();
+    method public long getSetTopBoxPower();
+    method public long getSettings();
+    method public long getSeven();
+    method public long getShiftLeft();
+    method public long getShiftRight();
+    method public long getSix();
+    method public long getSlash();
+    method public long getSleep();
+    method public long getSoftLeft();
+    method public long getSoftRight();
+    method public long getSoftSleep();
+    method public long getSpacebar();
+    method public long getStem1();
+    method public long getStem2();
+    method public long getStem3();
+    method public long getStemPrimary();
+    method public long getSwitchCharset();
+    method public long getSymbol();
+    method public long getSystemNavigationDown();
+    method public long getSystemNavigationLeft();
+    method public long getSystemNavigationRight();
+    method public long getSystemNavigationUp();
+    method public long getT();
+    method public long getTab();
+    method public long getThree();
+    method public long getThumbsDown();
+    method public long getThumbsUp();
+    method public long getToggle2D3D();
+    method public long getTv();
+    method public long getTvAntennaCable();
+    method public long getTvAudioDescription();
+    method public long getTvAudioDescriptionMixingVolumeDown();
+    method public long getTvAudioDescriptionMixingVolumeUp();
+    method public long getTvContentsMenu();
+    method public long getTvDataService();
+    method public long getTvInput();
+    method public long getTvInputComponent1();
+    method public long getTvInputComponent2();
+    method public long getTvInputComposite1();
+    method public long getTvInputComposite2();
+    method public long getTvInputHdmi1();
+    method public long getTvInputHdmi2();
+    method public long getTvInputHdmi3();
+    method public long getTvInputHdmi4();
+    method public long getTvInputVga1();
+    method public long getTvMediaContextMenu();
+    method public long getTvNetwork();
+    method public long getTvNumberEntry();
+    method public long getTvPower();
+    method public long getTvRadioService();
+    method public long getTvSatellite();
+    method public long getTvSatelliteBs();
+    method public long getTvSatelliteCs();
+    method public long getTvSatelliteService();
+    method public long getTvTeletext();
+    method public long getTvTerrestrialAnalog();
+    method public long getTvTerrestrialDigital();
+    method public long getTvTimerProgramming();
+    method public long getTvZoomMode();
+    method public long getTwo();
+    method public long getU();
+    method public long getUnknown();
+    method public long getV();
+    method public long getVoiceAssist();
+    method public long getVolumeDown();
+    method public long getVolumeMute();
+    method public long getVolumeUp();
+    method public long getW();
+    method public long getWakeUp();
+    method public long getWindow();
+    method public long getX();
+    method public long getY();
+    method public long getYen();
+    method public long getZ();
+    method public long getZenkakuHankaru();
+    method public long getZero();
+    method public long getZoomIn();
+    method public long getZoomOut();
+    property public final long A;
+    property public final long AllApps;
+    property public final long AltLeft;
+    property public final long AltRight;
+    property public final long Apostrophe;
+    property public final long AppSwitch;
+    property public final long Assist;
+    property public final long At;
+    property public final long AvReceiverInput;
+    property public final long AvReceiverPower;
+    property public final long B;
+    property public final long Back;
+    property public final long Backslash;
+    property public final long Backspace;
+    property public final long Bookmark;
+    property public final long Break;
+    property public final long BrightnessDown;
+    property public final long BrightnessUp;
+    property public final long Browser;
+    property public final long Button1;
+    property public final long Button10;
+    property public final long Button11;
+    property public final long Button12;
+    property public final long Button13;
+    property public final long Button14;
+    property public final long Button15;
+    property public final long Button16;
+    property public final long Button2;
+    property public final long Button3;
+    property public final long Button4;
+    property public final long Button5;
+    property public final long Button6;
+    property public final long Button7;
+    property public final long Button8;
+    property public final long Button9;
+    property public final long ButtonA;
+    property public final long ButtonB;
+    property public final long ButtonC;
+    property public final long ButtonL1;
+    property public final long ButtonL2;
+    property public final long ButtonMode;
+    property public final long ButtonR1;
+    property public final long ButtonR2;
+    property public final long ButtonSelect;
+    property public final long ButtonStart;
+    property public final long ButtonThumbLeft;
+    property public final long ButtonThumbRight;
+    property public final long ButtonX;
+    property public final long ButtonY;
+    property public final long ButtonZ;
+    property public final long C;
+    property public final long Calculator;
+    property public final long Calendar;
+    property public final long Call;
+    property public final long Camera;
+    property public final long CapsLock;
+    property public final long Captions;
+    property public final long ChannelDown;
+    property public final long ChannelUp;
+    property public final long Clear;
+    property public final long Comma;
+    property public final long Contacts;
+    property public final long Copy;
+    property public final long CtrlLeft;
+    property public final long CtrlRight;
+    property public final long Cut;
+    property public final long D;
+    property public final long Delete;
+    property public final long DirectionCenter;
+    property public final long DirectionDown;
+    property public final long DirectionDownLeft;
+    property public final long DirectionDownRight;
+    property public final long DirectionLeft;
+    property public final long DirectionRight;
+    property public final long DirectionUp;
+    property public final long DirectionUpLeft;
+    property public final long DirectionUpRight;
+    property public final long Dvr;
+    property public final long E;
+    property public final long Eight;
+    property public final long Eisu;
+    property public final long EndCall;
+    property public final long Enter;
+    property public final long Envelope;
+    property public final long Equals;
+    property public final long Escape;
+    property public final long F;
+    property public final long F1;
+    property public final long F10;
+    property public final long F11;
+    property public final long F12;
+    property public final long F2;
+    property public final long F3;
+    property public final long F4;
+    property public final long F5;
+    property public final long F6;
+    property public final long F7;
+    property public final long F8;
+    property public final long F9;
+    property public final long Five;
+    property public final long Focus;
+    property public final long Forward;
+    property public final long Four;
+    property public final long Function;
+    property public final long G;
+    property public final long Grave;
+    property public final long Guide;
+    property public final long H;
+    property public final long HeadsetHook;
+    property public final long Help;
+    property public final long Henkan;
+    property public final long Home;
+    property public final long I;
+    property public final long Info;
+    property public final long Insert;
+    property public final long J;
+    property public final long K;
+    property public final long Kana;
+    property public final long KatakanaHiragana;
+    property public final long L;
+    property public final long LanguageSwitch;
+    property public final long LastChannel;
+    property public final long LeftBracket;
+    property public final long M;
+    property public final long MannerMode;
+    property public final long MediaAudioTrack;
+    property public final long MediaClose;
+    property public final long MediaEject;
+    property public final long MediaFastForward;
+    property public final long MediaNext;
+    property public final long MediaPause;
+    property public final long MediaPlay;
+    property public final long MediaPlayPause;
+    property public final long MediaPrevious;
+    property public final long MediaRecord;
+    property public final long MediaRewind;
+    property public final long MediaSkipBackward;
+    property public final long MediaSkipForward;
+    property public final long MediaStepBackward;
+    property public final long MediaStepForward;
+    property public final long MediaStop;
+    property public final long MediaTopMenu;
+    property public final long Menu;
+    property public final long MetaLeft;
+    property public final long MetaRight;
+    property public final long MicrophoneMute;
+    property public final long Minus;
+    property public final long MoveEnd;
+    property public final long MoveHome;
+    property public final long Muhenkan;
+    property public final long Multiply;
+    property public final long Music;
+    property public final long N;
+    property public final long NavigateIn;
+    property public final long NavigateNext;
+    property public final long NavigateOut;
+    property public final long NavigatePrevious;
+    property public final long Nine;
+    property public final long Notification;
+    property public final long NumLock;
+    property public final long NumPad0;
+    property public final long NumPad1;
+    property public final long NumPad2;
+    property public final long NumPad3;
+    property public final long NumPad4;
+    property public final long NumPad5;
+    property public final long NumPad6;
+    property public final long NumPad7;
+    property public final long NumPad8;
+    property public final long NumPad9;
+    property public final long NumPadAdd;
+    property public final long NumPadComma;
+    property public final long NumPadDivide;
+    property public final long NumPadDot;
+    property public final long NumPadEnter;
+    property public final long NumPadEquals;
+    property public final long NumPadLeftParenthesis;
+    property public final long NumPadMultiply;
+    property public final long NumPadRightParenthesis;
+    property public final long NumPadSubtract;
+    property public final long Number;
+    property public final long O;
+    property public final long One;
+    property public final long P;
+    property public final long PageDown;
+    property public final long PageUp;
+    property public final long Pairing;
+    property public final long Paste;
+    property public final long Period;
+    property public final long PictureSymbols;
+    property public final long Plus;
+    property public final long Pound;
+    property public final long Power;
+    property public final long PrintScreen;
+    property public final long ProfileSwitch;
+    property public final long ProgramBlue;
+    property public final long ProgramGreen;
+    property public final long ProgramRed;
+    property public final long ProgramYellow;
+    property public final long Q;
+    property public final long R;
+    property public final long Refresh;
+    property public final long RightBracket;
+    property public final long Ro;
+    property public final long S;
+    property public final long ScrollLock;
+    property public final long Search;
+    property public final long Semicolon;
+    property public final long SetTopBoxInput;
+    property public final long SetTopBoxPower;
+    property public final long Settings;
+    property public final long Seven;
+    property public final long ShiftLeft;
+    property public final long ShiftRight;
+    property public final long Six;
+    property public final long Slash;
+    property public final long Sleep;
+    property public final long SoftLeft;
+    property public final long SoftRight;
+    property public final long SoftSleep;
+    property public final long Spacebar;
+    property public final long Stem1;
+    property public final long Stem2;
+    property public final long Stem3;
+    property public final long StemPrimary;
+    property public final long SwitchCharset;
+    property public final long Symbol;
+    property public final long SystemNavigationDown;
+    property public final long SystemNavigationLeft;
+    property public final long SystemNavigationRight;
+    property public final long SystemNavigationUp;
+    property public final long T;
+    property public final long Tab;
+    property public final long Three;
+    property public final long ThumbsDown;
+    property public final long ThumbsUp;
+    property public final long Toggle2D3D;
+    property public final long Tv;
+    property public final long TvAntennaCable;
+    property public final long TvAudioDescription;
+    property public final long TvAudioDescriptionMixingVolumeDown;
+    property public final long TvAudioDescriptionMixingVolumeUp;
+    property public final long TvContentsMenu;
+    property public final long TvDataService;
+    property public final long TvInput;
+    property public final long TvInputComponent1;
+    property public final long TvInputComponent2;
+    property public final long TvInputComposite1;
+    property public final long TvInputComposite2;
+    property public final long TvInputHdmi1;
+    property public final long TvInputHdmi2;
+    property public final long TvInputHdmi3;
+    property public final long TvInputHdmi4;
+    property public final long TvInputVga1;
+    property public final long TvMediaContextMenu;
+    property public final long TvNetwork;
+    property public final long TvNumberEntry;
+    property public final long TvPower;
+    property public final long TvRadioService;
+    property public final long TvSatellite;
+    property public final long TvSatelliteBs;
+    property public final long TvSatelliteCs;
+    property public final long TvSatelliteService;
+    property public final long TvTeletext;
+    property public final long TvTerrestrialAnalog;
+    property public final long TvTerrestrialDigital;
+    property public final long TvTimerProgramming;
+    property public final long TvZoomMode;
+    property public final long Two;
+    property public final long U;
+    property public final long Unknown;
+    property public final long V;
+    property public final long VoiceAssist;
+    property public final long VolumeDown;
+    property public final long VolumeMute;
+    property public final long VolumeUp;
+    property public final long W;
+    property public final long WakeUp;
+    property public final long Window;
+    property public final long X;
+    property public final long Y;
+    property public final long Yen;
+    property public final long Z;
+    property public final long ZenkakuHankaru;
+    property public final long Zero;
+    property public final long ZoomIn;
+    property public final long ZoomOut;
+  }
+
+  public final inline class KeyEvent {
+    ctor public KeyEvent();
+    method public android.view.KeyEvent getNativeKeyEvent();
+    property public final android.view.KeyEvent nativeKeyEvent;
+  }
+
+  public final inline class KeyEventType {
+    ctor public KeyEventType();
+  }
+
+  public static final class KeyEventType.Companion {
+    method public int getKeyDown();
+    method public int getKeyUp();
+    method public int getUnknown();
+    property public final int KeyDown;
+    property public final int KeyUp;
+    property public final int Unknown;
+  }
+
+  public final class KeyEvent_androidKt {
+    method public static long getKey(android.view.KeyEvent);
+    method public static int getType(android.view.KeyEvent);
+    method public static int getUtf16CodePoint(android.view.KeyEvent);
+    method public static boolean isAltPressed(android.view.KeyEvent);
+    method public static boolean isCtrlPressed(android.view.KeyEvent);
+    method public static boolean isMetaPressed(android.view.KeyEvent);
+    method public static boolean isShiftPressed(android.view.KeyEvent);
+  }
+
+  public final class KeyInputModifierKt {
+    method public static androidx.compose.ui.Modifier onKeyEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.key.KeyEvent,java.lang.Boolean> onKeyEvent);
+    method public static androidx.compose.ui.Modifier onPreviewKeyEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.key.KeyEvent,java.lang.Boolean> onPreviewKeyEvent);
+  }
+
+  public final class Key_androidKt {
+    method public static long Key(int nativeKeyCode);
+    method public static int getNativeKeyCode(long);
+  }
+
+}
+
+package androidx.compose.ui.input.nestedscroll {
+
+  public interface NestedScrollConnection {
+    method public default suspend Object? onPostFling(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public default long onPostScroll(long consumed, long available, int source);
+    method public default suspend Object? onPreFling(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public default long onPreScroll(long available, int source);
+  }
+
+  public final class NestedScrollDelegatingWrapperKt {
+  }
+
+  public final class NestedScrollDispatcher {
+    ctor public NestedScrollDispatcher();
+    method public suspend Object? dispatchPostFling(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public long dispatchPostScroll(long consumed, long available, int source);
+    method public suspend Object? dispatchPreFling(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public long dispatchPreScroll(long available, int source);
+    method public kotlinx.coroutines.CoroutineScope getCoroutineScope();
+    property public final kotlinx.coroutines.CoroutineScope coroutineScope;
+  }
+
+  public final class NestedScrollModifierKt {
+    method public static androidx.compose.ui.Modifier nestedScroll(androidx.compose.ui.Modifier, androidx.compose.ui.input.nestedscroll.NestedScrollConnection connection, optional androidx.compose.ui.input.nestedscroll.NestedScrollDispatcher? dispatcher);
+  }
+
+  public final inline class NestedScrollSource {
+    ctor public NestedScrollSource();
+  }
+
+  public static final class NestedScrollSource.Companion {
+    method public int getDrag();
+    method public int getFling();
+    method @Deprecated public int getRelocate();
+    property public final int Drag;
+    property public final int Fling;
+    property @Deprecated public final int Relocate;
+  }
+
+}
+
+package androidx.compose.ui.input.pointer {
+
+  @kotlin.coroutines.RestrictsSuspension public interface AwaitPointerEventScope extends androidx.compose.ui.unit.Density {
+    method public suspend Object? awaitPointerEvent(optional androidx.compose.ui.input.pointer.PointerEventPass pass, optional kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerEvent> p);
+    method public androidx.compose.ui.input.pointer.PointerEvent getCurrentEvent();
+    method public default long getExtendedTouchPadding();
+    method public long getSize();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    method public default suspend <T> Object? withTimeout(long timeMillis, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.AwaitPointerEventScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T> p);
+    method public default suspend <T> Object? withTimeoutOrNull(long timeMillis, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.AwaitPointerEventScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T> p);
+    property public abstract androidx.compose.ui.input.pointer.PointerEvent currentEvent;
+    property public default long extendedTouchPadding;
+    property public abstract long size;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+  }
+
+  public final class ConsumedData {
+    ctor public ConsumedData(optional boolean positionChange, optional boolean downChange);
+    method public boolean getDownChange();
+    method public boolean getPositionChange();
+    method public void setDownChange(boolean downChange);
+    method public void setPositionChange(boolean positionChange);
+    property public final boolean downChange;
+    property public final boolean positionChange;
+  }
+
+  public final inline class PointerButtons {
+    ctor public PointerButtons();
+  }
+
+  public final class PointerEvent {
+    ctor public PointerEvent(java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes);
+    method public java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> component1();
+    method public androidx.compose.ui.input.pointer.PointerEvent copy(java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes, android.view.MotionEvent? motionEvent);
+    method public int getButtons();
+    method public java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> getChanges();
+    method public int getKeyboardModifiers();
+    method public int getType();
+    property public final int buttons;
+    property public final java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes;
+    property public final int keyboardModifiers;
+    property public final int type;
+  }
+
+  public final class PointerEventKt {
+    method public static boolean anyChangeConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static boolean changedToDown(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static boolean changedToDownIgnoreConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static boolean changedToUp(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static boolean changedToUpIgnoreConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static void consumeAllChanges(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static void consumeDownChange(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static void consumePositionChange(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static int indexOfFirstPressed(int);
+    method public static int indexOfLastPressed(int);
+    method @Deprecated public static boolean isOutOfBounds(androidx.compose.ui.input.pointer.PointerInputChange, long size);
+    method public static boolean isOutOfBounds(androidx.compose.ui.input.pointer.PointerInputChange, long size, long extendedTouchPadding);
+    method public static boolean isPressed(int, int buttonIndex);
+    method public static long positionChange(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static boolean positionChangeConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static long positionChangeIgnoreConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static boolean positionChanged(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static boolean positionChangedIgnoreConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
+  }
+
+  public enum PointerEventPass {
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerEventPass Final;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerEventPass Initial;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerEventPass Main;
+  }
+
+  public final class PointerEventTimeoutCancellationException extends java.util.concurrent.CancellationException {
+    ctor public PointerEventTimeoutCancellationException(long time);
+  }
+
+  public final inline class PointerEventType {
+    ctor public PointerEventType();
+  }
+
+  public static final class PointerEventType.Companion {
+    method public int getEnter();
+    method public int getExit();
+    method public int getMove();
+    method public int getPress();
+    method public int getRelease();
+    method public int getUnknown();
+    property public final int Enter;
+    property public final int Exit;
+    property public final int Move;
+    property public final int Press;
+    property public final int Release;
+    property public final int Unknown;
+  }
+
+  public final class PointerEvent_androidKt {
+    method public static boolean getAreAnyPressed(int);
+    method public static int indexOfFirstPressed(int);
+    method public static int indexOfLastPressed(int);
+    method public static boolean isAltGraphPressed(int);
+    method public static boolean isAltPressed(int);
+    method public static boolean isBackPressed(int);
+    method public static boolean isCapsLockOn(int);
+    method public static boolean isCtrlPressed(int);
+    method public static boolean isForwardPressed(int);
+    method public static boolean isFunctionPressed(int);
+    method public static boolean isMetaPressed(int);
+    method public static boolean isNumLockOn(int);
+    method public static boolean isPressed(int, int buttonIndex);
+    method public static boolean isPrimaryPressed(int);
+    method public static boolean isScrollLockOn(int);
+    method public static boolean isSecondaryPressed(int);
+    method public static boolean isShiftPressed(int);
+    method public static boolean isSymPressed(int);
+    method public static boolean isTertiaryPressed(int);
+  }
+
+  public interface PointerIcon {
+  }
+
+  public final class PointerIconKt {
+    method public static androidx.compose.ui.Modifier pointerHoverIcon(androidx.compose.ui.Modifier, androidx.compose.ui.input.pointer.PointerIcon icon, optional boolean overrideDescendants);
+  }
+
+  public final class PointerIcon_androidKt {
+    method public static androidx.compose.ui.input.pointer.PointerIcon PointerIcon(android.view.PointerIcon pointerIcon);
+    method public static androidx.compose.ui.input.pointer.PointerIcon PointerIcon(int pointerIconType);
+  }
+
+  public final inline class PointerId {
+    ctor public PointerId();
+    method public long getValue();
+    property public final long value;
+  }
+
+  @androidx.compose.runtime.Immutable public final class PointerInputChange {
+    ctor public PointerInputChange(long id, long uptimeMillis, long position, boolean pressed, long previousUptimeMillis, long previousPosition, boolean previousPressed, androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type);
+    method public androidx.compose.ui.input.pointer.PointerInputChange copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type);
+    method public androidx.compose.ui.input.pointer.ConsumedData getConsumed();
+    method public long getId();
+    method public long getPosition();
+    method public boolean getPressed();
+    method public long getPreviousPosition();
+    method public boolean getPreviousPressed();
+    method public long getPreviousUptimeMillis();
+    method public int getType();
+    method public long getUptimeMillis();
+    property public final androidx.compose.ui.input.pointer.ConsumedData consumed;
+    property public final long id;
+    property public final long position;
+    property public final boolean pressed;
+    property public final long previousPosition;
+    property public final boolean previousPressed;
+    property public final long previousUptimeMillis;
+    property public final int type;
+    property public final long uptimeMillis;
+  }
+
+  public final class PointerInputEventProcessorKt {
+  }
+
+  public abstract class PointerInputFilter {
+    ctor public PointerInputFilter();
+    method public boolean getInterceptOutOfBoundsChildEvents();
+    method public final long getSize();
+    method public abstract void onCancel();
+    method public abstract void onPointerEvent(androidx.compose.ui.input.pointer.PointerEvent pointerEvent, androidx.compose.ui.input.pointer.PointerEventPass pass, long bounds);
+    property public boolean interceptOutOfBoundsChildEvents;
+    property public final long size;
+  }
+
+  public interface PointerInputModifier extends androidx.compose.ui.Modifier.Element {
+    method public androidx.compose.ui.input.pointer.PointerInputFilter getPointerInputFilter();
+    property public abstract androidx.compose.ui.input.pointer.PointerInputFilter pointerInputFilter;
+  }
+
+  public interface PointerInputScope extends androidx.compose.ui.unit.Density {
+    method public suspend <R> Object? awaitPointerEventScope(kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.AwaitPointerEventScope,? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R> p);
+    method public default long getExtendedTouchPadding();
+    method public default boolean getInterceptOutOfBoundsChildEvents();
+    method public long getSize();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    method public default void setInterceptOutOfBoundsChildEvents(boolean _);
+    property public default long extendedTouchPadding;
+    property public default boolean interceptOutOfBoundsChildEvents;
+    property public abstract long size;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+  }
+
+  public final class PointerInputTestUtilKt {
+  }
+
+  public final class PointerInteropFilter_androidKt {
+  }
+
+  public final class PointerInteropUtils_androidKt {
+  }
+
+  public final inline class PointerKeyboardModifiers {
+    ctor public PointerKeyboardModifiers();
+  }
+
+  public final inline class PointerType {
+    ctor public PointerType();
+  }
+
+  public static final class PointerType.Companion {
+    method public int getEraser();
+    method public int getMouse();
+    method public int getStylus();
+    method public int getTouch();
+    method public int getUnknown();
+    property public final int Eraser;
+    property public final int Mouse;
+    property public final int Stylus;
+    property public final int Touch;
+    property public final int Unknown;
+  }
+
+  public final class SuspendingPointerInputFilterKt {
+    method @Deprecated public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+  }
+
+}
+
+package androidx.compose.ui.input.pointer.util {
+
+  public final class VelocityTracker {
+    ctor public VelocityTracker();
+    method public void addPosition(long timeMillis, long position);
+    method public long calculateVelocity();
+    method public void resetTracking();
+  }
+
+  public final class VelocityTrackerKt {
+    method public static void addPointerInputChange(androidx.compose.ui.input.pointer.util.VelocityTracker, androidx.compose.ui.input.pointer.PointerInputChange event);
+  }
+
+}
+
+package androidx.compose.ui.layout {
+
+  @androidx.compose.runtime.Immutable public abstract sealed class AlignmentLine {
+    field public static final androidx.compose.ui.layout.AlignmentLine.Companion Companion;
+    field public static final int Unspecified = -2147483648; // 0x80000000
+  }
+
+  public static final class AlignmentLine.Companion {
+  }
+
+  public final class AlignmentLineKt {
+    method public static androidx.compose.ui.layout.HorizontalAlignmentLine getFirstBaseline();
+    method public static androidx.compose.ui.layout.HorizontalAlignmentLine getLastBaseline();
+    property public static final androidx.compose.ui.layout.HorizontalAlignmentLine FirstBaseline;
+    property public static final androidx.compose.ui.layout.HorizontalAlignmentLine LastBaseline;
+  }
+
+  @androidx.compose.runtime.Stable public interface ContentScale {
+    method public long computeScaleFactor(long srcSize, long dstSize);
+    field public static final androidx.compose.ui.layout.ContentScale.Companion Companion;
+  }
+
+  public static final class ContentScale.Companion {
+    method public androidx.compose.ui.layout.ContentScale getCrop();
+    method public androidx.compose.ui.layout.ContentScale getFillBounds();
+    method public androidx.compose.ui.layout.ContentScale getFillHeight();
+    method public androidx.compose.ui.layout.ContentScale getFillWidth();
+    method public androidx.compose.ui.layout.ContentScale getFit();
+    method public androidx.compose.ui.layout.ContentScale getInside();
+    method public androidx.compose.ui.layout.FixedScale getNone();
+    property public final androidx.compose.ui.layout.ContentScale Crop;
+    property public final androidx.compose.ui.layout.ContentScale FillBounds;
+    property public final androidx.compose.ui.layout.ContentScale FillHeight;
+    property public final androidx.compose.ui.layout.ContentScale FillWidth;
+    property public final androidx.compose.ui.layout.ContentScale Fit;
+    property public final androidx.compose.ui.layout.ContentScale Inside;
+    property public final androidx.compose.ui.layout.FixedScale None;
+  }
+
+  public final class ContentScaleKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class FixedScale implements androidx.compose.ui.layout.ContentScale {
+    ctor public FixedScale(float value);
+    method public float component1();
+    method public long computeScaleFactor(long srcSize, long dstSize);
+    method public androidx.compose.ui.layout.FixedScale copy(float value);
+    method public float getValue();
+    property public final float value;
+  }
+
+  public interface GraphicLayerInfo {
+    method public long getLayerId();
+    method public default long getOwnerViewId();
+    property public abstract long layerId;
+    property public default long ownerViewId;
+  }
+
+  public final class HorizontalAlignmentLine extends androidx.compose.ui.layout.AlignmentLine {
+    ctor public HorizontalAlignmentLine(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,java.lang.Integer> merger);
+  }
+
+  public interface IntrinsicMeasurable {
+    method public Object? getParentData();
+    method public int maxIntrinsicHeight(int width);
+    method public int maxIntrinsicWidth(int height);
+    method public int minIntrinsicHeight(int width);
+    method public int minIntrinsicWidth(int height);
+    property public abstract Object? parentData;
+  }
+
+  public final class IntrinsicMeasurableKt {
+  }
+
+  public interface IntrinsicMeasureScope extends androidx.compose.ui.unit.Density {
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
+  }
+
+  public interface LayoutCoordinates {
+    method public operator int get(androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public androidx.compose.ui.layout.LayoutCoordinates? getParentCoordinates();
+    method public androidx.compose.ui.layout.LayoutCoordinates? getParentLayoutCoordinates();
+    method public java.util.Set<androidx.compose.ui.layout.AlignmentLine> getProvidedAlignmentLines();
+    method public long getSize();
+    method public boolean isAttached();
+    method public androidx.compose.ui.geometry.Rect localBoundingBoxOf(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, optional boolean clipBounds);
+    method public long localPositionOf(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, long relativeToSource);
+    method public long localToRoot(long relativeToLocal);
+    method public long localToWindow(long relativeToLocal);
+    method public long windowToLocal(long relativeToWindow);
+    property public abstract boolean isAttached;
+    property public abstract androidx.compose.ui.layout.LayoutCoordinates? parentCoordinates;
+    property public abstract androidx.compose.ui.layout.LayoutCoordinates? parentLayoutCoordinates;
+    property public abstract java.util.Set<androidx.compose.ui.layout.AlignmentLine> providedAlignmentLines;
+    property public abstract long size;
+  }
+
+  public final class LayoutCoordinatesKt {
+    method public static androidx.compose.ui.geometry.Rect boundsInParent(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static androidx.compose.ui.geometry.Rect boundsInRoot(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static androidx.compose.ui.geometry.Rect boundsInWindow(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static long positionInParent(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static long positionInRoot(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static long positionInWindow(androidx.compose.ui.layout.LayoutCoordinates);
+  }
+
+  public final class LayoutIdKt {
+    method public static Object? getLayoutId(androidx.compose.ui.layout.Measurable);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier layoutId(androidx.compose.ui.Modifier, Object layoutId);
+  }
+
+  public interface LayoutIdParentData {
+    method public Object getLayoutId();
+    property public abstract Object layoutId;
+  }
+
+  public interface LayoutInfo {
+    method public androidx.compose.ui.layout.LayoutCoordinates getCoordinates();
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public int getHeight();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public java.util.List<androidx.compose.ui.layout.ModifierInfo> getModifierInfo();
+    method public androidx.compose.ui.layout.LayoutInfo? getParentInfo();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    method public int getWidth();
+    method public boolean isAttached();
+    method public boolean isPlaced();
+    property public abstract androidx.compose.ui.layout.LayoutCoordinates coordinates;
+    property public abstract androidx.compose.ui.unit.Density density;
+    property public abstract int height;
+    property public abstract boolean isAttached;
+    property public abstract boolean isPlaced;
+    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public abstract androidx.compose.ui.layout.LayoutInfo? parentInfo;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+    property public abstract int width;
+  }
+
+  public final class LayoutKt {
+    method @androidx.compose.runtime.Composable public static inline void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> content, optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
+    method @androidx.compose.runtime.Composable public static inline void Layout(optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
+    method @Deprecated @androidx.compose.runtime.Composable public static void MultiMeasureLayout(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
+  }
+
+  public interface LayoutModifier extends androidx.compose.ui.Modifier.Element {
+    method public default int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int width);
+    method public default int maxIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int height);
+    method public androidx.compose.ui.layout.MeasureResult measure(androidx.compose.ui.layout.MeasureScope, androidx.compose.ui.layout.Measurable measurable, long constraints);
+    method public default int minIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int width);
+    method public default int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int height);
+  }
+
+  public final class LayoutModifierKt {
+    method public static androidx.compose.ui.Modifier layout(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function3<? super androidx.compose.ui.layout.MeasureScope,? super androidx.compose.ui.layout.Measurable,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measure);
+  }
+
+  public interface Measurable extends androidx.compose.ui.layout.IntrinsicMeasurable {
+    method public androidx.compose.ui.layout.Placeable measure(long constraints);
+  }
+
+  @androidx.compose.runtime.Stable public fun interface MeasurePolicy {
+    method public default int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int width);
+    method public default int maxIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int height);
+    method public androidx.compose.ui.layout.MeasureResult measure(androidx.compose.ui.layout.MeasureScope, java.util.List<? extends androidx.compose.ui.layout.Measurable> measurables, long constraints);
+    method public default int minIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int width);
+    method public default int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int height);
+  }
+
+  public interface MeasureResult {
+    method public java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> getAlignmentLines();
+    method public int getHeight();
+    method public int getWidth();
+    method public void placeChildren();
+    property public abstract java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> alignmentLines;
+    property public abstract int height;
+    property public abstract int width;
+  }
+
+  public interface MeasureScope extends androidx.compose.ui.layout.IntrinsicMeasureScope {
+    method public default androidx.compose.ui.layout.MeasureResult layout(int width, int height, optional java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> alignmentLines, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.Placeable.PlacementScope,kotlin.Unit> placementBlock);
+  }
+
+  public final class MeasureScopeKt {
+  }
+
+  public interface Measured {
+    method public operator int get(androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public int getMeasuredHeight();
+    method public int getMeasuredWidth();
+    property public abstract int measuredHeight;
+    property public abstract int measuredWidth;
+  }
+
+  public final class ModifierInfo {
+    ctor public ModifierInfo(androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.LayoutCoordinates coordinates, optional Object? extra);
+    method public androidx.compose.ui.layout.LayoutCoordinates getCoordinates();
+    method public Object? getExtra();
+    method public androidx.compose.ui.Modifier getModifier();
+    property public final androidx.compose.ui.layout.LayoutCoordinates coordinates;
+    property public final Object? extra;
+    property public final androidx.compose.ui.Modifier modifier;
+  }
+
+  public interface OnGloballyPositionedModifier extends androidx.compose.ui.Modifier.Element {
+    method public void onGloballyPositioned(androidx.compose.ui.layout.LayoutCoordinates coordinates);
+  }
+
+  public final class OnGloballyPositionedModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier onGloballyPositioned(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,kotlin.Unit> onGloballyPositioned);
+  }
+
+  public interface OnRemeasuredModifier extends androidx.compose.ui.Modifier.Element {
+    method public void onRemeasured(long size);
+  }
+
+  public final class OnRemeasuredModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier onSizeChanged(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,kotlin.Unit> onSizeChanged);
+  }
+
+  public interface ParentDataModifier extends androidx.compose.ui.Modifier.Element {
+    method public Object? modifyParentData(androidx.compose.ui.unit.Density, Object? parentData);
+  }
+
+  public abstract class Placeable implements androidx.compose.ui.layout.Measured {
+    ctor public Placeable();
+    method protected final long getApparentToRealOffset();
+    method public final int getHeight();
+    method public int getMeasuredHeight();
+    method protected final long getMeasuredSize();
+    method public int getMeasuredWidth();
+    method protected final long getMeasurementConstraints();
+    method public final int getWidth();
+    method protected abstract void placeAt(long position, float zIndex, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit>? layerBlock);
+    method protected final void setMeasuredSize(long value);
+    method protected final void setMeasurementConstraints(long value);
+    property protected final long apparentToRealOffset;
+    property public final int height;
+    property public int measuredHeight;
+    property protected final long measuredSize;
+    property public int measuredWidth;
+    property protected final long measurementConstraints;
+    property public final int width;
+  }
+
+  public abstract static class Placeable.PlacementScope {
+    ctor public Placeable.PlacementScope();
+    method protected abstract androidx.compose.ui.unit.LayoutDirection getParentLayoutDirection();
+    method protected abstract int getParentWidth();
+    method public final void place(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex);
+    method public final void place(androidx.compose.ui.layout.Placeable, long position, optional float zIndex);
+    method public final void placeRelative(androidx.compose.ui.layout.Placeable, long position, optional float zIndex);
+    method public final void placeRelative(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex);
+    method public final void placeRelativeWithLayer(androidx.compose.ui.layout.Placeable, long position, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
+    method public final void placeRelativeWithLayer(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
+    method public final void placeWithLayer(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
+    method public final void placeWithLayer(androidx.compose.ui.layout.Placeable, long position, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
+    property protected abstract androidx.compose.ui.unit.LayoutDirection parentLayoutDirection;
+    property protected abstract int parentWidth;
+  }
+
+  public final class PlaceableKt {
+  }
+
+  public final class RelocationModifierKt {
+  }
+
+  public final class RelocationRequesterModifierKt {
+  }
+
+  public interface Remeasurement {
+    method public void forceRemeasure();
+  }
+
+  public interface RemeasurementModifier extends androidx.compose.ui.Modifier.Element {
+    method public void onRemeasurementAvailable(androidx.compose.ui.layout.Remeasurement remeasurement);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class ScaleFactor {
+    ctor public ScaleFactor();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+  }
+
+  public static final class ScaleFactor.Companion {
+    method public long getUnspecified();
+    property public final long Unspecified;
+  }
+
+  public final class ScaleFactorKt {
+    method @androidx.compose.runtime.Stable public static long ScaleFactor(float scaleX, float scaleY);
+    method @androidx.compose.runtime.Stable public static operator long div(long, long scaleFactor);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.layout.ScaleFactor> block);
+    method @androidx.compose.runtime.Stable public static operator long times(long, long scaleFactor);
+    method @androidx.compose.runtime.Stable public static operator long times(long, long size);
+  }
+
+  public final class SubcomposeLayoutKt {
+    method @androidx.compose.runtime.Composable public static void SubcomposeLayout(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.layout.SubcomposeMeasureScope,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measurePolicy);
+    method @androidx.compose.runtime.Composable public static void SubcomposeLayout(androidx.compose.ui.layout.SubcomposeLayoutState state, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.layout.SubcomposeMeasureScope,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measurePolicy);
+  }
+
+  public final class SubcomposeLayoutState {
+    ctor public SubcomposeLayoutState(int maxSlotsToRetainForReuse);
+    ctor public SubcomposeLayoutState();
+    method public androidx.compose.ui.layout.SubcomposeLayoutState.PrecomposedSlotHandle precompose(Object? slotId, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public static interface SubcomposeLayoutState.PrecomposedSlotHandle {
+    method public void dispose();
+  }
+
+  public interface SubcomposeMeasureScope extends androidx.compose.ui.layout.MeasureScope {
+    method public java.util.List<androidx.compose.ui.layout.Measurable> subcompose(Object? slotId, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class TestModifierUpdaterKt {
+  }
+
+  public final class VerticalAlignmentLine extends androidx.compose.ui.layout.AlignmentLine {
+    ctor public VerticalAlignmentLine(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,java.lang.Integer> merger);
+  }
+
+}
+
+package androidx.compose.ui.modifier {
+
+  @androidx.compose.runtime.Stable public abstract sealed class ModifierLocal<T> {
+  }
+
+  @androidx.compose.runtime.Stable public interface ModifierLocalConsumer extends androidx.compose.ui.Modifier.Element {
+    method public void onModifierLocalsUpdated(androidx.compose.ui.modifier.ModifierLocalReadScope scope);
+  }
+
+  public final class ModifierLocalConsumerKt {
+  }
+
+  public final class ModifierLocalKt {
+    method public static <T> androidx.compose.ui.modifier.ProvidableModifierLocal<T> modifierLocalOf(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+  }
+
+  @androidx.compose.runtime.Stable public interface ModifierLocalProvider<T> extends androidx.compose.ui.Modifier.Element {
+    method public androidx.compose.ui.modifier.ProvidableModifierLocal<T> getKey();
+    method public T! getValue();
+    property public abstract androidx.compose.ui.modifier.ProvidableModifierLocal<T> key;
+    property public abstract T! value;
+  }
+
+  public final class ModifierLocalProviderKt {
+  }
+
+  public interface ModifierLocalReadScope {
+    method public <T> T! getCurrent(androidx.compose.ui.modifier.ModifierLocal<T>);
+  }
+
+  @androidx.compose.runtime.Stable public final class ProvidableModifierLocal<T> extends androidx.compose.ui.modifier.ModifierLocal<T> {
+    ctor public ProvidableModifierLocal(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+  }
+
+}
+
+package androidx.compose.ui.node {
+
+  public final class LayoutNodeKt {
+  }
+
+  public final class Ref<T> {
+    ctor public Ref();
+    method public T? getValue();
+    method public void setValue(T? value);
+    property public final T? value;
+  }
+
+  public interface RootForTest {
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.semantics.SemanticsOwner getSemanticsOwner();
+    method public androidx.compose.ui.text.input.TextInputService getTextInputService();
+    method public boolean sendKeyEvent(android.view.KeyEvent keyEvent);
+    property public abstract androidx.compose.ui.unit.Density density;
+    property public abstract androidx.compose.ui.semantics.SemanticsOwner semanticsOwner;
+    property public abstract androidx.compose.ui.text.input.TextInputService textInputService;
+  }
+
+  public final class ViewInterop_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.platform {
+
+  public abstract class AbstractComposeView extends android.view.ViewGroup {
+    ctor public AbstractComposeView(android.content.Context context, optional android.util.AttributeSet? attrs, optional int defStyleAttr);
+    ctor public AbstractComposeView(android.content.Context context, optional android.util.AttributeSet? attrs);
+    ctor public AbstractComposeView(android.content.Context context);
+    method @androidx.compose.runtime.Composable public abstract void Content();
+    method public final void createComposition();
+    method public final void disposeComposition();
+    method public final boolean getHasComposition();
+    method protected boolean getShouldCreateCompositionOnAttachedToWindow();
+    method public final boolean getShowLayoutBounds();
+    method protected final void onLayout(boolean changed, int left, int top, int right, int bottom);
+    method protected final void onMeasure(int widthMeasureSpec, int heightMeasureSpec);
+    method public final void setParentCompositionContext(androidx.compose.runtime.CompositionContext? parent);
+    method public final void setShowLayoutBounds(boolean value);
+    method public final void setViewCompositionStrategy(androidx.compose.ui.platform.ViewCompositionStrategy strategy);
+    property public final boolean hasComposition;
+    property protected boolean shouldCreateCompositionOnAttachedToWindow;
+    property public final boolean showLayoutBounds;
+  }
+
+  public interface AccessibilityManager {
+    method public long calculateRecommendedTimeoutMillis(long originalTimeoutMillis, optional boolean containsIcons, optional boolean containsText, optional boolean containsControls);
+  }
+
+  public final class AndroidClipboardManager_androidKt {
+  }
+
+  public final class AndroidComposeViewAccessibilityDelegateCompat_androidKt {
+  }
+
+  public final class AndroidComposeView_androidKt {
+  }
+
+  public final class AndroidCompositionLocals_androidKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> getLocalConfiguration();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> getLocalContext();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> getLocalLifecycleOwner();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> getLocalSavedStateRegistryOwner();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> getLocalView();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> LocalConfiguration;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> LocalContext;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> LocalLifecycleOwner;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> LocalSavedStateRegistryOwner;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> LocalView;
+  }
+
+  public final class AndroidUiDispatcher extends kotlinx.coroutines.CoroutineDispatcher {
+    method public void dispatch(kotlin.coroutines.CoroutineContext context, Runnable block);
+    method public android.view.Choreographer getChoreographer();
+    method public androidx.compose.runtime.MonotonicFrameClock getFrameClock();
+    property public final android.view.Choreographer choreographer;
+    property public final androidx.compose.runtime.MonotonicFrameClock frameClock;
+    field public static final androidx.compose.ui.platform.AndroidUiDispatcher.Companion Companion;
+  }
+
+  public static final class AndroidUiDispatcher.Companion {
+    method public kotlin.coroutines.CoroutineContext getCurrentThread();
+    method public kotlin.coroutines.CoroutineContext getMain();
+    property public final kotlin.coroutines.CoroutineContext CurrentThread;
+    property public final kotlin.coroutines.CoroutineContext Main;
+  }
+
+  public final class AndroidUiDispatcher_androidKt {
+  }
+
+  public final class AndroidUiFrameClock implements androidx.compose.runtime.MonotonicFrameClock {
+    ctor public AndroidUiFrameClock(android.view.Choreographer choreographer);
+    method public android.view.Choreographer getChoreographer();
+    method public suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+    property public final android.view.Choreographer choreographer;
+  }
+
+  public final class AndroidUriHandler implements androidx.compose.ui.platform.UriHandler {
+    ctor public AndroidUriHandler(android.content.Context context);
+    method public void openUri(String uri);
+  }
+
+  public final class AndroidViewConfiguration implements androidx.compose.ui.platform.ViewConfiguration {
+    ctor public AndroidViewConfiguration(android.view.ViewConfiguration viewConfiguration);
+    method public long getDoubleTapMinTimeMillis();
+    method public long getDoubleTapTimeoutMillis();
+    method public long getLongPressTimeoutMillis();
+    method public float getTouchSlop();
+    property public long doubleTapMinTimeMillis;
+    property public long doubleTapTimeoutMillis;
+    property public long longPressTimeoutMillis;
+    property public float touchSlop;
+  }
+
+  public interface ClipboardManager {
+    method public androidx.compose.ui.text.AnnotatedString? getText();
+    method public void setText(androidx.compose.ui.text.AnnotatedString annotatedString);
+  }
+
+  public final class ComposeView extends androidx.compose.ui.platform.AbstractComposeView {
+    ctor public ComposeView(android.content.Context context, optional android.util.AttributeSet? attrs, optional int defStyleAttr);
+    ctor public ComposeView(android.content.Context context, optional android.util.AttributeSet? attrs);
+    ctor public ComposeView(android.content.Context context);
+    method @androidx.compose.runtime.Composable public void Content();
+    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    property protected boolean shouldCreateCompositionOnAttachedToWindow;
+  }
+
+  public final class CompositionLocalsKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.AccessibilityManager> getLocalAccessibilityManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager> getLocalClipboardManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> getLocalDensity();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> getLocalFocusManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback> getLocalHapticFeedback();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.input.InputModeManager> getLocalInputModeManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection> getLocalLayoutDirection();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService> getLocalTextInputService();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar> getLocalTextToolbar();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler> getLocalUriHandler();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration> getLocalViewConfiguration();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> getLocalWindowInfo();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.AccessibilityManager> LocalAccessibilityManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager> LocalClipboardManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> LocalDensity;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> LocalFocusManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback> LocalHapticFeedback;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.input.InputModeManager> LocalInputModeManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection> LocalLayoutDirection;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService> LocalTextInputService;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar> LocalTextToolbar;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler> LocalUriHandler;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration> LocalViewConfiguration;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> LocalWindowInfo;
+  }
+
+  public final class DebugUtilsKt {
+  }
+
+  public final class DisposableSaveableStateRegistry_androidKt {
+  }
+
+  public interface InfiniteAnimationPolicy extends kotlin.coroutines.CoroutineContext.Element {
+    method public default kotlin.coroutines.CoroutineContext.Key<?> getKey();
+    method public suspend <R> Object? onInfiniteOperation(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R> p);
+    property public default kotlin.coroutines.CoroutineContext.Key<?> key;
+    field public static final androidx.compose.ui.platform.InfiniteAnimationPolicy.Key Key;
+  }
+
+  public static final class InfiniteAnimationPolicy.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.ui.platform.InfiniteAnimationPolicy> {
+  }
+
+  public final class InspectableModifier extends androidx.compose.ui.platform.InspectorValueInfo implements androidx.compose.ui.Modifier.Element {
+    ctor public InspectableModifier(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo);
+    method public androidx.compose.ui.platform.InspectableModifier.End getEnd();
+    property public final androidx.compose.ui.platform.InspectableModifier.End end;
+  }
+
+  public final class InspectableModifier.End implements androidx.compose.ui.Modifier.Element {
+    ctor public InspectableModifier.End();
+  }
+
+  public interface InspectableValue {
+    method public default kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> getInspectableElements();
+    method public default String? getNameFallback();
+    method public default Object? getValueOverride();
+    property public default kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> inspectableElements;
+    property public default String? nameFallback;
+    property public default Object? valueOverride;
+  }
+
+  public final class InspectableValueKt {
+    method public static inline kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> debugInspectorInfo(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> definitions);
+    method public static kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> getNoInspectorInfo();
+    method public static inline androidx.compose.ui.Modifier inspectable(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier,? extends androidx.compose.ui.Modifier> factory);
+    method public static boolean isDebugInspectorInfoEnabled();
+    method public static void setDebugInspectorInfoEnabled(boolean isDebugInspectorInfoEnabled);
+    property public static final kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> NoInspectorInfo;
+    property public static final boolean isDebugInspectorInfoEnabled;
+  }
+
+  public final class InspectionModeKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalInspectionMode();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> LocalInspectionMode;
+  }
+
+  public final class InspectorInfo {
+    ctor public InspectorInfo();
+    method public String? getName();
+    method public androidx.compose.ui.platform.ValueElementSequence getProperties();
+    method public Object? getValue();
+    method public void setName(String? name);
+    method public void setValue(Object? value);
+    property public final String? name;
+    property public final androidx.compose.ui.platform.ValueElementSequence properties;
+    property public final Object? value;
+  }
+
+  public abstract class InspectorValueInfo implements androidx.compose.ui.platform.InspectableValue {
+    ctor public InspectorValueInfo(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> info);
+    property public kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> inspectableElements;
+    property public String? nameFallback;
+    property public Object? valueOverride;
+  }
+
+  public final class InvertMatrixKt {
+  }
+
+  public final class JvmActuals_jvmKt {
+  }
+
+  public final class ShapeContainingUtilKt {
+  }
+
+  public final class TestTagKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier testTag(androidx.compose.ui.Modifier, String tag);
+  }
+
+  public interface TextToolbar {
+    method public androidx.compose.ui.platform.TextToolbarStatus getStatus();
+    method public void hide();
+    method public void showMenu(androidx.compose.ui.geometry.Rect rect, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onCopyRequested, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onPasteRequested, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onCutRequested, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onSelectAllRequested);
+    property public abstract androidx.compose.ui.platform.TextToolbarStatus status;
+  }
+
+  public final class TextToolbarKt {
+  }
+
+  public enum TextToolbarStatus {
+    enum_constant public static final androidx.compose.ui.platform.TextToolbarStatus Hidden;
+    enum_constant public static final androidx.compose.ui.platform.TextToolbarStatus Shown;
+  }
+
+  public interface UriHandler {
+    method public void openUri(String uri);
+  }
+
+  public final class ValueElement {
+    ctor public ValueElement(String name, Object? value);
+    method public String component1();
+    method public Object? component2();
+    method public androidx.compose.ui.platform.ValueElement copy(String name, Object? value);
+    method public String getName();
+    method public Object? getValue();
+    property public final String name;
+    property public final Object? value;
+  }
+
+  public final class ValueElementSequence implements kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> {
+    ctor public ValueElementSequence();
+    method public java.util.Iterator<androidx.compose.ui.platform.ValueElement> iterator();
+    method public operator void set(String name, Object? value);
+  }
+
+  public interface ViewCompositionStrategy {
+    method public kotlin.jvm.functions.Function0<kotlin.Unit> installFor(androidx.compose.ui.platform.AbstractComposeView view);
+    field public static final androidx.compose.ui.platform.ViewCompositionStrategy.Companion Companion;
+  }
+
+  public static final class ViewCompositionStrategy.Companion {
+  }
+
+  public static final class ViewCompositionStrategy.DisposeOnDetachedFromWindow implements androidx.compose.ui.platform.ViewCompositionStrategy {
+    method public kotlin.jvm.functions.Function0<kotlin.Unit> installFor(androidx.compose.ui.platform.AbstractComposeView view);
+    field public static final androidx.compose.ui.platform.ViewCompositionStrategy.DisposeOnDetachedFromWindow INSTANCE;
+  }
+
+  public static final class ViewCompositionStrategy.DisposeOnLifecycleDestroyed implements androidx.compose.ui.platform.ViewCompositionStrategy {
+    ctor public ViewCompositionStrategy.DisposeOnLifecycleDestroyed(androidx.lifecycle.Lifecycle lifecycle);
+    ctor public ViewCompositionStrategy.DisposeOnLifecycleDestroyed(androidx.lifecycle.LifecycleOwner lifecycleOwner);
+    method public kotlin.jvm.functions.Function0<kotlin.Unit> installFor(androidx.compose.ui.platform.AbstractComposeView view);
+  }
+
+  public static final class ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed implements androidx.compose.ui.platform.ViewCompositionStrategy {
+    method public kotlin.jvm.functions.Function0<kotlin.Unit> installFor(androidx.compose.ui.platform.AbstractComposeView view);
+    field public static final androidx.compose.ui.platform.ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed INSTANCE;
+  }
+
+  public final class ViewCompositionStrategy_androidKt {
+  }
+
+  public interface ViewConfiguration {
+    method public long getDoubleTapMinTimeMillis();
+    method public long getDoubleTapTimeoutMillis();
+    method public long getLongPressTimeoutMillis();
+    method public default long getMinimumTouchTargetSize();
+    method public float getTouchSlop();
+    property public abstract long doubleTapMinTimeMillis;
+    property public abstract long doubleTapTimeoutMillis;
+    property public abstract long longPressTimeoutMillis;
+    property public default long minimumTouchTargetSize;
+    property public abstract float touchSlop;
+  }
+
+  public interface ViewRootForInspector {
+    method public default androidx.compose.ui.platform.AbstractComposeView? getSubCompositionView();
+    method public default android.view.View? getViewRoot();
+    property public default androidx.compose.ui.platform.AbstractComposeView? subCompositionView;
+    property public default android.view.View? viewRoot;
+  }
+
+  @VisibleForTesting public interface ViewRootForTest extends androidx.compose.ui.node.RootForTest {
+    method public boolean getHasPendingMeasureOrLayout();
+    method public android.view.View getView();
+    method public void invalidateDescendants();
+    method public boolean isLifecycleInResumedState();
+    property public abstract boolean hasPendingMeasureOrLayout;
+    property public abstract boolean isLifecycleInResumedState;
+    property public abstract android.view.View view;
+    field public static final androidx.compose.ui.platform.ViewRootForTest.Companion Companion;
+  }
+
+  public static final class ViewRootForTest.Companion {
+    method public kotlin.jvm.functions.Function1<androidx.compose.ui.platform.ViewRootForTest,kotlin.Unit>? getOnViewCreatedCallback();
+    method public void setOnViewCreatedCallback(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.ViewRootForTest,kotlin.Unit>? onViewCreatedCallback);
+    property public final kotlin.jvm.functions.Function1<androidx.compose.ui.platform.ViewRootForTest,kotlin.Unit>? onViewCreatedCallback;
+  }
+
+  @androidx.compose.runtime.Stable public interface WindowInfo {
+    method public boolean isWindowFocused();
+    property public abstract boolean isWindowFocused;
+  }
+
+  public final class WindowInfoKt {
+  }
+
+  public final class WindowRecomposer_androidKt {
+    method public static androidx.compose.runtime.CompositionContext? findViewTreeCompositionContext(android.view.View);
+    method public static androidx.compose.runtime.CompositionContext? getCompositionContext(android.view.View);
+    method public static void setCompositionContext(android.view.View, androidx.compose.runtime.CompositionContext? value);
+  }
+
+  public final class Wrapper_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.platform.accessibility {
+
+  public final class CollectionInfoKt {
+  }
+
+}
+
+package androidx.compose.ui.platform.actionmodecallback {
+
+  public final class TextActionModeCallback_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.res {
+
+  public final class ColorResources_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static long colorResource(@ColorRes int id);
+  }
+
+  public final class FontResources_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static androidx.compose.ui.text.font.Typeface fontResource(androidx.compose.ui.text.font.FontFamily fontFamily);
+  }
+
+  public final class ImageResources_androidKt {
+    method public static androidx.compose.ui.graphics.ImageBitmap imageResource(androidx.compose.ui.graphics.ImageBitmap.Companion, android.content.res.Resources res, @DrawableRes int id);
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.ImageBitmap imageResource(androidx.compose.ui.graphics.ImageBitmap.Companion, @DrawableRes int id);
+  }
+
+  public final class PainterResources_androidKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.painter.Painter painterResource(@DrawableRes int id);
+  }
+
+  public final class PrimitiveResources_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean booleanResource(@BoolRes int id);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static float dimensionResource(@DimenRes int id);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static int[] integerArrayResource(@ArrayRes int id);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static int integerResource(@IntegerRes int id);
+  }
+
+  public final class StringResources_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String![] stringArrayResource(@ArrayRes int id);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String stringResource(@StringRes int id);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String stringResource(@StringRes int id, java.lang.Object... formatArgs);
+  }
+
+  public final class VectorResources_androidKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.ImageVector vectorResource(androidx.compose.ui.graphics.vector.ImageVector.Companion, @DrawableRes int id);
+    method @kotlin.jvm.Throws(exceptionClasses=XmlPullParserException::class) public static androidx.compose.ui.graphics.vector.ImageVector vectorResource(androidx.compose.ui.graphics.vector.ImageVector.Companion, optional android.content.res.Resources.Theme? theme, android.content.res.Resources res, int resId) throws org.xmlpull.v1.XmlPullParserException;
+  }
+
+}
+
+package androidx.compose.ui.semantics {
+
+  public final class AccessibilityAction<T extends kotlin.Function<? extends java.lang.Boolean>> {
+    ctor public AccessibilityAction(String? label, T? action);
+    method public T? getAction();
+    method public String? getLabel();
+    property public final T? action;
+    property public final String? label;
+  }
+
+  public final class CollectionInfo {
+    ctor public CollectionInfo(int rowCount, int columnCount);
+    method public int getColumnCount();
+    method public int getRowCount();
+    property public final int columnCount;
+    property public final int rowCount;
+  }
+
+  public final class CollectionItemInfo {
+    ctor public CollectionItemInfo(int rowIndex, int rowSpan, int columnIndex, int columnSpan);
+    method public int getColumnIndex();
+    method public int getColumnSpan();
+    method public int getRowIndex();
+    method public int getRowSpan();
+    property public final int columnIndex;
+    property public final int columnSpan;
+    property public final int rowIndex;
+    property public final int rowSpan;
+  }
+
+  public final class CustomAccessibilityAction {
+    ctor public CustomAccessibilityAction(String label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
+    method public kotlin.jvm.functions.Function0<java.lang.Boolean> getAction();
+    method public String getLabel();
+    property public final kotlin.jvm.functions.Function0<java.lang.Boolean> action;
+    property public final String label;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class LiveRegionMode {
+    ctor public LiveRegionMode();
+  }
+
+  public static final class LiveRegionMode.Companion {
+    method public int getAssertive();
+    method public int getPolite();
+    property public final int Assertive;
+    property public final int Polite;
+  }
+
+  public final class ProgressBarRangeInfo {
+    ctor public ProgressBarRangeInfo(float current, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> range, optional int steps);
+    method public float getCurrent();
+    method public kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> getRange();
+    method public int getSteps();
+    property public final float current;
+    property public final kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> range;
+    property public final int steps;
+    field public static final androidx.compose.ui.semantics.ProgressBarRangeInfo.Companion Companion;
+  }
+
+  public static final class ProgressBarRangeInfo.Companion {
+    method public androidx.compose.ui.semantics.ProgressBarRangeInfo getIndeterminate();
+    property public final androidx.compose.ui.semantics.ProgressBarRangeInfo Indeterminate;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Role {
+    ctor public Role();
+  }
+
+  public static final class Role.Companion {
+    method public int getButton();
+    method public int getCheckbox();
+    method public int getImage();
+    method public int getRadioButton();
+    method public int getSwitch();
+    method public int getTab();
+    property public final int Button;
+    property public final int Checkbox;
+    property public final int Image;
+    property public final int RadioButton;
+    property public final int Switch;
+    property public final int Tab;
+  }
+
+  public final class ScrollAxisRange {
+    ctor public ScrollAxisRange(kotlin.jvm.functions.Function0<java.lang.Float> value, kotlin.jvm.functions.Function0<java.lang.Float> maxValue, optional boolean reverseScrolling);
+    method public kotlin.jvm.functions.Function0<java.lang.Float> getMaxValue();
+    method public boolean getReverseScrolling();
+    method public kotlin.jvm.functions.Function0<java.lang.Float> getValue();
+    property public final kotlin.jvm.functions.Function0<java.lang.Float> maxValue;
+    property public final boolean reverseScrolling;
+    property public final kotlin.jvm.functions.Function0<java.lang.Float> value;
+  }
+
+  public final class SemanticsActions {
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCollapse();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCopyText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>> getCustomActions();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCutText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getDismiss();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getExpand();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>>> getGetTextLayoutResult();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnClick();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnLongClick();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getPasteText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> getScrollBy();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Integer,java.lang.Boolean>>> getScrollToIndex();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Boolean>>> getSetProgress();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function3<java.lang.Integer,java.lang.Integer,java.lang.Boolean,java.lang.Boolean>>> getSetSelection();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>>> getSetText();
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> Collapse;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> CopyText;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>> CustomActions;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> CutText;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> Dismiss;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> Expand;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>>> GetTextLayoutResult;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> OnClick;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> OnLongClick;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> PasteText;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> ScrollBy;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Integer,java.lang.Boolean>>> ScrollToIndex;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Boolean>>> SetProgress;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function3<java.lang.Integer,java.lang.Integer,java.lang.Boolean,java.lang.Boolean>>> SetSelection;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>>> SetText;
+    field public static final androidx.compose.ui.semantics.SemanticsActions INSTANCE;
+  }
+
+  public final class SemanticsConfiguration implements java.lang.Iterable<java.util.Map.Entry<? extends androidx.compose.ui.semantics.SemanticsPropertyKey<?>,?>> kotlin.jvm.internal.markers.KMappedMarker androidx.compose.ui.semantics.SemanticsPropertyReceiver {
+    ctor public SemanticsConfiguration();
+    method public operator <T> boolean contains(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key);
+    method public androidx.compose.ui.semantics.SemanticsConfiguration copy();
+    method public operator <T> T! get(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key);
+    method public <T> T! getOrElse(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method public <T> T? getOrElseNullable(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method public boolean isClearingSemantics();
+    method public boolean isMergingSemanticsOfDescendants();
+    method public java.util.Iterator<java.util.Map.Entry<androidx.compose.ui.semantics.SemanticsPropertyKey<?>,java.lang.Object>> iterator();
+    method public <T> void set(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, T? value);
+    method public void setClearingSemantics(boolean isClearingSemantics);
+    method public void setMergingSemanticsOfDescendants(boolean isMergingSemanticsOfDescendants);
+    property public final boolean isClearingSemantics;
+    property public final boolean isMergingSemanticsOfDescendants;
+  }
+
+  public final class SemanticsConfigurationKt {
+    method public static <T> T? getOrNull(androidx.compose.ui.semantics.SemanticsConfiguration, androidx.compose.ui.semantics.SemanticsPropertyKey<T> key);
+  }
+
+  public interface SemanticsModifier extends androidx.compose.ui.Modifier.Element {
+    method public int getId();
+    method public androidx.compose.ui.semantics.SemanticsConfiguration getSemanticsConfiguration();
+    property public abstract int id;
+    property public abstract androidx.compose.ui.semantics.SemanticsConfiguration semanticsConfiguration;
+  }
+
+  public final class SemanticsModifierKt {
+    method public static androidx.compose.ui.Modifier clearAndSetSemantics(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.semantics.SemanticsPropertyReceiver,kotlin.Unit> properties);
+    method public static androidx.compose.ui.Modifier semantics(androidx.compose.ui.Modifier, optional boolean mergeDescendants, kotlin.jvm.functions.Function1<? super androidx.compose.ui.semantics.SemanticsPropertyReceiver,kotlin.Unit> properties);
+  }
+
+  public final class SemanticsNode {
+    method public int getAlignmentLinePosition(androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public androidx.compose.ui.geometry.Rect getBoundsInRoot();
+    method public androidx.compose.ui.geometry.Rect getBoundsInWindow();
+    method public java.util.List<androidx.compose.ui.semantics.SemanticsNode> getChildren();
+    method public androidx.compose.ui.semantics.SemanticsConfiguration getConfig();
+    method public int getId();
+    method public androidx.compose.ui.layout.LayoutInfo getLayoutInfo();
+    method public boolean getMergingEnabled();
+    method public androidx.compose.ui.semantics.SemanticsNode? getParent();
+    method public long getPositionInRoot();
+    method public long getPositionInWindow();
+    method public androidx.compose.ui.node.RootForTest? getRoot();
+    method public long getSize();
+    method public androidx.compose.ui.geometry.Rect getTouchBoundsInRoot();
+    method public boolean isRoot();
+    property public final androidx.compose.ui.geometry.Rect boundsInRoot;
+    property public final androidx.compose.ui.geometry.Rect boundsInWindow;
+    property public final java.util.List<androidx.compose.ui.semantics.SemanticsNode> children;
+    property public final androidx.compose.ui.semantics.SemanticsConfiguration config;
+    property public final int id;
+    property public final boolean isRoot;
+    property public final androidx.compose.ui.layout.LayoutInfo layoutInfo;
+    property public final boolean mergingEnabled;
+    property public final androidx.compose.ui.semantics.SemanticsNode? parent;
+    property public final long positionInRoot;
+    property public final long positionInWindow;
+    property public final androidx.compose.ui.node.RootForTest? root;
+    property public final long size;
+    property public final androidx.compose.ui.geometry.Rect touchBoundsInRoot;
+  }
+
+  public final class SemanticsNodeKt {
+  }
+
+  public final class SemanticsOwner {
+    method public androidx.compose.ui.semantics.SemanticsNode getRootSemanticsNode();
+    method public androidx.compose.ui.semantics.SemanticsNode getUnmergedRootSemanticsNode();
+    property public final androidx.compose.ui.semantics.SemanticsNode rootSemanticsNode;
+    property public final androidx.compose.ui.semantics.SemanticsNode unmergedRootSemanticsNode;
+  }
+
+  public final class SemanticsOwnerKt {
+    method public static java.util.List<androidx.compose.ui.semantics.SemanticsNode> getAllSemanticsNodes(androidx.compose.ui.semantics.SemanticsOwner, boolean mergingEnabled);
+  }
+
+  public final class SemanticsProperties {
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> getCollectionInfo();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> getCollectionItemInfo();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> getContentDescription();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getDisabled();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> getEditableText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getError();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getFocused();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getHeading();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getHorizontalScrollAxisRange();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.input.ImeAction> getImeAction();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer>> getIndexForKey();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getInvisibleToUser();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getIsDialog();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getIsPopup();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.LiveRegionMode> getLiveRegion();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getPaneTitle();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getPassword();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ProgressBarRangeInfo> getProgressBarRangeInfo();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.Role> getRole();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getSelectableGroup();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getSelected();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getStateDescription();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getTestTag();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> getText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> getTextSelectionRange();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> getToggleableState();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getVerticalScrollAxisRange();
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> CollectionInfo;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> CollectionItemInfo;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> ContentDescription;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Disabled;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> EditableText;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> Error;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Focused;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Heading;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> HorizontalScrollAxisRange;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.input.ImeAction> ImeAction;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer>> IndexForKey;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> InvisibleToUser;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> IsDialog;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> IsPopup;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.LiveRegionMode> LiveRegion;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> PaneTitle;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Password;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ProgressBarRangeInfo> ProgressBarRangeInfo;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.Role> Role;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> SelectableGroup;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Selected;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> StateDescription;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> TestTag;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> Text;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> TextSelectionRange;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> ToggleableState;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> VerticalScrollAxisRange;
+    field public static final androidx.compose.ui.semantics.SemanticsProperties INSTANCE;
+  }
+
+  public final class SemanticsPropertiesKt {
+    method public static void collapse(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void copyText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void cutText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void dialog(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void disabled(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void dismiss(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void error(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String description);
+    method public static void expand(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static androidx.compose.ui.semantics.CollectionInfo getCollectionInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.CollectionItemInfo getCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> getCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.text.AnnotatedString getEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static boolean getFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.ScrollAxisRange getHorizontalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static int getImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static int getLiveRegion(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getPaneTitle(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.ProgressBarRangeInfo getProgressBarRangeInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static int getRole(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static boolean getSelected(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getStateDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.text.AnnotatedString getText(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void getTextLayoutResult(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>? action);
+    method public static long getTextSelectionRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.state.ToggleableState getToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.ScrollAxisRange getVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void heading(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void indexForKey(androidx.compose.ui.semantics.SemanticsPropertyReceiver, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer> mapping);
+    method public static void onClick(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void onLongClick(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void password(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void pasteText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void popup(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void scrollBy(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,java.lang.Boolean>? action);
+    method public static void scrollToIndex(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Boolean> action);
+    method public static void selectableGroup(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void setCollectionInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionInfo collectionInfo);
+    method public static void setCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionItemInfo collectionItemInfo);
+    method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String value);
+    method public static void setCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver, java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> customActions);
+    method public static void setEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString editableText);
+    method public static void setFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean focused);
+    method public static void setHorizontalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange horizontalScrollAxisRange);
+    method public static void setImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver, int imeAction);
+    method public static void setLiveRegion(androidx.compose.ui.semantics.SemanticsPropertyReceiver, int liveRegion);
+    method public static void setPaneTitle(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String paneTitle);
+    method public static void setProgress(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Boolean>? action);
+    method public static void setProgressBarRangeInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ProgressBarRangeInfo progressBarRangeInfo);
+    method public static void setRole(androidx.compose.ui.semantics.SemanticsPropertyReceiver, int role);
+    method public static void setSelected(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean selected);
+    method public static void setSelection(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function3<? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Boolean,java.lang.Boolean>? action);
+    method public static void setStateDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String stateDescription);
+    method public static void setTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String testTag);
+    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString value);
+    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>? action);
+    method public static void setTextSelectionRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, long textSelectionRange);
+    method public static void setToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.state.ToggleableState toggleableState);
+    method public static void setVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange verticalScrollAxisRange);
+  }
+
+  public final class SemanticsPropertyKey<T> {
+    ctor public SemanticsPropertyKey(String name, optional kotlin.jvm.functions.Function2<? super T,? super T,? extends T> mergePolicy);
+    method public String getName();
+    method public operator T! getValue(androidx.compose.ui.semantics.SemanticsPropertyReceiver thisRef, kotlin.reflect.KProperty<?> property);
+    method public T? merge(T? parentValue, T? childValue);
+    method public operator void setValue(androidx.compose.ui.semantics.SemanticsPropertyReceiver thisRef, kotlin.reflect.KProperty<?> property, T? value);
+    property public final String name;
+  }
+
+  public interface SemanticsPropertyReceiver {
+    method public operator <T> void set(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, T? value);
+  }
+
+  public final class SemanticsSortKt {
+  }
+
+}
+
+package androidx.compose.ui.state {
+
+  public enum ToggleableState {
+    enum_constant public static final androidx.compose.ui.state.ToggleableState Indeterminate;
+    enum_constant public static final androidx.compose.ui.state.ToggleableState Off;
+    enum_constant public static final androidx.compose.ui.state.ToggleableState On;
+  }
+
+  public final class ToggleableStateKt {
+    method public static androidx.compose.ui.state.ToggleableState ToggleableState(boolean value);
+  }
+
+}
+
+package androidx.compose.ui.text.input {
+
+  public final class InputState_androidKt {
+  }
+
+  public final class RecordingInputConnection_androidKt {
+  }
+
+  public final class TextInputServiceAndroid_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.viewinterop {
+
+  public final class AndroidViewHolder_androidKt {
+  }
+
+  public final class AndroidView_androidKt {
+    method @androidx.compose.runtime.Composable public static <T extends android.view.View> void AndroidView(kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> factory, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update);
+    method public static kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> getNoOpUpdate();
+    property public static final kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> NoOpUpdate;
+  }
+
+}
+
+package androidx.compose.ui.window {
+
+  public final class AndroidDialog_androidKt {
+    method @androidx.compose.runtime.Composable public static void Dialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.window.DialogProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class AndroidPopup_androidKt {
+    method @androidx.compose.runtime.Composable public static void Popup(optional androidx.compose.ui.Alignment alignment, optional long offset, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Popup(androidx.compose.ui.window.PopupPositionProvider popupPositionProvider, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @org.jetbrains.annotations.TestOnly public static boolean isPopupLayout(android.view.View view, optional String? testTag);
+  }
+
+  @androidx.compose.runtime.Immutable public final class DialogProperties {
+    ctor public DialogProperties(optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy);
+    method public boolean getDismissOnBackPress();
+    method public boolean getDismissOnClickOutside();
+    method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
+    property public final boolean dismissOnBackPress;
+    property public final boolean dismissOnClickOutside;
+    property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
+  }
+
+  public interface DialogWindowProvider {
+    method public android.view.Window getWindow();
+    property public abstract android.view.Window window;
+  }
+
+  @androidx.compose.runtime.Immutable public interface PopupPositionProvider {
+    method public long calculatePosition(androidx.compose.ui.unit.IntRect anchorBounds, long windowSize, androidx.compose.ui.unit.LayoutDirection layoutDirection, long popupContentSize);
+  }
+
+  @androidx.compose.runtime.Immutable public final class PopupProperties {
+    ctor public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean excludeFromSystemGesture, optional boolean clippingEnabled);
+    method public boolean getClippingEnabled();
+    method public boolean getDismissOnBackPress();
+    method public boolean getDismissOnClickOutside();
+    method public boolean getExcludeFromSystemGesture();
+    method public boolean getFocusable();
+    method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
+    property public final boolean clippingEnabled;
+    property public final boolean dismissOnBackPress;
+    property public final boolean dismissOnClickOutside;
+    property public final boolean excludeFromSystemGesture;
+    property public final boolean focusable;
+    property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
+  }
+
+  public enum SecureFlagPolicy {
+    enum_constant public static final androidx.compose.ui.window.SecureFlagPolicy Inherit;
+    enum_constant public static final androidx.compose.ui.window.SecureFlagPolicy SecureOff;
+    enum_constant public static final androidx.compose.ui.window.SecureFlagPolicy SecureOn;
+  }
+
+  public final class SecureFlagPolicy_androidKt {
+  }
+
+}
+
diff --git a/compose/ui/ui/api/current.ignore b/compose/ui/ui/api/current.ignore
index 95aa6ca..e0cadc5 100644
--- a/compose/ui/ui/api/current.ignore
+++ b/compose/ui/ui/api/current.ignore
@@ -7,6 +7,10 @@
     Added method androidx.compose.ui.layout.LayoutInfo.getViewConfiguration()
 
 
+InvalidNullConversion: androidx.compose.ui.graphics.GraphicsLayerModifierKt#graphicsLayer(androidx.compose.ui.Modifier, float, float, float, float, float, float, float, float, float, float, long, androidx.compose.ui.graphics.Shape, boolean):
+    Attempted to remove @NonNull annotation from method androidx.compose.ui.graphics.GraphicsLayerModifierKt.graphicsLayer(androidx.compose.ui.Modifier,float,float,float,float,float,float,float,float,float,float,long,androidx.compose.ui.graphics.Shape,boolean)
+
+
 RemovedClass: androidx.compose.ui.graphics.vector.AnimatorKt:
     Removed class androidx.compose.ui.graphics.vector.AnimatorKt
 RemovedClass: androidx.compose.ui.graphics.vector.compat.XmlAnimatedVectorParser_androidKt:
@@ -21,7 +25,3 @@
     Removed class androidx.compose.ui.res.AnimatedVectorResources_androidKt
 RemovedClass: androidx.compose.ui.res.AnimatorResources_androidKt:
     Removed class androidx.compose.ui.res.AnimatorResources_androidKt
-
-
-RemovedMethod: androidx.compose.ui.graphics.GraphicsLayerModifierKt#graphicsLayer(androidx.compose.ui.Modifier, float, float, float, float, float, float, float, float, float, float, long, androidx.compose.ui.graphics.Shape, boolean):
-    Removed method androidx.compose.ui.graphics.GraphicsLayerModifierKt.graphicsLayer(androidx.compose.ui.Modifier,float,float,float,float,float,float,float,float,float,float,long,androidx.compose.ui.graphics.Shape,boolean)
diff --git a/compose/ui/ui/api/current.txt b/compose/ui/ui/api/current.txt
index 9849f6c..da7f726 100644
--- a/compose/ui/ui/api/current.txt
+++ b/compose/ui/ui/api/current.txt
@@ -399,6 +399,7 @@
   public final class GraphicsLayerModifierKt {
     method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional androidx.compose.ui.graphics.RenderEffect? renderEffect);
     method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> block);
+    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip);
     method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier toolingGraphicsLayer(androidx.compose.ui.Modifier);
   }
 
@@ -454,6 +455,8 @@
 
   @androidx.compose.runtime.Immutable public final inline class TransformOrigin {
     ctor public TransformOrigin();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
   }
 
   public static final class TransformOrigin.Companion {
@@ -562,6 +565,12 @@
     method public static int getDefaultTintBlendMode();
     method public static long getDefaultTintColor();
     method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> getEmptyPath();
+    property public static final int DefaultFillType;
+    property public static final int DefaultStrokeLineCap;
+    property public static final int DefaultStrokeLineJoin;
+    property public static final int DefaultTintBlendMode;
+    property public static final long DefaultTintColor;
+    property public static final java.util.List<androidx.compose.ui.graphics.vector.PathNode> EmptyPath;
     field public static final String DefaultGroupName = "";
     field public static final String DefaultPathName = "";
     field public static final float DefaultPivotX = 0.0f;
@@ -1461,8 +1470,11 @@
     method public static void consumeAllChanges(androidx.compose.ui.input.pointer.PointerInputChange);
     method public static void consumeDownChange(androidx.compose.ui.input.pointer.PointerInputChange);
     method public static void consumePositionChange(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static int indexOfFirstPressed(int);
+    method public static int indexOfLastPressed(int);
     method @Deprecated public static boolean isOutOfBounds(androidx.compose.ui.input.pointer.PointerInputChange, long size);
     method public static boolean isOutOfBounds(androidx.compose.ui.input.pointer.PointerInputChange, long size, long extendedTouchPadding);
+    method public static boolean isPressed(int, int buttonIndex);
     method public static long positionChange(androidx.compose.ui.input.pointer.PointerInputChange);
     method public static boolean positionChangeConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
     method public static long positionChangeIgnoreConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
@@ -1521,6 +1533,18 @@
     method public static boolean isTertiaryPressed(int);
   }
 
+  public interface PointerIcon {
+  }
+
+  public final class PointerIconKt {
+    method public static androidx.compose.ui.Modifier pointerHoverIcon(androidx.compose.ui.Modifier, androidx.compose.ui.input.pointer.PointerIcon icon, optional boolean overrideDescendants);
+  }
+
+  public final class PointerIcon_androidKt {
+    method public static androidx.compose.ui.input.pointer.PointerIcon PointerIcon(android.view.PointerIcon pointerIcon);
+    method public static androidx.compose.ui.input.pointer.PointerIcon PointerIcon(int pointerIconType);
+  }
+
   public final inline class PointerId {
     ctor public PointerId();
     method public long getValue();
@@ -1648,6 +1672,8 @@
   public final class AlignmentLineKt {
     method public static androidx.compose.ui.layout.HorizontalAlignmentLine getFirstBaseline();
     method public static androidx.compose.ui.layout.HorizontalAlignmentLine getLastBaseline();
+    property public static final androidx.compose.ui.layout.HorizontalAlignmentLine FirstBaseline;
+    property public static final androidx.compose.ui.layout.HorizontalAlignmentLine LastBaseline;
   }
 
   @androidx.compose.runtime.Stable public interface ContentScale {
@@ -1913,6 +1939,10 @@
 
   @androidx.compose.runtime.Immutable public final inline class ScaleFactor {
     ctor public ScaleFactor();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
   }
 
   public static final class ScaleFactor.Companion {
@@ -1987,7 +2017,6 @@
 
   public interface ModifierLocalReadScope {
     method public <T> T! getCurrent(androidx.compose.ui.modifier.ModifierLocal<T>);
-    property public abstract T! current;
   }
 
   @androidx.compose.runtime.Stable public final class ProvidableModifierLocal<T> extends androidx.compose.ui.modifier.ModifierLocal<T> {
@@ -2064,6 +2093,11 @@
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> getLocalLifecycleOwner();
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> getLocalSavedStateRegistryOwner();
     method public static androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> getLocalView();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> LocalConfiguration;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> LocalContext;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> LocalLifecycleOwner;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> LocalSavedStateRegistryOwner;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> LocalView;
   }
 
   public final class AndroidUiDispatcher extends kotlinx.coroutines.CoroutineDispatcher {
@@ -2136,6 +2170,18 @@
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler> getLocalUriHandler();
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration> getLocalViewConfiguration();
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> getLocalWindowInfo();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.AccessibilityManager> LocalAccessibilityManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager> LocalClipboardManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> LocalDensity;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> LocalFocusManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback> LocalHapticFeedback;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.input.InputModeManager> LocalInputModeManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection> LocalLayoutDirection;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService> LocalTextInputService;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar> LocalTextToolbar;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler> LocalUriHandler;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration> LocalViewConfiguration;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> LocalWindowInfo;
   }
 
   public final class DebugUtilsKt {
@@ -2179,10 +2225,13 @@
     method public static inline androidx.compose.ui.Modifier inspectable(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier,? extends androidx.compose.ui.Modifier> factory);
     method public static boolean isDebugInspectorInfoEnabled();
     method public static void setDebugInspectorInfoEnabled(boolean isDebugInspectorInfoEnabled);
+    property public static final kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> NoInspectorInfo;
+    property public static final boolean isDebugInspectorInfoEnabled;
   }
 
   public final class InspectionModeKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalInspectionMode();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> LocalInspectionMode;
   }
 
   public final class InspectorInfo {
@@ -2770,6 +2819,7 @@
   public final class AndroidView_androidKt {
     method @androidx.compose.runtime.Composable public static <T extends android.view.View> void AndroidView(kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> factory, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update);
     method public static kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> getNoOpUpdate();
+    property public static final kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> NoOpUpdate;
   }
 
 }
diff --git a/compose/ui/ui/api/public_plus_experimental_1.1.0-beta02.txt b/compose/ui/ui/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..35a4d58
--- /dev/null
+++ b/compose/ui/ui/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,3066 @@
+// Signature format: 4.0
+package androidx.compose.ui {
+
+  public final class AbsoluteAlignment {
+    method public androidx.compose.ui.Alignment getBottomLeft();
+    method public androidx.compose.ui.Alignment getBottomRight();
+    method public androidx.compose.ui.Alignment getCenterLeft();
+    method public androidx.compose.ui.Alignment getCenterRight();
+    method public androidx.compose.ui.Alignment.Horizontal getLeft();
+    method public androidx.compose.ui.Alignment.Horizontal getRight();
+    method public androidx.compose.ui.Alignment getTopLeft();
+    method public androidx.compose.ui.Alignment getTopRight();
+    property public final androidx.compose.ui.Alignment BottomLeft;
+    property public final androidx.compose.ui.Alignment BottomRight;
+    property public final androidx.compose.ui.Alignment CenterLeft;
+    property public final androidx.compose.ui.Alignment CenterRight;
+    property public final androidx.compose.ui.Alignment.Horizontal Left;
+    property public final androidx.compose.ui.Alignment.Horizontal Right;
+    property public final androidx.compose.ui.Alignment TopLeft;
+    property public final androidx.compose.ui.Alignment TopRight;
+    field public static final androidx.compose.ui.AbsoluteAlignment INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public fun interface Alignment {
+    method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    field public static final androidx.compose.ui.Alignment.Companion Companion;
+  }
+
+  public static final class Alignment.Companion {
+    method public androidx.compose.ui.Alignment.Vertical getBottom();
+    method public androidx.compose.ui.Alignment getBottomCenter();
+    method public androidx.compose.ui.Alignment getBottomEnd();
+    method public androidx.compose.ui.Alignment getBottomStart();
+    method public androidx.compose.ui.Alignment getCenter();
+    method public androidx.compose.ui.Alignment getCenterEnd();
+    method public androidx.compose.ui.Alignment.Horizontal getCenterHorizontally();
+    method public androidx.compose.ui.Alignment getCenterStart();
+    method public androidx.compose.ui.Alignment.Vertical getCenterVertically();
+    method public androidx.compose.ui.Alignment.Horizontal getEnd();
+    method public androidx.compose.ui.Alignment.Horizontal getStart();
+    method public androidx.compose.ui.Alignment.Vertical getTop();
+    method public androidx.compose.ui.Alignment getTopCenter();
+    method public androidx.compose.ui.Alignment getTopEnd();
+    method public androidx.compose.ui.Alignment getTopStart();
+    property public final androidx.compose.ui.Alignment.Vertical Bottom;
+    property public final androidx.compose.ui.Alignment BottomCenter;
+    property public final androidx.compose.ui.Alignment BottomEnd;
+    property public final androidx.compose.ui.Alignment BottomStart;
+    property public final androidx.compose.ui.Alignment Center;
+    property public final androidx.compose.ui.Alignment CenterEnd;
+    property public final androidx.compose.ui.Alignment.Horizontal CenterHorizontally;
+    property public final androidx.compose.ui.Alignment CenterStart;
+    property public final androidx.compose.ui.Alignment.Vertical CenterVertically;
+    property public final androidx.compose.ui.Alignment.Horizontal End;
+    property public final androidx.compose.ui.Alignment.Horizontal Start;
+    property public final androidx.compose.ui.Alignment.Vertical Top;
+    property public final androidx.compose.ui.Alignment TopCenter;
+    property public final androidx.compose.ui.Alignment TopEnd;
+    property public final androidx.compose.ui.Alignment TopStart;
+  }
+
+  @androidx.compose.runtime.Stable public static fun interface Alignment.Horizontal {
+    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  @androidx.compose.runtime.Stable public static fun interface Alignment.Vertical {
+    method public int align(int size, int space);
+  }
+
+  @androidx.compose.runtime.Immutable public final class BiasAbsoluteAlignment implements androidx.compose.ui.Alignment {
+    ctor public BiasAbsoluteAlignment(float horizontalBias, float verticalBias);
+    method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public androidx.compose.ui.BiasAbsoluteAlignment copy(float horizontalBias, float verticalBias);
+  }
+
+  @androidx.compose.runtime.Immutable public static final class BiasAbsoluteAlignment.Horizontal implements androidx.compose.ui.Alignment.Horizontal {
+    ctor public BiasAbsoluteAlignment.Horizontal(float bias);
+    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public androidx.compose.ui.BiasAbsoluteAlignment.Horizontal copy(float bias);
+  }
+
+  @androidx.compose.runtime.Immutable public final class BiasAlignment implements androidx.compose.ui.Alignment {
+    ctor public BiasAlignment(float horizontalBias, float verticalBias);
+    method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.BiasAlignment copy(float horizontalBias, float verticalBias);
+    method public float getHorizontalBias();
+    method public float getVerticalBias();
+    property public final float horizontalBias;
+    property public final float verticalBias;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class BiasAlignment.Horizontal implements androidx.compose.ui.Alignment.Horizontal {
+    ctor public BiasAlignment.Horizontal(float bias);
+    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public androidx.compose.ui.BiasAlignment.Horizontal copy(float bias);
+  }
+
+  @androidx.compose.runtime.Immutable public static final class BiasAlignment.Vertical implements androidx.compose.ui.Alignment.Vertical {
+    ctor public BiasAlignment.Vertical(float bias);
+    method public int align(int size, int space);
+    method public androidx.compose.ui.BiasAlignment.Vertical copy(float bias);
+  }
+
+  public final class CombinedModifier implements androidx.compose.ui.Modifier {
+    ctor public CombinedModifier(androidx.compose.ui.Modifier outer, androidx.compose.ui.Modifier inner);
+    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.compose.ui.Modifier.Element,? extends R> operation);
+    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.compose.ui.Modifier.Element,? super R,? extends R> operation);
+  }
+
+  public final class ComposedModifierKt {
+    method public static androidx.compose.ui.Modifier composed(androidx.compose.ui.Modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier,? extends androidx.compose.ui.Modifier> factory);
+    method public static androidx.compose.ui.Modifier materialize(androidx.compose.runtime.Composer, androidx.compose.ui.Modifier modifier);
+  }
+
+  @kotlin.RequiresOptIn(message="This API is experimental and is likely to change in the future.") public @interface ExperimentalComposeUiApi {
+  }
+
+  @kotlin.RequiresOptIn(message="Unstable API for use only between compose-ui modules sharing the same exact version, " + "subject to change without notice in major, minor, or patch releases.") public @interface InternalComposeUiApi {
+  }
+
+  @androidx.compose.runtime.Stable public interface Modifier {
+    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.compose.ui.Modifier.Element,? extends R> operation);
+    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.compose.ui.Modifier.Element,? super R,? extends R> operation);
+    method public default infix androidx.compose.ui.Modifier then(androidx.compose.ui.Modifier other);
+    field public static final androidx.compose.ui.Modifier.Companion Companion;
+  }
+
+  public static final class Modifier.Companion implements androidx.compose.ui.Modifier {
+    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.compose.ui.Modifier.Element,? extends R> operation);
+    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.compose.ui.Modifier.Element,? super R,? extends R> operation);
+  }
+
+  public static interface Modifier.Element extends androidx.compose.ui.Modifier {
+    method public default boolean all(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public default boolean any(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public default <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.compose.ui.Modifier.Element,? extends R> operation);
+    method public default <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.compose.ui.Modifier.Element,? super R,? extends R> operation);
+  }
+
+  public final class TempListUtilsKt {
+  }
+
+  public final class ZIndexModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier zIndex(androidx.compose.ui.Modifier, float zIndex);
+  }
+
+}
+
+package androidx.compose.ui.autofill {
+
+  public final class AndroidAutofillType_androidKt {
+  }
+
+  public final class AndroidAutofill_androidKt {
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public interface Autofill {
+    method public void cancelAutofillForNode(androidx.compose.ui.autofill.AutofillNode autofillNode);
+    method public void requestAutofillForNode(androidx.compose.ui.autofill.AutofillNode autofillNode);
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public final class AutofillNode {
+    ctor public AutofillNode(optional java.util.List<? extends androidx.compose.ui.autofill.AutofillType> autofillTypes, optional androidx.compose.ui.geometry.Rect? boundingBox, kotlin.jvm.functions.Function1<? super java.lang.String,kotlin.Unit>? onFill);
+    method public java.util.List<androidx.compose.ui.autofill.AutofillType> getAutofillTypes();
+    method public androidx.compose.ui.geometry.Rect? getBoundingBox();
+    method public int getId();
+    method public kotlin.jvm.functions.Function1<java.lang.String,kotlin.Unit>? getOnFill();
+    method public void setBoundingBox(androidx.compose.ui.geometry.Rect? boundingBox);
+    property public final java.util.List<androidx.compose.ui.autofill.AutofillType> autofillTypes;
+    property public final androidx.compose.ui.geometry.Rect? boundingBox;
+    property public final int id;
+    property public final kotlin.jvm.functions.Function1<java.lang.String,kotlin.Unit>? onFill;
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public final class AutofillTree {
+    ctor public AutofillTree();
+    method public java.util.Map<java.lang.Integer,androidx.compose.ui.autofill.AutofillNode> getChildren();
+    method public kotlin.Unit? performAutofill(int id, String value);
+    method public operator void plusAssign(androidx.compose.ui.autofill.AutofillNode autofillNode);
+    property public final java.util.Map<java.lang.Integer,androidx.compose.ui.autofill.AutofillNode> children;
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public enum AutofillType {
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType AddressAuxiliaryDetails;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType AddressCountry;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType AddressLocality;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType AddressRegion;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType AddressStreet;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType BirthDateDay;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType BirthDateFull;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType BirthDateMonth;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType BirthDateYear;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType CreditCardExpirationDate;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType CreditCardExpirationDay;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType CreditCardExpirationMonth;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType CreditCardExpirationYear;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType CreditCardNumber;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType CreditCardSecurityCode;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType EmailAddress;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType Gender;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType NewPassword;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType NewUsername;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType Password;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PersonFirstName;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PersonFullName;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PersonLastName;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PersonMiddleInitial;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PersonMiddleName;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PersonNamePrefix;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PersonNameSuffix;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PhoneCountryCode;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PhoneNumber;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PhoneNumberDevice;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PhoneNumberNational;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PostalAddress;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PostalCode;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType PostalCodeExtended;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType SmsOtpCode;
+    enum_constant public static final androidx.compose.ui.autofill.AutofillType Username;
+  }
+
+}
+
+package androidx.compose.ui.draw {
+
+  public final class AlphaKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier alpha(androidx.compose.ui.Modifier, float alpha);
+  }
+
+  public final class BlurKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier blur(androidx.compose.ui.Modifier, float radiusX, float radiusY, optional androidx.compose.ui.graphics.Shape edgeTreatment);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier blur(androidx.compose.ui.Modifier, float radius, optional androidx.compose.ui.graphics.Shape edgeTreatment);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class BlurredEdgeTreatment {
+    ctor public BlurredEdgeTreatment();
+    method public androidx.compose.ui.graphics.Shape? getShape();
+    property public final androidx.compose.ui.graphics.Shape? shape;
+  }
+
+  public static final class BlurredEdgeTreatment.Companion {
+    method public androidx.compose.ui.graphics.Shape getRectangle();
+    method public androidx.compose.ui.graphics.Shape getUnbounded();
+    property public final androidx.compose.ui.graphics.Shape Rectangle;
+    property public final androidx.compose.ui.graphics.Shape Unbounded;
+  }
+
+  public interface BuildDrawCacheParams {
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public long getSize();
+    property public abstract androidx.compose.ui.unit.Density density;
+    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public abstract long size;
+  }
+
+  public final class CacheDrawScope implements androidx.compose.ui.unit.Density {
+    method public float getDensity();
+    method public float getFontScale();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public long getSize();
+    method public androidx.compose.ui.draw.DrawResult onDrawBehind(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public androidx.compose.ui.draw.DrawResult onDrawWithContent(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.ContentDrawScope,kotlin.Unit> block);
+    property public float density;
+    property public float fontScale;
+    property public final androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public final long size;
+  }
+
+  public final class ClipKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier clip(androidx.compose.ui.Modifier, androidx.compose.ui.graphics.Shape shape);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier clipToBounds(androidx.compose.ui.Modifier);
+  }
+
+  public interface DrawCacheModifier extends androidx.compose.ui.draw.DrawModifier {
+    method public void onBuildCache(androidx.compose.ui.draw.BuildDrawCacheParams params);
+  }
+
+  public interface DrawModifier extends androidx.compose.ui.Modifier.Element {
+    method public void draw(androidx.compose.ui.graphics.drawscope.ContentDrawScope);
+  }
+
+  public final class DrawModifierKt {
+    method public static androidx.compose.ui.Modifier drawBehind(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> onDraw);
+    method public static androidx.compose.ui.Modifier drawWithCache(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.draw.CacheDrawScope,androidx.compose.ui.draw.DrawResult> onBuildDrawCache);
+    method public static androidx.compose.ui.Modifier drawWithContent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.ContentDrawScope,kotlin.Unit> onDraw);
+  }
+
+  public final class DrawResult {
+  }
+
+  public final class PainterModifierKt {
+    method public static androidx.compose.ui.Modifier paint(androidx.compose.ui.Modifier, androidx.compose.ui.graphics.painter.Painter painter, optional boolean sizeToIntrinsics, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+  }
+
+  public final class RotateKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier rotate(androidx.compose.ui.Modifier, float degrees);
+  }
+
+  public final class ScaleKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier scale(androidx.compose.ui.Modifier, float scaleX, float scaleY);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier scale(androidx.compose.ui.Modifier, float scale);
+  }
+
+  public final class ShadowKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier shadow(androidx.compose.ui.Modifier, float elevation, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip);
+  }
+
+}
+
+package androidx.compose.ui.focus {
+
+  public final class FocusChangedModifierKt {
+    method public static androidx.compose.ui.Modifier onFocusChanged(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusState,kotlin.Unit> onFocusChanged);
+  }
+
+  public final inline class FocusDirection {
+    ctor public FocusDirection();
+  }
+
+  public static final class FocusDirection.Companion {
+    method public int getDown();
+    method public int getIn();
+    method public int getLeft();
+    method public int getNext();
+    method public int getOut();
+    method public int getPrevious();
+    method public int getRight();
+    method public int getUp();
+    property public final int Down;
+    property public final int In;
+    property public final int Left;
+    property public final int Next;
+    property public final int Out;
+    property public final int Previous;
+    property public final int Right;
+    property public final int Up;
+  }
+
+  public interface FocusEventModifier extends androidx.compose.ui.Modifier.Element {
+    method public void onFocusEvent(androidx.compose.ui.focus.FocusState focusState);
+  }
+
+  public final class FocusEventModifierKt {
+    method public static androidx.compose.ui.Modifier onFocusEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusState,kotlin.Unit> onFocusEvent);
+  }
+
+  public interface FocusManager {
+    method public void clearFocus(optional boolean force);
+    method public boolean moveFocus(int focusDirection);
+  }
+
+  public final class FocusManagerKt {
+  }
+
+  public final class FocusModifierKt {
+    method @Deprecated public static androidx.compose.ui.Modifier focusModifier(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier focusTarget(androidx.compose.ui.Modifier);
+  }
+
+  public final class FocusNodeUtilsKt {
+  }
+
+  public final class FocusOrder {
+    ctor public FocusOrder();
+    method public androidx.compose.ui.focus.FocusRequester getDown();
+    method public androidx.compose.ui.focus.FocusRequester getEnd();
+    method public androidx.compose.ui.focus.FocusRequester getLeft();
+    method public androidx.compose.ui.focus.FocusRequester getNext();
+    method public androidx.compose.ui.focus.FocusRequester getPrevious();
+    method public androidx.compose.ui.focus.FocusRequester getRight();
+    method public androidx.compose.ui.focus.FocusRequester getStart();
+    method public androidx.compose.ui.focus.FocusRequester getUp();
+    method public void setDown(androidx.compose.ui.focus.FocusRequester down);
+    method public void setEnd(androidx.compose.ui.focus.FocusRequester end);
+    method public void setLeft(androidx.compose.ui.focus.FocusRequester left);
+    method public void setNext(androidx.compose.ui.focus.FocusRequester next);
+    method public void setPrevious(androidx.compose.ui.focus.FocusRequester previous);
+    method public void setRight(androidx.compose.ui.focus.FocusRequester right);
+    method public void setStart(androidx.compose.ui.focus.FocusRequester start);
+    method public void setUp(androidx.compose.ui.focus.FocusRequester up);
+    property public final androidx.compose.ui.focus.FocusRequester down;
+    property public final androidx.compose.ui.focus.FocusRequester end;
+    property public final androidx.compose.ui.focus.FocusRequester left;
+    property public final androidx.compose.ui.focus.FocusRequester next;
+    property public final androidx.compose.ui.focus.FocusRequester previous;
+    property public final androidx.compose.ui.focus.FocusRequester right;
+    property public final androidx.compose.ui.focus.FocusRequester start;
+    property public final androidx.compose.ui.focus.FocusRequester up;
+  }
+
+  public interface FocusOrderModifier extends androidx.compose.ui.Modifier.Element {
+    method public void populateFocusOrder(androidx.compose.ui.focus.FocusOrder focusOrder);
+  }
+
+  public final class FocusOrderModifierKt {
+    method public static androidx.compose.ui.Modifier focusOrder(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusOrder,kotlin.Unit> focusOrderReceiver);
+    method public static androidx.compose.ui.Modifier focusOrder(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester);
+    method public static androidx.compose.ui.Modifier focusOrder(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusOrder,kotlin.Unit> focusOrderReceiver);
+  }
+
+  public interface FocusProperties {
+    method public boolean getCanFocus();
+    method public void setCanFocus(boolean canFocus);
+    property public abstract boolean canFocus;
+  }
+
+  public final class FocusPropertiesKt {
+    method public static androidx.compose.ui.Modifier focusProperties(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusProperties,kotlin.Unit> scope);
+  }
+
+  public final class FocusRequester {
+    ctor public FocusRequester();
+    method public boolean captureFocus();
+    method public boolean freeFocus();
+    method public void requestFocus();
+    field public static final androidx.compose.ui.focus.FocusRequester.Companion Companion;
+  }
+
+  public static final class FocusRequester.Companion {
+    method @androidx.compose.ui.ExperimentalComposeUiApi public androidx.compose.ui.focus.FocusRequester.Companion.FocusRequesterFactory createRefs();
+    method public androidx.compose.ui.focus.FocusRequester getDefault();
+    property public final androidx.compose.ui.focus.FocusRequester Default;
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public static final class FocusRequester.Companion.FocusRequesterFactory {
+    method public operator androidx.compose.ui.focus.FocusRequester component1();
+    method public operator androidx.compose.ui.focus.FocusRequester component10();
+    method public operator androidx.compose.ui.focus.FocusRequester component11();
+    method public operator androidx.compose.ui.focus.FocusRequester component12();
+    method public operator androidx.compose.ui.focus.FocusRequester component13();
+    method public operator androidx.compose.ui.focus.FocusRequester component14();
+    method public operator androidx.compose.ui.focus.FocusRequester component15();
+    method public operator androidx.compose.ui.focus.FocusRequester component16();
+    method public operator androidx.compose.ui.focus.FocusRequester component2();
+    method public operator androidx.compose.ui.focus.FocusRequester component3();
+    method public operator androidx.compose.ui.focus.FocusRequester component4();
+    method public operator androidx.compose.ui.focus.FocusRequester component5();
+    method public operator androidx.compose.ui.focus.FocusRequester component6();
+    method public operator androidx.compose.ui.focus.FocusRequester component7();
+    method public operator androidx.compose.ui.focus.FocusRequester component8();
+    method public operator androidx.compose.ui.focus.FocusRequester component9();
+    field public static final androidx.compose.ui.focus.FocusRequester.Companion.FocusRequesterFactory INSTANCE;
+  }
+
+  public final class FocusRequesterKt {
+  }
+
+  public interface FocusRequesterModifier extends androidx.compose.ui.Modifier.Element {
+    method public androidx.compose.ui.focus.FocusRequester getFocusRequester();
+    property public abstract androidx.compose.ui.focus.FocusRequester focusRequester;
+  }
+
+  public final class FocusRequesterModifierKt {
+    method public static androidx.compose.ui.Modifier focusRequester(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester);
+  }
+
+  public interface FocusState {
+    method public boolean getHasFocus();
+    method public boolean isCaptured();
+    method public boolean isFocused();
+    property public abstract boolean hasFocus;
+    property public abstract boolean isCaptured;
+    property public abstract boolean isFocused;
+  }
+
+  public final class FocusTransactionsKt {
+  }
+
+  public final class FocusTraversalKt {
+  }
+
+  public final class OneDimensionalFocusSearchKt {
+  }
+
+  public final class TwoDimensionalFocusSearchKt {
+  }
+
+}
+
+package androidx.compose.ui.graphics {
+
+  public final class GraphicsLayerModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional androidx.compose.ui.graphics.RenderEffect? renderEffect);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> block);
+    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier toolingGraphicsLayer(androidx.compose.ui.Modifier);
+  }
+
+  public interface GraphicsLayerScope extends androidx.compose.ui.unit.Density {
+    method public float getAlpha();
+    method public float getCameraDistance();
+    method public boolean getClip();
+    method public default androidx.compose.ui.graphics.RenderEffect? getRenderEffect();
+    method public float getRotationX();
+    method public float getRotationY();
+    method public float getRotationZ();
+    method public float getScaleX();
+    method public float getScaleY();
+    method public float getShadowElevation();
+    method public androidx.compose.ui.graphics.Shape getShape();
+    method public long getTransformOrigin();
+    method public float getTranslationX();
+    method public float getTranslationY();
+    method public void setAlpha(float alpha);
+    method public void setCameraDistance(float cameraDistance);
+    method public void setClip(boolean clip);
+    method public default void setRenderEffect(androidx.compose.ui.graphics.RenderEffect? _);
+    method public void setRotationX(float rotationX);
+    method public void setRotationY(float rotationY);
+    method public void setRotationZ(float rotationZ);
+    method public void setScaleX(float scaleX);
+    method public void setScaleY(float scaleY);
+    method public void setShadowElevation(float shadowElevation);
+    method public void setShape(androidx.compose.ui.graphics.Shape shape);
+    method public void setTransformOrigin(long transformOrigin);
+    method public void setTranslationX(float translationX);
+    method public void setTranslationY(float translationY);
+    property public abstract float alpha;
+    property public abstract float cameraDistance;
+    property public abstract boolean clip;
+    property public default androidx.compose.ui.graphics.RenderEffect? renderEffect;
+    property public abstract float rotationX;
+    property public abstract float rotationY;
+    property public abstract float rotationZ;
+    property public abstract float scaleX;
+    property public abstract float scaleY;
+    property public abstract float shadowElevation;
+    property public abstract androidx.compose.ui.graphics.Shape shape;
+    property public abstract long transformOrigin;
+    property public abstract float translationX;
+    property public abstract float translationY;
+  }
+
+  public final class GraphicsLayerScopeKt {
+    method public static androidx.compose.ui.graphics.GraphicsLayerScope GraphicsLayerScope();
+    field public static final float DefaultCameraDistance = 8.0f;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class TransformOrigin {
+    ctor public TransformOrigin();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+  }
+
+  public static final class TransformOrigin.Companion {
+    method public long getCenter();
+    property public final long Center;
+  }
+
+  public final class TransformOriginKt {
+    method public static long TransformOrigin(float pivotFractionX, float pivotFractionY);
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector {
+
+  @androidx.compose.runtime.Immutable public final class ImageVector {
+    method public float getDefaultHeight();
+    method public float getDefaultWidth();
+    method public String getName();
+    method public androidx.compose.ui.graphics.vector.VectorGroup getRoot();
+    method public int getTintBlendMode();
+    method public long getTintColor();
+    method public float getViewportHeight();
+    method public float getViewportWidth();
+    property public final float defaultHeight;
+    property public final float defaultWidth;
+    property public final String name;
+    property public final androidx.compose.ui.graphics.vector.VectorGroup root;
+    property public final int tintBlendMode;
+    property public final long tintColor;
+    property public final float viewportHeight;
+    property public final float viewportWidth;
+    field public static final androidx.compose.ui.graphics.vector.ImageVector.Companion Companion;
+  }
+
+  public static final class ImageVector.Builder {
+    ctor public ImageVector.Builder(optional String name, float defaultWidth, float defaultHeight, float viewportWidth, float viewportHeight, optional long tintColor, optional int tintBlendMode);
+    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addGroup(optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData);
+    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addPath(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+    method public androidx.compose.ui.graphics.vector.ImageVector build();
+    method public androidx.compose.ui.graphics.vector.ImageVector.Builder clearGroup();
+  }
+
+  public static final class ImageVector.Companion {
+  }
+
+  public final class ImageVectorKt {
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder group(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,kotlin.Unit> block);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder path(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+  }
+
+  public abstract sealed class VNode {
+    method public abstract void draw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    method public final void invalidate();
+  }
+
+  public final class VectorApplier extends androidx.compose.runtime.AbstractApplier<androidx.compose.ui.graphics.vector.VNode> {
+    ctor public VectorApplier(androidx.compose.ui.graphics.vector.VNode root);
+    method public void insertBottomUp(int index, androidx.compose.ui.graphics.vector.VNode instance);
+    method public void insertTopDown(int index, androidx.compose.ui.graphics.vector.VNode instance);
+    method public void move(int from, int to, int count);
+    method protected void onClear();
+    method public void remove(int index, int count);
+  }
+
+  public final class VectorComposeKt {
+    method @androidx.compose.runtime.Composable public static void Group(optional String name, optional float rotation, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Path(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+  }
+
+  public interface VectorConfig {
+    method public default <T> T! getOrDefault(androidx.compose.ui.graphics.vector.VectorProperty<T> property, T? defaultValue);
+  }
+
+  @androidx.compose.runtime.Immutable public final class VectorGroup extends androidx.compose.ui.graphics.vector.VectorNode implements java.lang.Iterable<androidx.compose.ui.graphics.vector.VectorNode> kotlin.jvm.internal.markers.KMappedMarker {
+    method public operator androidx.compose.ui.graphics.vector.VectorNode get(int index);
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getClipPathData();
+    method public String getName();
+    method public float getPivotX();
+    method public float getPivotY();
+    method public float getRotation();
+    method public float getScaleX();
+    method public float getScaleY();
+    method public int getSize();
+    method public float getTranslationX();
+    method public float getTranslationY();
+    method public java.util.Iterator<androidx.compose.ui.graphics.vector.VectorNode> iterator();
+    property public final java.util.List<androidx.compose.ui.graphics.vector.PathNode> clipPathData;
+    property public final String name;
+    property public final float pivotX;
+    property public final float pivotY;
+    property public final float rotation;
+    property public final float scaleX;
+    property public final float scaleY;
+    property public final int size;
+    property public final float translationX;
+    property public final float translationY;
+  }
+
+  public final class VectorKt {
+    method public static inline java.util.List<androidx.compose.ui.graphics.vector.PathNode> PathData(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
+    method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> addPathNodes(String? pathStr);
+    method public static int getDefaultFillType();
+    method public static int getDefaultStrokeLineCap();
+    method public static int getDefaultStrokeLineJoin();
+    method public static int getDefaultTintBlendMode();
+    method public static long getDefaultTintColor();
+    method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> getEmptyPath();
+    property public static final int DefaultFillType;
+    property public static final int DefaultStrokeLineCap;
+    property public static final int DefaultStrokeLineJoin;
+    property public static final int DefaultTintBlendMode;
+    property public static final long DefaultTintColor;
+    property public static final java.util.List<androidx.compose.ui.graphics.vector.PathNode> EmptyPath;
+    field public static final String DefaultGroupName = "";
+    field public static final String DefaultPathName = "";
+    field public static final float DefaultPivotX = 0.0f;
+    field public static final float DefaultPivotY = 0.0f;
+    field public static final float DefaultRotation = 0.0f;
+    field public static final float DefaultScaleX = 1.0f;
+    field public static final float DefaultScaleY = 1.0f;
+    field public static final float DefaultStrokeLineMiter = 4.0f;
+    field public static final float DefaultStrokeLineWidth = 0.0f;
+    field public static final float DefaultTranslationX = 0.0f;
+    field public static final float DefaultTranslationY = 0.0f;
+    field public static final float DefaultTrimPathEnd = 1.0f;
+    field public static final float DefaultTrimPathOffset = 0.0f;
+    field public static final float DefaultTrimPathStart = 0.0f;
+  }
+
+  public abstract sealed class VectorNode {
+  }
+
+  public final class VectorPainter extends androidx.compose.ui.graphics.painter.Painter {
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public long intrinsicSize;
+  }
+
+  public final class VectorPainterKt {
+    method @androidx.compose.runtime.Composable public static void RenderVectorGroup(androidx.compose.ui.graphics.vector.VectorGroup group, optional java.util.Map<java.lang.String,? extends androidx.compose.ui.graphics.vector.VectorConfig> configs);
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional int tintBlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(androidx.compose.ui.graphics.vector.ImageVector image);
+    field public static final String RootGroupName = "VectorRootGroup";
+  }
+
+  @androidx.compose.runtime.Immutable public final class VectorPath extends androidx.compose.ui.graphics.vector.VectorNode {
+    method public androidx.compose.ui.graphics.Brush? getFill();
+    method public float getFillAlpha();
+    method public String getName();
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getPathData();
+    method public int getPathFillType();
+    method public androidx.compose.ui.graphics.Brush? getStroke();
+    method public float getStrokeAlpha();
+    method public int getStrokeLineCap();
+    method public int getStrokeLineJoin();
+    method public float getStrokeLineMiter();
+    method public float getStrokeLineWidth();
+    method public float getTrimPathEnd();
+    method public float getTrimPathOffset();
+    method public float getTrimPathStart();
+    property public final androidx.compose.ui.graphics.Brush? fill;
+    property public final float fillAlpha;
+    property public final String name;
+    property public final java.util.List<androidx.compose.ui.graphics.vector.PathNode> pathData;
+    property public final int pathFillType;
+    property public final androidx.compose.ui.graphics.Brush? stroke;
+    property public final float strokeAlpha;
+    property public final int strokeLineCap;
+    property public final int strokeLineJoin;
+    property public final float strokeLineMiter;
+    property public final float strokeLineWidth;
+    property public final float trimPathEnd;
+    property public final float trimPathOffset;
+    property public final float trimPathStart;
+  }
+
+  public abstract sealed class VectorProperty<T> {
+  }
+
+  public static final class VectorProperty.Fill extends androidx.compose.ui.graphics.vector.VectorProperty<androidx.compose.ui.graphics.Brush> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.Fill INSTANCE;
+  }
+
+  public static final class VectorProperty.FillAlpha extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.FillAlpha INSTANCE;
+  }
+
+  public static final class VectorProperty.PathData extends androidx.compose.ui.graphics.vector.VectorProperty<java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode>> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.PathData INSTANCE;
+  }
+
+  public static final class VectorProperty.PivotX extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.PivotX INSTANCE;
+  }
+
+  public static final class VectorProperty.PivotY extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.PivotY INSTANCE;
+  }
+
+  public static final class VectorProperty.Rotation extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.Rotation INSTANCE;
+  }
+
+  public static final class VectorProperty.ScaleX extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.ScaleX INSTANCE;
+  }
+
+  public static final class VectorProperty.ScaleY extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.ScaleY INSTANCE;
+  }
+
+  public static final class VectorProperty.Stroke extends androidx.compose.ui.graphics.vector.VectorProperty<androidx.compose.ui.graphics.Brush> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.Stroke INSTANCE;
+  }
+
+  public static final class VectorProperty.StrokeAlpha extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.StrokeAlpha INSTANCE;
+  }
+
+  public static final class VectorProperty.StrokeLineWidth extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.StrokeLineWidth INSTANCE;
+  }
+
+  public static final class VectorProperty.TranslateX extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TranslateX INSTANCE;
+  }
+
+  public static final class VectorProperty.TranslateY extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TranslateY INSTANCE;
+  }
+
+  public static final class VectorProperty.TrimPathEnd extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TrimPathEnd INSTANCE;
+  }
+
+  public static final class VectorProperty.TrimPathOffset extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TrimPathOffset INSTANCE;
+  }
+
+  public static final class VectorProperty.TrimPathStart extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TrimPathStart INSTANCE;
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector.compat {
+
+  public final class XmlVectorParser_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.hapticfeedback {
+
+  public interface HapticFeedback {
+    method public void performHapticFeedback(int hapticFeedbackType);
+  }
+
+  public final inline class HapticFeedbackType {
+    ctor public HapticFeedbackType();
+  }
+
+  public static final class HapticFeedbackType.Companion {
+    method public int getLongPress();
+    method public int getTextHandleMove();
+    method public java.util.List<androidx.compose.ui.hapticfeedback.HapticFeedbackType> values();
+    property public final int LongPress;
+    property public final int TextHandleMove;
+  }
+
+}
+
+package androidx.compose.ui.input {
+
+  public final inline class InputMode {
+    ctor public InputMode();
+  }
+
+  public static final class InputMode.Companion {
+    method public int getKeyboard();
+    method public int getTouch();
+    property public final int Keyboard;
+    property public final int Touch;
+  }
+
+  public interface InputModeManager {
+    method public int getInputMode();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public boolean requestInputMode(int inputMode);
+    property public abstract int inputMode;
+  }
+
+}
+
+package androidx.compose.ui.input.key {
+
+  public final inline class Key {
+    ctor public Key();
+    method public long getKeyCode();
+    property public final long keyCode;
+  }
+
+  public static final class Key.Companion {
+    method public long getA();
+    method public long getAllApps();
+    method public long getAltLeft();
+    method public long getAltRight();
+    method public long getApostrophe();
+    method public long getAppSwitch();
+    method public long getAssist();
+    method public long getAt();
+    method public long getAvReceiverInput();
+    method public long getAvReceiverPower();
+    method public long getB();
+    method public long getBack();
+    method public long getBackslash();
+    method public long getBackspace();
+    method public long getBookmark();
+    method public long getBreak();
+    method public long getBrightnessDown();
+    method public long getBrightnessUp();
+    method public long getBrowser();
+    method public long getButton1();
+    method public long getButton10();
+    method public long getButton11();
+    method public long getButton12();
+    method public long getButton13();
+    method public long getButton14();
+    method public long getButton15();
+    method public long getButton16();
+    method public long getButton2();
+    method public long getButton3();
+    method public long getButton4();
+    method public long getButton5();
+    method public long getButton6();
+    method public long getButton7();
+    method public long getButton8();
+    method public long getButton9();
+    method public long getButtonA();
+    method public long getButtonB();
+    method public long getButtonC();
+    method public long getButtonL1();
+    method public long getButtonL2();
+    method public long getButtonMode();
+    method public long getButtonR1();
+    method public long getButtonR2();
+    method public long getButtonSelect();
+    method public long getButtonStart();
+    method public long getButtonThumbLeft();
+    method public long getButtonThumbRight();
+    method public long getButtonX();
+    method public long getButtonY();
+    method public long getButtonZ();
+    method public long getC();
+    method public long getCalculator();
+    method public long getCalendar();
+    method public long getCall();
+    method public long getCamera();
+    method public long getCapsLock();
+    method public long getCaptions();
+    method public long getChannelDown();
+    method public long getChannelUp();
+    method public long getClear();
+    method public long getComma();
+    method public long getContacts();
+    method public long getCopy();
+    method public long getCtrlLeft();
+    method public long getCtrlRight();
+    method public long getCut();
+    method public long getD();
+    method public long getDelete();
+    method public long getDirectionCenter();
+    method public long getDirectionDown();
+    method public long getDirectionDownLeft();
+    method public long getDirectionDownRight();
+    method public long getDirectionLeft();
+    method public long getDirectionRight();
+    method public long getDirectionUp();
+    method public long getDirectionUpLeft();
+    method public long getDirectionUpRight();
+    method public long getDvr();
+    method public long getE();
+    method public long getEight();
+    method public long getEisu();
+    method public long getEndCall();
+    method public long getEnter();
+    method public long getEnvelope();
+    method public long getEquals();
+    method public long getEscape();
+    method public long getF();
+    method public long getF1();
+    method public long getF10();
+    method public long getF11();
+    method public long getF12();
+    method public long getF2();
+    method public long getF3();
+    method public long getF4();
+    method public long getF5();
+    method public long getF6();
+    method public long getF7();
+    method public long getF8();
+    method public long getF9();
+    method public long getFive();
+    method public long getFocus();
+    method public long getForward();
+    method public long getFour();
+    method public long getFunction();
+    method public long getG();
+    method public long getGrave();
+    method public long getGuide();
+    method public long getH();
+    method public long getHeadsetHook();
+    method public long getHelp();
+    method public long getHenkan();
+    method public long getHome();
+    method public long getI();
+    method public long getInfo();
+    method public long getInsert();
+    method public long getJ();
+    method public long getK();
+    method public long getKana();
+    method public long getKatakanaHiragana();
+    method public long getL();
+    method public long getLanguageSwitch();
+    method public long getLastChannel();
+    method public long getLeftBracket();
+    method public long getM();
+    method public long getMannerMode();
+    method public long getMediaAudioTrack();
+    method public long getMediaClose();
+    method public long getMediaEject();
+    method public long getMediaFastForward();
+    method public long getMediaNext();
+    method public long getMediaPause();
+    method public long getMediaPlay();
+    method public long getMediaPlayPause();
+    method public long getMediaPrevious();
+    method public long getMediaRecord();
+    method public long getMediaRewind();
+    method public long getMediaSkipBackward();
+    method public long getMediaSkipForward();
+    method public long getMediaStepBackward();
+    method public long getMediaStepForward();
+    method public long getMediaStop();
+    method public long getMediaTopMenu();
+    method public long getMenu();
+    method public long getMetaLeft();
+    method public long getMetaRight();
+    method public long getMicrophoneMute();
+    method public long getMinus();
+    method public long getMoveEnd();
+    method public long getMoveHome();
+    method public long getMuhenkan();
+    method public long getMultiply();
+    method public long getMusic();
+    method public long getN();
+    method public long getNavigateIn();
+    method public long getNavigateNext();
+    method public long getNavigateOut();
+    method public long getNavigatePrevious();
+    method public long getNine();
+    method public long getNotification();
+    method public long getNumLock();
+    method public long getNumPad0();
+    method public long getNumPad1();
+    method public long getNumPad2();
+    method public long getNumPad3();
+    method public long getNumPad4();
+    method public long getNumPad5();
+    method public long getNumPad6();
+    method public long getNumPad7();
+    method public long getNumPad8();
+    method public long getNumPad9();
+    method public long getNumPadAdd();
+    method public long getNumPadComma();
+    method public long getNumPadDivide();
+    method public long getNumPadDot();
+    method public long getNumPadEnter();
+    method public long getNumPadEquals();
+    method public long getNumPadLeftParenthesis();
+    method public long getNumPadMultiply();
+    method public long getNumPadRightParenthesis();
+    method public long getNumPadSubtract();
+    method public long getNumber();
+    method public long getO();
+    method public long getOne();
+    method public long getP();
+    method public long getPageDown();
+    method public long getPageUp();
+    method public long getPairing();
+    method public long getPaste();
+    method public long getPeriod();
+    method public long getPictureSymbols();
+    method public long getPlus();
+    method public long getPound();
+    method public long getPower();
+    method public long getPrintScreen();
+    method public long getProfileSwitch();
+    method public long getProgramBlue();
+    method public long getProgramGreen();
+    method public long getProgramRed();
+    method public long getProgramYellow();
+    method public long getQ();
+    method public long getR();
+    method public long getRefresh();
+    method public long getRightBracket();
+    method public long getRo();
+    method public long getS();
+    method public long getScrollLock();
+    method public long getSearch();
+    method public long getSemicolon();
+    method public long getSetTopBoxInput();
+    method public long getSetTopBoxPower();
+    method public long getSettings();
+    method public long getSeven();
+    method public long getShiftLeft();
+    method public long getShiftRight();
+    method public long getSix();
+    method public long getSlash();
+    method public long getSleep();
+    method public long getSoftLeft();
+    method public long getSoftRight();
+    method public long getSoftSleep();
+    method public long getSpacebar();
+    method public long getStem1();
+    method public long getStem2();
+    method public long getStem3();
+    method public long getStemPrimary();
+    method public long getSwitchCharset();
+    method public long getSymbol();
+    method public long getSystemNavigationDown();
+    method public long getSystemNavigationLeft();
+    method public long getSystemNavigationRight();
+    method public long getSystemNavigationUp();
+    method public long getT();
+    method public long getTab();
+    method public long getThree();
+    method public long getThumbsDown();
+    method public long getThumbsUp();
+    method public long getToggle2D3D();
+    method public long getTv();
+    method public long getTvAntennaCable();
+    method public long getTvAudioDescription();
+    method public long getTvAudioDescriptionMixingVolumeDown();
+    method public long getTvAudioDescriptionMixingVolumeUp();
+    method public long getTvContentsMenu();
+    method public long getTvDataService();
+    method public long getTvInput();
+    method public long getTvInputComponent1();
+    method public long getTvInputComponent2();
+    method public long getTvInputComposite1();
+    method public long getTvInputComposite2();
+    method public long getTvInputHdmi1();
+    method public long getTvInputHdmi2();
+    method public long getTvInputHdmi3();
+    method public long getTvInputHdmi4();
+    method public long getTvInputVga1();
+    method public long getTvMediaContextMenu();
+    method public long getTvNetwork();
+    method public long getTvNumberEntry();
+    method public long getTvPower();
+    method public long getTvRadioService();
+    method public long getTvSatellite();
+    method public long getTvSatelliteBs();
+    method public long getTvSatelliteCs();
+    method public long getTvSatelliteService();
+    method public long getTvTeletext();
+    method public long getTvTerrestrialAnalog();
+    method public long getTvTerrestrialDigital();
+    method public long getTvTimerProgramming();
+    method public long getTvZoomMode();
+    method public long getTwo();
+    method public long getU();
+    method public long getUnknown();
+    method public long getV();
+    method public long getVoiceAssist();
+    method public long getVolumeDown();
+    method public long getVolumeMute();
+    method public long getVolumeUp();
+    method public long getW();
+    method public long getWakeUp();
+    method public long getWindow();
+    method public long getX();
+    method public long getY();
+    method public long getYen();
+    method public long getZ();
+    method public long getZenkakuHankaru();
+    method public long getZero();
+    method public long getZoomIn();
+    method public long getZoomOut();
+    property public final long A;
+    property public final long AllApps;
+    property public final long AltLeft;
+    property public final long AltRight;
+    property public final long Apostrophe;
+    property public final long AppSwitch;
+    property public final long Assist;
+    property public final long At;
+    property public final long AvReceiverInput;
+    property public final long AvReceiverPower;
+    property public final long B;
+    property public final long Back;
+    property public final long Backslash;
+    property public final long Backspace;
+    property public final long Bookmark;
+    property public final long Break;
+    property public final long BrightnessDown;
+    property public final long BrightnessUp;
+    property public final long Browser;
+    property public final long Button1;
+    property public final long Button10;
+    property public final long Button11;
+    property public final long Button12;
+    property public final long Button13;
+    property public final long Button14;
+    property public final long Button15;
+    property public final long Button16;
+    property public final long Button2;
+    property public final long Button3;
+    property public final long Button4;
+    property public final long Button5;
+    property public final long Button6;
+    property public final long Button7;
+    property public final long Button8;
+    property public final long Button9;
+    property public final long ButtonA;
+    property public final long ButtonB;
+    property public final long ButtonC;
+    property public final long ButtonL1;
+    property public final long ButtonL2;
+    property public final long ButtonMode;
+    property public final long ButtonR1;
+    property public final long ButtonR2;
+    property public final long ButtonSelect;
+    property public final long ButtonStart;
+    property public final long ButtonThumbLeft;
+    property public final long ButtonThumbRight;
+    property public final long ButtonX;
+    property public final long ButtonY;
+    property public final long ButtonZ;
+    property public final long C;
+    property public final long Calculator;
+    property public final long Calendar;
+    property public final long Call;
+    property public final long Camera;
+    property public final long CapsLock;
+    property public final long Captions;
+    property public final long ChannelDown;
+    property public final long ChannelUp;
+    property public final long Clear;
+    property public final long Comma;
+    property public final long Contacts;
+    property public final long Copy;
+    property public final long CtrlLeft;
+    property public final long CtrlRight;
+    property public final long Cut;
+    property public final long D;
+    property public final long Delete;
+    property public final long DirectionCenter;
+    property public final long DirectionDown;
+    property public final long DirectionDownLeft;
+    property public final long DirectionDownRight;
+    property public final long DirectionLeft;
+    property public final long DirectionRight;
+    property public final long DirectionUp;
+    property public final long DirectionUpLeft;
+    property public final long DirectionUpRight;
+    property public final long Dvr;
+    property public final long E;
+    property public final long Eight;
+    property public final long Eisu;
+    property public final long EndCall;
+    property public final long Enter;
+    property public final long Envelope;
+    property public final long Equals;
+    property public final long Escape;
+    property public final long F;
+    property public final long F1;
+    property public final long F10;
+    property public final long F11;
+    property public final long F12;
+    property public final long F2;
+    property public final long F3;
+    property public final long F4;
+    property public final long F5;
+    property public final long F6;
+    property public final long F7;
+    property public final long F8;
+    property public final long F9;
+    property public final long Five;
+    property public final long Focus;
+    property public final long Forward;
+    property public final long Four;
+    property public final long Function;
+    property public final long G;
+    property public final long Grave;
+    property public final long Guide;
+    property public final long H;
+    property public final long HeadsetHook;
+    property public final long Help;
+    property public final long Henkan;
+    property public final long Home;
+    property public final long I;
+    property public final long Info;
+    property public final long Insert;
+    property public final long J;
+    property public final long K;
+    property public final long Kana;
+    property public final long KatakanaHiragana;
+    property public final long L;
+    property public final long LanguageSwitch;
+    property public final long LastChannel;
+    property public final long LeftBracket;
+    property public final long M;
+    property public final long MannerMode;
+    property public final long MediaAudioTrack;
+    property public final long MediaClose;
+    property public final long MediaEject;
+    property public final long MediaFastForward;
+    property public final long MediaNext;
+    property public final long MediaPause;
+    property public final long MediaPlay;
+    property public final long MediaPlayPause;
+    property public final long MediaPrevious;
+    property public final long MediaRecord;
+    property public final long MediaRewind;
+    property public final long MediaSkipBackward;
+    property public final long MediaSkipForward;
+    property public final long MediaStepBackward;
+    property public final long MediaStepForward;
+    property public final long MediaStop;
+    property public final long MediaTopMenu;
+    property public final long Menu;
+    property public final long MetaLeft;
+    property public final long MetaRight;
+    property public final long MicrophoneMute;
+    property public final long Minus;
+    property public final long MoveEnd;
+    property public final long MoveHome;
+    property public final long Muhenkan;
+    property public final long Multiply;
+    property public final long Music;
+    property public final long N;
+    property public final long NavigateIn;
+    property public final long NavigateNext;
+    property public final long NavigateOut;
+    property public final long NavigatePrevious;
+    property public final long Nine;
+    property public final long Notification;
+    property public final long NumLock;
+    property public final long NumPad0;
+    property public final long NumPad1;
+    property public final long NumPad2;
+    property public final long NumPad3;
+    property public final long NumPad4;
+    property public final long NumPad5;
+    property public final long NumPad6;
+    property public final long NumPad7;
+    property public final long NumPad8;
+    property public final long NumPad9;
+    property public final long NumPadAdd;
+    property public final long NumPadComma;
+    property public final long NumPadDivide;
+    property public final long NumPadDot;
+    property public final long NumPadEnter;
+    property public final long NumPadEquals;
+    property public final long NumPadLeftParenthesis;
+    property public final long NumPadMultiply;
+    property public final long NumPadRightParenthesis;
+    property public final long NumPadSubtract;
+    property public final long Number;
+    property public final long O;
+    property public final long One;
+    property public final long P;
+    property public final long PageDown;
+    property public final long PageUp;
+    property public final long Pairing;
+    property public final long Paste;
+    property public final long Period;
+    property public final long PictureSymbols;
+    property public final long Plus;
+    property public final long Pound;
+    property public final long Power;
+    property public final long PrintScreen;
+    property public final long ProfileSwitch;
+    property public final long ProgramBlue;
+    property public final long ProgramGreen;
+    property public final long ProgramRed;
+    property public final long ProgramYellow;
+    property public final long Q;
+    property public final long R;
+    property public final long Refresh;
+    property public final long RightBracket;
+    property public final long Ro;
+    property public final long S;
+    property public final long ScrollLock;
+    property public final long Search;
+    property public final long Semicolon;
+    property public final long SetTopBoxInput;
+    property public final long SetTopBoxPower;
+    property public final long Settings;
+    property public final long Seven;
+    property public final long ShiftLeft;
+    property public final long ShiftRight;
+    property public final long Six;
+    property public final long Slash;
+    property public final long Sleep;
+    property public final long SoftLeft;
+    property public final long SoftRight;
+    property public final long SoftSleep;
+    property public final long Spacebar;
+    property public final long Stem1;
+    property public final long Stem2;
+    property public final long Stem3;
+    property public final long StemPrimary;
+    property public final long SwitchCharset;
+    property public final long Symbol;
+    property public final long SystemNavigationDown;
+    property public final long SystemNavigationLeft;
+    property public final long SystemNavigationRight;
+    property public final long SystemNavigationUp;
+    property public final long T;
+    property public final long Tab;
+    property public final long Three;
+    property public final long ThumbsDown;
+    property public final long ThumbsUp;
+    property public final long Toggle2D3D;
+    property public final long Tv;
+    property public final long TvAntennaCable;
+    property public final long TvAudioDescription;
+    property public final long TvAudioDescriptionMixingVolumeDown;
+    property public final long TvAudioDescriptionMixingVolumeUp;
+    property public final long TvContentsMenu;
+    property public final long TvDataService;
+    property public final long TvInput;
+    property public final long TvInputComponent1;
+    property public final long TvInputComponent2;
+    property public final long TvInputComposite1;
+    property public final long TvInputComposite2;
+    property public final long TvInputHdmi1;
+    property public final long TvInputHdmi2;
+    property public final long TvInputHdmi3;
+    property public final long TvInputHdmi4;
+    property public final long TvInputVga1;
+    property public final long TvMediaContextMenu;
+    property public final long TvNetwork;
+    property public final long TvNumberEntry;
+    property public final long TvPower;
+    property public final long TvRadioService;
+    property public final long TvSatellite;
+    property public final long TvSatelliteBs;
+    property public final long TvSatelliteCs;
+    property public final long TvSatelliteService;
+    property public final long TvTeletext;
+    property public final long TvTerrestrialAnalog;
+    property public final long TvTerrestrialDigital;
+    property public final long TvTimerProgramming;
+    property public final long TvZoomMode;
+    property public final long Two;
+    property public final long U;
+    property public final long Unknown;
+    property public final long V;
+    property public final long VoiceAssist;
+    property public final long VolumeDown;
+    property public final long VolumeMute;
+    property public final long VolumeUp;
+    property public final long W;
+    property public final long WakeUp;
+    property public final long Window;
+    property public final long X;
+    property public final long Y;
+    property public final long Yen;
+    property public final long Z;
+    property public final long ZenkakuHankaru;
+    property public final long Zero;
+    property public final long ZoomIn;
+    property public final long ZoomOut;
+  }
+
+  public final inline class KeyEvent {
+    ctor public KeyEvent();
+    method public android.view.KeyEvent getNativeKeyEvent();
+    property public final android.view.KeyEvent nativeKeyEvent;
+  }
+
+  public final inline class KeyEventType {
+    ctor public KeyEventType();
+  }
+
+  public static final class KeyEventType.Companion {
+    method public int getKeyDown();
+    method public int getKeyUp();
+    method public int getUnknown();
+    property public final int KeyDown;
+    property public final int KeyUp;
+    property public final int Unknown;
+  }
+
+  public final class KeyEvent_androidKt {
+    method public static long getKey(android.view.KeyEvent);
+    method public static int getType(android.view.KeyEvent);
+    method public static int getUtf16CodePoint(android.view.KeyEvent);
+    method public static boolean isAltPressed(android.view.KeyEvent);
+    method public static boolean isCtrlPressed(android.view.KeyEvent);
+    method public static boolean isMetaPressed(android.view.KeyEvent);
+    method public static boolean isShiftPressed(android.view.KeyEvent);
+  }
+
+  public final class KeyInputModifierKt {
+    method public static androidx.compose.ui.Modifier onKeyEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.key.KeyEvent,java.lang.Boolean> onKeyEvent);
+    method public static androidx.compose.ui.Modifier onPreviewKeyEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.key.KeyEvent,java.lang.Boolean> onPreviewKeyEvent);
+  }
+
+  public final class Key_androidKt {
+    method public static long Key(int nativeKeyCode);
+    method public static int getNativeKeyCode(long);
+  }
+
+}
+
+package androidx.compose.ui.input.nestedscroll {
+
+  public interface NestedScrollConnection {
+    method public default suspend Object? onPostFling(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public default long onPostScroll(long consumed, long available, int source);
+    method public default suspend Object? onPreFling(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public default long onPreScroll(long available, int source);
+  }
+
+  public final class NestedScrollDelegatingWrapperKt {
+  }
+
+  public final class NestedScrollDispatcher {
+    ctor public NestedScrollDispatcher();
+    method public suspend Object? dispatchPostFling(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public long dispatchPostScroll(long consumed, long available, int source);
+    method public suspend Object? dispatchPreFling(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public long dispatchPreScroll(long available, int source);
+    method public kotlinx.coroutines.CoroutineScope getCoroutineScope();
+    property public final kotlinx.coroutines.CoroutineScope coroutineScope;
+  }
+
+  public final class NestedScrollModifierKt {
+    method public static androidx.compose.ui.Modifier nestedScroll(androidx.compose.ui.Modifier, androidx.compose.ui.input.nestedscroll.NestedScrollConnection connection, optional androidx.compose.ui.input.nestedscroll.NestedScrollDispatcher? dispatcher);
+  }
+
+  public final inline class NestedScrollSource {
+    ctor public NestedScrollSource();
+  }
+
+  public static final class NestedScrollSource.Companion {
+    method public int getDrag();
+    method public int getFling();
+    method @Deprecated public int getRelocate();
+    property public final int Drag;
+    property public final int Fling;
+    property @Deprecated public final int Relocate;
+  }
+
+}
+
+package androidx.compose.ui.input.pointer {
+
+  @kotlin.coroutines.RestrictsSuspension public interface AwaitPointerEventScope extends androidx.compose.ui.unit.Density {
+    method public suspend Object? awaitPointerEvent(optional androidx.compose.ui.input.pointer.PointerEventPass pass, optional kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerEvent> p);
+    method public androidx.compose.ui.input.pointer.PointerEvent getCurrentEvent();
+    method public default long getExtendedTouchPadding();
+    method public long getSize();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    method public default suspend <T> Object? withTimeout(long timeMillis, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.AwaitPointerEventScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T> p);
+    method public default suspend <T> Object? withTimeoutOrNull(long timeMillis, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.AwaitPointerEventScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T> p);
+    property public abstract androidx.compose.ui.input.pointer.PointerEvent currentEvent;
+    property public default long extendedTouchPadding;
+    property public abstract long size;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+  }
+
+  public final class ConsumedData {
+    ctor public ConsumedData(optional boolean positionChange, optional boolean downChange);
+    method public boolean getDownChange();
+    method public boolean getPositionChange();
+    method public void setDownChange(boolean downChange);
+    method public void setPositionChange(boolean positionChange);
+    property public final boolean downChange;
+    property public final boolean positionChange;
+  }
+
+  @androidx.compose.runtime.Immutable @androidx.compose.ui.ExperimentalComposeUiApi public final class HistoricalChange {
+    ctor public HistoricalChange(long uptimeMillis, long position);
+    method public long getPosition();
+    method public long getUptimeMillis();
+    property public final long position;
+    property public final long uptimeMillis;
+  }
+
+  public final inline class PointerButtons {
+    ctor public PointerButtons();
+  }
+
+  public final class PointerEvent {
+    ctor public PointerEvent(java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes);
+    method public java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> component1();
+    method public androidx.compose.ui.input.pointer.PointerEvent copy(java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes, android.view.MotionEvent? motionEvent);
+    method public int getButtons();
+    method public java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> getChanges();
+    method public int getKeyboardModifiers();
+    method public int getType();
+    property public final int buttons;
+    property public final java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes;
+    property public final int keyboardModifiers;
+    property public final int type;
+  }
+
+  public final class PointerEventKt {
+    method public static boolean anyChangeConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static boolean changedToDown(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static boolean changedToDownIgnoreConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static boolean changedToUp(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static boolean changedToUpIgnoreConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static void consumeAllChanges(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static void consumeDownChange(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static void consumePositionChange(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static int indexOfFirstPressed(int);
+    method public static int indexOfLastPressed(int);
+    method @Deprecated public static boolean isOutOfBounds(androidx.compose.ui.input.pointer.PointerInputChange, long size);
+    method public static boolean isOutOfBounds(androidx.compose.ui.input.pointer.PointerInputChange, long size, long extendedTouchPadding);
+    method public static boolean isPressed(int, int buttonIndex);
+    method public static long positionChange(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static boolean positionChangeConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static long positionChangeIgnoreConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static boolean positionChanged(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static boolean positionChangedIgnoreConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
+  }
+
+  public enum PointerEventPass {
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerEventPass Final;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerEventPass Initial;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerEventPass Main;
+  }
+
+  public final class PointerEventTimeoutCancellationException extends java.util.concurrent.CancellationException {
+    ctor public PointerEventTimeoutCancellationException(long time);
+  }
+
+  public final inline class PointerEventType {
+    ctor public PointerEventType();
+  }
+
+  public static final class PointerEventType.Companion {
+    method public int getEnter();
+    method public int getExit();
+    method public int getMove();
+    method public int getPress();
+    method public int getRelease();
+    method public int getUnknown();
+    property public final int Enter;
+    property public final int Exit;
+    property public final int Move;
+    property public final int Press;
+    property public final int Release;
+    property public final int Unknown;
+  }
+
+  public final class PointerEvent_androidKt {
+    method public static boolean getAreAnyPressed(int);
+    method public static int indexOfFirstPressed(int);
+    method public static int indexOfLastPressed(int);
+    method public static boolean isAltGraphPressed(int);
+    method public static boolean isAltPressed(int);
+    method public static boolean isBackPressed(int);
+    method public static boolean isCapsLockOn(int);
+    method public static boolean isCtrlPressed(int);
+    method public static boolean isForwardPressed(int);
+    method public static boolean isFunctionPressed(int);
+    method public static boolean isMetaPressed(int);
+    method public static boolean isNumLockOn(int);
+    method public static boolean isPressed(int, int buttonIndex);
+    method public static boolean isPrimaryPressed(int);
+    method public static boolean isScrollLockOn(int);
+    method public static boolean isSecondaryPressed(int);
+    method public static boolean isShiftPressed(int);
+    method public static boolean isSymPressed(int);
+    method public static boolean isTertiaryPressed(int);
+  }
+
+  public interface PointerIcon {
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public final class PointerIconDefaults {
+    method public androidx.compose.ui.input.pointer.PointerIcon getCrosshair();
+    method public androidx.compose.ui.input.pointer.PointerIcon getDefault();
+    method public androidx.compose.ui.input.pointer.PointerIcon getHand();
+    method public androidx.compose.ui.input.pointer.PointerIcon getText();
+    property public final androidx.compose.ui.input.pointer.PointerIcon Crosshair;
+    property public final androidx.compose.ui.input.pointer.PointerIcon Default;
+    property public final androidx.compose.ui.input.pointer.PointerIcon Hand;
+    property public final androidx.compose.ui.input.pointer.PointerIcon Text;
+    field public static final androidx.compose.ui.input.pointer.PointerIconDefaults INSTANCE;
+  }
+
+  public final class PointerIconKt {
+    method public static androidx.compose.ui.Modifier pointerHoverIcon(androidx.compose.ui.Modifier, androidx.compose.ui.input.pointer.PointerIcon icon, optional boolean overrideDescendants);
+  }
+
+  public final class PointerIcon_androidKt {
+    method public static androidx.compose.ui.input.pointer.PointerIcon PointerIcon(android.view.PointerIcon pointerIcon);
+    method public static androidx.compose.ui.input.pointer.PointerIcon PointerIcon(int pointerIconType);
+  }
+
+  public final inline class PointerId {
+    ctor public PointerId();
+    method public long getValue();
+    property public final long value;
+  }
+
+  @androidx.compose.runtime.Immutable public final class PointerInputChange {
+    ctor public PointerInputChange(long id, long uptimeMillis, long position, boolean pressed, long previousUptimeMillis, long previousPosition, boolean previousPressed, androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type);
+    ctor @androidx.compose.ui.ExperimentalComposeUiApi public PointerInputChange(long id, long uptimeMillis, long position, boolean pressed, long previousUptimeMillis, long previousPosition, boolean previousPressed, androidx.compose.ui.input.pointer.ConsumedData consumed, int type, java.util.List<androidx.compose.ui.input.pointer.HistoricalChange> historical);
+    method public androidx.compose.ui.input.pointer.PointerInputChange copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public androidx.compose.ui.input.pointer.PointerInputChange copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type, java.util.List<androidx.compose.ui.input.pointer.HistoricalChange> historical);
+    method public androidx.compose.ui.input.pointer.ConsumedData getConsumed();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public java.util.List<androidx.compose.ui.input.pointer.HistoricalChange> getHistorical();
+    method public long getId();
+    method public long getPosition();
+    method public boolean getPressed();
+    method public long getPreviousPosition();
+    method public boolean getPreviousPressed();
+    method public long getPreviousUptimeMillis();
+    method public int getType();
+    method public long getUptimeMillis();
+    property public final androidx.compose.ui.input.pointer.ConsumedData consumed;
+    property @androidx.compose.ui.ExperimentalComposeUiApi public final java.util.List<androidx.compose.ui.input.pointer.HistoricalChange> historical;
+    property public final long id;
+    property public final long position;
+    property public final boolean pressed;
+    property public final long previousPosition;
+    property public final boolean previousPressed;
+    property public final long previousUptimeMillis;
+    property public final int type;
+    property public final long uptimeMillis;
+  }
+
+  public final class PointerInputEventProcessorKt {
+  }
+
+  public abstract class PointerInputFilter {
+    ctor public PointerInputFilter();
+    method public boolean getInterceptOutOfBoundsChildEvents();
+    method public final long getSize();
+    method public abstract void onCancel();
+    method public abstract void onPointerEvent(androidx.compose.ui.input.pointer.PointerEvent pointerEvent, androidx.compose.ui.input.pointer.PointerEventPass pass, long bounds);
+    property public boolean interceptOutOfBoundsChildEvents;
+    property public final long size;
+  }
+
+  public interface PointerInputModifier extends androidx.compose.ui.Modifier.Element {
+    method public androidx.compose.ui.input.pointer.PointerInputFilter getPointerInputFilter();
+    property public abstract androidx.compose.ui.input.pointer.PointerInputFilter pointerInputFilter;
+  }
+
+  public interface PointerInputScope extends androidx.compose.ui.unit.Density {
+    method public suspend <R> Object? awaitPointerEventScope(kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.AwaitPointerEventScope,? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R> p);
+    method public default long getExtendedTouchPadding();
+    method public default boolean getInterceptOutOfBoundsChildEvents();
+    method public long getSize();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    method public default void setInterceptOutOfBoundsChildEvents(boolean _);
+    property public default long extendedTouchPadding;
+    property public default boolean interceptOutOfBoundsChildEvents;
+    property public abstract long size;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+  }
+
+  public final class PointerInputTestUtilKt {
+  }
+
+  public final class PointerInteropFilter_androidKt {
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier motionEventSpy(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super android.view.MotionEvent,kotlin.Unit> watcher);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier pointerInteropFilter(androidx.compose.ui.Modifier, optional androidx.compose.ui.input.pointer.RequestDisallowInterceptTouchEvent? requestDisallowInterceptTouchEvent, kotlin.jvm.functions.Function1<? super android.view.MotionEvent,java.lang.Boolean> onTouchEvent);
+  }
+
+  public final class PointerInteropUtils_androidKt {
+  }
+
+  public final inline class PointerKeyboardModifiers {
+    ctor public PointerKeyboardModifiers();
+  }
+
+  public final inline class PointerType {
+    ctor public PointerType();
+  }
+
+  public static final class PointerType.Companion {
+    method public int getEraser();
+    method public int getMouse();
+    method public int getStylus();
+    method public int getTouch();
+    method public int getUnknown();
+    property public final int Eraser;
+    property public final int Mouse;
+    property public final int Stylus;
+    property public final int Touch;
+    property public final int Unknown;
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public final class RequestDisallowInterceptTouchEvent implements kotlin.jvm.functions.Function1<java.lang.Boolean,kotlin.Unit> {
+    ctor public RequestDisallowInterceptTouchEvent();
+    method public void invoke(boolean disallowIntercept);
+  }
+
+  public final class SuspendingPointerInputFilterKt {
+    method @Deprecated public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+  }
+
+}
+
+package androidx.compose.ui.input.pointer.util {
+
+  public final class VelocityTracker {
+    ctor public VelocityTracker();
+    method public void addPosition(long timeMillis, long position);
+    method public long calculateVelocity();
+    method public void resetTracking();
+  }
+
+  public final class VelocityTrackerKt {
+    method public static void addPointerInputChange(androidx.compose.ui.input.pointer.util.VelocityTracker, androidx.compose.ui.input.pointer.PointerInputChange event);
+  }
+
+}
+
+package androidx.compose.ui.layout {
+
+  @androidx.compose.runtime.Immutable public abstract sealed class AlignmentLine {
+    field public static final androidx.compose.ui.layout.AlignmentLine.Companion Companion;
+    field public static final int Unspecified = -2147483648; // 0x80000000
+  }
+
+  public static final class AlignmentLine.Companion {
+  }
+
+  public final class AlignmentLineKt {
+    method public static androidx.compose.ui.layout.HorizontalAlignmentLine getFirstBaseline();
+    method public static androidx.compose.ui.layout.HorizontalAlignmentLine getLastBaseline();
+    property public static final androidx.compose.ui.layout.HorizontalAlignmentLine FirstBaseline;
+    property public static final androidx.compose.ui.layout.HorizontalAlignmentLine LastBaseline;
+  }
+
+  @androidx.compose.runtime.Stable public interface ContentScale {
+    method public long computeScaleFactor(long srcSize, long dstSize);
+    field public static final androidx.compose.ui.layout.ContentScale.Companion Companion;
+  }
+
+  public static final class ContentScale.Companion {
+    method public androidx.compose.ui.layout.ContentScale getCrop();
+    method public androidx.compose.ui.layout.ContentScale getFillBounds();
+    method public androidx.compose.ui.layout.ContentScale getFillHeight();
+    method public androidx.compose.ui.layout.ContentScale getFillWidth();
+    method public androidx.compose.ui.layout.ContentScale getFit();
+    method public androidx.compose.ui.layout.ContentScale getInside();
+    method public androidx.compose.ui.layout.FixedScale getNone();
+    property public final androidx.compose.ui.layout.ContentScale Crop;
+    property public final androidx.compose.ui.layout.ContentScale FillBounds;
+    property public final androidx.compose.ui.layout.ContentScale FillHeight;
+    property public final androidx.compose.ui.layout.ContentScale FillWidth;
+    property public final androidx.compose.ui.layout.ContentScale Fit;
+    property public final androidx.compose.ui.layout.ContentScale Inside;
+    property public final androidx.compose.ui.layout.FixedScale None;
+  }
+
+  public final class ContentScaleKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class FixedScale implements androidx.compose.ui.layout.ContentScale {
+    ctor public FixedScale(float value);
+    method public float component1();
+    method public long computeScaleFactor(long srcSize, long dstSize);
+    method public androidx.compose.ui.layout.FixedScale copy(float value);
+    method public float getValue();
+    property public final float value;
+  }
+
+  public interface GraphicLayerInfo {
+    method public long getLayerId();
+    method public default long getOwnerViewId();
+    property public abstract long layerId;
+    property public default long ownerViewId;
+  }
+
+  public final class HorizontalAlignmentLine extends androidx.compose.ui.layout.AlignmentLine {
+    ctor public HorizontalAlignmentLine(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,java.lang.Integer> merger);
+  }
+
+  public interface IntrinsicMeasurable {
+    method public Object? getParentData();
+    method public int maxIntrinsicHeight(int width);
+    method public int maxIntrinsicWidth(int height);
+    method public int minIntrinsicHeight(int width);
+    method public int minIntrinsicWidth(int height);
+    property public abstract Object? parentData;
+  }
+
+  public final class IntrinsicMeasurableKt {
+  }
+
+  public interface IntrinsicMeasureScope extends androidx.compose.ui.unit.Density {
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
+  }
+
+  public interface LayoutCoordinates {
+    method public operator int get(androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public androidx.compose.ui.layout.LayoutCoordinates? getParentCoordinates();
+    method public androidx.compose.ui.layout.LayoutCoordinates? getParentLayoutCoordinates();
+    method public java.util.Set<androidx.compose.ui.layout.AlignmentLine> getProvidedAlignmentLines();
+    method public long getSize();
+    method public boolean isAttached();
+    method public androidx.compose.ui.geometry.Rect localBoundingBoxOf(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, optional boolean clipBounds);
+    method public long localPositionOf(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, long relativeToSource);
+    method public long localToRoot(long relativeToLocal);
+    method public long localToWindow(long relativeToLocal);
+    method public long windowToLocal(long relativeToWindow);
+    property public abstract boolean isAttached;
+    property public abstract androidx.compose.ui.layout.LayoutCoordinates? parentCoordinates;
+    property public abstract androidx.compose.ui.layout.LayoutCoordinates? parentLayoutCoordinates;
+    property public abstract java.util.Set<androidx.compose.ui.layout.AlignmentLine> providedAlignmentLines;
+    property public abstract long size;
+  }
+
+  public final class LayoutCoordinatesKt {
+    method public static androidx.compose.ui.geometry.Rect boundsInParent(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static androidx.compose.ui.geometry.Rect boundsInRoot(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static androidx.compose.ui.geometry.Rect boundsInWindow(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static long positionInParent(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static long positionInRoot(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static long positionInWindow(androidx.compose.ui.layout.LayoutCoordinates);
+  }
+
+  public final class LayoutIdKt {
+    method public static Object? getLayoutId(androidx.compose.ui.layout.Measurable);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier layoutId(androidx.compose.ui.Modifier, Object layoutId);
+  }
+
+  public interface LayoutIdParentData {
+    method public Object getLayoutId();
+    property public abstract Object layoutId;
+  }
+
+  public interface LayoutInfo {
+    method public androidx.compose.ui.layout.LayoutCoordinates getCoordinates();
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public int getHeight();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public java.util.List<androidx.compose.ui.layout.ModifierInfo> getModifierInfo();
+    method public androidx.compose.ui.layout.LayoutInfo? getParentInfo();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    method public int getWidth();
+    method public boolean isAttached();
+    method public boolean isPlaced();
+    property public abstract androidx.compose.ui.layout.LayoutCoordinates coordinates;
+    property public abstract androidx.compose.ui.unit.Density density;
+    property public abstract int height;
+    property public abstract boolean isAttached;
+    property public abstract boolean isPlaced;
+    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public abstract androidx.compose.ui.layout.LayoutInfo? parentInfo;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+    property public abstract int width;
+  }
+
+  public final class LayoutKt {
+    method @androidx.compose.runtime.Composable public static inline void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> content, optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
+    method @androidx.compose.runtime.Composable public static inline void Layout(optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
+    method @Deprecated @androidx.compose.runtime.Composable public static void MultiMeasureLayout(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
+  }
+
+  public interface LayoutModifier extends androidx.compose.ui.Modifier.Element {
+    method public default int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int width);
+    method public default int maxIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int height);
+    method public androidx.compose.ui.layout.MeasureResult measure(androidx.compose.ui.layout.MeasureScope, androidx.compose.ui.layout.Measurable measurable, long constraints);
+    method public default int minIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int width);
+    method public default int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int height);
+  }
+
+  public final class LayoutModifierKt {
+    method public static androidx.compose.ui.Modifier layout(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function3<? super androidx.compose.ui.layout.MeasureScope,? super androidx.compose.ui.layout.Measurable,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measure);
+  }
+
+  public interface Measurable extends androidx.compose.ui.layout.IntrinsicMeasurable {
+    method public androidx.compose.ui.layout.Placeable measure(long constraints);
+  }
+
+  @androidx.compose.runtime.Stable public fun interface MeasurePolicy {
+    method public default int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int width);
+    method public default int maxIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int height);
+    method public androidx.compose.ui.layout.MeasureResult measure(androidx.compose.ui.layout.MeasureScope, java.util.List<? extends androidx.compose.ui.layout.Measurable> measurables, long constraints);
+    method public default int minIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int width);
+    method public default int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int height);
+  }
+
+  public interface MeasureResult {
+    method public java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> getAlignmentLines();
+    method public int getHeight();
+    method public int getWidth();
+    method public void placeChildren();
+    property public abstract java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> alignmentLines;
+    property public abstract int height;
+    property public abstract int width;
+  }
+
+  public interface MeasureScope extends androidx.compose.ui.layout.IntrinsicMeasureScope {
+    method public default androidx.compose.ui.layout.MeasureResult layout(int width, int height, optional java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> alignmentLines, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.Placeable.PlacementScope,kotlin.Unit> placementBlock);
+  }
+
+  public final class MeasureScopeKt {
+  }
+
+  public interface Measured {
+    method public operator int get(androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public int getMeasuredHeight();
+    method public int getMeasuredWidth();
+    property public abstract int measuredHeight;
+    property public abstract int measuredWidth;
+  }
+
+  public final class ModifierInfo {
+    ctor public ModifierInfo(androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.LayoutCoordinates coordinates, optional Object? extra);
+    method public androidx.compose.ui.layout.LayoutCoordinates getCoordinates();
+    method public Object? getExtra();
+    method public androidx.compose.ui.Modifier getModifier();
+    property public final androidx.compose.ui.layout.LayoutCoordinates coordinates;
+    property public final Object? extra;
+    property public final androidx.compose.ui.Modifier modifier;
+  }
+
+  public interface OnGloballyPositionedModifier extends androidx.compose.ui.Modifier.Element {
+    method public void onGloballyPositioned(androidx.compose.ui.layout.LayoutCoordinates coordinates);
+  }
+
+  public final class OnGloballyPositionedModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier onGloballyPositioned(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,kotlin.Unit> onGloballyPositioned);
+  }
+
+  public interface OnRemeasuredModifier extends androidx.compose.ui.Modifier.Element {
+    method public void onRemeasured(long size);
+  }
+
+  public final class OnRemeasuredModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier onSizeChanged(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,kotlin.Unit> onSizeChanged);
+  }
+
+  public interface ParentDataModifier extends androidx.compose.ui.Modifier.Element {
+    method public Object? modifyParentData(androidx.compose.ui.unit.Density, Object? parentData);
+  }
+
+  public abstract class Placeable implements androidx.compose.ui.layout.Measured {
+    ctor public Placeable();
+    method protected final long getApparentToRealOffset();
+    method public final int getHeight();
+    method public int getMeasuredHeight();
+    method protected final long getMeasuredSize();
+    method public int getMeasuredWidth();
+    method protected final long getMeasurementConstraints();
+    method public final int getWidth();
+    method protected abstract void placeAt(long position, float zIndex, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit>? layerBlock);
+    method protected final void setMeasuredSize(long value);
+    method protected final void setMeasurementConstraints(long value);
+    property protected final long apparentToRealOffset;
+    property public final int height;
+    property public int measuredHeight;
+    property protected final long measuredSize;
+    property public int measuredWidth;
+    property protected final long measurementConstraints;
+    property public final int width;
+  }
+
+  public abstract static class Placeable.PlacementScope {
+    ctor public Placeable.PlacementScope();
+    method protected abstract androidx.compose.ui.unit.LayoutDirection getParentLayoutDirection();
+    method protected abstract int getParentWidth();
+    method public final void place(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex);
+    method public final void place(androidx.compose.ui.layout.Placeable, long position, optional float zIndex);
+    method public final void placeRelative(androidx.compose.ui.layout.Placeable, long position, optional float zIndex);
+    method public final void placeRelative(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex);
+    method public final void placeRelativeWithLayer(androidx.compose.ui.layout.Placeable, long position, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
+    method public final void placeRelativeWithLayer(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
+    method public final void placeWithLayer(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
+    method public final void placeWithLayer(androidx.compose.ui.layout.Placeable, long position, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
+    property protected abstract androidx.compose.ui.unit.LayoutDirection parentLayoutDirection;
+    property protected abstract int parentWidth;
+  }
+
+  public final class PlaceableKt {
+  }
+
+  @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public interface RelocationModifier extends androidx.compose.ui.Modifier.Element {
+    method @Deprecated public androidx.compose.ui.geometry.Rect computeDestination(androidx.compose.ui.geometry.Rect source, androidx.compose.ui.layout.LayoutCoordinates layoutCoordinates);
+    method @Deprecated public suspend Object? performRelocation(androidx.compose.ui.geometry.Rect source, androidx.compose.ui.geometry.Rect destination, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+  }
+
+  public final class RelocationModifierKt {
+    method @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier onRelocationRequest(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.geometry.Rect,? super androidx.compose.ui.layout.LayoutCoordinates,androidx.compose.ui.geometry.Rect> onProvideDestination, kotlin.jvm.functions.Function3<? super androidx.compose.ui.geometry.Rect,? super androidx.compose.ui.geometry.Rect,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> onPerformRelocation);
+  }
+
+  @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public final class RelocationRequester {
+    ctor @Deprecated public RelocationRequester();
+    method @Deprecated public suspend Object? bringIntoView(optional androidx.compose.ui.geometry.Rect? rect, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+  }
+
+  public final class RelocationRequesterModifierKt {
+    method @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier relocationRequester(androidx.compose.ui.Modifier, Object relocationRequester);
+  }
+
+  public interface Remeasurement {
+    method public void forceRemeasure();
+  }
+
+  public interface RemeasurementModifier extends androidx.compose.ui.Modifier.Element {
+    method public void onRemeasurementAvailable(androidx.compose.ui.layout.Remeasurement remeasurement);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class ScaleFactor {
+    ctor public ScaleFactor();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+  }
+
+  public static final class ScaleFactor.Companion {
+    method public long getUnspecified();
+    property public final long Unspecified;
+  }
+
+  public final class ScaleFactorKt {
+    method @androidx.compose.runtime.Stable public static long ScaleFactor(float scaleX, float scaleY);
+    method @androidx.compose.runtime.Stable public static operator long div(long, long scaleFactor);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.layout.ScaleFactor> block);
+    method @androidx.compose.runtime.Stable public static operator long times(long, long scaleFactor);
+    method @androidx.compose.runtime.Stable public static operator long times(long, long size);
+  }
+
+  public final class SubcomposeLayoutKt {
+    method @androidx.compose.runtime.Composable public static void SubcomposeLayout(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.layout.SubcomposeMeasureScope,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measurePolicy);
+    method @androidx.compose.runtime.Composable public static void SubcomposeLayout(androidx.compose.ui.layout.SubcomposeLayoutState state, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.layout.SubcomposeMeasureScope,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measurePolicy);
+  }
+
+  public final class SubcomposeLayoutState {
+    ctor public SubcomposeLayoutState(int maxSlotsToRetainForReuse);
+    ctor public SubcomposeLayoutState();
+    method public androidx.compose.ui.layout.SubcomposeLayoutState.PrecomposedSlotHandle precompose(Object? slotId, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public static interface SubcomposeLayoutState.PrecomposedSlotHandle {
+    method public void dispose();
+  }
+
+  public interface SubcomposeMeasureScope extends androidx.compose.ui.layout.MeasureScope {
+    method public java.util.List<androidx.compose.ui.layout.Measurable> subcompose(Object? slotId, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class TestModifierUpdaterKt {
+  }
+
+  public final class VerticalAlignmentLine extends androidx.compose.ui.layout.AlignmentLine {
+    ctor public VerticalAlignmentLine(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,java.lang.Integer> merger);
+  }
+
+}
+
+package androidx.compose.ui.modifier {
+
+  @androidx.compose.runtime.Stable public abstract sealed class ModifierLocal<T> {
+  }
+
+  @androidx.compose.runtime.Stable public interface ModifierLocalConsumer extends androidx.compose.ui.Modifier.Element {
+    method public void onModifierLocalsUpdated(androidx.compose.ui.modifier.ModifierLocalReadScope scope);
+  }
+
+  public final class ModifierLocalConsumerKt {
+    method @androidx.compose.runtime.Stable @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier modifierLocalConsumer(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.modifier.ModifierLocalReadScope,kotlin.Unit> consumer);
+  }
+
+  public final class ModifierLocalKt {
+    method public static <T> androidx.compose.ui.modifier.ProvidableModifierLocal<T> modifierLocalOf(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+  }
+
+  @androidx.compose.runtime.Stable public interface ModifierLocalProvider<T> extends androidx.compose.ui.Modifier.Element {
+    method public androidx.compose.ui.modifier.ProvidableModifierLocal<T> getKey();
+    method public T! getValue();
+    property public abstract androidx.compose.ui.modifier.ProvidableModifierLocal<T> key;
+    property public abstract T! value;
+  }
+
+  public final class ModifierLocalProviderKt {
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static <T> androidx.compose.ui.Modifier modifierLocalProvider(androidx.compose.ui.Modifier, androidx.compose.ui.modifier.ProvidableModifierLocal<T> key, kotlin.jvm.functions.Function0<? extends T> value);
+  }
+
+  public interface ModifierLocalReadScope {
+    method public <T> T! getCurrent(androidx.compose.ui.modifier.ModifierLocal<T>);
+  }
+
+  @androidx.compose.runtime.Stable public final class ProvidableModifierLocal<T> extends androidx.compose.ui.modifier.ModifierLocal<T> {
+    ctor public ProvidableModifierLocal(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+  }
+
+}
+
+package androidx.compose.ui.node {
+
+  @kotlin.RequiresOptIn(message="This API is internal to library.") @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface InternalCoreApi {
+  }
+
+  public final class LayoutNodeKt {
+  }
+
+  public final class Ref<T> {
+    ctor public Ref();
+    method public T? getValue();
+    method public void setValue(T? value);
+    property public final T? value;
+  }
+
+  public interface RootForTest {
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.semantics.SemanticsOwner getSemanticsOwner();
+    method public androidx.compose.ui.text.input.TextInputService getTextInputService();
+    method public boolean sendKeyEvent(android.view.KeyEvent keyEvent);
+    property public abstract androidx.compose.ui.unit.Density density;
+    property public abstract androidx.compose.ui.semantics.SemanticsOwner semanticsOwner;
+    property public abstract androidx.compose.ui.text.input.TextInputService textInputService;
+  }
+
+  public final class ViewInterop_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.platform {
+
+  public abstract class AbstractComposeView extends android.view.ViewGroup {
+    ctor public AbstractComposeView(android.content.Context context, optional android.util.AttributeSet? attrs, optional int defStyleAttr);
+    ctor public AbstractComposeView(android.content.Context context, optional android.util.AttributeSet? attrs);
+    ctor public AbstractComposeView(android.content.Context context);
+    method @androidx.compose.runtime.Composable public abstract void Content();
+    method public final void createComposition();
+    method public final void disposeComposition();
+    method public final boolean getHasComposition();
+    method protected boolean getShouldCreateCompositionOnAttachedToWindow();
+    method public final boolean getShowLayoutBounds();
+    method protected final void onLayout(boolean changed, int left, int top, int right, int bottom);
+    method protected final void onMeasure(int widthMeasureSpec, int heightMeasureSpec);
+    method public final void setParentCompositionContext(androidx.compose.runtime.CompositionContext? parent);
+    method public final void setShowLayoutBounds(boolean value);
+    method public final void setViewCompositionStrategy(androidx.compose.ui.platform.ViewCompositionStrategy strategy);
+    property public final boolean hasComposition;
+    property protected boolean shouldCreateCompositionOnAttachedToWindow;
+    property public final boolean showLayoutBounds;
+  }
+
+  public interface AccessibilityManager {
+    method public long calculateRecommendedTimeoutMillis(long originalTimeoutMillis, optional boolean containsIcons, optional boolean containsText, optional boolean containsControls);
+  }
+
+  public final class AndroidClipboardManager_androidKt {
+  }
+
+  public final class AndroidComposeViewAccessibilityDelegateCompat_androidKt {
+  }
+
+  public final class AndroidComposeView_androidKt {
+  }
+
+  public final class AndroidCompositionLocals_androidKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> getLocalConfiguration();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> getLocalContext();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> getLocalLifecycleOwner();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> getLocalSavedStateRegistryOwner();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> getLocalView();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> LocalConfiguration;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> LocalContext;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> LocalLifecycleOwner;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> LocalSavedStateRegistryOwner;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> LocalView;
+  }
+
+  public final class AndroidUiDispatcher extends kotlinx.coroutines.CoroutineDispatcher {
+    method public void dispatch(kotlin.coroutines.CoroutineContext context, Runnable block);
+    method public android.view.Choreographer getChoreographer();
+    method public androidx.compose.runtime.MonotonicFrameClock getFrameClock();
+    property public final android.view.Choreographer choreographer;
+    property public final androidx.compose.runtime.MonotonicFrameClock frameClock;
+    field public static final androidx.compose.ui.platform.AndroidUiDispatcher.Companion Companion;
+  }
+
+  public static final class AndroidUiDispatcher.Companion {
+    method public kotlin.coroutines.CoroutineContext getCurrentThread();
+    method public kotlin.coroutines.CoroutineContext getMain();
+    property public final kotlin.coroutines.CoroutineContext CurrentThread;
+    property public final kotlin.coroutines.CoroutineContext Main;
+  }
+
+  public final class AndroidUiDispatcher_androidKt {
+  }
+
+  public final class AndroidUiFrameClock implements androidx.compose.runtime.MonotonicFrameClock {
+    ctor public AndroidUiFrameClock(android.view.Choreographer choreographer);
+    method public android.view.Choreographer getChoreographer();
+    method public suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+    property public final android.view.Choreographer choreographer;
+  }
+
+  public final class AndroidUriHandler implements androidx.compose.ui.platform.UriHandler {
+    ctor public AndroidUriHandler(android.content.Context context);
+    method public void openUri(String uri);
+  }
+
+  public final class AndroidViewConfiguration implements androidx.compose.ui.platform.ViewConfiguration {
+    ctor public AndroidViewConfiguration(android.view.ViewConfiguration viewConfiguration);
+    method public long getDoubleTapMinTimeMillis();
+    method public long getDoubleTapTimeoutMillis();
+    method public long getLongPressTimeoutMillis();
+    method public float getTouchSlop();
+    property public long doubleTapMinTimeMillis;
+    property public long doubleTapTimeoutMillis;
+    property public long longPressTimeoutMillis;
+    property public float touchSlop;
+  }
+
+  public interface ClipboardManager {
+    method public androidx.compose.ui.text.AnnotatedString? getText();
+    method public void setText(androidx.compose.ui.text.AnnotatedString annotatedString);
+  }
+
+  public final class ComposeView extends androidx.compose.ui.platform.AbstractComposeView {
+    ctor public ComposeView(android.content.Context context, optional android.util.AttributeSet? attrs, optional int defStyleAttr);
+    ctor public ComposeView(android.content.Context context, optional android.util.AttributeSet? attrs);
+    ctor public ComposeView(android.content.Context context);
+    method @androidx.compose.runtime.Composable public void Content();
+    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    property protected boolean shouldCreateCompositionOnAttachedToWindow;
+  }
+
+  public final class CompositionLocalsKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.AccessibilityManager> getLocalAccessibilityManager();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.Autofill> getLocalAutofill();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.AutofillTree> getLocalAutofillTree();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager> getLocalClipboardManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> getLocalDensity();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> getLocalFocusManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback> getLocalHapticFeedback();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.input.InputModeManager> getLocalInputModeManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection> getLocalLayoutDirection();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService> getLocalTextInputService();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar> getLocalTextToolbar();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler> getLocalUriHandler();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration> getLocalViewConfiguration();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> getLocalWindowInfo();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.AccessibilityManager> LocalAccessibilityManager;
+    property @androidx.compose.ui.ExperimentalComposeUiApi public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.Autofill> LocalAutofill;
+    property @androidx.compose.ui.ExperimentalComposeUiApi public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.AutofillTree> LocalAutofillTree;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager> LocalClipboardManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> LocalDensity;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> LocalFocusManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback> LocalHapticFeedback;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.input.InputModeManager> LocalInputModeManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection> LocalLayoutDirection;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService> LocalTextInputService;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar> LocalTextToolbar;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler> LocalUriHandler;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration> LocalViewConfiguration;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> LocalWindowInfo;
+  }
+
+  public final class DebugUtilsKt {
+  }
+
+  public final class DisposableSaveableStateRegistry_androidKt {
+  }
+
+  public interface InfiniteAnimationPolicy extends kotlin.coroutines.CoroutineContext.Element {
+    method public default kotlin.coroutines.CoroutineContext.Key<?> getKey();
+    method public suspend <R> Object? onInfiniteOperation(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R> p);
+    property public default kotlin.coroutines.CoroutineContext.Key<?> key;
+    field public static final androidx.compose.ui.platform.InfiniteAnimationPolicy.Key Key;
+  }
+
+  public static final class InfiniteAnimationPolicy.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.ui.platform.InfiniteAnimationPolicy> {
+  }
+
+  public final class InspectableModifier extends androidx.compose.ui.platform.InspectorValueInfo implements androidx.compose.ui.Modifier.Element {
+    ctor public InspectableModifier(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo);
+    method public androidx.compose.ui.platform.InspectableModifier.End getEnd();
+    property public final androidx.compose.ui.platform.InspectableModifier.End end;
+  }
+
+  public final class InspectableModifier.End implements androidx.compose.ui.Modifier.Element {
+    ctor public InspectableModifier.End();
+  }
+
+  public interface InspectableValue {
+    method public default kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> getInspectableElements();
+    method public default String? getNameFallback();
+    method public default Object? getValueOverride();
+    property public default kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> inspectableElements;
+    property public default String? nameFallback;
+    property public default Object? valueOverride;
+  }
+
+  public final class InspectableValueKt {
+    method public static inline kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> debugInspectorInfo(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> definitions);
+    method public static kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> getNoInspectorInfo();
+    method public static inline androidx.compose.ui.Modifier inspectable(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier,? extends androidx.compose.ui.Modifier> factory);
+    method public static boolean isDebugInspectorInfoEnabled();
+    method public static void setDebugInspectorInfoEnabled(boolean isDebugInspectorInfoEnabled);
+    property public static final kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> NoInspectorInfo;
+    property public static final boolean isDebugInspectorInfoEnabled;
+  }
+
+  public final class InspectionModeKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalInspectionMode();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> LocalInspectionMode;
+  }
+
+  public final class InspectorInfo {
+    ctor public InspectorInfo();
+    method public String? getName();
+    method public androidx.compose.ui.platform.ValueElementSequence getProperties();
+    method public Object? getValue();
+    method public void setName(String? name);
+    method public void setValue(Object? value);
+    property public final String? name;
+    property public final androidx.compose.ui.platform.ValueElementSequence properties;
+    property public final Object? value;
+  }
+
+  public abstract class InspectorValueInfo implements androidx.compose.ui.platform.InspectableValue {
+    ctor public InspectorValueInfo(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> info);
+    property public kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> inspectableElements;
+    property public String? nameFallback;
+    property public Object? valueOverride;
+  }
+
+  public final class InvertMatrixKt {
+  }
+
+  public final class JvmActuals_jvmKt {
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public final class LocalSoftwareKeyboardController {
+    method @androidx.compose.runtime.Composable public androidx.compose.ui.platform.SoftwareKeyboardController? getCurrent();
+    method public infix androidx.compose.runtime.ProvidedValue<androidx.compose.ui.platform.SoftwareKeyboardController> provides(androidx.compose.ui.platform.SoftwareKeyboardController softwareKeyboardController);
+    property @androidx.compose.runtime.Composable public final androidx.compose.ui.platform.SoftwareKeyboardController? current;
+    field public static final androidx.compose.ui.platform.LocalSoftwareKeyboardController INSTANCE;
+  }
+
+  public final class ShapeContainingUtilKt {
+  }
+
+  @androidx.compose.runtime.Stable @androidx.compose.ui.ExperimentalComposeUiApi public interface SoftwareKeyboardController {
+    method public void hide();
+    method @Deprecated public default void hideSoftwareKeyboard();
+    method public void show();
+    method @Deprecated public default void showSoftwareKeyboard();
+  }
+
+  public final class TestTagKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier testTag(androidx.compose.ui.Modifier, String tag);
+  }
+
+  public interface TextToolbar {
+    method public androidx.compose.ui.platform.TextToolbarStatus getStatus();
+    method public void hide();
+    method public void showMenu(androidx.compose.ui.geometry.Rect rect, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onCopyRequested, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onPasteRequested, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onCutRequested, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onSelectAllRequested);
+    property public abstract androidx.compose.ui.platform.TextToolbarStatus status;
+  }
+
+  public final class TextToolbarKt {
+  }
+
+  public enum TextToolbarStatus {
+    enum_constant public static final androidx.compose.ui.platform.TextToolbarStatus Hidden;
+    enum_constant public static final androidx.compose.ui.platform.TextToolbarStatus Shown;
+  }
+
+  public interface UriHandler {
+    method public void openUri(String uri);
+  }
+
+  public final class ValueElement {
+    ctor public ValueElement(String name, Object? value);
+    method public String component1();
+    method public Object? component2();
+    method public androidx.compose.ui.platform.ValueElement copy(String name, Object? value);
+    method public String getName();
+    method public Object? getValue();
+    property public final String name;
+    property public final Object? value;
+  }
+
+  public final class ValueElementSequence implements kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> {
+    ctor public ValueElementSequence();
+    method public java.util.Iterator<androidx.compose.ui.platform.ValueElement> iterator();
+    method public operator void set(String name, Object? value);
+  }
+
+  public interface ViewCompositionStrategy {
+    method public kotlin.jvm.functions.Function0<kotlin.Unit> installFor(androidx.compose.ui.platform.AbstractComposeView view);
+    field public static final androidx.compose.ui.platform.ViewCompositionStrategy.Companion Companion;
+  }
+
+  public static final class ViewCompositionStrategy.Companion {
+  }
+
+  public static final class ViewCompositionStrategy.DisposeOnDetachedFromWindow implements androidx.compose.ui.platform.ViewCompositionStrategy {
+    method public kotlin.jvm.functions.Function0<kotlin.Unit> installFor(androidx.compose.ui.platform.AbstractComposeView view);
+    field public static final androidx.compose.ui.platform.ViewCompositionStrategy.DisposeOnDetachedFromWindow INSTANCE;
+  }
+
+  public static final class ViewCompositionStrategy.DisposeOnLifecycleDestroyed implements androidx.compose.ui.platform.ViewCompositionStrategy {
+    ctor public ViewCompositionStrategy.DisposeOnLifecycleDestroyed(androidx.lifecycle.Lifecycle lifecycle);
+    ctor public ViewCompositionStrategy.DisposeOnLifecycleDestroyed(androidx.lifecycle.LifecycleOwner lifecycleOwner);
+    method public kotlin.jvm.functions.Function0<kotlin.Unit> installFor(androidx.compose.ui.platform.AbstractComposeView view);
+  }
+
+  public static final class ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed implements androidx.compose.ui.platform.ViewCompositionStrategy {
+    method public kotlin.jvm.functions.Function0<kotlin.Unit> installFor(androidx.compose.ui.platform.AbstractComposeView view);
+    field public static final androidx.compose.ui.platform.ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed INSTANCE;
+  }
+
+  public final class ViewCompositionStrategy_androidKt {
+  }
+
+  public interface ViewConfiguration {
+    method public long getDoubleTapMinTimeMillis();
+    method public long getDoubleTapTimeoutMillis();
+    method public long getLongPressTimeoutMillis();
+    method public default long getMinimumTouchTargetSize();
+    method public float getTouchSlop();
+    property public abstract long doubleTapMinTimeMillis;
+    property public abstract long doubleTapTimeoutMillis;
+    property public abstract long longPressTimeoutMillis;
+    property public default long minimumTouchTargetSize;
+    property public abstract float touchSlop;
+  }
+
+  public interface ViewRootForInspector {
+    method public default androidx.compose.ui.platform.AbstractComposeView? getSubCompositionView();
+    method public default android.view.View? getViewRoot();
+    property public default androidx.compose.ui.platform.AbstractComposeView? subCompositionView;
+    property public default android.view.View? viewRoot;
+  }
+
+  @VisibleForTesting public interface ViewRootForTest extends androidx.compose.ui.node.RootForTest {
+    method public boolean getHasPendingMeasureOrLayout();
+    method public android.view.View getView();
+    method public void invalidateDescendants();
+    method public boolean isLifecycleInResumedState();
+    property public abstract boolean hasPendingMeasureOrLayout;
+    property public abstract boolean isLifecycleInResumedState;
+    property public abstract android.view.View view;
+    field public static final androidx.compose.ui.platform.ViewRootForTest.Companion Companion;
+  }
+
+  public static final class ViewRootForTest.Companion {
+    method public kotlin.jvm.functions.Function1<androidx.compose.ui.platform.ViewRootForTest,kotlin.Unit>? getOnViewCreatedCallback();
+    method public void setOnViewCreatedCallback(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.ViewRootForTest,kotlin.Unit>? onViewCreatedCallback);
+    property public final kotlin.jvm.functions.Function1<androidx.compose.ui.platform.ViewRootForTest,kotlin.Unit>? onViewCreatedCallback;
+  }
+
+  @androidx.compose.runtime.Stable public interface WindowInfo {
+    method public boolean isWindowFocused();
+    property public abstract boolean isWindowFocused;
+  }
+
+  public final class WindowInfoKt {
+  }
+
+  @androidx.compose.ui.InternalComposeUiApi public fun interface WindowRecomposerFactory {
+    method public androidx.compose.runtime.Recomposer createRecomposer(android.view.View windowRootView);
+    field public static final androidx.compose.ui.platform.WindowRecomposerFactory.Companion Companion;
+  }
+
+  public static final class WindowRecomposerFactory.Companion {
+    method public androidx.compose.ui.platform.WindowRecomposerFactory getLifecycleAware();
+    property public final androidx.compose.ui.platform.WindowRecomposerFactory LifecycleAware;
+  }
+
+  @androidx.compose.ui.InternalComposeUiApi public final class WindowRecomposerPolicy {
+    method public void setFactory(androidx.compose.ui.platform.WindowRecomposerFactory factory);
+    method public inline <R> R! withFactory(androidx.compose.ui.platform.WindowRecomposerFactory factory, kotlin.jvm.functions.Function0<? extends R> block);
+    field public static final androidx.compose.ui.platform.WindowRecomposerPolicy INSTANCE;
+  }
+
+  public final class WindowRecomposer_androidKt {
+    method public static androidx.compose.runtime.CompositionContext? findViewTreeCompositionContext(android.view.View);
+    method public static androidx.compose.runtime.CompositionContext? getCompositionContext(android.view.View);
+    method public static void setCompositionContext(android.view.View, androidx.compose.runtime.CompositionContext? value);
+  }
+
+  public final class Wrapper_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.platform.accessibility {
+
+  public final class CollectionInfoKt {
+  }
+
+}
+
+package androidx.compose.ui.platform.actionmodecallback {
+
+  public final class TextActionModeCallback_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.res {
+
+  public final class ColorResources_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static long colorResource(@ColorRes int id);
+  }
+
+  public final class FontResources_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static androidx.compose.ui.text.font.Typeface fontResource(androidx.compose.ui.text.font.FontFamily fontFamily);
+  }
+
+  public final class ImageResources_androidKt {
+    method public static androidx.compose.ui.graphics.ImageBitmap imageResource(androidx.compose.ui.graphics.ImageBitmap.Companion, android.content.res.Resources res, @DrawableRes int id);
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.ImageBitmap imageResource(androidx.compose.ui.graphics.ImageBitmap.Companion, @DrawableRes int id);
+  }
+
+  public final class PainterResources_androidKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.painter.Painter painterResource(@DrawableRes int id);
+  }
+
+  public final class PrimitiveResources_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean booleanResource(@BoolRes int id);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static float dimensionResource(@DimenRes int id);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static int[] integerArrayResource(@ArrayRes int id);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static int integerResource(@IntegerRes int id);
+  }
+
+  public final class StringResources_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String![] stringArrayResource(@ArrayRes int id);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String stringResource(@StringRes int id);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String stringResource(@StringRes int id, java.lang.Object... formatArgs);
+  }
+
+  public final class VectorResources_androidKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.ImageVector vectorResource(androidx.compose.ui.graphics.vector.ImageVector.Companion, @DrawableRes int id);
+    method @kotlin.jvm.Throws(exceptionClasses=XmlPullParserException::class) public static androidx.compose.ui.graphics.vector.ImageVector vectorResource(androidx.compose.ui.graphics.vector.ImageVector.Companion, optional android.content.res.Resources.Theme? theme, android.content.res.Resources res, int resId) throws org.xmlpull.v1.XmlPullParserException;
+  }
+
+}
+
+package androidx.compose.ui.semantics {
+
+  public final class AccessibilityAction<T extends kotlin.Function<? extends java.lang.Boolean>> {
+    ctor public AccessibilityAction(String? label, T? action);
+    method public T? getAction();
+    method public String? getLabel();
+    property public final T? action;
+    property public final String? label;
+  }
+
+  public final class CollectionInfo {
+    ctor public CollectionInfo(int rowCount, int columnCount);
+    method public int getColumnCount();
+    method public int getRowCount();
+    property public final int columnCount;
+    property public final int rowCount;
+  }
+
+  public final class CollectionItemInfo {
+    ctor public CollectionItemInfo(int rowIndex, int rowSpan, int columnIndex, int columnSpan);
+    method public int getColumnIndex();
+    method public int getColumnSpan();
+    method public int getRowIndex();
+    method public int getRowSpan();
+    property public final int columnIndex;
+    property public final int columnSpan;
+    property public final int rowIndex;
+    property public final int rowSpan;
+  }
+
+  public final class CustomAccessibilityAction {
+    ctor public CustomAccessibilityAction(String label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
+    method public kotlin.jvm.functions.Function0<java.lang.Boolean> getAction();
+    method public String getLabel();
+    property public final kotlin.jvm.functions.Function0<java.lang.Boolean> action;
+    property public final String label;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class LiveRegionMode {
+    ctor public LiveRegionMode();
+  }
+
+  public static final class LiveRegionMode.Companion {
+    method public int getAssertive();
+    method public int getPolite();
+    property public final int Assertive;
+    property public final int Polite;
+  }
+
+  public final class ProgressBarRangeInfo {
+    ctor public ProgressBarRangeInfo(float current, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> range, optional int steps);
+    method public float getCurrent();
+    method public kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> getRange();
+    method public int getSteps();
+    property public final float current;
+    property public final kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> range;
+    property public final int steps;
+    field public static final androidx.compose.ui.semantics.ProgressBarRangeInfo.Companion Companion;
+  }
+
+  public static final class ProgressBarRangeInfo.Companion {
+    method public androidx.compose.ui.semantics.ProgressBarRangeInfo getIndeterminate();
+    property public final androidx.compose.ui.semantics.ProgressBarRangeInfo Indeterminate;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Role {
+    ctor public Role();
+  }
+
+  public static final class Role.Companion {
+    method public int getButton();
+    method public int getCheckbox();
+    method public int getImage();
+    method public int getRadioButton();
+    method public int getSwitch();
+    method public int getTab();
+    property public final int Button;
+    property public final int Checkbox;
+    property public final int Image;
+    property public final int RadioButton;
+    property public final int Switch;
+    property public final int Tab;
+  }
+
+  public final class ScrollAxisRange {
+    ctor public ScrollAxisRange(kotlin.jvm.functions.Function0<java.lang.Float> value, kotlin.jvm.functions.Function0<java.lang.Float> maxValue, optional boolean reverseScrolling);
+    method public kotlin.jvm.functions.Function0<java.lang.Float> getMaxValue();
+    method public boolean getReverseScrolling();
+    method public kotlin.jvm.functions.Function0<java.lang.Float> getValue();
+    property public final kotlin.jvm.functions.Function0<java.lang.Float> maxValue;
+    property public final boolean reverseScrolling;
+    property public final kotlin.jvm.functions.Function0<java.lang.Float> value;
+  }
+
+  public final class SemanticsActions {
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCollapse();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCopyText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>> getCustomActions();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCutText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getDismiss();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getExpand();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>>> getGetTextLayoutResult();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnClick();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnLongClick();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getPasteText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> getScrollBy();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Integer,java.lang.Boolean>>> getScrollToIndex();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Boolean>>> getSetProgress();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function3<java.lang.Integer,java.lang.Integer,java.lang.Boolean,java.lang.Boolean>>> getSetSelection();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>>> getSetText();
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> Collapse;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> CopyText;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>> CustomActions;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> CutText;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> Dismiss;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> Expand;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>>> GetTextLayoutResult;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> OnClick;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> OnLongClick;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> PasteText;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> ScrollBy;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Integer,java.lang.Boolean>>> ScrollToIndex;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Boolean>>> SetProgress;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function3<java.lang.Integer,java.lang.Integer,java.lang.Boolean,java.lang.Boolean>>> SetSelection;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>>> SetText;
+    field public static final androidx.compose.ui.semantics.SemanticsActions INSTANCE;
+  }
+
+  public final class SemanticsConfiguration implements java.lang.Iterable<java.util.Map.Entry<? extends androidx.compose.ui.semantics.SemanticsPropertyKey<?>,?>> kotlin.jvm.internal.markers.KMappedMarker androidx.compose.ui.semantics.SemanticsPropertyReceiver {
+    ctor public SemanticsConfiguration();
+    method public operator <T> boolean contains(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key);
+    method public androidx.compose.ui.semantics.SemanticsConfiguration copy();
+    method public operator <T> T! get(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key);
+    method public <T> T! getOrElse(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method public <T> T? getOrElseNullable(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method public boolean isClearingSemantics();
+    method public boolean isMergingSemanticsOfDescendants();
+    method public java.util.Iterator<java.util.Map.Entry<androidx.compose.ui.semantics.SemanticsPropertyKey<?>,java.lang.Object>> iterator();
+    method public <T> void set(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, T? value);
+    method public void setClearingSemantics(boolean isClearingSemantics);
+    method public void setMergingSemanticsOfDescendants(boolean isMergingSemanticsOfDescendants);
+    property public final boolean isClearingSemantics;
+    property public final boolean isMergingSemanticsOfDescendants;
+  }
+
+  public final class SemanticsConfigurationKt {
+    method public static <T> T? getOrNull(androidx.compose.ui.semantics.SemanticsConfiguration, androidx.compose.ui.semantics.SemanticsPropertyKey<T> key);
+  }
+
+  public interface SemanticsModifier extends androidx.compose.ui.Modifier.Element {
+    method public int getId();
+    method public androidx.compose.ui.semantics.SemanticsConfiguration getSemanticsConfiguration();
+    property public abstract int id;
+    property public abstract androidx.compose.ui.semantics.SemanticsConfiguration semanticsConfiguration;
+  }
+
+  public final class SemanticsModifierKt {
+    method public static androidx.compose.ui.Modifier clearAndSetSemantics(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.semantics.SemanticsPropertyReceiver,kotlin.Unit> properties);
+    method public static androidx.compose.ui.Modifier semantics(androidx.compose.ui.Modifier, optional boolean mergeDescendants, kotlin.jvm.functions.Function1<? super androidx.compose.ui.semantics.SemanticsPropertyReceiver,kotlin.Unit> properties);
+  }
+
+  public final class SemanticsNode {
+    method public int getAlignmentLinePosition(androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public androidx.compose.ui.geometry.Rect getBoundsInRoot();
+    method public androidx.compose.ui.geometry.Rect getBoundsInWindow();
+    method public java.util.List<androidx.compose.ui.semantics.SemanticsNode> getChildren();
+    method public androidx.compose.ui.semantics.SemanticsConfiguration getConfig();
+    method public int getId();
+    method public androidx.compose.ui.layout.LayoutInfo getLayoutInfo();
+    method public boolean getMergingEnabled();
+    method public androidx.compose.ui.semantics.SemanticsNode? getParent();
+    method public long getPositionInRoot();
+    method public long getPositionInWindow();
+    method public androidx.compose.ui.node.RootForTest? getRoot();
+    method public long getSize();
+    method public androidx.compose.ui.geometry.Rect getTouchBoundsInRoot();
+    method public boolean isRoot();
+    property public final androidx.compose.ui.geometry.Rect boundsInRoot;
+    property public final androidx.compose.ui.geometry.Rect boundsInWindow;
+    property public final java.util.List<androidx.compose.ui.semantics.SemanticsNode> children;
+    property public final androidx.compose.ui.semantics.SemanticsConfiguration config;
+    property public final int id;
+    property public final boolean isRoot;
+    property public final androidx.compose.ui.layout.LayoutInfo layoutInfo;
+    property public final boolean mergingEnabled;
+    property public final androidx.compose.ui.semantics.SemanticsNode? parent;
+    property public final long positionInRoot;
+    property public final long positionInWindow;
+    property public final androidx.compose.ui.node.RootForTest? root;
+    property public final long size;
+    property public final androidx.compose.ui.geometry.Rect touchBoundsInRoot;
+  }
+
+  public final class SemanticsNodeKt {
+  }
+
+  public final class SemanticsOwner {
+    method public androidx.compose.ui.semantics.SemanticsNode getRootSemanticsNode();
+    method public androidx.compose.ui.semantics.SemanticsNode getUnmergedRootSemanticsNode();
+    property public final androidx.compose.ui.semantics.SemanticsNode rootSemanticsNode;
+    property public final androidx.compose.ui.semantics.SemanticsNode unmergedRootSemanticsNode;
+  }
+
+  public final class SemanticsOwnerKt {
+    method public static java.util.List<androidx.compose.ui.semantics.SemanticsNode> getAllSemanticsNodes(androidx.compose.ui.semantics.SemanticsOwner, boolean mergingEnabled);
+  }
+
+  public final class SemanticsProperties {
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> getCollectionInfo();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> getCollectionItemInfo();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> getContentDescription();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getDisabled();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> getEditableText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getError();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getFocused();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getHeading();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getHorizontalScrollAxisRange();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.input.ImeAction> getImeAction();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer>> getIndexForKey();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getInvisibleToUser();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getIsDialog();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getIsPopup();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.LiveRegionMode> getLiveRegion();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getPaneTitle();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getPassword();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ProgressBarRangeInfo> getProgressBarRangeInfo();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.Role> getRole();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getSelectableGroup();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getSelected();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getStateDescription();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getTestTag();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> getText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> getTextSelectionRange();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> getToggleableState();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getVerticalScrollAxisRange();
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> CollectionInfo;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> CollectionItemInfo;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> ContentDescription;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Disabled;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> EditableText;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> Error;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Focused;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Heading;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> HorizontalScrollAxisRange;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.input.ImeAction> ImeAction;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer>> IndexForKey;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> InvisibleToUser;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> IsDialog;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> IsPopup;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.LiveRegionMode> LiveRegion;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> PaneTitle;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Password;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ProgressBarRangeInfo> ProgressBarRangeInfo;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.Role> Role;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> SelectableGroup;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Selected;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> StateDescription;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> TestTag;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> Text;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> TextSelectionRange;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> ToggleableState;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> VerticalScrollAxisRange;
+    field public static final androidx.compose.ui.semantics.SemanticsProperties INSTANCE;
+  }
+
+  public final class SemanticsPropertiesKt {
+    method public static void collapse(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void copyText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void cutText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void dialog(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void disabled(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void dismiss(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void error(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String description);
+    method public static void expand(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static androidx.compose.ui.semantics.CollectionInfo getCollectionInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.CollectionItemInfo getCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> getCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.text.AnnotatedString getEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static boolean getFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.ScrollAxisRange getHorizontalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static int getImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static int getLiveRegion(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getPaneTitle(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.ProgressBarRangeInfo getProgressBarRangeInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static int getRole(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static boolean getSelected(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getStateDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.text.AnnotatedString getText(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void getTextLayoutResult(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>? action);
+    method public static long getTextSelectionRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.state.ToggleableState getToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.ScrollAxisRange getVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void heading(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void indexForKey(androidx.compose.ui.semantics.SemanticsPropertyReceiver, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer> mapping);
+    method @androidx.compose.ui.ExperimentalComposeUiApi public static void invisibleToUser(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void onClick(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void onLongClick(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void password(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void pasteText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void popup(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void scrollBy(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,java.lang.Boolean>? action);
+    method public static void scrollToIndex(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Boolean> action);
+    method public static void selectableGroup(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void setCollectionInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionInfo collectionInfo);
+    method public static void setCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionItemInfo collectionItemInfo);
+    method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String value);
+    method public static void setCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver, java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> customActions);
+    method public static void setEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString editableText);
+    method public static void setFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean focused);
+    method public static void setHorizontalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange horizontalScrollAxisRange);
+    method public static void setImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver, int imeAction);
+    method public static void setLiveRegion(androidx.compose.ui.semantics.SemanticsPropertyReceiver, int liveRegion);
+    method public static void setPaneTitle(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String paneTitle);
+    method public static void setProgress(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Boolean>? action);
+    method public static void setProgressBarRangeInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ProgressBarRangeInfo progressBarRangeInfo);
+    method public static void setRole(androidx.compose.ui.semantics.SemanticsPropertyReceiver, int role);
+    method public static void setSelected(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean selected);
+    method public static void setSelection(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function3<? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Boolean,java.lang.Boolean>? action);
+    method public static void setStateDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String stateDescription);
+    method public static void setTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String testTag);
+    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString value);
+    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>? action);
+    method public static void setTextSelectionRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, long textSelectionRange);
+    method public static void setToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.state.ToggleableState toggleableState);
+    method public static void setVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange verticalScrollAxisRange);
+  }
+
+  public final class SemanticsPropertyKey<T> {
+    ctor public SemanticsPropertyKey(String name, optional kotlin.jvm.functions.Function2<? super T,? super T,? extends T> mergePolicy);
+    method public String getName();
+    method public operator T! getValue(androidx.compose.ui.semantics.SemanticsPropertyReceiver thisRef, kotlin.reflect.KProperty<?> property);
+    method public T? merge(T? parentValue, T? childValue);
+    method public operator void setValue(androidx.compose.ui.semantics.SemanticsPropertyReceiver thisRef, kotlin.reflect.KProperty<?> property, T? value);
+    property public final String name;
+  }
+
+  public interface SemanticsPropertyReceiver {
+    method public operator <T> void set(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, T? value);
+  }
+
+  public final class SemanticsSortKt {
+  }
+
+}
+
+package androidx.compose.ui.state {
+
+  public enum ToggleableState {
+    enum_constant public static final androidx.compose.ui.state.ToggleableState Indeterminate;
+    enum_constant public static final androidx.compose.ui.state.ToggleableState Off;
+    enum_constant public static final androidx.compose.ui.state.ToggleableState On;
+  }
+
+  public final class ToggleableStateKt {
+    method public static androidx.compose.ui.state.ToggleableState ToggleableState(boolean value);
+  }
+
+}
+
+package androidx.compose.ui.text.input {
+
+  public final class InputState_androidKt {
+  }
+
+  public final class RecordingInputConnection_androidKt {
+  }
+
+  public final class TextInputServiceAndroid_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.viewinterop {
+
+  public final class AndroidViewHolder_androidKt {
+  }
+
+  public final class AndroidView_androidKt {
+    method @androidx.compose.runtime.Composable public static <T extends android.view.View> void AndroidView(kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> factory, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update);
+    method public static kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> getNoOpUpdate();
+    property public static final kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> NoOpUpdate;
+  }
+
+}
+
+package androidx.compose.ui.window {
+
+  public final class AndroidDialog_androidKt {
+    method @androidx.compose.runtime.Composable public static void Dialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.window.DialogProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class AndroidPopup_androidKt {
+    method @androidx.compose.runtime.Composable public static void Popup(optional androidx.compose.ui.Alignment alignment, optional long offset, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Popup(androidx.compose.ui.window.PopupPositionProvider popupPositionProvider, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @org.jetbrains.annotations.TestOnly public static boolean isPopupLayout(android.view.View view, optional String? testTag);
+  }
+
+  @androidx.compose.runtime.Immutable public final class DialogProperties {
+    ctor @androidx.compose.ui.ExperimentalComposeUiApi public DialogProperties(optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean usePlatformDefaultWidth);
+    ctor public DialogProperties(optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy);
+    method public boolean getDismissOnBackPress();
+    method public boolean getDismissOnClickOutside();
+    method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public boolean getUsePlatformDefaultWidth();
+    property public final boolean dismissOnBackPress;
+    property public final boolean dismissOnClickOutside;
+    property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
+    property @androidx.compose.ui.ExperimentalComposeUiApi public final boolean usePlatformDefaultWidth;
+  }
+
+  public interface DialogWindowProvider {
+    method public android.view.Window getWindow();
+    property public abstract android.view.Window window;
+  }
+
+  @androidx.compose.runtime.Immutable public interface PopupPositionProvider {
+    method public long calculatePosition(androidx.compose.ui.unit.IntRect anchorBounds, long windowSize, androidx.compose.ui.unit.LayoutDirection layoutDirection, long popupContentSize);
+  }
+
+  @androidx.compose.runtime.Immutable public final class PopupProperties {
+    ctor @androidx.compose.ui.ExperimentalComposeUiApi public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean excludeFromSystemGesture, optional boolean clippingEnabled, optional boolean usePlatformDefaultWidth);
+    ctor public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean excludeFromSystemGesture, optional boolean clippingEnabled);
+    method public boolean getClippingEnabled();
+    method public boolean getDismissOnBackPress();
+    method public boolean getDismissOnClickOutside();
+    method public boolean getExcludeFromSystemGesture();
+    method public boolean getFocusable();
+    method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
+    method @androidx.compose.ui.ExperimentalComposeUiApi public boolean getUsePlatformDefaultWidth();
+    property public final boolean clippingEnabled;
+    property public final boolean dismissOnBackPress;
+    property public final boolean dismissOnClickOutside;
+    property public final boolean excludeFromSystemGesture;
+    property public final boolean focusable;
+    property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
+    property @androidx.compose.ui.ExperimentalComposeUiApi public final boolean usePlatformDefaultWidth;
+  }
+
+  public enum SecureFlagPolicy {
+    enum_constant public static final androidx.compose.ui.window.SecureFlagPolicy Inherit;
+    enum_constant public static final androidx.compose.ui.window.SecureFlagPolicy SecureOff;
+    enum_constant public static final androidx.compose.ui.window.SecureFlagPolicy SecureOn;
+  }
+
+  public final class SecureFlagPolicy_androidKt {
+  }
+
+}
+
diff --git a/compose/ui/ui/api/public_plus_experimental_current.txt b/compose/ui/ui/api/public_plus_experimental_current.txt
index e494fab..35a4d58 100644
--- a/compose/ui/ui/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui/api/public_plus_experimental_current.txt
@@ -491,6 +491,7 @@
   public final class GraphicsLayerModifierKt {
     method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional androidx.compose.ui.graphics.RenderEffect? renderEffect);
     method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> block);
+    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip);
     method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier toolingGraphicsLayer(androidx.compose.ui.Modifier);
   }
 
@@ -546,6 +547,8 @@
 
   @androidx.compose.runtime.Immutable public final inline class TransformOrigin {
     ctor public TransformOrigin();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
   }
 
   public static final class TransformOrigin.Companion {
@@ -654,6 +657,12 @@
     method public static int getDefaultTintBlendMode();
     method public static long getDefaultTintColor();
     method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> getEmptyPath();
+    property public static final int DefaultFillType;
+    property public static final int DefaultStrokeLineCap;
+    property public static final int DefaultStrokeLineJoin;
+    property public static final int DefaultTintBlendMode;
+    property public static final long DefaultTintColor;
+    property public static final java.util.List<androidx.compose.ui.graphics.vector.PathNode> EmptyPath;
     field public static final String DefaultGroupName = "";
     field public static final String DefaultPathName = "";
     field public static final float DefaultPivotX = 0.0f;
@@ -1562,8 +1571,11 @@
     method public static void consumeAllChanges(androidx.compose.ui.input.pointer.PointerInputChange);
     method public static void consumeDownChange(androidx.compose.ui.input.pointer.PointerInputChange);
     method public static void consumePositionChange(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static int indexOfFirstPressed(int);
+    method public static int indexOfLastPressed(int);
     method @Deprecated public static boolean isOutOfBounds(androidx.compose.ui.input.pointer.PointerInputChange, long size);
     method public static boolean isOutOfBounds(androidx.compose.ui.input.pointer.PointerInputChange, long size, long extendedTouchPadding);
+    method public static boolean isPressed(int, int buttonIndex);
     method public static long positionChange(androidx.compose.ui.input.pointer.PointerInputChange);
     method public static boolean positionChangeConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
     method public static long positionChangeIgnoreConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
@@ -1622,6 +1634,30 @@
     method public static boolean isTertiaryPressed(int);
   }
 
+  public interface PointerIcon {
+  }
+
+  @androidx.compose.ui.ExperimentalComposeUiApi public final class PointerIconDefaults {
+    method public androidx.compose.ui.input.pointer.PointerIcon getCrosshair();
+    method public androidx.compose.ui.input.pointer.PointerIcon getDefault();
+    method public androidx.compose.ui.input.pointer.PointerIcon getHand();
+    method public androidx.compose.ui.input.pointer.PointerIcon getText();
+    property public final androidx.compose.ui.input.pointer.PointerIcon Crosshair;
+    property public final androidx.compose.ui.input.pointer.PointerIcon Default;
+    property public final androidx.compose.ui.input.pointer.PointerIcon Hand;
+    property public final androidx.compose.ui.input.pointer.PointerIcon Text;
+    field public static final androidx.compose.ui.input.pointer.PointerIconDefaults INSTANCE;
+  }
+
+  public final class PointerIconKt {
+    method public static androidx.compose.ui.Modifier pointerHoverIcon(androidx.compose.ui.Modifier, androidx.compose.ui.input.pointer.PointerIcon icon, optional boolean overrideDescendants);
+  }
+
+  public final class PointerIcon_androidKt {
+    method public static androidx.compose.ui.input.pointer.PointerIcon PointerIcon(android.view.PointerIcon pointerIcon);
+    method public static androidx.compose.ui.input.pointer.PointerIcon PointerIcon(int pointerIconType);
+  }
+
   public final inline class PointerId {
     ctor public PointerId();
     method public long getValue();
@@ -1760,6 +1796,8 @@
   public final class AlignmentLineKt {
     method public static androidx.compose.ui.layout.HorizontalAlignmentLine getFirstBaseline();
     method public static androidx.compose.ui.layout.HorizontalAlignmentLine getLastBaseline();
+    property public static final androidx.compose.ui.layout.HorizontalAlignmentLine FirstBaseline;
+    property public static final androidx.compose.ui.layout.HorizontalAlignmentLine LastBaseline;
   }
 
   @androidx.compose.runtime.Stable public interface ContentScale {
@@ -2009,22 +2047,22 @@
   public final class PlaceableKt {
   }
 
-  @androidx.compose.ui.ExperimentalComposeUiApi public interface RelocationModifier extends androidx.compose.ui.Modifier.Element {
-    method public androidx.compose.ui.geometry.Rect computeDestination(androidx.compose.ui.geometry.Rect source, androidx.compose.ui.layout.LayoutCoordinates layoutCoordinates);
-    method public suspend Object? performRelocation(androidx.compose.ui.geometry.Rect source, androidx.compose.ui.geometry.Rect destination, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+  @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public interface RelocationModifier extends androidx.compose.ui.Modifier.Element {
+    method @Deprecated public androidx.compose.ui.geometry.Rect computeDestination(androidx.compose.ui.geometry.Rect source, androidx.compose.ui.layout.LayoutCoordinates layoutCoordinates);
+    method @Deprecated public suspend Object? performRelocation(androidx.compose.ui.geometry.Rect source, androidx.compose.ui.geometry.Rect destination, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
   }
 
   public final class RelocationModifierKt {
-    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier onRelocationRequest(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.geometry.Rect,? super androidx.compose.ui.layout.LayoutCoordinates,androidx.compose.ui.geometry.Rect> onProvideDestination, kotlin.jvm.functions.Function3<? super androidx.compose.ui.geometry.Rect,? super androidx.compose.ui.geometry.Rect,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> onPerformRelocation);
+    method @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier onRelocationRequest(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.geometry.Rect,? super androidx.compose.ui.layout.LayoutCoordinates,androidx.compose.ui.geometry.Rect> onProvideDestination, kotlin.jvm.functions.Function3<? super androidx.compose.ui.geometry.Rect,? super androidx.compose.ui.geometry.Rect,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> onPerformRelocation);
   }
 
-  @androidx.compose.ui.ExperimentalComposeUiApi public final class RelocationRequester {
-    ctor public RelocationRequester();
-    method public suspend Object? bringIntoView(optional androidx.compose.ui.geometry.Rect? rect, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+  @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public final class RelocationRequester {
+    ctor @Deprecated public RelocationRequester();
+    method @Deprecated public suspend Object? bringIntoView(optional androidx.compose.ui.geometry.Rect? rect, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
   }
 
   public final class RelocationRequesterModifierKt {
-    method @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier relocationRequester(androidx.compose.ui.Modifier, androidx.compose.ui.layout.RelocationRequester relocationRequester);
+    method @Deprecated @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier relocationRequester(androidx.compose.ui.Modifier, Object relocationRequester);
   }
 
   public interface Remeasurement {
@@ -2037,6 +2075,10 @@
 
   @androidx.compose.runtime.Immutable public final inline class ScaleFactor {
     ctor public ScaleFactor();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
   }
 
   public static final class ScaleFactor.Companion {
@@ -2113,7 +2155,6 @@
 
   public interface ModifierLocalReadScope {
     method public <T> T! getCurrent(androidx.compose.ui.modifier.ModifierLocal<T>);
-    property public abstract T! current;
   }
 
   @androidx.compose.runtime.Stable public final class ProvidableModifierLocal<T> extends androidx.compose.ui.modifier.ModifierLocal<T> {
@@ -2193,6 +2234,11 @@
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> getLocalLifecycleOwner();
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> getLocalSavedStateRegistryOwner();
     method public static androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> getLocalView();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> LocalConfiguration;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> LocalContext;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> LocalLifecycleOwner;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> LocalSavedStateRegistryOwner;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> LocalView;
   }
 
   public final class AndroidUiDispatcher extends kotlinx.coroutines.CoroutineDispatcher {
@@ -2267,6 +2313,20 @@
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler> getLocalUriHandler();
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration> getLocalViewConfiguration();
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> getLocalWindowInfo();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.AccessibilityManager> LocalAccessibilityManager;
+    property @androidx.compose.ui.ExperimentalComposeUiApi public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.Autofill> LocalAutofill;
+    property @androidx.compose.ui.ExperimentalComposeUiApi public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.autofill.AutofillTree> LocalAutofillTree;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager> LocalClipboardManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> LocalDensity;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> LocalFocusManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback> LocalHapticFeedback;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.input.InputModeManager> LocalInputModeManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection> LocalLayoutDirection;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService> LocalTextInputService;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar> LocalTextToolbar;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler> LocalUriHandler;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration> LocalViewConfiguration;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> LocalWindowInfo;
   }
 
   public final class DebugUtilsKt {
@@ -2310,10 +2370,13 @@
     method public static inline androidx.compose.ui.Modifier inspectable(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier,? extends androidx.compose.ui.Modifier> factory);
     method public static boolean isDebugInspectorInfoEnabled();
     method public static void setDebugInspectorInfoEnabled(boolean isDebugInspectorInfoEnabled);
+    property public static final kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> NoInspectorInfo;
+    property public static final boolean isDebugInspectorInfoEnabled;
   }
 
   public final class InspectionModeKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalInspectionMode();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> LocalInspectionMode;
   }
 
   public final class InspectorInfo {
@@ -2932,6 +2995,7 @@
   public final class AndroidView_androidKt {
     method @androidx.compose.runtime.Composable public static <T extends android.view.View> void AndroidView(kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> factory, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update);
     method public static kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> getNoOpUpdate();
+    property public static final kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> NoOpUpdate;
   }
 
 }
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/compose/ui/ui/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to compose/ui/ui/api/res-1.1.0-beta02.txt
diff --git a/compose/ui/ui/api/restricted_1.1.0-beta02.txt b/compose/ui/ui/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..fa1efa8
--- /dev/null
+++ b/compose/ui/ui/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,2920 @@
+// Signature format: 4.0
+package androidx.compose.ui {
+
+  public final class AbsoluteAlignment {
+    method public androidx.compose.ui.Alignment getBottomLeft();
+    method public androidx.compose.ui.Alignment getBottomRight();
+    method public androidx.compose.ui.Alignment getCenterLeft();
+    method public androidx.compose.ui.Alignment getCenterRight();
+    method public androidx.compose.ui.Alignment.Horizontal getLeft();
+    method public androidx.compose.ui.Alignment.Horizontal getRight();
+    method public androidx.compose.ui.Alignment getTopLeft();
+    method public androidx.compose.ui.Alignment getTopRight();
+    property public final androidx.compose.ui.Alignment BottomLeft;
+    property public final androidx.compose.ui.Alignment BottomRight;
+    property public final androidx.compose.ui.Alignment CenterLeft;
+    property public final androidx.compose.ui.Alignment CenterRight;
+    property public final androidx.compose.ui.Alignment.Horizontal Left;
+    property public final androidx.compose.ui.Alignment.Horizontal Right;
+    property public final androidx.compose.ui.Alignment TopLeft;
+    property public final androidx.compose.ui.Alignment TopRight;
+    field public static final androidx.compose.ui.AbsoluteAlignment INSTANCE;
+  }
+
+  @androidx.compose.runtime.Stable public fun interface Alignment {
+    method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    field public static final androidx.compose.ui.Alignment.Companion Companion;
+  }
+
+  public static final class Alignment.Companion {
+    method public androidx.compose.ui.Alignment.Vertical getBottom();
+    method public androidx.compose.ui.Alignment getBottomCenter();
+    method public androidx.compose.ui.Alignment getBottomEnd();
+    method public androidx.compose.ui.Alignment getBottomStart();
+    method public androidx.compose.ui.Alignment getCenter();
+    method public androidx.compose.ui.Alignment getCenterEnd();
+    method public androidx.compose.ui.Alignment.Horizontal getCenterHorizontally();
+    method public androidx.compose.ui.Alignment getCenterStart();
+    method public androidx.compose.ui.Alignment.Vertical getCenterVertically();
+    method public androidx.compose.ui.Alignment.Horizontal getEnd();
+    method public androidx.compose.ui.Alignment.Horizontal getStart();
+    method public androidx.compose.ui.Alignment.Vertical getTop();
+    method public androidx.compose.ui.Alignment getTopCenter();
+    method public androidx.compose.ui.Alignment getTopEnd();
+    method public androidx.compose.ui.Alignment getTopStart();
+    property public final androidx.compose.ui.Alignment.Vertical Bottom;
+    property public final androidx.compose.ui.Alignment BottomCenter;
+    property public final androidx.compose.ui.Alignment BottomEnd;
+    property public final androidx.compose.ui.Alignment BottomStart;
+    property public final androidx.compose.ui.Alignment Center;
+    property public final androidx.compose.ui.Alignment CenterEnd;
+    property public final androidx.compose.ui.Alignment.Horizontal CenterHorizontally;
+    property public final androidx.compose.ui.Alignment CenterStart;
+    property public final androidx.compose.ui.Alignment.Vertical CenterVertically;
+    property public final androidx.compose.ui.Alignment.Horizontal End;
+    property public final androidx.compose.ui.Alignment.Horizontal Start;
+    property public final androidx.compose.ui.Alignment.Vertical Top;
+    property public final androidx.compose.ui.Alignment TopCenter;
+    property public final androidx.compose.ui.Alignment TopEnd;
+    property public final androidx.compose.ui.Alignment TopStart;
+  }
+
+  @androidx.compose.runtime.Stable public static fun interface Alignment.Horizontal {
+    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+  }
+
+  @androidx.compose.runtime.Stable public static fun interface Alignment.Vertical {
+    method public int align(int size, int space);
+  }
+
+  @androidx.compose.runtime.Immutable public final class BiasAbsoluteAlignment implements androidx.compose.ui.Alignment {
+    ctor public BiasAbsoluteAlignment(float horizontalBias, float verticalBias);
+    method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public androidx.compose.ui.BiasAbsoluteAlignment copy(float horizontalBias, float verticalBias);
+  }
+
+  @androidx.compose.runtime.Immutable public static final class BiasAbsoluteAlignment.Horizontal implements androidx.compose.ui.Alignment.Horizontal {
+    ctor public BiasAbsoluteAlignment.Horizontal(float bias);
+    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public androidx.compose.ui.BiasAbsoluteAlignment.Horizontal copy(float bias);
+  }
+
+  @androidx.compose.runtime.Immutable public final class BiasAlignment implements androidx.compose.ui.Alignment {
+    ctor public BiasAlignment(float horizontalBias, float verticalBias);
+    method public long align(long size, long space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public float component1();
+    method public float component2();
+    method public androidx.compose.ui.BiasAlignment copy(float horizontalBias, float verticalBias);
+    method public float getHorizontalBias();
+    method public float getVerticalBias();
+    property public final float horizontalBias;
+    property public final float verticalBias;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class BiasAlignment.Horizontal implements androidx.compose.ui.Alignment.Horizontal {
+    ctor public BiasAlignment.Horizontal(float bias);
+    method public int align(int size, int space, androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public androidx.compose.ui.BiasAlignment.Horizontal copy(float bias);
+  }
+
+  @androidx.compose.runtime.Immutable public static final class BiasAlignment.Vertical implements androidx.compose.ui.Alignment.Vertical {
+    ctor public BiasAlignment.Vertical(float bias);
+    method public int align(int size, int space);
+    method public androidx.compose.ui.BiasAlignment.Vertical copy(float bias);
+  }
+
+  public final class CombinedModifier implements androidx.compose.ui.Modifier {
+    ctor public CombinedModifier(androidx.compose.ui.Modifier outer, androidx.compose.ui.Modifier inner);
+    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.compose.ui.Modifier.Element,? extends R> operation);
+    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.compose.ui.Modifier.Element,? super R,? extends R> operation);
+  }
+
+  public final class ComposedModifierKt {
+    method public static androidx.compose.ui.Modifier composed(androidx.compose.ui.Modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier,? extends androidx.compose.ui.Modifier> factory);
+    method public static androidx.compose.ui.Modifier materialize(androidx.compose.runtime.Composer, androidx.compose.ui.Modifier modifier);
+  }
+
+  @androidx.compose.runtime.Stable public interface Modifier {
+    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.compose.ui.Modifier.Element,? extends R> operation);
+    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.compose.ui.Modifier.Element,? super R,? extends R> operation);
+    method public default infix androidx.compose.ui.Modifier then(androidx.compose.ui.Modifier other);
+    field public static final androidx.compose.ui.Modifier.Companion Companion;
+  }
+
+  public static final class Modifier.Companion implements androidx.compose.ui.Modifier {
+    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.compose.ui.Modifier.Element,? extends R> operation);
+    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.compose.ui.Modifier.Element,? super R,? extends R> operation);
+  }
+
+  public static interface Modifier.Element extends androidx.compose.ui.Modifier {
+    method public default boolean all(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public default boolean any(kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier.Element,java.lang.Boolean> predicate);
+    method public default <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.compose.ui.Modifier.Element,? extends R> operation);
+    method public default <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.compose.ui.Modifier.Element,? super R,? extends R> operation);
+  }
+
+  public final class TempListUtilsKt {
+  }
+
+  public final class ZIndexModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier zIndex(androidx.compose.ui.Modifier, float zIndex);
+  }
+
+}
+
+package androidx.compose.ui.autofill {
+
+  public final class AndroidAutofillType_androidKt {
+  }
+
+  public final class AndroidAutofill_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.draw {
+
+  public final class AlphaKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier alpha(androidx.compose.ui.Modifier, float alpha);
+  }
+
+  public final class BlurKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier blur(androidx.compose.ui.Modifier, float radiusX, float radiusY, optional androidx.compose.ui.graphics.Shape edgeTreatment);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier blur(androidx.compose.ui.Modifier, float radius, optional androidx.compose.ui.graphics.Shape edgeTreatment);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class BlurredEdgeTreatment {
+    ctor public BlurredEdgeTreatment();
+    method public androidx.compose.ui.graphics.Shape? getShape();
+    property public final androidx.compose.ui.graphics.Shape? shape;
+  }
+
+  public static final class BlurredEdgeTreatment.Companion {
+    method public androidx.compose.ui.graphics.Shape getRectangle();
+    method public androidx.compose.ui.graphics.Shape getUnbounded();
+    property public final androidx.compose.ui.graphics.Shape Rectangle;
+    property public final androidx.compose.ui.graphics.Shape Unbounded;
+  }
+
+  public interface BuildDrawCacheParams {
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public long getSize();
+    property public abstract androidx.compose.ui.unit.Density density;
+    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public abstract long size;
+  }
+
+  public final class CacheDrawScope implements androidx.compose.ui.unit.Density {
+    method public float getDensity();
+    method public float getFontScale();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public long getSize();
+    method public androidx.compose.ui.draw.DrawResult onDrawBehind(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
+    method public androidx.compose.ui.draw.DrawResult onDrawWithContent(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.ContentDrawScope,kotlin.Unit> block);
+    property public float density;
+    property public float fontScale;
+    property public final androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public final long size;
+  }
+
+  public final class ClipKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier clip(androidx.compose.ui.Modifier, androidx.compose.ui.graphics.Shape shape);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier clipToBounds(androidx.compose.ui.Modifier);
+  }
+
+  public interface DrawCacheModifier extends androidx.compose.ui.draw.DrawModifier {
+    method public void onBuildCache(androidx.compose.ui.draw.BuildDrawCacheParams params);
+  }
+
+  public interface DrawModifier extends androidx.compose.ui.Modifier.Element {
+    method public void draw(androidx.compose.ui.graphics.drawscope.ContentDrawScope);
+  }
+
+  public final class DrawModifierKt {
+    method public static androidx.compose.ui.Modifier drawBehind(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.DrawScope,kotlin.Unit> onDraw);
+    method public static androidx.compose.ui.Modifier drawWithCache(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.draw.CacheDrawScope,androidx.compose.ui.draw.DrawResult> onBuildDrawCache);
+    method public static androidx.compose.ui.Modifier drawWithContent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.drawscope.ContentDrawScope,kotlin.Unit> onDraw);
+  }
+
+  public final class DrawResult {
+  }
+
+  public final class PainterModifierKt {
+    method public static androidx.compose.ui.Modifier paint(androidx.compose.ui.Modifier, androidx.compose.ui.graphics.painter.Painter painter, optional boolean sizeToIntrinsics, optional androidx.compose.ui.Alignment alignment, optional androidx.compose.ui.layout.ContentScale contentScale, optional float alpha, optional androidx.compose.ui.graphics.ColorFilter? colorFilter);
+  }
+
+  public final class RotateKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier rotate(androidx.compose.ui.Modifier, float degrees);
+  }
+
+  public final class ScaleKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier scale(androidx.compose.ui.Modifier, float scaleX, float scaleY);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier scale(androidx.compose.ui.Modifier, float scale);
+  }
+
+  public final class ShadowKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier shadow(androidx.compose.ui.Modifier, float elevation, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip);
+  }
+
+}
+
+package androidx.compose.ui.focus {
+
+  public final class FocusChangedModifierKt {
+    method public static androidx.compose.ui.Modifier onFocusChanged(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusState,kotlin.Unit> onFocusChanged);
+  }
+
+  public final inline class FocusDirection {
+    ctor public FocusDirection();
+  }
+
+  public static final class FocusDirection.Companion {
+    method public int getDown();
+    method public int getIn();
+    method public int getLeft();
+    method public int getNext();
+    method public int getOut();
+    method public int getPrevious();
+    method public int getRight();
+    method public int getUp();
+    property public final int Down;
+    property public final int In;
+    property public final int Left;
+    property public final int Next;
+    property public final int Out;
+    property public final int Previous;
+    property public final int Right;
+    property public final int Up;
+  }
+
+  public interface FocusEventModifier extends androidx.compose.ui.Modifier.Element {
+    method public void onFocusEvent(androidx.compose.ui.focus.FocusState focusState);
+  }
+
+  public final class FocusEventModifierKt {
+    method public static androidx.compose.ui.Modifier onFocusEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusState,kotlin.Unit> onFocusEvent);
+  }
+
+  public interface FocusManager {
+    method public void clearFocus(optional boolean force);
+    method public boolean moveFocus(int focusDirection);
+  }
+
+  public final class FocusManagerKt {
+  }
+
+  public final class FocusModifierKt {
+    method @Deprecated public static androidx.compose.ui.Modifier focusModifier(androidx.compose.ui.Modifier);
+    method public static androidx.compose.ui.Modifier focusTarget(androidx.compose.ui.Modifier);
+  }
+
+  public final class FocusNodeUtilsKt {
+  }
+
+  public final class FocusOrder {
+    ctor public FocusOrder();
+    method public androidx.compose.ui.focus.FocusRequester getDown();
+    method public androidx.compose.ui.focus.FocusRequester getEnd();
+    method public androidx.compose.ui.focus.FocusRequester getLeft();
+    method public androidx.compose.ui.focus.FocusRequester getNext();
+    method public androidx.compose.ui.focus.FocusRequester getPrevious();
+    method public androidx.compose.ui.focus.FocusRequester getRight();
+    method public androidx.compose.ui.focus.FocusRequester getStart();
+    method public androidx.compose.ui.focus.FocusRequester getUp();
+    method public void setDown(androidx.compose.ui.focus.FocusRequester down);
+    method public void setEnd(androidx.compose.ui.focus.FocusRequester end);
+    method public void setLeft(androidx.compose.ui.focus.FocusRequester left);
+    method public void setNext(androidx.compose.ui.focus.FocusRequester next);
+    method public void setPrevious(androidx.compose.ui.focus.FocusRequester previous);
+    method public void setRight(androidx.compose.ui.focus.FocusRequester right);
+    method public void setStart(androidx.compose.ui.focus.FocusRequester start);
+    method public void setUp(androidx.compose.ui.focus.FocusRequester up);
+    property public final androidx.compose.ui.focus.FocusRequester down;
+    property public final androidx.compose.ui.focus.FocusRequester end;
+    property public final androidx.compose.ui.focus.FocusRequester left;
+    property public final androidx.compose.ui.focus.FocusRequester next;
+    property public final androidx.compose.ui.focus.FocusRequester previous;
+    property public final androidx.compose.ui.focus.FocusRequester right;
+    property public final androidx.compose.ui.focus.FocusRequester start;
+    property public final androidx.compose.ui.focus.FocusRequester up;
+  }
+
+  public interface FocusOrderModifier extends androidx.compose.ui.Modifier.Element {
+    method public void populateFocusOrder(androidx.compose.ui.focus.FocusOrder focusOrder);
+  }
+
+  public final class FocusOrderModifierKt {
+    method public static androidx.compose.ui.Modifier focusOrder(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusOrder,kotlin.Unit> focusOrderReceiver);
+    method public static androidx.compose.ui.Modifier focusOrder(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester);
+    method public static androidx.compose.ui.Modifier focusOrder(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusOrder,kotlin.Unit> focusOrderReceiver);
+  }
+
+  public interface FocusProperties {
+    method public boolean getCanFocus();
+    method public void setCanFocus(boolean canFocus);
+    property public abstract boolean canFocus;
+  }
+
+  public final class FocusPropertiesKt {
+    method public static androidx.compose.ui.Modifier focusProperties(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.focus.FocusProperties,kotlin.Unit> scope);
+  }
+
+  public final class FocusRequester {
+    ctor public FocusRequester();
+    method public boolean captureFocus();
+    method public boolean freeFocus();
+    method public void requestFocus();
+    field public static final androidx.compose.ui.focus.FocusRequester.Companion Companion;
+  }
+
+  public static final class FocusRequester.Companion {
+    method public androidx.compose.ui.focus.FocusRequester getDefault();
+    property public final androidx.compose.ui.focus.FocusRequester Default;
+  }
+
+  public final class FocusRequesterKt {
+  }
+
+  public interface FocusRequesterModifier extends androidx.compose.ui.Modifier.Element {
+    method public androidx.compose.ui.focus.FocusRequester getFocusRequester();
+    property public abstract androidx.compose.ui.focus.FocusRequester focusRequester;
+  }
+
+  public final class FocusRequesterModifierKt {
+    method public static androidx.compose.ui.Modifier focusRequester(androidx.compose.ui.Modifier, androidx.compose.ui.focus.FocusRequester focusRequester);
+  }
+
+  public interface FocusState {
+    method public boolean getHasFocus();
+    method public boolean isCaptured();
+    method public boolean isFocused();
+    property public abstract boolean hasFocus;
+    property public abstract boolean isCaptured;
+    property public abstract boolean isFocused;
+  }
+
+  public final class FocusTransactionsKt {
+  }
+
+  public final class FocusTraversalKt {
+  }
+
+  public final class OneDimensionalFocusSearchKt {
+  }
+
+  public final class TwoDimensionalFocusSearchKt {
+  }
+
+}
+
+package androidx.compose.ui.graphics {
+
+  public final class GraphicsLayerModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional androidx.compose.ui.graphics.RenderEffect? renderEffect);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> block);
+    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier toolingGraphicsLayer(androidx.compose.ui.Modifier);
+  }
+
+  public interface GraphicsLayerScope extends androidx.compose.ui.unit.Density {
+    method public float getAlpha();
+    method public float getCameraDistance();
+    method public boolean getClip();
+    method public default androidx.compose.ui.graphics.RenderEffect? getRenderEffect();
+    method public float getRotationX();
+    method public float getRotationY();
+    method public float getRotationZ();
+    method public float getScaleX();
+    method public float getScaleY();
+    method public float getShadowElevation();
+    method public androidx.compose.ui.graphics.Shape getShape();
+    method public long getTransformOrigin();
+    method public float getTranslationX();
+    method public float getTranslationY();
+    method public void setAlpha(float alpha);
+    method public void setCameraDistance(float cameraDistance);
+    method public void setClip(boolean clip);
+    method public default void setRenderEffect(androidx.compose.ui.graphics.RenderEffect? _);
+    method public void setRotationX(float rotationX);
+    method public void setRotationY(float rotationY);
+    method public void setRotationZ(float rotationZ);
+    method public void setScaleX(float scaleX);
+    method public void setScaleY(float scaleY);
+    method public void setShadowElevation(float shadowElevation);
+    method public void setShape(androidx.compose.ui.graphics.Shape shape);
+    method public void setTransformOrigin(long transformOrigin);
+    method public void setTranslationX(float translationX);
+    method public void setTranslationY(float translationY);
+    property public abstract float alpha;
+    property public abstract float cameraDistance;
+    property public abstract boolean clip;
+    property public default androidx.compose.ui.graphics.RenderEffect? renderEffect;
+    property public abstract float rotationX;
+    property public abstract float rotationY;
+    property public abstract float rotationZ;
+    property public abstract float scaleX;
+    property public abstract float scaleY;
+    property public abstract float shadowElevation;
+    property public abstract androidx.compose.ui.graphics.Shape shape;
+    property public abstract long transformOrigin;
+    property public abstract float translationX;
+    property public abstract float translationY;
+  }
+
+  public final class GraphicsLayerScopeKt {
+    method public static androidx.compose.ui.graphics.GraphicsLayerScope GraphicsLayerScope();
+    field public static final float DefaultCameraDistance = 8.0f;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class TransformOrigin {
+    ctor public TransformOrigin();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+  }
+
+  public static final class TransformOrigin.Companion {
+    method public long getCenter();
+    property public final long Center;
+  }
+
+  public final class TransformOriginKt {
+    method public static long TransformOrigin(float pivotFractionX, float pivotFractionY);
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector {
+
+  @androidx.compose.runtime.Immutable public final class ImageVector {
+    method public float getDefaultHeight();
+    method public float getDefaultWidth();
+    method public String getName();
+    method public androidx.compose.ui.graphics.vector.VectorGroup getRoot();
+    method public int getTintBlendMode();
+    method public long getTintColor();
+    method public float getViewportHeight();
+    method public float getViewportWidth();
+    property public final float defaultHeight;
+    property public final float defaultWidth;
+    property public final String name;
+    property public final androidx.compose.ui.graphics.vector.VectorGroup root;
+    property public final int tintBlendMode;
+    property public final long tintColor;
+    property public final float viewportHeight;
+    property public final float viewportWidth;
+    field public static final androidx.compose.ui.graphics.vector.ImageVector.Companion Companion;
+  }
+
+  public static final class ImageVector.Builder {
+    ctor public ImageVector.Builder(optional String name, float defaultWidth, float defaultHeight, float viewportWidth, float viewportHeight, optional long tintColor, optional int tintBlendMode);
+    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addGroup(optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData);
+    method public androidx.compose.ui.graphics.vector.ImageVector.Builder addPath(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+    method public androidx.compose.ui.graphics.vector.ImageVector build();
+    method public androidx.compose.ui.graphics.vector.ImageVector.Builder clearGroup();
+  }
+
+  public static final class ImageVector.Companion {
+  }
+
+  public final class ImageVectorKt {
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder group(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional float rotate, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.ImageVector.Builder,kotlin.Unit> block);
+    method public static inline androidx.compose.ui.graphics.vector.ImageVector.Builder path(androidx.compose.ui.graphics.vector.ImageVector.Builder, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional int pathFillType, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> pathBuilder);
+  }
+
+  public abstract sealed class VNode {
+    method public abstract void draw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    method public final void invalidate();
+  }
+
+  public final class VectorApplier extends androidx.compose.runtime.AbstractApplier<androidx.compose.ui.graphics.vector.VNode> {
+    ctor public VectorApplier(androidx.compose.ui.graphics.vector.VNode root);
+    method public void insertBottomUp(int index, androidx.compose.ui.graphics.vector.VNode instance);
+    method public void insertTopDown(int index, androidx.compose.ui.graphics.vector.VNode instance);
+    method public void move(int from, int to, int count);
+    method protected void onClear();
+    method public void remove(int index, int count);
+  }
+
+  public final class VectorComposeKt {
+    method @androidx.compose.runtime.Composable public static void Group(optional String name, optional float rotation, optional float pivotX, optional float pivotY, optional float scaleX, optional float scaleY, optional float translationX, optional float translationY, optional java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> clipPathData, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Path(java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode> pathData, optional int pathFillType, optional String name, optional androidx.compose.ui.graphics.Brush? fill, optional float fillAlpha, optional androidx.compose.ui.graphics.Brush? stroke, optional float strokeAlpha, optional float strokeLineWidth, optional int strokeLineCap, optional int strokeLineJoin, optional float strokeLineMiter, optional float trimPathStart, optional float trimPathEnd, optional float trimPathOffset);
+  }
+
+  public interface VectorConfig {
+    method public default <T> T! getOrDefault(androidx.compose.ui.graphics.vector.VectorProperty<T> property, T? defaultValue);
+  }
+
+  @androidx.compose.runtime.Immutable public final class VectorGroup extends androidx.compose.ui.graphics.vector.VectorNode implements java.lang.Iterable<androidx.compose.ui.graphics.vector.VectorNode> kotlin.jvm.internal.markers.KMappedMarker {
+    method public operator androidx.compose.ui.graphics.vector.VectorNode get(int index);
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getClipPathData();
+    method public String getName();
+    method public float getPivotX();
+    method public float getPivotY();
+    method public float getRotation();
+    method public float getScaleX();
+    method public float getScaleY();
+    method public int getSize();
+    method public float getTranslationX();
+    method public float getTranslationY();
+    method public java.util.Iterator<androidx.compose.ui.graphics.vector.VectorNode> iterator();
+    property public final java.util.List<androidx.compose.ui.graphics.vector.PathNode> clipPathData;
+    property public final String name;
+    property public final float pivotX;
+    property public final float pivotY;
+    property public final float rotation;
+    property public final float scaleX;
+    property public final float scaleY;
+    property public final int size;
+    property public final float translationX;
+    property public final float translationY;
+  }
+
+  public final class VectorKt {
+    method public static inline java.util.List<androidx.compose.ui.graphics.vector.PathNode> PathData(kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.vector.PathBuilder,kotlin.Unit> block);
+    method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> addPathNodes(String? pathStr);
+    method public static int getDefaultFillType();
+    method public static int getDefaultStrokeLineCap();
+    method public static int getDefaultStrokeLineJoin();
+    method public static int getDefaultTintBlendMode();
+    method public static long getDefaultTintColor();
+    method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> getEmptyPath();
+    property public static final int DefaultFillType;
+    property public static final int DefaultStrokeLineCap;
+    property public static final int DefaultStrokeLineJoin;
+    property public static final int DefaultTintBlendMode;
+    property public static final long DefaultTintColor;
+    property public static final java.util.List<androidx.compose.ui.graphics.vector.PathNode> EmptyPath;
+    field public static final String DefaultGroupName = "";
+    field public static final String DefaultPathName = "";
+    field public static final float DefaultPivotX = 0.0f;
+    field public static final float DefaultPivotY = 0.0f;
+    field public static final float DefaultRotation = 0.0f;
+    field public static final float DefaultScaleX = 1.0f;
+    field public static final float DefaultScaleY = 1.0f;
+    field public static final float DefaultStrokeLineMiter = 4.0f;
+    field public static final float DefaultStrokeLineWidth = 0.0f;
+    field public static final float DefaultTranslationX = 0.0f;
+    field public static final float DefaultTranslationY = 0.0f;
+    field public static final float DefaultTrimPathEnd = 1.0f;
+    field public static final float DefaultTrimPathOffset = 0.0f;
+    field public static final float DefaultTrimPathStart = 0.0f;
+  }
+
+  public abstract sealed class VectorNode {
+  }
+
+  public final class VectorPainter extends androidx.compose.ui.graphics.painter.Painter {
+    method public long getIntrinsicSize();
+    method protected void onDraw(androidx.compose.ui.graphics.drawscope.DrawScope);
+    property public long intrinsicSize;
+  }
+
+  public final class VectorPainterKt {
+    method @androidx.compose.runtime.Composable public static void RenderVectorGroup(androidx.compose.ui.graphics.vector.VectorGroup group, optional java.util.Map<java.lang.String,? extends androidx.compose.ui.graphics.vector.VectorConfig> configs);
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(float defaultWidth, float defaultHeight, optional float viewportWidth, optional float viewportHeight, optional String name, optional long tintColor, optional int tintBlendMode, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.VectorPainter rememberVectorPainter(androidx.compose.ui.graphics.vector.ImageVector image);
+    field public static final String RootGroupName = "VectorRootGroup";
+  }
+
+  @androidx.compose.runtime.Immutable public final class VectorPath extends androidx.compose.ui.graphics.vector.VectorNode {
+    method public androidx.compose.ui.graphics.Brush? getFill();
+    method public float getFillAlpha();
+    method public String getName();
+    method public java.util.List<androidx.compose.ui.graphics.vector.PathNode> getPathData();
+    method public int getPathFillType();
+    method public androidx.compose.ui.graphics.Brush? getStroke();
+    method public float getStrokeAlpha();
+    method public int getStrokeLineCap();
+    method public int getStrokeLineJoin();
+    method public float getStrokeLineMiter();
+    method public float getStrokeLineWidth();
+    method public float getTrimPathEnd();
+    method public float getTrimPathOffset();
+    method public float getTrimPathStart();
+    property public final androidx.compose.ui.graphics.Brush? fill;
+    property public final float fillAlpha;
+    property public final String name;
+    property public final java.util.List<androidx.compose.ui.graphics.vector.PathNode> pathData;
+    property public final int pathFillType;
+    property public final androidx.compose.ui.graphics.Brush? stroke;
+    property public final float strokeAlpha;
+    property public final int strokeLineCap;
+    property public final int strokeLineJoin;
+    property public final float strokeLineMiter;
+    property public final float strokeLineWidth;
+    property public final float trimPathEnd;
+    property public final float trimPathOffset;
+    property public final float trimPathStart;
+  }
+
+  public abstract sealed class VectorProperty<T> {
+  }
+
+  public static final class VectorProperty.Fill extends androidx.compose.ui.graphics.vector.VectorProperty<androidx.compose.ui.graphics.Brush> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.Fill INSTANCE;
+  }
+
+  public static final class VectorProperty.FillAlpha extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.FillAlpha INSTANCE;
+  }
+
+  public static final class VectorProperty.PathData extends androidx.compose.ui.graphics.vector.VectorProperty<java.util.List<? extends androidx.compose.ui.graphics.vector.PathNode>> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.PathData INSTANCE;
+  }
+
+  public static final class VectorProperty.PivotX extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.PivotX INSTANCE;
+  }
+
+  public static final class VectorProperty.PivotY extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.PivotY INSTANCE;
+  }
+
+  public static final class VectorProperty.Rotation extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.Rotation INSTANCE;
+  }
+
+  public static final class VectorProperty.ScaleX extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.ScaleX INSTANCE;
+  }
+
+  public static final class VectorProperty.ScaleY extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.ScaleY INSTANCE;
+  }
+
+  public static final class VectorProperty.Stroke extends androidx.compose.ui.graphics.vector.VectorProperty<androidx.compose.ui.graphics.Brush> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.Stroke INSTANCE;
+  }
+
+  public static final class VectorProperty.StrokeAlpha extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.StrokeAlpha INSTANCE;
+  }
+
+  public static final class VectorProperty.StrokeLineWidth extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.StrokeLineWidth INSTANCE;
+  }
+
+  public static final class VectorProperty.TranslateX extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TranslateX INSTANCE;
+  }
+
+  public static final class VectorProperty.TranslateY extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TranslateY INSTANCE;
+  }
+
+  public static final class VectorProperty.TrimPathEnd extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TrimPathEnd INSTANCE;
+  }
+
+  public static final class VectorProperty.TrimPathOffset extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TrimPathOffset INSTANCE;
+  }
+
+  public static final class VectorProperty.TrimPathStart extends androidx.compose.ui.graphics.vector.VectorProperty<java.lang.Float> {
+    field public static final androidx.compose.ui.graphics.vector.VectorProperty.TrimPathStart INSTANCE;
+  }
+
+}
+
+package androidx.compose.ui.graphics.vector.compat {
+
+  public final class XmlVectorParser_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.hapticfeedback {
+
+  public interface HapticFeedback {
+    method public void performHapticFeedback(int hapticFeedbackType);
+  }
+
+  public final inline class HapticFeedbackType {
+    ctor public HapticFeedbackType();
+  }
+
+  public static final class HapticFeedbackType.Companion {
+    method public int getLongPress();
+    method public int getTextHandleMove();
+    method public java.util.List<androidx.compose.ui.hapticfeedback.HapticFeedbackType> values();
+    property public final int LongPress;
+    property public final int TextHandleMove;
+  }
+
+}
+
+package androidx.compose.ui.input {
+
+  public final inline class InputMode {
+    ctor public InputMode();
+  }
+
+  public static final class InputMode.Companion {
+    method public int getKeyboard();
+    method public int getTouch();
+    property public final int Keyboard;
+    property public final int Touch;
+  }
+
+  public interface InputModeManager {
+    method public int getInputMode();
+    property public abstract int inputMode;
+  }
+
+}
+
+package androidx.compose.ui.input.key {
+
+  public final inline class Key {
+    ctor public Key();
+    method public long getKeyCode();
+    property public final long keyCode;
+  }
+
+  public static final class Key.Companion {
+    method public long getA();
+    method public long getAllApps();
+    method public long getAltLeft();
+    method public long getAltRight();
+    method public long getApostrophe();
+    method public long getAppSwitch();
+    method public long getAssist();
+    method public long getAt();
+    method public long getAvReceiverInput();
+    method public long getAvReceiverPower();
+    method public long getB();
+    method public long getBack();
+    method public long getBackslash();
+    method public long getBackspace();
+    method public long getBookmark();
+    method public long getBreak();
+    method public long getBrightnessDown();
+    method public long getBrightnessUp();
+    method public long getBrowser();
+    method public long getButton1();
+    method public long getButton10();
+    method public long getButton11();
+    method public long getButton12();
+    method public long getButton13();
+    method public long getButton14();
+    method public long getButton15();
+    method public long getButton16();
+    method public long getButton2();
+    method public long getButton3();
+    method public long getButton4();
+    method public long getButton5();
+    method public long getButton6();
+    method public long getButton7();
+    method public long getButton8();
+    method public long getButton9();
+    method public long getButtonA();
+    method public long getButtonB();
+    method public long getButtonC();
+    method public long getButtonL1();
+    method public long getButtonL2();
+    method public long getButtonMode();
+    method public long getButtonR1();
+    method public long getButtonR2();
+    method public long getButtonSelect();
+    method public long getButtonStart();
+    method public long getButtonThumbLeft();
+    method public long getButtonThumbRight();
+    method public long getButtonX();
+    method public long getButtonY();
+    method public long getButtonZ();
+    method public long getC();
+    method public long getCalculator();
+    method public long getCalendar();
+    method public long getCall();
+    method public long getCamera();
+    method public long getCapsLock();
+    method public long getCaptions();
+    method public long getChannelDown();
+    method public long getChannelUp();
+    method public long getClear();
+    method public long getComma();
+    method public long getContacts();
+    method public long getCopy();
+    method public long getCtrlLeft();
+    method public long getCtrlRight();
+    method public long getCut();
+    method public long getD();
+    method public long getDelete();
+    method public long getDirectionCenter();
+    method public long getDirectionDown();
+    method public long getDirectionDownLeft();
+    method public long getDirectionDownRight();
+    method public long getDirectionLeft();
+    method public long getDirectionRight();
+    method public long getDirectionUp();
+    method public long getDirectionUpLeft();
+    method public long getDirectionUpRight();
+    method public long getDvr();
+    method public long getE();
+    method public long getEight();
+    method public long getEisu();
+    method public long getEndCall();
+    method public long getEnter();
+    method public long getEnvelope();
+    method public long getEquals();
+    method public long getEscape();
+    method public long getF();
+    method public long getF1();
+    method public long getF10();
+    method public long getF11();
+    method public long getF12();
+    method public long getF2();
+    method public long getF3();
+    method public long getF4();
+    method public long getF5();
+    method public long getF6();
+    method public long getF7();
+    method public long getF8();
+    method public long getF9();
+    method public long getFive();
+    method public long getFocus();
+    method public long getForward();
+    method public long getFour();
+    method public long getFunction();
+    method public long getG();
+    method public long getGrave();
+    method public long getGuide();
+    method public long getH();
+    method public long getHeadsetHook();
+    method public long getHelp();
+    method public long getHenkan();
+    method public long getHome();
+    method public long getI();
+    method public long getInfo();
+    method public long getInsert();
+    method public long getJ();
+    method public long getK();
+    method public long getKana();
+    method public long getKatakanaHiragana();
+    method public long getL();
+    method public long getLanguageSwitch();
+    method public long getLastChannel();
+    method public long getLeftBracket();
+    method public long getM();
+    method public long getMannerMode();
+    method public long getMediaAudioTrack();
+    method public long getMediaClose();
+    method public long getMediaEject();
+    method public long getMediaFastForward();
+    method public long getMediaNext();
+    method public long getMediaPause();
+    method public long getMediaPlay();
+    method public long getMediaPlayPause();
+    method public long getMediaPrevious();
+    method public long getMediaRecord();
+    method public long getMediaRewind();
+    method public long getMediaSkipBackward();
+    method public long getMediaSkipForward();
+    method public long getMediaStepBackward();
+    method public long getMediaStepForward();
+    method public long getMediaStop();
+    method public long getMediaTopMenu();
+    method public long getMenu();
+    method public long getMetaLeft();
+    method public long getMetaRight();
+    method public long getMicrophoneMute();
+    method public long getMinus();
+    method public long getMoveEnd();
+    method public long getMoveHome();
+    method public long getMuhenkan();
+    method public long getMultiply();
+    method public long getMusic();
+    method public long getN();
+    method public long getNavigateIn();
+    method public long getNavigateNext();
+    method public long getNavigateOut();
+    method public long getNavigatePrevious();
+    method public long getNine();
+    method public long getNotification();
+    method public long getNumLock();
+    method public long getNumPad0();
+    method public long getNumPad1();
+    method public long getNumPad2();
+    method public long getNumPad3();
+    method public long getNumPad4();
+    method public long getNumPad5();
+    method public long getNumPad6();
+    method public long getNumPad7();
+    method public long getNumPad8();
+    method public long getNumPad9();
+    method public long getNumPadAdd();
+    method public long getNumPadComma();
+    method public long getNumPadDivide();
+    method public long getNumPadDot();
+    method public long getNumPadEnter();
+    method public long getNumPadEquals();
+    method public long getNumPadLeftParenthesis();
+    method public long getNumPadMultiply();
+    method public long getNumPadRightParenthesis();
+    method public long getNumPadSubtract();
+    method public long getNumber();
+    method public long getO();
+    method public long getOne();
+    method public long getP();
+    method public long getPageDown();
+    method public long getPageUp();
+    method public long getPairing();
+    method public long getPaste();
+    method public long getPeriod();
+    method public long getPictureSymbols();
+    method public long getPlus();
+    method public long getPound();
+    method public long getPower();
+    method public long getPrintScreen();
+    method public long getProfileSwitch();
+    method public long getProgramBlue();
+    method public long getProgramGreen();
+    method public long getProgramRed();
+    method public long getProgramYellow();
+    method public long getQ();
+    method public long getR();
+    method public long getRefresh();
+    method public long getRightBracket();
+    method public long getRo();
+    method public long getS();
+    method public long getScrollLock();
+    method public long getSearch();
+    method public long getSemicolon();
+    method public long getSetTopBoxInput();
+    method public long getSetTopBoxPower();
+    method public long getSettings();
+    method public long getSeven();
+    method public long getShiftLeft();
+    method public long getShiftRight();
+    method public long getSix();
+    method public long getSlash();
+    method public long getSleep();
+    method public long getSoftLeft();
+    method public long getSoftRight();
+    method public long getSoftSleep();
+    method public long getSpacebar();
+    method public long getStem1();
+    method public long getStem2();
+    method public long getStem3();
+    method public long getStemPrimary();
+    method public long getSwitchCharset();
+    method public long getSymbol();
+    method public long getSystemNavigationDown();
+    method public long getSystemNavigationLeft();
+    method public long getSystemNavigationRight();
+    method public long getSystemNavigationUp();
+    method public long getT();
+    method public long getTab();
+    method public long getThree();
+    method public long getThumbsDown();
+    method public long getThumbsUp();
+    method public long getToggle2D3D();
+    method public long getTv();
+    method public long getTvAntennaCable();
+    method public long getTvAudioDescription();
+    method public long getTvAudioDescriptionMixingVolumeDown();
+    method public long getTvAudioDescriptionMixingVolumeUp();
+    method public long getTvContentsMenu();
+    method public long getTvDataService();
+    method public long getTvInput();
+    method public long getTvInputComponent1();
+    method public long getTvInputComponent2();
+    method public long getTvInputComposite1();
+    method public long getTvInputComposite2();
+    method public long getTvInputHdmi1();
+    method public long getTvInputHdmi2();
+    method public long getTvInputHdmi3();
+    method public long getTvInputHdmi4();
+    method public long getTvInputVga1();
+    method public long getTvMediaContextMenu();
+    method public long getTvNetwork();
+    method public long getTvNumberEntry();
+    method public long getTvPower();
+    method public long getTvRadioService();
+    method public long getTvSatellite();
+    method public long getTvSatelliteBs();
+    method public long getTvSatelliteCs();
+    method public long getTvSatelliteService();
+    method public long getTvTeletext();
+    method public long getTvTerrestrialAnalog();
+    method public long getTvTerrestrialDigital();
+    method public long getTvTimerProgramming();
+    method public long getTvZoomMode();
+    method public long getTwo();
+    method public long getU();
+    method public long getUnknown();
+    method public long getV();
+    method public long getVoiceAssist();
+    method public long getVolumeDown();
+    method public long getVolumeMute();
+    method public long getVolumeUp();
+    method public long getW();
+    method public long getWakeUp();
+    method public long getWindow();
+    method public long getX();
+    method public long getY();
+    method public long getYen();
+    method public long getZ();
+    method public long getZenkakuHankaru();
+    method public long getZero();
+    method public long getZoomIn();
+    method public long getZoomOut();
+    property public final long A;
+    property public final long AllApps;
+    property public final long AltLeft;
+    property public final long AltRight;
+    property public final long Apostrophe;
+    property public final long AppSwitch;
+    property public final long Assist;
+    property public final long At;
+    property public final long AvReceiverInput;
+    property public final long AvReceiverPower;
+    property public final long B;
+    property public final long Back;
+    property public final long Backslash;
+    property public final long Backspace;
+    property public final long Bookmark;
+    property public final long Break;
+    property public final long BrightnessDown;
+    property public final long BrightnessUp;
+    property public final long Browser;
+    property public final long Button1;
+    property public final long Button10;
+    property public final long Button11;
+    property public final long Button12;
+    property public final long Button13;
+    property public final long Button14;
+    property public final long Button15;
+    property public final long Button16;
+    property public final long Button2;
+    property public final long Button3;
+    property public final long Button4;
+    property public final long Button5;
+    property public final long Button6;
+    property public final long Button7;
+    property public final long Button8;
+    property public final long Button9;
+    property public final long ButtonA;
+    property public final long ButtonB;
+    property public final long ButtonC;
+    property public final long ButtonL1;
+    property public final long ButtonL2;
+    property public final long ButtonMode;
+    property public final long ButtonR1;
+    property public final long ButtonR2;
+    property public final long ButtonSelect;
+    property public final long ButtonStart;
+    property public final long ButtonThumbLeft;
+    property public final long ButtonThumbRight;
+    property public final long ButtonX;
+    property public final long ButtonY;
+    property public final long ButtonZ;
+    property public final long C;
+    property public final long Calculator;
+    property public final long Calendar;
+    property public final long Call;
+    property public final long Camera;
+    property public final long CapsLock;
+    property public final long Captions;
+    property public final long ChannelDown;
+    property public final long ChannelUp;
+    property public final long Clear;
+    property public final long Comma;
+    property public final long Contacts;
+    property public final long Copy;
+    property public final long CtrlLeft;
+    property public final long CtrlRight;
+    property public final long Cut;
+    property public final long D;
+    property public final long Delete;
+    property public final long DirectionCenter;
+    property public final long DirectionDown;
+    property public final long DirectionDownLeft;
+    property public final long DirectionDownRight;
+    property public final long DirectionLeft;
+    property public final long DirectionRight;
+    property public final long DirectionUp;
+    property public final long DirectionUpLeft;
+    property public final long DirectionUpRight;
+    property public final long Dvr;
+    property public final long E;
+    property public final long Eight;
+    property public final long Eisu;
+    property public final long EndCall;
+    property public final long Enter;
+    property public final long Envelope;
+    property public final long Equals;
+    property public final long Escape;
+    property public final long F;
+    property public final long F1;
+    property public final long F10;
+    property public final long F11;
+    property public final long F12;
+    property public final long F2;
+    property public final long F3;
+    property public final long F4;
+    property public final long F5;
+    property public final long F6;
+    property public final long F7;
+    property public final long F8;
+    property public final long F9;
+    property public final long Five;
+    property public final long Focus;
+    property public final long Forward;
+    property public final long Four;
+    property public final long Function;
+    property public final long G;
+    property public final long Grave;
+    property public final long Guide;
+    property public final long H;
+    property public final long HeadsetHook;
+    property public final long Help;
+    property public final long Henkan;
+    property public final long Home;
+    property public final long I;
+    property public final long Info;
+    property public final long Insert;
+    property public final long J;
+    property public final long K;
+    property public final long Kana;
+    property public final long KatakanaHiragana;
+    property public final long L;
+    property public final long LanguageSwitch;
+    property public final long LastChannel;
+    property public final long LeftBracket;
+    property public final long M;
+    property public final long MannerMode;
+    property public final long MediaAudioTrack;
+    property public final long MediaClose;
+    property public final long MediaEject;
+    property public final long MediaFastForward;
+    property public final long MediaNext;
+    property public final long MediaPause;
+    property public final long MediaPlay;
+    property public final long MediaPlayPause;
+    property public final long MediaPrevious;
+    property public final long MediaRecord;
+    property public final long MediaRewind;
+    property public final long MediaSkipBackward;
+    property public final long MediaSkipForward;
+    property public final long MediaStepBackward;
+    property public final long MediaStepForward;
+    property public final long MediaStop;
+    property public final long MediaTopMenu;
+    property public final long Menu;
+    property public final long MetaLeft;
+    property public final long MetaRight;
+    property public final long MicrophoneMute;
+    property public final long Minus;
+    property public final long MoveEnd;
+    property public final long MoveHome;
+    property public final long Muhenkan;
+    property public final long Multiply;
+    property public final long Music;
+    property public final long N;
+    property public final long NavigateIn;
+    property public final long NavigateNext;
+    property public final long NavigateOut;
+    property public final long NavigatePrevious;
+    property public final long Nine;
+    property public final long Notification;
+    property public final long NumLock;
+    property public final long NumPad0;
+    property public final long NumPad1;
+    property public final long NumPad2;
+    property public final long NumPad3;
+    property public final long NumPad4;
+    property public final long NumPad5;
+    property public final long NumPad6;
+    property public final long NumPad7;
+    property public final long NumPad8;
+    property public final long NumPad9;
+    property public final long NumPadAdd;
+    property public final long NumPadComma;
+    property public final long NumPadDivide;
+    property public final long NumPadDot;
+    property public final long NumPadEnter;
+    property public final long NumPadEquals;
+    property public final long NumPadLeftParenthesis;
+    property public final long NumPadMultiply;
+    property public final long NumPadRightParenthesis;
+    property public final long NumPadSubtract;
+    property public final long Number;
+    property public final long O;
+    property public final long One;
+    property public final long P;
+    property public final long PageDown;
+    property public final long PageUp;
+    property public final long Pairing;
+    property public final long Paste;
+    property public final long Period;
+    property public final long PictureSymbols;
+    property public final long Plus;
+    property public final long Pound;
+    property public final long Power;
+    property public final long PrintScreen;
+    property public final long ProfileSwitch;
+    property public final long ProgramBlue;
+    property public final long ProgramGreen;
+    property public final long ProgramRed;
+    property public final long ProgramYellow;
+    property public final long Q;
+    property public final long R;
+    property public final long Refresh;
+    property public final long RightBracket;
+    property public final long Ro;
+    property public final long S;
+    property public final long ScrollLock;
+    property public final long Search;
+    property public final long Semicolon;
+    property public final long SetTopBoxInput;
+    property public final long SetTopBoxPower;
+    property public final long Settings;
+    property public final long Seven;
+    property public final long ShiftLeft;
+    property public final long ShiftRight;
+    property public final long Six;
+    property public final long Slash;
+    property public final long Sleep;
+    property public final long SoftLeft;
+    property public final long SoftRight;
+    property public final long SoftSleep;
+    property public final long Spacebar;
+    property public final long Stem1;
+    property public final long Stem2;
+    property public final long Stem3;
+    property public final long StemPrimary;
+    property public final long SwitchCharset;
+    property public final long Symbol;
+    property public final long SystemNavigationDown;
+    property public final long SystemNavigationLeft;
+    property public final long SystemNavigationRight;
+    property public final long SystemNavigationUp;
+    property public final long T;
+    property public final long Tab;
+    property public final long Three;
+    property public final long ThumbsDown;
+    property public final long ThumbsUp;
+    property public final long Toggle2D3D;
+    property public final long Tv;
+    property public final long TvAntennaCable;
+    property public final long TvAudioDescription;
+    property public final long TvAudioDescriptionMixingVolumeDown;
+    property public final long TvAudioDescriptionMixingVolumeUp;
+    property public final long TvContentsMenu;
+    property public final long TvDataService;
+    property public final long TvInput;
+    property public final long TvInputComponent1;
+    property public final long TvInputComponent2;
+    property public final long TvInputComposite1;
+    property public final long TvInputComposite2;
+    property public final long TvInputHdmi1;
+    property public final long TvInputHdmi2;
+    property public final long TvInputHdmi3;
+    property public final long TvInputHdmi4;
+    property public final long TvInputVga1;
+    property public final long TvMediaContextMenu;
+    property public final long TvNetwork;
+    property public final long TvNumberEntry;
+    property public final long TvPower;
+    property public final long TvRadioService;
+    property public final long TvSatellite;
+    property public final long TvSatelliteBs;
+    property public final long TvSatelliteCs;
+    property public final long TvSatelliteService;
+    property public final long TvTeletext;
+    property public final long TvTerrestrialAnalog;
+    property public final long TvTerrestrialDigital;
+    property public final long TvTimerProgramming;
+    property public final long TvZoomMode;
+    property public final long Two;
+    property public final long U;
+    property public final long Unknown;
+    property public final long V;
+    property public final long VoiceAssist;
+    property public final long VolumeDown;
+    property public final long VolumeMute;
+    property public final long VolumeUp;
+    property public final long W;
+    property public final long WakeUp;
+    property public final long Window;
+    property public final long X;
+    property public final long Y;
+    property public final long Yen;
+    property public final long Z;
+    property public final long ZenkakuHankaru;
+    property public final long Zero;
+    property public final long ZoomIn;
+    property public final long ZoomOut;
+  }
+
+  public final inline class KeyEvent {
+    ctor public KeyEvent();
+    method public android.view.KeyEvent getNativeKeyEvent();
+    property public final android.view.KeyEvent nativeKeyEvent;
+  }
+
+  public final inline class KeyEventType {
+    ctor public KeyEventType();
+  }
+
+  public static final class KeyEventType.Companion {
+    method public int getKeyDown();
+    method public int getKeyUp();
+    method public int getUnknown();
+    property public final int KeyDown;
+    property public final int KeyUp;
+    property public final int Unknown;
+  }
+
+  public final class KeyEvent_androidKt {
+    method public static long getKey(android.view.KeyEvent);
+    method public static int getType(android.view.KeyEvent);
+    method public static int getUtf16CodePoint(android.view.KeyEvent);
+    method public static boolean isAltPressed(android.view.KeyEvent);
+    method public static boolean isCtrlPressed(android.view.KeyEvent);
+    method public static boolean isMetaPressed(android.view.KeyEvent);
+    method public static boolean isShiftPressed(android.view.KeyEvent);
+  }
+
+  public final class KeyInputModifierKt {
+    method public static androidx.compose.ui.Modifier onKeyEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.key.KeyEvent,java.lang.Boolean> onKeyEvent);
+    method public static androidx.compose.ui.Modifier onPreviewKeyEvent(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.input.key.KeyEvent,java.lang.Boolean> onPreviewKeyEvent);
+  }
+
+  public final class Key_androidKt {
+    method public static long Key(int nativeKeyCode);
+    method public static int getNativeKeyCode(long);
+  }
+
+}
+
+package androidx.compose.ui.input.nestedscroll {
+
+  public interface NestedScrollConnection {
+    method public default suspend Object? onPostFling(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public default long onPostScroll(long consumed, long available, int source);
+    method public default suspend Object? onPreFling(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public default long onPreScroll(long available, int source);
+  }
+
+  public final class NestedScrollDelegatingWrapperKt {
+  }
+
+  public final class NestedScrollDispatcher {
+    ctor public NestedScrollDispatcher();
+    method public suspend Object? dispatchPostFling(long consumed, long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public long dispatchPostScroll(long consumed, long available, int source);
+    method public suspend Object? dispatchPreFling(long available, kotlin.coroutines.Continuation<? super androidx.compose.ui.unit.Velocity> p);
+    method public long dispatchPreScroll(long available, int source);
+    method public kotlinx.coroutines.CoroutineScope getCoroutineScope();
+    property public final kotlinx.coroutines.CoroutineScope coroutineScope;
+  }
+
+  public final class NestedScrollModifierKt {
+    method public static androidx.compose.ui.Modifier nestedScroll(androidx.compose.ui.Modifier, androidx.compose.ui.input.nestedscroll.NestedScrollConnection connection, optional androidx.compose.ui.input.nestedscroll.NestedScrollDispatcher? dispatcher);
+  }
+
+  public final inline class NestedScrollSource {
+    ctor public NestedScrollSource();
+  }
+
+  public static final class NestedScrollSource.Companion {
+    method public int getDrag();
+    method public int getFling();
+    method @Deprecated public int getRelocate();
+    property public final int Drag;
+    property public final int Fling;
+    property @Deprecated public final int Relocate;
+  }
+
+}
+
+package androidx.compose.ui.input.pointer {
+
+  @kotlin.coroutines.RestrictsSuspension public interface AwaitPointerEventScope extends androidx.compose.ui.unit.Density {
+    method public suspend Object? awaitPointerEvent(optional androidx.compose.ui.input.pointer.PointerEventPass pass, optional kotlin.coroutines.Continuation<? super androidx.compose.ui.input.pointer.PointerEvent> p);
+    method public androidx.compose.ui.input.pointer.PointerEvent getCurrentEvent();
+    method public default long getExtendedTouchPadding();
+    method public long getSize();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    method public default suspend <T> Object? withTimeout(long timeMillis, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.AwaitPointerEventScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T> p);
+    method public default suspend <T> Object? withTimeoutOrNull(long timeMillis, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.AwaitPointerEventScope,? super kotlin.coroutines.Continuation<? super T>,?> block, kotlin.coroutines.Continuation<? super T> p);
+    property public abstract androidx.compose.ui.input.pointer.PointerEvent currentEvent;
+    property public default long extendedTouchPadding;
+    property public abstract long size;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+  }
+
+  public final class ConsumedData {
+    ctor public ConsumedData(optional boolean positionChange, optional boolean downChange);
+    method public boolean getDownChange();
+    method public boolean getPositionChange();
+    method public void setDownChange(boolean downChange);
+    method public void setPositionChange(boolean positionChange);
+    property public final boolean downChange;
+    property public final boolean positionChange;
+  }
+
+  public final inline class PointerButtons {
+    ctor public PointerButtons();
+  }
+
+  public final class PointerEvent {
+    ctor public PointerEvent(java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes);
+    method public java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> component1();
+    method public androidx.compose.ui.input.pointer.PointerEvent copy(java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes, android.view.MotionEvent? motionEvent);
+    method public int getButtons();
+    method public java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> getChanges();
+    method public int getKeyboardModifiers();
+    method public int getType();
+    property public final int buttons;
+    property public final java.util.List<androidx.compose.ui.input.pointer.PointerInputChange> changes;
+    property public final int keyboardModifiers;
+    property public final int type;
+  }
+
+  public final class PointerEventKt {
+    method public static boolean anyChangeConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static boolean changedToDown(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static boolean changedToDownIgnoreConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static boolean changedToUp(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static boolean changedToUpIgnoreConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static void consumeAllChanges(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static void consumeDownChange(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static void consumePositionChange(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static int indexOfFirstPressed(int);
+    method public static int indexOfLastPressed(int);
+    method @Deprecated public static boolean isOutOfBounds(androidx.compose.ui.input.pointer.PointerInputChange, long size);
+    method public static boolean isOutOfBounds(androidx.compose.ui.input.pointer.PointerInputChange, long size, long extendedTouchPadding);
+    method public static boolean isPressed(int, int buttonIndex);
+    method public static long positionChange(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static boolean positionChangeConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static long positionChangeIgnoreConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static boolean positionChanged(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static boolean positionChangedIgnoreConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
+  }
+
+  public enum PointerEventPass {
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerEventPass Final;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerEventPass Initial;
+    enum_constant public static final androidx.compose.ui.input.pointer.PointerEventPass Main;
+  }
+
+  public final class PointerEventTimeoutCancellationException extends java.util.concurrent.CancellationException {
+    ctor public PointerEventTimeoutCancellationException(long time);
+  }
+
+  public final inline class PointerEventType {
+    ctor public PointerEventType();
+  }
+
+  public static final class PointerEventType.Companion {
+    method public int getEnter();
+    method public int getExit();
+    method public int getMove();
+    method public int getPress();
+    method public int getRelease();
+    method public int getUnknown();
+    property public final int Enter;
+    property public final int Exit;
+    property public final int Move;
+    property public final int Press;
+    property public final int Release;
+    property public final int Unknown;
+  }
+
+  public final class PointerEvent_androidKt {
+    method public static boolean getAreAnyPressed(int);
+    method public static int indexOfFirstPressed(int);
+    method public static int indexOfLastPressed(int);
+    method public static boolean isAltGraphPressed(int);
+    method public static boolean isAltPressed(int);
+    method public static boolean isBackPressed(int);
+    method public static boolean isCapsLockOn(int);
+    method public static boolean isCtrlPressed(int);
+    method public static boolean isForwardPressed(int);
+    method public static boolean isFunctionPressed(int);
+    method public static boolean isMetaPressed(int);
+    method public static boolean isNumLockOn(int);
+    method public static boolean isPressed(int, int buttonIndex);
+    method public static boolean isPrimaryPressed(int);
+    method public static boolean isScrollLockOn(int);
+    method public static boolean isSecondaryPressed(int);
+    method public static boolean isShiftPressed(int);
+    method public static boolean isSymPressed(int);
+    method public static boolean isTertiaryPressed(int);
+  }
+
+  public interface PointerIcon {
+  }
+
+  public final class PointerIconKt {
+    method public static androidx.compose.ui.Modifier pointerHoverIcon(androidx.compose.ui.Modifier, androidx.compose.ui.input.pointer.PointerIcon icon, optional boolean overrideDescendants);
+  }
+
+  public final class PointerIcon_androidKt {
+    method public static androidx.compose.ui.input.pointer.PointerIcon PointerIcon(android.view.PointerIcon pointerIcon);
+    method public static androidx.compose.ui.input.pointer.PointerIcon PointerIcon(int pointerIconType);
+  }
+
+  public final inline class PointerId {
+    ctor public PointerId();
+    method public long getValue();
+    property public final long value;
+  }
+
+  @androidx.compose.runtime.Immutable public final class PointerInputChange {
+    ctor public PointerInputChange(long id, long uptimeMillis, long position, boolean pressed, long previousUptimeMillis, long previousPosition, boolean previousPressed, androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type);
+    method public androidx.compose.ui.input.pointer.PointerInputChange copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type);
+    method public androidx.compose.ui.input.pointer.ConsumedData getConsumed();
+    method public long getId();
+    method public long getPosition();
+    method public boolean getPressed();
+    method public long getPreviousPosition();
+    method public boolean getPreviousPressed();
+    method public long getPreviousUptimeMillis();
+    method public int getType();
+    method public long getUptimeMillis();
+    property public final androidx.compose.ui.input.pointer.ConsumedData consumed;
+    property public final long id;
+    property public final long position;
+    property public final boolean pressed;
+    property public final long previousPosition;
+    property public final boolean previousPressed;
+    property public final long previousUptimeMillis;
+    property public final int type;
+    property public final long uptimeMillis;
+  }
+
+  public final class PointerInputEventProcessorKt {
+  }
+
+  public abstract class PointerInputFilter {
+    ctor public PointerInputFilter();
+    method public boolean getInterceptOutOfBoundsChildEvents();
+    method public final long getSize();
+    method public abstract void onCancel();
+    method public abstract void onPointerEvent(androidx.compose.ui.input.pointer.PointerEvent pointerEvent, androidx.compose.ui.input.pointer.PointerEventPass pass, long bounds);
+    property public boolean interceptOutOfBoundsChildEvents;
+    property public final long size;
+  }
+
+  public interface PointerInputModifier extends androidx.compose.ui.Modifier.Element {
+    method public androidx.compose.ui.input.pointer.PointerInputFilter getPointerInputFilter();
+    property public abstract androidx.compose.ui.input.pointer.PointerInputFilter pointerInputFilter;
+  }
+
+  public interface PointerInputScope extends androidx.compose.ui.unit.Density {
+    method public suspend <R> Object? awaitPointerEventScope(kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.AwaitPointerEventScope,? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R> p);
+    method public default long getExtendedTouchPadding();
+    method public default boolean getInterceptOutOfBoundsChildEvents();
+    method public long getSize();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    method public default void setInterceptOutOfBoundsChildEvents(boolean _);
+    property public default long extendedTouchPadding;
+    property public default boolean interceptOutOfBoundsChildEvents;
+    property public abstract long size;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+  }
+
+  public final class PointerInputTestUtilKt {
+  }
+
+  public final class PointerInteropFilter_androidKt {
+  }
+
+  public final class PointerInteropUtils_androidKt {
+  }
+
+  public final inline class PointerKeyboardModifiers {
+    ctor public PointerKeyboardModifiers();
+  }
+
+  public final inline class PointerType {
+    ctor public PointerType();
+  }
+
+  public static final class PointerType.Companion {
+    method public int getEraser();
+    method public int getMouse();
+    method public int getStylus();
+    method public int getTouch();
+    method public int getUnknown();
+    property public final int Eraser;
+    property public final int Mouse;
+    property public final int Stylus;
+    property public final int Touch;
+    property public final int Unknown;
+  }
+
+  public final class SuspendingPointerInputFilterKt {
+    method @Deprecated public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, Object? key1, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, Object? key1, Object? key2, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+    method public static androidx.compose.ui.Modifier pointerInput(androidx.compose.ui.Modifier, Object![]? keys, kotlin.jvm.functions.Function2<? super androidx.compose.ui.input.pointer.PointerInputScope,? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> block);
+  }
+
+}
+
+package androidx.compose.ui.input.pointer.util {
+
+  public final class VelocityTracker {
+    ctor public VelocityTracker();
+    method public void addPosition(long timeMillis, long position);
+    method public long calculateVelocity();
+    method public void resetTracking();
+  }
+
+  public final class VelocityTrackerKt {
+    method public static void addPointerInputChange(androidx.compose.ui.input.pointer.util.VelocityTracker, androidx.compose.ui.input.pointer.PointerInputChange event);
+  }
+
+}
+
+package androidx.compose.ui.layout {
+
+  @androidx.compose.runtime.Immutable public abstract sealed class AlignmentLine {
+    field public static final androidx.compose.ui.layout.AlignmentLine.Companion Companion;
+    field public static final int Unspecified = -2147483648; // 0x80000000
+  }
+
+  public static final class AlignmentLine.Companion {
+  }
+
+  public final class AlignmentLineKt {
+    method public static androidx.compose.ui.layout.HorizontalAlignmentLine getFirstBaseline();
+    method public static androidx.compose.ui.layout.HorizontalAlignmentLine getLastBaseline();
+    property public static final androidx.compose.ui.layout.HorizontalAlignmentLine FirstBaseline;
+    property public static final androidx.compose.ui.layout.HorizontalAlignmentLine LastBaseline;
+  }
+
+  @androidx.compose.runtime.Stable public interface ContentScale {
+    method public long computeScaleFactor(long srcSize, long dstSize);
+    field public static final androidx.compose.ui.layout.ContentScale.Companion Companion;
+  }
+
+  public static final class ContentScale.Companion {
+    method public androidx.compose.ui.layout.ContentScale getCrop();
+    method public androidx.compose.ui.layout.ContentScale getFillBounds();
+    method public androidx.compose.ui.layout.ContentScale getFillHeight();
+    method public androidx.compose.ui.layout.ContentScale getFillWidth();
+    method public androidx.compose.ui.layout.ContentScale getFit();
+    method public androidx.compose.ui.layout.ContentScale getInside();
+    method public androidx.compose.ui.layout.FixedScale getNone();
+    property public final androidx.compose.ui.layout.ContentScale Crop;
+    property public final androidx.compose.ui.layout.ContentScale FillBounds;
+    property public final androidx.compose.ui.layout.ContentScale FillHeight;
+    property public final androidx.compose.ui.layout.ContentScale FillWidth;
+    property public final androidx.compose.ui.layout.ContentScale Fit;
+    property public final androidx.compose.ui.layout.ContentScale Inside;
+    property public final androidx.compose.ui.layout.FixedScale None;
+  }
+
+  public final class ContentScaleKt {
+  }
+
+  @androidx.compose.runtime.Immutable public final class FixedScale implements androidx.compose.ui.layout.ContentScale {
+    ctor public FixedScale(float value);
+    method public float component1();
+    method public long computeScaleFactor(long srcSize, long dstSize);
+    method public androidx.compose.ui.layout.FixedScale copy(float value);
+    method public float getValue();
+    property public final float value;
+  }
+
+  public interface GraphicLayerInfo {
+    method public long getLayerId();
+    method public default long getOwnerViewId();
+    property public abstract long layerId;
+    property public default long ownerViewId;
+  }
+
+  public final class HorizontalAlignmentLine extends androidx.compose.ui.layout.AlignmentLine {
+    ctor public HorizontalAlignmentLine(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,java.lang.Integer> merger);
+  }
+
+  public interface IntrinsicMeasurable {
+    method public Object? getParentData();
+    method public int maxIntrinsicHeight(int width);
+    method public int maxIntrinsicWidth(int height);
+    method public int minIntrinsicHeight(int width);
+    method public int minIntrinsicWidth(int height);
+    property public abstract Object? parentData;
+  }
+
+  public final class IntrinsicMeasurableKt {
+  }
+
+  public interface IntrinsicMeasureScope extends androidx.compose.ui.unit.Density {
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
+  }
+
+  public interface LayoutCoordinates {
+    method public operator int get(androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public androidx.compose.ui.layout.LayoutCoordinates? getParentCoordinates();
+    method public androidx.compose.ui.layout.LayoutCoordinates? getParentLayoutCoordinates();
+    method public java.util.Set<androidx.compose.ui.layout.AlignmentLine> getProvidedAlignmentLines();
+    method public long getSize();
+    method public boolean isAttached();
+    method public androidx.compose.ui.geometry.Rect localBoundingBoxOf(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, optional boolean clipBounds);
+    method public long localPositionOf(androidx.compose.ui.layout.LayoutCoordinates sourceCoordinates, long relativeToSource);
+    method public long localToRoot(long relativeToLocal);
+    method public long localToWindow(long relativeToLocal);
+    method public long windowToLocal(long relativeToWindow);
+    property public abstract boolean isAttached;
+    property public abstract androidx.compose.ui.layout.LayoutCoordinates? parentCoordinates;
+    property public abstract androidx.compose.ui.layout.LayoutCoordinates? parentLayoutCoordinates;
+    property public abstract java.util.Set<androidx.compose.ui.layout.AlignmentLine> providedAlignmentLines;
+    property public abstract long size;
+  }
+
+  public final class LayoutCoordinatesKt {
+    method public static androidx.compose.ui.geometry.Rect boundsInParent(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static androidx.compose.ui.geometry.Rect boundsInRoot(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static androidx.compose.ui.geometry.Rect boundsInWindow(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static long positionInParent(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static long positionInRoot(androidx.compose.ui.layout.LayoutCoordinates);
+    method public static long positionInWindow(androidx.compose.ui.layout.LayoutCoordinates);
+  }
+
+  public final class LayoutIdKt {
+    method public static Object? getLayoutId(androidx.compose.ui.layout.Measurable);
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier layoutId(androidx.compose.ui.Modifier, Object layoutId);
+  }
+
+  public interface LayoutIdParentData {
+    method public Object getLayoutId();
+    property public abstract Object layoutId;
+  }
+
+  public interface LayoutInfo {
+    method public androidx.compose.ui.layout.LayoutCoordinates getCoordinates();
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public int getHeight();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public java.util.List<androidx.compose.ui.layout.ModifierInfo> getModifierInfo();
+    method public androidx.compose.ui.layout.LayoutInfo? getParentInfo();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    method public int getWidth();
+    method public boolean isAttached();
+    method public boolean isPlaced();
+    property public abstract androidx.compose.ui.layout.LayoutCoordinates coordinates;
+    property public abstract androidx.compose.ui.unit.Density density;
+    property public abstract int height;
+    property public abstract boolean isAttached;
+    property public abstract boolean isPlaced;
+    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public abstract androidx.compose.ui.layout.LayoutInfo? parentInfo;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+    property public abstract int width;
+  }
+
+  public final class LayoutKt {
+    method @androidx.compose.runtime.Composable public static inline void Layout(kotlin.jvm.functions.Function0<kotlin.Unit> content, optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
+    method @androidx.compose.runtime.Composable public static inline void Layout(optional androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
+    method @Deprecated @androidx.compose.runtime.Composable public static void MultiMeasureLayout(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content, androidx.compose.ui.layout.MeasurePolicy measurePolicy);
+    method @kotlin.PublishedApi internal static kotlin.jvm.functions.Function1<androidx.compose.runtime.SkippableUpdater<androidx.compose.ui.node.ComposeUiNode>,kotlin.Unit> materializerOf(androidx.compose.ui.Modifier modifier);
+  }
+
+  public interface LayoutModifier extends androidx.compose.ui.Modifier.Element {
+    method public default int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int width);
+    method public default int maxIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int height);
+    method public androidx.compose.ui.layout.MeasureResult measure(androidx.compose.ui.layout.MeasureScope, androidx.compose.ui.layout.Measurable measurable, long constraints);
+    method public default int minIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int width);
+    method public default int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, androidx.compose.ui.layout.IntrinsicMeasurable measurable, int height);
+  }
+
+  public final class LayoutModifierKt {
+    method public static androidx.compose.ui.Modifier layout(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function3<? super androidx.compose.ui.layout.MeasureScope,? super androidx.compose.ui.layout.Measurable,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measure);
+  }
+
+  public interface Measurable extends androidx.compose.ui.layout.IntrinsicMeasurable {
+    method public androidx.compose.ui.layout.Placeable measure(long constraints);
+  }
+
+  @androidx.compose.runtime.Stable public fun interface MeasurePolicy {
+    method public default int maxIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int width);
+    method public default int maxIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int height);
+    method public androidx.compose.ui.layout.MeasureResult measure(androidx.compose.ui.layout.MeasureScope, java.util.List<? extends androidx.compose.ui.layout.Measurable> measurables, long constraints);
+    method public default int minIntrinsicHeight(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int width);
+    method public default int minIntrinsicWidth(androidx.compose.ui.layout.IntrinsicMeasureScope, java.util.List<? extends androidx.compose.ui.layout.IntrinsicMeasurable> measurables, int height);
+  }
+
+  public interface MeasureResult {
+    method public java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> getAlignmentLines();
+    method public int getHeight();
+    method public int getWidth();
+    method public void placeChildren();
+    property public abstract java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> alignmentLines;
+    property public abstract int height;
+    property public abstract int width;
+  }
+
+  public interface MeasureScope extends androidx.compose.ui.layout.IntrinsicMeasureScope {
+    method public default androidx.compose.ui.layout.MeasureResult layout(int width, int height, optional java.util.Map<androidx.compose.ui.layout.AlignmentLine,java.lang.Integer> alignmentLines, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.Placeable.PlacementScope,kotlin.Unit> placementBlock);
+  }
+
+  public final class MeasureScopeKt {
+  }
+
+  public interface Measured {
+    method public operator int get(androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public int getMeasuredHeight();
+    method public int getMeasuredWidth();
+    property public abstract int measuredHeight;
+    property public abstract int measuredWidth;
+  }
+
+  public final class ModifierInfo {
+    ctor public ModifierInfo(androidx.compose.ui.Modifier modifier, androidx.compose.ui.layout.LayoutCoordinates coordinates, optional Object? extra);
+    method public androidx.compose.ui.layout.LayoutCoordinates getCoordinates();
+    method public Object? getExtra();
+    method public androidx.compose.ui.Modifier getModifier();
+    property public final androidx.compose.ui.layout.LayoutCoordinates coordinates;
+    property public final Object? extra;
+    property public final androidx.compose.ui.Modifier modifier;
+  }
+
+  public interface OnGloballyPositionedModifier extends androidx.compose.ui.Modifier.Element {
+    method public void onGloballyPositioned(androidx.compose.ui.layout.LayoutCoordinates coordinates);
+  }
+
+  public final class OnGloballyPositionedModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier onGloballyPositioned(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.layout.LayoutCoordinates,kotlin.Unit> onGloballyPositioned);
+  }
+
+  public interface OnRemeasuredModifier extends androidx.compose.ui.Modifier.Element {
+    method public void onRemeasured(long size);
+  }
+
+  public final class OnRemeasuredModifierKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier onSizeChanged(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.unit.IntSize,kotlin.Unit> onSizeChanged);
+  }
+
+  public interface ParentDataModifier extends androidx.compose.ui.Modifier.Element {
+    method public Object? modifyParentData(androidx.compose.ui.unit.Density, Object? parentData);
+  }
+
+  public abstract class Placeable implements androidx.compose.ui.layout.Measured {
+    ctor public Placeable();
+    method protected final long getApparentToRealOffset();
+    method public final int getHeight();
+    method public int getMeasuredHeight();
+    method protected final long getMeasuredSize();
+    method public int getMeasuredWidth();
+    method protected final long getMeasurementConstraints();
+    method public final int getWidth();
+    method protected abstract void placeAt(long position, float zIndex, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit>? layerBlock);
+    method protected final void setMeasuredSize(long value);
+    method protected final void setMeasurementConstraints(long value);
+    property protected final long apparentToRealOffset;
+    property public final int height;
+    property public int measuredHeight;
+    property protected final long measuredSize;
+    property public int measuredWidth;
+    property protected final long measurementConstraints;
+    property public final int width;
+  }
+
+  public abstract static class Placeable.PlacementScope {
+    ctor public Placeable.PlacementScope();
+    method protected abstract androidx.compose.ui.unit.LayoutDirection getParentLayoutDirection();
+    method protected abstract int getParentWidth();
+    method public final void place(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex);
+    method public final void place(androidx.compose.ui.layout.Placeable, long position, optional float zIndex);
+    method public final void placeRelative(androidx.compose.ui.layout.Placeable, long position, optional float zIndex);
+    method public final void placeRelative(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex);
+    method public final void placeRelativeWithLayer(androidx.compose.ui.layout.Placeable, long position, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
+    method public final void placeRelativeWithLayer(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
+    method public final void placeWithLayer(androidx.compose.ui.layout.Placeable, int x, int y, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
+    method public final void placeWithLayer(androidx.compose.ui.layout.Placeable, long position, optional float zIndex, optional kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> layerBlock);
+    property protected abstract androidx.compose.ui.unit.LayoutDirection parentLayoutDirection;
+    property protected abstract int parentWidth;
+  }
+
+  public final class PlaceableKt {
+  }
+
+  public final class RelocationModifierKt {
+  }
+
+  public final class RelocationRequesterModifierKt {
+  }
+
+  public interface Remeasurement {
+    method public void forceRemeasure();
+  }
+
+  public interface RemeasurementModifier extends androidx.compose.ui.Modifier.Element {
+    method public void onRemeasurementAvailable(androidx.compose.ui.layout.Remeasurement remeasurement);
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class ScaleFactor {
+    ctor public ScaleFactor();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
+  }
+
+  public static final class ScaleFactor.Companion {
+    method public long getUnspecified();
+    property public final long Unspecified;
+  }
+
+  public final class ScaleFactorKt {
+    method @androidx.compose.runtime.Stable public static long ScaleFactor(float scaleX, float scaleY);
+    method @androidx.compose.runtime.Stable public static operator long div(long, long scaleFactor);
+    method public static inline boolean isSpecified(long);
+    method public static inline boolean isUnspecified(long);
+    method @androidx.compose.runtime.Stable public static long lerp(long start, long stop, float fraction);
+    method public static inline long takeOrElse(long, kotlin.jvm.functions.Function0<androidx.compose.ui.layout.ScaleFactor> block);
+    method @androidx.compose.runtime.Stable public static operator long times(long, long scaleFactor);
+    method @androidx.compose.runtime.Stable public static operator long times(long, long size);
+  }
+
+  public final class SubcomposeLayoutKt {
+    method @androidx.compose.runtime.Composable public static void SubcomposeLayout(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.layout.SubcomposeMeasureScope,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measurePolicy);
+    method @androidx.compose.runtime.Composable public static void SubcomposeLayout(androidx.compose.ui.layout.SubcomposeLayoutState state, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function2<? super androidx.compose.ui.layout.SubcomposeMeasureScope,? super androidx.compose.ui.unit.Constraints,? extends androidx.compose.ui.layout.MeasureResult> measurePolicy);
+  }
+
+  public final class SubcomposeLayoutState {
+    ctor public SubcomposeLayoutState(int maxSlotsToRetainForReuse);
+    ctor public SubcomposeLayoutState();
+    method public androidx.compose.ui.layout.SubcomposeLayoutState.PrecomposedSlotHandle precompose(Object? slotId, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public static interface SubcomposeLayoutState.PrecomposedSlotHandle {
+    method public void dispose();
+  }
+
+  public interface SubcomposeMeasureScope extends androidx.compose.ui.layout.MeasureScope {
+    method public java.util.List<androidx.compose.ui.layout.Measurable> subcompose(Object? slotId, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class TestModifierUpdaterKt {
+  }
+
+  public final class VerticalAlignmentLine extends androidx.compose.ui.layout.AlignmentLine {
+    ctor public VerticalAlignmentLine(kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,java.lang.Integer> merger);
+  }
+
+}
+
+package androidx.compose.ui.modifier {
+
+  @androidx.compose.runtime.Stable public abstract sealed class ModifierLocal<T> {
+  }
+
+  @androidx.compose.runtime.Stable public interface ModifierLocalConsumer extends androidx.compose.ui.Modifier.Element {
+    method public void onModifierLocalsUpdated(androidx.compose.ui.modifier.ModifierLocalReadScope scope);
+  }
+
+  public final class ModifierLocalConsumerKt {
+  }
+
+  public final class ModifierLocalKt {
+    method public static <T> androidx.compose.ui.modifier.ProvidableModifierLocal<T> modifierLocalOf(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+  }
+
+  @androidx.compose.runtime.Stable public interface ModifierLocalProvider<T> extends androidx.compose.ui.Modifier.Element {
+    method public androidx.compose.ui.modifier.ProvidableModifierLocal<T> getKey();
+    method public T! getValue();
+    property public abstract androidx.compose.ui.modifier.ProvidableModifierLocal<T> key;
+    property public abstract T! value;
+  }
+
+  public final class ModifierLocalProviderKt {
+  }
+
+  public interface ModifierLocalReadScope {
+    method public <T> T! getCurrent(androidx.compose.ui.modifier.ModifierLocal<T>);
+  }
+
+  @androidx.compose.runtime.Stable public final class ProvidableModifierLocal<T> extends androidx.compose.ui.modifier.ModifierLocal<T> {
+    ctor public ProvidableModifierLocal(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+  }
+
+}
+
+package androidx.compose.ui.node {
+
+  @kotlin.PublishedApi internal interface ComposeUiNode {
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
+    method public androidx.compose.ui.layout.MeasurePolicy getMeasurePolicy();
+    method public androidx.compose.ui.Modifier getModifier();
+    method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
+    method public void setDensity(androidx.compose.ui.unit.Density density);
+    method public void setLayoutDirection(androidx.compose.ui.unit.LayoutDirection layoutDirection);
+    method public void setMeasurePolicy(androidx.compose.ui.layout.MeasurePolicy measurePolicy);
+    method public void setModifier(androidx.compose.ui.Modifier modifier);
+    method public void setViewConfiguration(androidx.compose.ui.platform.ViewConfiguration viewConfiguration);
+    property public abstract androidx.compose.ui.unit.Density density;
+    property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
+    property public abstract androidx.compose.ui.layout.MeasurePolicy measurePolicy;
+    property public abstract androidx.compose.ui.Modifier modifier;
+    property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
+    field public static final androidx.compose.ui.node.ComposeUiNode.Companion Companion;
+  }
+
+  public static final class ComposeUiNode.Companion {
+    method public kotlin.jvm.functions.Function0<androidx.compose.ui.node.ComposeUiNode> getConstructor();
+    method public kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.unit.Density,kotlin.Unit> getSetDensity();
+    method public kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.unit.LayoutDirection,kotlin.Unit> getSetLayoutDirection();
+    method public kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.layout.MeasurePolicy,kotlin.Unit> getSetMeasurePolicy();
+    method public kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.Modifier,kotlin.Unit> getSetModifier();
+    method public kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.platform.ViewConfiguration,kotlin.Unit> getSetViewConfiguration();
+    property public final kotlin.jvm.functions.Function0<androidx.compose.ui.node.ComposeUiNode> Constructor;
+    property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.unit.Density,kotlin.Unit> SetDensity;
+    property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.unit.LayoutDirection,kotlin.Unit> SetLayoutDirection;
+    property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.layout.MeasurePolicy,kotlin.Unit> SetMeasurePolicy;
+    property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.Modifier,kotlin.Unit> SetModifier;
+    property public final kotlin.jvm.functions.Function2<androidx.compose.ui.node.ComposeUiNode,androidx.compose.ui.platform.ViewConfiguration,kotlin.Unit> SetViewConfiguration;
+  }
+
+  public final class LayoutNodeKt {
+  }
+
+  public final class Ref<T> {
+    ctor public Ref();
+    method public T? getValue();
+    method public void setValue(T? value);
+    property public final T? value;
+  }
+
+  public interface RootForTest {
+    method public androidx.compose.ui.unit.Density getDensity();
+    method public androidx.compose.ui.semantics.SemanticsOwner getSemanticsOwner();
+    method public androidx.compose.ui.text.input.TextInputService getTextInputService();
+    method public boolean sendKeyEvent(android.view.KeyEvent keyEvent);
+    property public abstract androidx.compose.ui.unit.Density density;
+    property public abstract androidx.compose.ui.semantics.SemanticsOwner semanticsOwner;
+    property public abstract androidx.compose.ui.text.input.TextInputService textInputService;
+  }
+
+  public final class ViewInterop_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.platform {
+
+  public abstract class AbstractComposeView extends android.view.ViewGroup {
+    ctor public AbstractComposeView(android.content.Context context, optional android.util.AttributeSet? attrs, optional int defStyleAttr);
+    ctor public AbstractComposeView(android.content.Context context, optional android.util.AttributeSet? attrs);
+    ctor public AbstractComposeView(android.content.Context context);
+    method @androidx.compose.runtime.Composable public abstract void Content();
+    method public final void createComposition();
+    method public final void disposeComposition();
+    method public final boolean getHasComposition();
+    method protected boolean getShouldCreateCompositionOnAttachedToWindow();
+    method public final boolean getShowLayoutBounds();
+    method protected final void onLayout(boolean changed, int left, int top, int right, int bottom);
+    method protected final void onMeasure(int widthMeasureSpec, int heightMeasureSpec);
+    method public final void setParentCompositionContext(androidx.compose.runtime.CompositionContext? parent);
+    method public final void setShowLayoutBounds(boolean value);
+    method public final void setViewCompositionStrategy(androidx.compose.ui.platform.ViewCompositionStrategy strategy);
+    property public final boolean hasComposition;
+    property protected boolean shouldCreateCompositionOnAttachedToWindow;
+    property public final boolean showLayoutBounds;
+  }
+
+  public interface AccessibilityManager {
+    method public long calculateRecommendedTimeoutMillis(long originalTimeoutMillis, optional boolean containsIcons, optional boolean containsText, optional boolean containsControls);
+  }
+
+  public final class AndroidClipboardManager_androidKt {
+  }
+
+  public final class AndroidComposeViewAccessibilityDelegateCompat_androidKt {
+  }
+
+  public final class AndroidComposeView_androidKt {
+  }
+
+  public final class AndroidCompositionLocals_androidKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> getLocalConfiguration();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> getLocalContext();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> getLocalLifecycleOwner();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> getLocalSavedStateRegistryOwner();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> getLocalView();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> LocalConfiguration;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> LocalContext;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> LocalLifecycleOwner;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> LocalSavedStateRegistryOwner;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> LocalView;
+  }
+
+  public final class AndroidUiDispatcher extends kotlinx.coroutines.CoroutineDispatcher {
+    method public void dispatch(kotlin.coroutines.CoroutineContext context, Runnable block);
+    method public android.view.Choreographer getChoreographer();
+    method public androidx.compose.runtime.MonotonicFrameClock getFrameClock();
+    property public final android.view.Choreographer choreographer;
+    property public final androidx.compose.runtime.MonotonicFrameClock frameClock;
+    field public static final androidx.compose.ui.platform.AndroidUiDispatcher.Companion Companion;
+  }
+
+  public static final class AndroidUiDispatcher.Companion {
+    method public kotlin.coroutines.CoroutineContext getCurrentThread();
+    method public kotlin.coroutines.CoroutineContext getMain();
+    property public final kotlin.coroutines.CoroutineContext CurrentThread;
+    property public final kotlin.coroutines.CoroutineContext Main;
+  }
+
+  public final class AndroidUiDispatcher_androidKt {
+  }
+
+  public final class AndroidUiFrameClock implements androidx.compose.runtime.MonotonicFrameClock {
+    ctor public AndroidUiFrameClock(android.view.Choreographer choreographer);
+    method public android.view.Choreographer getChoreographer();
+    method public suspend <R> Object? withFrameNanos(kotlin.jvm.functions.Function1<? super java.lang.Long,? extends R> onFrame, kotlin.coroutines.Continuation<? super R> p);
+    property public final android.view.Choreographer choreographer;
+  }
+
+  public final class AndroidUriHandler implements androidx.compose.ui.platform.UriHandler {
+    ctor public AndroidUriHandler(android.content.Context context);
+    method public void openUri(String uri);
+  }
+
+  public final class AndroidViewConfiguration implements androidx.compose.ui.platform.ViewConfiguration {
+    ctor public AndroidViewConfiguration(android.view.ViewConfiguration viewConfiguration);
+    method public long getDoubleTapMinTimeMillis();
+    method public long getDoubleTapTimeoutMillis();
+    method public long getLongPressTimeoutMillis();
+    method public float getTouchSlop();
+    property public long doubleTapMinTimeMillis;
+    property public long doubleTapTimeoutMillis;
+    property public long longPressTimeoutMillis;
+    property public float touchSlop;
+  }
+
+  public interface ClipboardManager {
+    method public androidx.compose.ui.text.AnnotatedString? getText();
+    method public void setText(androidx.compose.ui.text.AnnotatedString annotatedString);
+  }
+
+  public final class ComposeView extends androidx.compose.ui.platform.AbstractComposeView {
+    ctor public ComposeView(android.content.Context context, optional android.util.AttributeSet? attrs, optional int defStyleAttr);
+    ctor public ComposeView(android.content.Context context, optional android.util.AttributeSet? attrs);
+    ctor public ComposeView(android.content.Context context);
+    method @androidx.compose.runtime.Composable public void Content();
+    method public void setContent(kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    property protected boolean shouldCreateCompositionOnAttachedToWindow;
+  }
+
+  public final class CompositionLocalsKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.AccessibilityManager> getLocalAccessibilityManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager> getLocalClipboardManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> getLocalDensity();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> getLocalFocusManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback> getLocalHapticFeedback();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.input.InputModeManager> getLocalInputModeManager();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection> getLocalLayoutDirection();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService> getLocalTextInputService();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar> getLocalTextToolbar();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler> getLocalUriHandler();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration> getLocalViewConfiguration();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> getLocalWindowInfo();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.AccessibilityManager> LocalAccessibilityManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager> LocalClipboardManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> LocalDensity;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> LocalFocusManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback> LocalHapticFeedback;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.input.InputModeManager> LocalInputModeManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection> LocalLayoutDirection;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService> LocalTextInputService;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar> LocalTextToolbar;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler> LocalUriHandler;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration> LocalViewConfiguration;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> LocalWindowInfo;
+  }
+
+  public final class DebugUtilsKt {
+  }
+
+  public final class DisposableSaveableStateRegistry_androidKt {
+  }
+
+  public interface InfiniteAnimationPolicy extends kotlin.coroutines.CoroutineContext.Element {
+    method public default kotlin.coroutines.CoroutineContext.Key<?> getKey();
+    method public suspend <R> Object? onInfiniteOperation(kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R> p);
+    property public default kotlin.coroutines.CoroutineContext.Key<?> key;
+    field public static final androidx.compose.ui.platform.InfiniteAnimationPolicy.Key Key;
+  }
+
+  public static final class InfiniteAnimationPolicy.Key implements kotlin.coroutines.CoroutineContext.Key<androidx.compose.ui.platform.InfiniteAnimationPolicy> {
+  }
+
+  public final class InspectableModifier extends androidx.compose.ui.platform.InspectorValueInfo implements androidx.compose.ui.Modifier.Element {
+    ctor public InspectableModifier(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo);
+    method public androidx.compose.ui.platform.InspectableModifier.End getEnd();
+    property public final androidx.compose.ui.platform.InspectableModifier.End end;
+  }
+
+  public final class InspectableModifier.End implements androidx.compose.ui.Modifier.Element {
+    ctor public InspectableModifier.End();
+  }
+
+  public interface InspectableValue {
+    method public default kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> getInspectableElements();
+    method public default String? getNameFallback();
+    method public default Object? getValueOverride();
+    property public default kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> inspectableElements;
+    property public default String? nameFallback;
+    property public default Object? valueOverride;
+  }
+
+  public final class InspectableValueKt {
+    method public static inline kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> debugInspectorInfo(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> definitions);
+    method public static kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> getNoInspectorInfo();
+    method public static inline androidx.compose.ui.Modifier inspectable(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, kotlin.jvm.functions.Function1<? super androidx.compose.ui.Modifier,? extends androidx.compose.ui.Modifier> factory);
+    method @kotlin.PublishedApi internal static androidx.compose.ui.Modifier inspectableWrapper(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, androidx.compose.ui.Modifier wrapped);
+    method public static boolean isDebugInspectorInfoEnabled();
+    method public static void setDebugInspectorInfoEnabled(boolean isDebugInspectorInfoEnabled);
+    property public static final kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> NoInspectorInfo;
+    property public static final boolean isDebugInspectorInfoEnabled;
+  }
+
+  public final class InspectionModeKt {
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalInspectionMode();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> LocalInspectionMode;
+  }
+
+  public final class InspectorInfo {
+    ctor public InspectorInfo();
+    method public String? getName();
+    method public androidx.compose.ui.platform.ValueElementSequence getProperties();
+    method public Object? getValue();
+    method public void setName(String? name);
+    method public void setValue(Object? value);
+    property public final String? name;
+    property public final androidx.compose.ui.platform.ValueElementSequence properties;
+    property public final Object? value;
+  }
+
+  public abstract class InspectorValueInfo implements androidx.compose.ui.platform.InspectableValue {
+    ctor public InspectorValueInfo(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> info);
+    property public kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> inspectableElements;
+    property public String? nameFallback;
+    property public Object? valueOverride;
+  }
+
+  public final class InvertMatrixKt {
+  }
+
+  public final class JvmActuals_jvmKt {
+  }
+
+  public final class ShapeContainingUtilKt {
+  }
+
+  public final class TestTagKt {
+    method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier testTag(androidx.compose.ui.Modifier, String tag);
+  }
+
+  public interface TextToolbar {
+    method public androidx.compose.ui.platform.TextToolbarStatus getStatus();
+    method public void hide();
+    method public void showMenu(androidx.compose.ui.geometry.Rect rect, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onCopyRequested, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onPasteRequested, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onCutRequested, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onSelectAllRequested);
+    property public abstract androidx.compose.ui.platform.TextToolbarStatus status;
+  }
+
+  public final class TextToolbarKt {
+  }
+
+  public enum TextToolbarStatus {
+    enum_constant public static final androidx.compose.ui.platform.TextToolbarStatus Hidden;
+    enum_constant public static final androidx.compose.ui.platform.TextToolbarStatus Shown;
+  }
+
+  public interface UriHandler {
+    method public void openUri(String uri);
+  }
+
+  public final class ValueElement {
+    ctor public ValueElement(String name, Object? value);
+    method public String component1();
+    method public Object? component2();
+    method public androidx.compose.ui.platform.ValueElement copy(String name, Object? value);
+    method public String getName();
+    method public Object? getValue();
+    property public final String name;
+    property public final Object? value;
+  }
+
+  public final class ValueElementSequence implements kotlin.sequences.Sequence<androidx.compose.ui.platform.ValueElement> {
+    ctor public ValueElementSequence();
+    method public java.util.Iterator<androidx.compose.ui.platform.ValueElement> iterator();
+    method public operator void set(String name, Object? value);
+  }
+
+  public interface ViewCompositionStrategy {
+    method public kotlin.jvm.functions.Function0<kotlin.Unit> installFor(androidx.compose.ui.platform.AbstractComposeView view);
+    field public static final androidx.compose.ui.platform.ViewCompositionStrategy.Companion Companion;
+  }
+
+  public static final class ViewCompositionStrategy.Companion {
+  }
+
+  public static final class ViewCompositionStrategy.DisposeOnDetachedFromWindow implements androidx.compose.ui.platform.ViewCompositionStrategy {
+    method public kotlin.jvm.functions.Function0<kotlin.Unit> installFor(androidx.compose.ui.platform.AbstractComposeView view);
+    field public static final androidx.compose.ui.platform.ViewCompositionStrategy.DisposeOnDetachedFromWindow INSTANCE;
+  }
+
+  public static final class ViewCompositionStrategy.DisposeOnLifecycleDestroyed implements androidx.compose.ui.platform.ViewCompositionStrategy {
+    ctor public ViewCompositionStrategy.DisposeOnLifecycleDestroyed(androidx.lifecycle.Lifecycle lifecycle);
+    ctor public ViewCompositionStrategy.DisposeOnLifecycleDestroyed(androidx.lifecycle.LifecycleOwner lifecycleOwner);
+    method public kotlin.jvm.functions.Function0<kotlin.Unit> installFor(androidx.compose.ui.platform.AbstractComposeView view);
+  }
+
+  public static final class ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed implements androidx.compose.ui.platform.ViewCompositionStrategy {
+    method public kotlin.jvm.functions.Function0<kotlin.Unit> installFor(androidx.compose.ui.platform.AbstractComposeView view);
+    field public static final androidx.compose.ui.platform.ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed INSTANCE;
+  }
+
+  public final class ViewCompositionStrategy_androidKt {
+  }
+
+  public interface ViewConfiguration {
+    method public long getDoubleTapMinTimeMillis();
+    method public long getDoubleTapTimeoutMillis();
+    method public long getLongPressTimeoutMillis();
+    method public default long getMinimumTouchTargetSize();
+    method public float getTouchSlop();
+    property public abstract long doubleTapMinTimeMillis;
+    property public abstract long doubleTapTimeoutMillis;
+    property public abstract long longPressTimeoutMillis;
+    property public default long minimumTouchTargetSize;
+    property public abstract float touchSlop;
+  }
+
+  public interface ViewRootForInspector {
+    method public default androidx.compose.ui.platform.AbstractComposeView? getSubCompositionView();
+    method public default android.view.View? getViewRoot();
+    property public default androidx.compose.ui.platform.AbstractComposeView? subCompositionView;
+    property public default android.view.View? viewRoot;
+  }
+
+  @VisibleForTesting public interface ViewRootForTest extends androidx.compose.ui.node.RootForTest {
+    method public boolean getHasPendingMeasureOrLayout();
+    method public android.view.View getView();
+    method public void invalidateDescendants();
+    method public boolean isLifecycleInResumedState();
+    property public abstract boolean hasPendingMeasureOrLayout;
+    property public abstract boolean isLifecycleInResumedState;
+    property public abstract android.view.View view;
+    field public static final androidx.compose.ui.platform.ViewRootForTest.Companion Companion;
+  }
+
+  public static final class ViewRootForTest.Companion {
+    method public kotlin.jvm.functions.Function1<androidx.compose.ui.platform.ViewRootForTest,kotlin.Unit>? getOnViewCreatedCallback();
+    method public void setOnViewCreatedCallback(kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.ViewRootForTest,kotlin.Unit>? onViewCreatedCallback);
+    property public final kotlin.jvm.functions.Function1<androidx.compose.ui.platform.ViewRootForTest,kotlin.Unit>? onViewCreatedCallback;
+  }
+
+  @androidx.compose.runtime.Stable public interface WindowInfo {
+    method public boolean isWindowFocused();
+    property public abstract boolean isWindowFocused;
+  }
+
+  public final class WindowInfoKt {
+  }
+
+  public final class WindowRecomposer_androidKt {
+    method public static androidx.compose.runtime.CompositionContext? findViewTreeCompositionContext(android.view.View);
+    method public static androidx.compose.runtime.CompositionContext? getCompositionContext(android.view.View);
+    method public static void setCompositionContext(android.view.View, androidx.compose.runtime.CompositionContext? value);
+  }
+
+  public final class Wrapper_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.platform.accessibility {
+
+  public final class CollectionInfoKt {
+  }
+
+}
+
+package androidx.compose.ui.platform.actionmodecallback {
+
+  public final class TextActionModeCallback_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.res {
+
+  public final class ColorResources_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static long colorResource(@ColorRes int id);
+  }
+
+  public final class FontResources_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static androidx.compose.ui.text.font.Typeface fontResource(androidx.compose.ui.text.font.FontFamily fontFamily);
+  }
+
+  public final class ImageResources_androidKt {
+    method public static androidx.compose.ui.graphics.ImageBitmap imageResource(androidx.compose.ui.graphics.ImageBitmap.Companion, android.content.res.Resources res, @DrawableRes int id);
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.ImageBitmap imageResource(androidx.compose.ui.graphics.ImageBitmap.Companion, @DrawableRes int id);
+  }
+
+  public final class PainterResources_androidKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.painter.Painter painterResource(@DrawableRes int id);
+  }
+
+  public final class PrimitiveResources_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static boolean booleanResource(@BoolRes int id);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static float dimensionResource(@DimenRes int id);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static int[] integerArrayResource(@ArrayRes int id);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static int integerResource(@IntegerRes int id);
+  }
+
+  public final class StringResources_androidKt {
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String![] stringArrayResource(@ArrayRes int id);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String stringResource(@StringRes int id);
+    method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static String stringResource(@StringRes int id, java.lang.Object... formatArgs);
+  }
+
+  public final class VectorResources_androidKt {
+    method @androidx.compose.runtime.Composable public static androidx.compose.ui.graphics.vector.ImageVector vectorResource(androidx.compose.ui.graphics.vector.ImageVector.Companion, @DrawableRes int id);
+    method @kotlin.jvm.Throws(exceptionClasses=XmlPullParserException::class) public static androidx.compose.ui.graphics.vector.ImageVector vectorResource(androidx.compose.ui.graphics.vector.ImageVector.Companion, optional android.content.res.Resources.Theme? theme, android.content.res.Resources res, int resId) throws org.xmlpull.v1.XmlPullParserException;
+  }
+
+}
+
+package androidx.compose.ui.semantics {
+
+  public final class AccessibilityAction<T extends kotlin.Function<? extends java.lang.Boolean>> {
+    ctor public AccessibilityAction(String? label, T? action);
+    method public T? getAction();
+    method public String? getLabel();
+    property public final T? action;
+    property public final String? label;
+  }
+
+  public final class CollectionInfo {
+    ctor public CollectionInfo(int rowCount, int columnCount);
+    method public int getColumnCount();
+    method public int getRowCount();
+    property public final int columnCount;
+    property public final int rowCount;
+  }
+
+  public final class CollectionItemInfo {
+    ctor public CollectionItemInfo(int rowIndex, int rowSpan, int columnIndex, int columnSpan);
+    method public int getColumnIndex();
+    method public int getColumnSpan();
+    method public int getRowIndex();
+    method public int getRowSpan();
+    property public final int columnIndex;
+    property public final int columnSpan;
+    property public final int rowIndex;
+    property public final int rowSpan;
+  }
+
+  public final class CustomAccessibilityAction {
+    ctor public CustomAccessibilityAction(String label, kotlin.jvm.functions.Function0<java.lang.Boolean> action);
+    method public kotlin.jvm.functions.Function0<java.lang.Boolean> getAction();
+    method public String getLabel();
+    property public final kotlin.jvm.functions.Function0<java.lang.Boolean> action;
+    property public final String label;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class LiveRegionMode {
+    ctor public LiveRegionMode();
+  }
+
+  public static final class LiveRegionMode.Companion {
+    method public int getAssertive();
+    method public int getPolite();
+    property public final int Assertive;
+    property public final int Polite;
+  }
+
+  public final class ProgressBarRangeInfo {
+    ctor public ProgressBarRangeInfo(float current, kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> range, optional int steps);
+    method public float getCurrent();
+    method public kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> getRange();
+    method public int getSteps();
+    property public final float current;
+    property public final kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> range;
+    property public final int steps;
+    field public static final androidx.compose.ui.semantics.ProgressBarRangeInfo.Companion Companion;
+  }
+
+  public static final class ProgressBarRangeInfo.Companion {
+    method public androidx.compose.ui.semantics.ProgressBarRangeInfo getIndeterminate();
+    property public final androidx.compose.ui.semantics.ProgressBarRangeInfo Indeterminate;
+  }
+
+  @androidx.compose.runtime.Immutable public final inline class Role {
+    ctor public Role();
+  }
+
+  public static final class Role.Companion {
+    method public int getButton();
+    method public int getCheckbox();
+    method public int getImage();
+    method public int getRadioButton();
+    method public int getSwitch();
+    method public int getTab();
+    property public final int Button;
+    property public final int Checkbox;
+    property public final int Image;
+    property public final int RadioButton;
+    property public final int Switch;
+    property public final int Tab;
+  }
+
+  public final class ScrollAxisRange {
+    ctor public ScrollAxisRange(kotlin.jvm.functions.Function0<java.lang.Float> value, kotlin.jvm.functions.Function0<java.lang.Float> maxValue, optional boolean reverseScrolling);
+    method public kotlin.jvm.functions.Function0<java.lang.Float> getMaxValue();
+    method public boolean getReverseScrolling();
+    method public kotlin.jvm.functions.Function0<java.lang.Float> getValue();
+    property public final kotlin.jvm.functions.Function0<java.lang.Float> maxValue;
+    property public final boolean reverseScrolling;
+    property public final kotlin.jvm.functions.Function0<java.lang.Float> value;
+  }
+
+  public final class SemanticsActions {
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCollapse();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCopyText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>> getCustomActions();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getCutText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getDismiss();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getExpand();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>>> getGetTextLayoutResult();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnClick();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getOnLongClick();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> getPasteText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> getScrollBy();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Integer,java.lang.Boolean>>> getScrollToIndex();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Boolean>>> getSetProgress();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function3<java.lang.Integer,java.lang.Integer,java.lang.Boolean,java.lang.Boolean>>> getSetSelection();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>>> getSetText();
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> Collapse;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> CopyText;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction>> CustomActions;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> CutText;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> Dismiss;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> Expand;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>>> GetTextLayoutResult;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> OnClick;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> OnLongClick;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> PasteText;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Float,java.lang.Boolean>>> ScrollBy;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Integer,java.lang.Boolean>>> ScrollToIndex;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<java.lang.Float,java.lang.Boolean>>> SetProgress;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function3<java.lang.Integer,java.lang.Integer,java.lang.Boolean,java.lang.Boolean>>> SetSelection;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function1<androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>>> SetText;
+    field public static final androidx.compose.ui.semantics.SemanticsActions INSTANCE;
+  }
+
+  public final class SemanticsConfiguration implements java.lang.Iterable<java.util.Map.Entry<? extends androidx.compose.ui.semantics.SemanticsPropertyKey<?>,?>> kotlin.jvm.internal.markers.KMappedMarker androidx.compose.ui.semantics.SemanticsPropertyReceiver {
+    ctor public SemanticsConfiguration();
+    method public operator <T> boolean contains(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key);
+    method public androidx.compose.ui.semantics.SemanticsConfiguration copy();
+    method public operator <T> T! get(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key);
+    method public <T> T! getOrElse(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method public <T> T? getOrElseNullable(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+    method public boolean isClearingSemantics();
+    method public boolean isMergingSemanticsOfDescendants();
+    method public java.util.Iterator<java.util.Map.Entry<androidx.compose.ui.semantics.SemanticsPropertyKey<?>,java.lang.Object>> iterator();
+    method public <T> void set(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, T? value);
+    method public void setClearingSemantics(boolean isClearingSemantics);
+    method public void setMergingSemanticsOfDescendants(boolean isMergingSemanticsOfDescendants);
+    property public final boolean isClearingSemantics;
+    property public final boolean isMergingSemanticsOfDescendants;
+  }
+
+  public final class SemanticsConfigurationKt {
+    method public static <T> T? getOrNull(androidx.compose.ui.semantics.SemanticsConfiguration, androidx.compose.ui.semantics.SemanticsPropertyKey<T> key);
+  }
+
+  public interface SemanticsModifier extends androidx.compose.ui.Modifier.Element {
+    method public int getId();
+    method public androidx.compose.ui.semantics.SemanticsConfiguration getSemanticsConfiguration();
+    property public abstract int id;
+    property public abstract androidx.compose.ui.semantics.SemanticsConfiguration semanticsConfiguration;
+  }
+
+  public final class SemanticsModifierKt {
+    method public static androidx.compose.ui.Modifier clearAndSetSemantics(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.semantics.SemanticsPropertyReceiver,kotlin.Unit> properties);
+    method public static androidx.compose.ui.Modifier semantics(androidx.compose.ui.Modifier, optional boolean mergeDescendants, kotlin.jvm.functions.Function1<? super androidx.compose.ui.semantics.SemanticsPropertyReceiver,kotlin.Unit> properties);
+  }
+
+  public final class SemanticsNode {
+    method public int getAlignmentLinePosition(androidx.compose.ui.layout.AlignmentLine alignmentLine);
+    method public androidx.compose.ui.geometry.Rect getBoundsInRoot();
+    method public androidx.compose.ui.geometry.Rect getBoundsInWindow();
+    method public java.util.List<androidx.compose.ui.semantics.SemanticsNode> getChildren();
+    method public androidx.compose.ui.semantics.SemanticsConfiguration getConfig();
+    method public int getId();
+    method public androidx.compose.ui.layout.LayoutInfo getLayoutInfo();
+    method public boolean getMergingEnabled();
+    method public androidx.compose.ui.semantics.SemanticsNode? getParent();
+    method public long getPositionInRoot();
+    method public long getPositionInWindow();
+    method public androidx.compose.ui.node.RootForTest? getRoot();
+    method public long getSize();
+    method public androidx.compose.ui.geometry.Rect getTouchBoundsInRoot();
+    method public boolean isRoot();
+    property public final androidx.compose.ui.geometry.Rect boundsInRoot;
+    property public final androidx.compose.ui.geometry.Rect boundsInWindow;
+    property public final java.util.List<androidx.compose.ui.semantics.SemanticsNode> children;
+    property public final androidx.compose.ui.semantics.SemanticsConfiguration config;
+    property public final int id;
+    property public final boolean isRoot;
+    property public final androidx.compose.ui.layout.LayoutInfo layoutInfo;
+    property public final boolean mergingEnabled;
+    property public final androidx.compose.ui.semantics.SemanticsNode? parent;
+    property public final long positionInRoot;
+    property public final long positionInWindow;
+    property public final androidx.compose.ui.node.RootForTest? root;
+    property public final long size;
+    property public final androidx.compose.ui.geometry.Rect touchBoundsInRoot;
+  }
+
+  public final class SemanticsNodeKt {
+  }
+
+  public final class SemanticsOwner {
+    method public androidx.compose.ui.semantics.SemanticsNode getRootSemanticsNode();
+    method public androidx.compose.ui.semantics.SemanticsNode getUnmergedRootSemanticsNode();
+    property public final androidx.compose.ui.semantics.SemanticsNode rootSemanticsNode;
+    property public final androidx.compose.ui.semantics.SemanticsNode unmergedRootSemanticsNode;
+  }
+
+  public final class SemanticsOwnerKt {
+    method public static java.util.List<androidx.compose.ui.semantics.SemanticsNode> getAllSemanticsNodes(androidx.compose.ui.semantics.SemanticsOwner, boolean mergingEnabled);
+  }
+
+  public final class SemanticsProperties {
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> getCollectionInfo();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> getCollectionItemInfo();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> getContentDescription();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getDisabled();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> getEditableText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getError();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getFocused();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getHeading();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getHorizontalScrollAxisRange();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.input.ImeAction> getImeAction();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer>> getIndexForKey();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getInvisibleToUser();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getIsDialog();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getIsPopup();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.LiveRegionMode> getLiveRegion();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getPaneTitle();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getPassword();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ProgressBarRangeInfo> getProgressBarRangeInfo();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.Role> getRole();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> getSelectableGroup();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> getSelected();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getStateDescription();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> getTestTag();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> getText();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> getTextSelectionRange();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> getToggleableState();
+    method public androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> getVerticalScrollAxisRange();
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionInfo> CollectionInfo;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.CollectionItemInfo> CollectionItemInfo;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<java.lang.String>> ContentDescription;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Disabled;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.AnnotatedString> EditableText;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> Error;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Focused;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Heading;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> HorizontalScrollAxisRange;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.input.ImeAction> ImeAction;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer>> IndexForKey;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> InvisibleToUser;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> IsDialog;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> IsPopup;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.LiveRegionMode> LiveRegion;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> PaneTitle;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> Password;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ProgressBarRangeInfo> ProgressBarRangeInfo;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.Role> Role;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<kotlin.Unit> SelectableGroup;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.Boolean> Selected;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> StateDescription;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.lang.String> TestTag;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<java.util.List<androidx.compose.ui.text.AnnotatedString>> Text;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.text.TextRange> TextSelectionRange;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.state.ToggleableState> ToggleableState;
+    property public final androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.ScrollAxisRange> VerticalScrollAxisRange;
+    field public static final androidx.compose.ui.semantics.SemanticsProperties INSTANCE;
+  }
+
+  public final class SemanticsPropertiesKt {
+    method public static void collapse(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void copyText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void cutText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void dialog(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void disabled(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void dismiss(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void error(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String description);
+    method public static void expand(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static androidx.compose.ui.semantics.CollectionInfo getCollectionInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.CollectionItemInfo getCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> getCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.text.AnnotatedString getEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static boolean getFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.ScrollAxisRange getHorizontalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static int getImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static int getLiveRegion(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getPaneTitle(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.ProgressBarRangeInfo getProgressBarRangeInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static int getRole(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static boolean getSelected(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getStateDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static String getTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.text.AnnotatedString getText(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void getTextLayoutResult(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super java.util.List<androidx.compose.ui.text.TextLayoutResult>,java.lang.Boolean>? action);
+    method public static long getTextSelectionRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.state.ToggleableState getToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static androidx.compose.ui.semantics.ScrollAxisRange getVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void heading(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void indexForKey(androidx.compose.ui.semantics.SemanticsPropertyReceiver, kotlin.jvm.functions.Function1<java.lang.Object,java.lang.Integer> mapping);
+    method public static void onClick(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void onLongClick(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void password(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void pasteText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function0<java.lang.Boolean>? action);
+    method public static void popup(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void scrollBy(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Float,java.lang.Boolean>? action);
+    method public static void scrollToIndex(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Boolean> action);
+    method public static void selectableGroup(androidx.compose.ui.semantics.SemanticsPropertyReceiver);
+    method public static void setCollectionInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionInfo collectionInfo);
+    method public static void setCollectionItemInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.CollectionItemInfo collectionItemInfo);
+    method public static void setContentDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String value);
+    method public static void setCustomActions(androidx.compose.ui.semantics.SemanticsPropertyReceiver, java.util.List<androidx.compose.ui.semantics.CustomAccessibilityAction> customActions);
+    method public static void setEditableText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString editableText);
+    method public static void setFocused(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean focused);
+    method public static void setHorizontalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange horizontalScrollAxisRange);
+    method public static void setImeAction(androidx.compose.ui.semantics.SemanticsPropertyReceiver, int imeAction);
+    method public static void setLiveRegion(androidx.compose.ui.semantics.SemanticsPropertyReceiver, int liveRegion);
+    method public static void setPaneTitle(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String paneTitle);
+    method public static void setProgress(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Boolean>? action);
+    method public static void setProgressBarRangeInfo(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ProgressBarRangeInfo progressBarRangeInfo);
+    method public static void setRole(androidx.compose.ui.semantics.SemanticsPropertyReceiver, int role);
+    method public static void setSelected(androidx.compose.ui.semantics.SemanticsPropertyReceiver, boolean selected);
+    method public static void setSelection(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function3<? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Boolean,java.lang.Boolean>? action);
+    method public static void setStateDescription(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String stateDescription);
+    method public static void setTestTag(androidx.compose.ui.semantics.SemanticsPropertyReceiver, String testTag);
+    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.text.AnnotatedString value);
+    method public static void setText(androidx.compose.ui.semantics.SemanticsPropertyReceiver, optional String? label, kotlin.jvm.functions.Function1<? super androidx.compose.ui.text.AnnotatedString,java.lang.Boolean>? action);
+    method public static void setTextSelectionRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, long textSelectionRange);
+    method public static void setToggleableState(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.state.ToggleableState toggleableState);
+    method public static void setVerticalScrollAxisRange(androidx.compose.ui.semantics.SemanticsPropertyReceiver, androidx.compose.ui.semantics.ScrollAxisRange verticalScrollAxisRange);
+  }
+
+  public final class SemanticsPropertyKey<T> {
+    ctor public SemanticsPropertyKey(String name, optional kotlin.jvm.functions.Function2<? super T,? super T,? extends T> mergePolicy);
+    method public String getName();
+    method public operator T! getValue(androidx.compose.ui.semantics.SemanticsPropertyReceiver thisRef, kotlin.reflect.KProperty<?> property);
+    method public T? merge(T? parentValue, T? childValue);
+    method public operator void setValue(androidx.compose.ui.semantics.SemanticsPropertyReceiver thisRef, kotlin.reflect.KProperty<?> property, T? value);
+    property public final String name;
+  }
+
+  public interface SemanticsPropertyReceiver {
+    method public operator <T> void set(androidx.compose.ui.semantics.SemanticsPropertyKey<T> key, T? value);
+  }
+
+  public final class SemanticsSortKt {
+  }
+
+}
+
+package androidx.compose.ui.state {
+
+  public enum ToggleableState {
+    enum_constant public static final androidx.compose.ui.state.ToggleableState Indeterminate;
+    enum_constant public static final androidx.compose.ui.state.ToggleableState Off;
+    enum_constant public static final androidx.compose.ui.state.ToggleableState On;
+  }
+
+  public final class ToggleableStateKt {
+    method public static androidx.compose.ui.state.ToggleableState ToggleableState(boolean value);
+  }
+
+}
+
+package androidx.compose.ui.text.input {
+
+  public final class InputState_androidKt {
+  }
+
+  public final class RecordingInputConnection_androidKt {
+  }
+
+  public final class TextInputServiceAndroid_androidKt {
+  }
+
+}
+
+package androidx.compose.ui.viewinterop {
+
+  public final class AndroidViewHolder_androidKt {
+  }
+
+  public final class AndroidView_androidKt {
+    method @androidx.compose.runtime.Composable public static <T extends android.view.View> void AndroidView(kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> factory, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update);
+    method public static kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> getNoOpUpdate();
+    property public static final kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> NoOpUpdate;
+  }
+
+}
+
+package androidx.compose.ui.window {
+
+  public final class AndroidDialog_androidKt {
+    method @androidx.compose.runtime.Composable public static void Dialog(kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.window.DialogProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+  }
+
+  public final class AndroidPopup_androidKt {
+    method @androidx.compose.runtime.Composable public static void Popup(optional androidx.compose.ui.Alignment alignment, optional long offset, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Popup(androidx.compose.ui.window.PopupPositionProvider popupPositionProvider, optional kotlin.jvm.functions.Function0<kotlin.Unit>? onDismissRequest, optional androidx.compose.ui.window.PopupProperties properties, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @org.jetbrains.annotations.TestOnly public static boolean isPopupLayout(android.view.View view, optional String? testTag);
+  }
+
+  @androidx.compose.runtime.Immutable public final class DialogProperties {
+    ctor public DialogProperties(optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy);
+    method public boolean getDismissOnBackPress();
+    method public boolean getDismissOnClickOutside();
+    method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
+    property public final boolean dismissOnBackPress;
+    property public final boolean dismissOnClickOutside;
+    property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
+  }
+
+  public interface DialogWindowProvider {
+    method public android.view.Window getWindow();
+    property public abstract android.view.Window window;
+  }
+
+  @androidx.compose.runtime.Immutable public interface PopupPositionProvider {
+    method public long calculatePosition(androidx.compose.ui.unit.IntRect anchorBounds, long windowSize, androidx.compose.ui.unit.LayoutDirection layoutDirection, long popupContentSize);
+  }
+
+  @androidx.compose.runtime.Immutable public final class PopupProperties {
+    ctor public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean excludeFromSystemGesture, optional boolean clippingEnabled);
+    method public boolean getClippingEnabled();
+    method public boolean getDismissOnBackPress();
+    method public boolean getDismissOnClickOutside();
+    method public boolean getExcludeFromSystemGesture();
+    method public boolean getFocusable();
+    method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
+    property public final boolean clippingEnabled;
+    property public final boolean dismissOnBackPress;
+    property public final boolean dismissOnClickOutside;
+    property public final boolean excludeFromSystemGesture;
+    property public final boolean focusable;
+    property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
+  }
+
+  public enum SecureFlagPolicy {
+    enum_constant public static final androidx.compose.ui.window.SecureFlagPolicy Inherit;
+    enum_constant public static final androidx.compose.ui.window.SecureFlagPolicy SecureOff;
+    enum_constant public static final androidx.compose.ui.window.SecureFlagPolicy SecureOn;
+  }
+
+  public final class SecureFlagPolicy_androidKt {
+  }
+
+}
+
diff --git a/compose/ui/ui/api/restricted_current.ignore b/compose/ui/ui/api/restricted_current.ignore
index 95aa6ca..e0cadc5 100644
--- a/compose/ui/ui/api/restricted_current.ignore
+++ b/compose/ui/ui/api/restricted_current.ignore
@@ -7,6 +7,10 @@
     Added method androidx.compose.ui.layout.LayoutInfo.getViewConfiguration()
 
 
+InvalidNullConversion: androidx.compose.ui.graphics.GraphicsLayerModifierKt#graphicsLayer(androidx.compose.ui.Modifier, float, float, float, float, float, float, float, float, float, float, long, androidx.compose.ui.graphics.Shape, boolean):
+    Attempted to remove @NonNull annotation from method androidx.compose.ui.graphics.GraphicsLayerModifierKt.graphicsLayer(androidx.compose.ui.Modifier,float,float,float,float,float,float,float,float,float,float,long,androidx.compose.ui.graphics.Shape,boolean)
+
+
 RemovedClass: androidx.compose.ui.graphics.vector.AnimatorKt:
     Removed class androidx.compose.ui.graphics.vector.AnimatorKt
 RemovedClass: androidx.compose.ui.graphics.vector.compat.XmlAnimatedVectorParser_androidKt:
@@ -21,7 +25,3 @@
     Removed class androidx.compose.ui.res.AnimatedVectorResources_androidKt
 RemovedClass: androidx.compose.ui.res.AnimatorResources_androidKt:
     Removed class androidx.compose.ui.res.AnimatorResources_androidKt
-
-
-RemovedMethod: androidx.compose.ui.graphics.GraphicsLayerModifierKt#graphicsLayer(androidx.compose.ui.Modifier, float, float, float, float, float, float, float, float, float, float, long, androidx.compose.ui.graphics.Shape, boolean):
-    Removed method androidx.compose.ui.graphics.GraphicsLayerModifierKt.graphicsLayer(androidx.compose.ui.Modifier,float,float,float,float,float,float,float,float,float,float,long,androidx.compose.ui.graphics.Shape,boolean)
diff --git a/compose/ui/ui/api/restricted_current.txt b/compose/ui/ui/api/restricted_current.txt
index 736b3fb..fa1efa8 100644
--- a/compose/ui/ui/api/restricted_current.txt
+++ b/compose/ui/ui/api/restricted_current.txt
@@ -399,6 +399,7 @@
   public final class GraphicsLayerModifierKt {
     method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip, optional androidx.compose.ui.graphics.RenderEffect? renderEffect);
     method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier graphicsLayer(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.graphics.GraphicsLayerScope,kotlin.Unit> block);
+    method @Deprecated @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier! graphicsLayer(androidx.compose.ui.Modifier, optional float scaleX, optional float scaleY, optional float alpha, optional float translationX, optional float translationY, optional float shadowElevation, optional float rotationX, optional float rotationY, optional float rotationZ, optional float cameraDistance, optional long transformOrigin, optional androidx.compose.ui.graphics.Shape shape, optional boolean clip);
     method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier toolingGraphicsLayer(androidx.compose.ui.Modifier);
   }
 
@@ -454,6 +455,8 @@
 
   @androidx.compose.runtime.Immutable public final inline class TransformOrigin {
     ctor public TransformOrigin();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
   }
 
   public static final class TransformOrigin.Companion {
@@ -562,6 +565,12 @@
     method public static int getDefaultTintBlendMode();
     method public static long getDefaultTintColor();
     method public static java.util.List<androidx.compose.ui.graphics.vector.PathNode> getEmptyPath();
+    property public static final int DefaultFillType;
+    property public static final int DefaultStrokeLineCap;
+    property public static final int DefaultStrokeLineJoin;
+    property public static final int DefaultTintBlendMode;
+    property public static final long DefaultTintColor;
+    property public static final java.util.List<androidx.compose.ui.graphics.vector.PathNode> EmptyPath;
     field public static final String DefaultGroupName = "";
     field public static final String DefaultPathName = "";
     field public static final float DefaultPivotX = 0.0f;
@@ -1461,8 +1470,11 @@
     method public static void consumeAllChanges(androidx.compose.ui.input.pointer.PointerInputChange);
     method public static void consumeDownChange(androidx.compose.ui.input.pointer.PointerInputChange);
     method public static void consumePositionChange(androidx.compose.ui.input.pointer.PointerInputChange);
+    method public static int indexOfFirstPressed(int);
+    method public static int indexOfLastPressed(int);
     method @Deprecated public static boolean isOutOfBounds(androidx.compose.ui.input.pointer.PointerInputChange, long size);
     method public static boolean isOutOfBounds(androidx.compose.ui.input.pointer.PointerInputChange, long size, long extendedTouchPadding);
+    method public static boolean isPressed(int, int buttonIndex);
     method public static long positionChange(androidx.compose.ui.input.pointer.PointerInputChange);
     method public static boolean positionChangeConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
     method public static long positionChangeIgnoreConsumed(androidx.compose.ui.input.pointer.PointerInputChange);
@@ -1521,6 +1533,18 @@
     method public static boolean isTertiaryPressed(int);
   }
 
+  public interface PointerIcon {
+  }
+
+  public final class PointerIconKt {
+    method public static androidx.compose.ui.Modifier pointerHoverIcon(androidx.compose.ui.Modifier, androidx.compose.ui.input.pointer.PointerIcon icon, optional boolean overrideDescendants);
+  }
+
+  public final class PointerIcon_androidKt {
+    method public static androidx.compose.ui.input.pointer.PointerIcon PointerIcon(android.view.PointerIcon pointerIcon);
+    method public static androidx.compose.ui.input.pointer.PointerIcon PointerIcon(int pointerIconType);
+  }
+
   public final inline class PointerId {
     ctor public PointerId();
     method public long getValue();
@@ -1648,6 +1672,8 @@
   public final class AlignmentLineKt {
     method public static androidx.compose.ui.layout.HorizontalAlignmentLine getFirstBaseline();
     method public static androidx.compose.ui.layout.HorizontalAlignmentLine getLastBaseline();
+    property public static final androidx.compose.ui.layout.HorizontalAlignmentLine FirstBaseline;
+    property public static final androidx.compose.ui.layout.HorizontalAlignmentLine LastBaseline;
   }
 
   @androidx.compose.runtime.Stable public interface ContentScale {
@@ -1914,6 +1940,10 @@
 
   @androidx.compose.runtime.Immutable public final inline class ScaleFactor {
     ctor public ScaleFactor();
+    method @androidx.compose.runtime.Stable public inline operator float component1();
+    method @androidx.compose.runtime.Stable public inline operator float component2();
+    method @androidx.compose.runtime.Stable public operator long div(float operand);
+    method @androidx.compose.runtime.Stable public operator long times(float operand);
   }
 
   public static final class ScaleFactor.Companion {
@@ -1988,7 +2018,6 @@
 
   public interface ModifierLocalReadScope {
     method public <T> T! getCurrent(androidx.compose.ui.modifier.ModifierLocal<T>);
-    property public abstract T! current;
   }
 
   @androidx.compose.runtime.Stable public final class ProvidableModifierLocal<T> extends androidx.compose.ui.modifier.ModifierLocal<T> {
@@ -2099,6 +2128,11 @@
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> getLocalLifecycleOwner();
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> getLocalSavedStateRegistryOwner();
     method public static androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> getLocalView();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.res.Configuration> LocalConfiguration;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> LocalContext;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.lifecycle.LifecycleOwner> LocalLifecycleOwner;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.savedstate.SavedStateRegistryOwner> LocalSavedStateRegistryOwner;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.view.View> LocalView;
   }
 
   public final class AndroidUiDispatcher extends kotlinx.coroutines.CoroutineDispatcher {
@@ -2171,6 +2205,18 @@
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler> getLocalUriHandler();
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration> getLocalViewConfiguration();
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> getLocalWindowInfo();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.AccessibilityManager> LocalAccessibilityManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ClipboardManager> LocalClipboardManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> LocalDensity;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> LocalFocusManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback> LocalHapticFeedback;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.input.InputModeManager> LocalInputModeManager;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection> LocalLayoutDirection;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService> LocalTextInputService;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar> LocalTextToolbar;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.UriHandler> LocalUriHandler;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.ViewConfiguration> LocalViewConfiguration;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.WindowInfo> LocalWindowInfo;
   }
 
   public final class DebugUtilsKt {
@@ -2215,10 +2261,13 @@
     method @kotlin.PublishedApi internal static androidx.compose.ui.Modifier inspectableWrapper(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> inspectorInfo, androidx.compose.ui.Modifier wrapped);
     method public static boolean isDebugInspectorInfoEnabled();
     method public static void setDebugInspectorInfoEnabled(boolean isDebugInspectorInfoEnabled);
+    property public static final kotlin.jvm.functions.Function1<androidx.compose.ui.platform.InspectorInfo,kotlin.Unit> NoInspectorInfo;
+    property public static final boolean isDebugInspectorInfoEnabled;
   }
 
   public final class InspectionModeKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalInspectionMode();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> LocalInspectionMode;
   }
 
   public final class InspectorInfo {
@@ -2806,6 +2855,7 @@
   public final class AndroidView_androidKt {
     method @androidx.compose.runtime.Composable public static <T extends android.view.View> void AndroidView(kotlin.jvm.functions.Function1<? super android.content.Context,? extends T> factory, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super T,kotlin.Unit> update);
     method public static kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> getNoOpUpdate();
+    property public static final kotlin.jvm.functions.Function1<android.view.View,kotlin.Unit> NoOpUpdate;
   }
 
 }
diff --git a/compose/ui/ui/build.gradle b/compose/ui/ui/build.gradle
index 82273c8..e1712fe 100644
--- a/compose/ui/ui/build.gradle
+++ b/compose/ui/ui/build.gradle
@@ -152,7 +152,15 @@
             }
 
             androidMain.dependsOn(jvmMain)
+            skikoMain {
+                dependsOn(commonMain)
+                dependencies {
+                    api(project(":compose:ui:ui-graphics"))
+                    api(libs.skikoCommon)
+                }
+            }
             desktopMain {
+                dependsOn(skikoMain)
                 dependencies {
                     implementation(libs.kotlinStdlibJdk8)
                     api(libs.kotlinCoroutinesSwing)
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/UiDemos.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/UiDemos.kt
index f415db7..664c7ff 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/UiDemos.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/UiDemos.kt
@@ -54,12 +54,9 @@
 import androidx.compose.ui.demos.gestures.VerticalScrollerInDrawerDemo
 import androidx.compose.ui.demos.input.TouchModeDemo
 import androidx.compose.ui.demos.focus.ConditionalFocusabilityDemo
-import androidx.compose.ui.demos.scroll.BringIntoViewDemo
 import androidx.compose.ui.demos.keyinput.KeyInputDemo
 import androidx.compose.ui.demos.keyinput.InterceptEnterToSendMessageDemo
 import androidx.compose.ui.demos.modifier.CommunicatingModifierDemo
-import androidx.compose.ui.demos.scroll.BringRectangleIntoViewDemo
-import androidx.compose.ui.demos.scroll.RequestRectangleOnScreenDemo
 import androidx.compose.ui.demos.viewinterop.AndroidInComposeDemos
 import androidx.compose.ui.demos.viewinterop.ComplexTouchInterop
 import androidx.compose.ui.demos.viewinterop.ComposeInAndroidDemos
@@ -154,15 +151,6 @@
     )
 )
 
-private val RelocationDemos = DemoCategory(
-    "Relocation",
-    listOf(
-        ComposableDemo("Bring Into View") { BringIntoViewDemo() },
-        ComposableDemo("Bring Rectangle Into View") { BringRectangleIntoViewDemo() },
-        ComposableDemo("Request Rectangle On Screen") { RequestRectangleOnScreenDemo() }
-    )
-)
-
 private val ViewInteropDemos = DemoCategory(
     "View Interop",
     listOf(
@@ -197,6 +185,5 @@
         GestureDemos,
         ViewInteropDemos,
         ComposableDemo("Software Keyboard Controller") { SoftwareKeyboardControllerDemo() },
-        RelocationDemos
     )
 )
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ConditionalFocusabilityDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ConditionalFocusabilityDemo.kt
index 08380dd..d4c43cf 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ConditionalFocusabilityDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/focus/ConditionalFocusabilityDemo.kt
@@ -17,8 +17,8 @@
 package androidx.compose.ui.demos.focus
 
 import androidx.compose.foundation.background
-import androidx.compose.foundation.clickable
 import androidx.compose.foundation.focusable
+import androidx.compose.foundation.gestures.detectTapGestures
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.padding
@@ -40,6 +40,7 @@
 import androidx.compose.ui.graphics.Color.Companion.Gray
 import androidx.compose.ui.graphics.Color.Companion.Red
 import androidx.compose.ui.input.InputMode.Companion.Keyboard
+import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.platform.LocalInputModeManager
 import androidx.compose.ui.unit.dp
 
@@ -74,7 +75,7 @@
             modifier = Modifier
                 .focusAwareBackground()
                 .focusRequester(item1)
-                .clickable { item1.requestFocus() }
+                .pointerInput(item1) { detectTapGestures { item1.requestFocus() } }
                 .focusable()
         )
         Row {
@@ -85,7 +86,7 @@
                 modifier = Modifier
                     .focusAwareBackground()
                     .focusRequester(item2)
-                    .clickable { item2.requestFocus() }
+                    .pointerInput(item2) { detectTapGestures { item2.requestFocus() } }
                     .focusProperties { canFocus = item2active }
                     .focusable()
             )
@@ -98,7 +99,7 @@
             modifier = Modifier
                 .focusAwareBackground()
                 .focusRequester(item3)
-                .clickable { item3.requestFocus() }
+                .pointerInput(item3) { detectTapGestures { item3.requestFocus() } }
                 .focusProperties { canFocus = localInputModeManager.inputMode == Keyboard }
                 .focusable()
         )
@@ -107,9 +108,11 @@
             modifier = Modifier
                 .focusAwareBackground()
                 .focusRequester(item4)
-                .clickable {
-                    if (localInputModeManager.requestInputMode(Keyboard)) {
-                        item4.requestFocus()
+                .pointerInput(item4) {
+                    detectTapGestures {
+                        if (localInputModeManager.requestInputMode(Keyboard)) {
+                            item4.requestFocus()
+                        }
                     }
                 }
                 .focusProperties { canFocus = localInputModeManager.inputMode == Keyboard }
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/PointerIconSample.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/PointerIconSample.kt
new file mode 100644
index 0000000..1a9035d
--- /dev/null
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/PointerIconSample.kt
@@ -0,0 +1,45 @@
+/*
+ * 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.ui.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.text.selection.SelectionContainer
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.input.pointer.PointerIconDefaults
+import androidx.compose.ui.input.pointer.pointerHoverIcon
+
+@OptIn(ExperimentalComposeUiApi::class)
+@Sampled
+@Composable
+fun PointerIconSample() {
+    Column(Modifier.pointerHoverIcon(PointerIconDefaults.Crosshair)) {
+        SelectionContainer {
+            Column {
+                Text("Selectable text")
+                Text(
+                    modifier = Modifier.pointerHoverIcon(PointerIconDefaults.Hand, true),
+                    text = "Selectable text with hand"
+                )
+            }
+        }
+        Text("Just text with global pointerIcon")
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidAccessibilityTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidAccessibilityTest.kt
index c10eeed..4b86181 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidAccessibilityTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidAccessibilityTest.kt
@@ -2875,6 +2875,30 @@
         }
     }
 
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.P)
+    fun progressSemantics_mergesSemantics_forTalkback() {
+        container.setContent {
+            Box(Modifier.progressSemantics(0.5f).testTag("box"))
+        }
+
+        val node = rule.onNodeWithTag("box").fetchSemanticsNode()
+        val info = provider.createAccessibilityNodeInfo(node.id)
+        assertEquals(info.isScreenReaderFocusable, true)
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.P)
+    fun indeterminateProgressSemantics_mergesSemantics_forTalkback() {
+        container.setContent {
+            Box(Modifier.progressSemantics().testTag("box"))
+        }
+
+        val node = rule.onNodeWithTag("box").fetchSemanticsNode()
+        val info = provider.createAccessibilityNodeInfo(node.id)
+        assertEquals(info.isScreenReaderFocusable, true)
+    }
+
     private fun eventIndex(list: List<AccessibilityEvent>, event: AccessibilityEvent): Int {
         for (i in list.indices) {
             if (ReflectionEquals(list[i], null).matches(event)) {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt
index 2a51391..c1b7f74 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt
@@ -3555,6 +3555,26 @@
         }
     }
 
+    @Test
+    fun androidComposeViewIsTransitionGroup() {
+        // ensure that the android compose view is a transition group.
+
+        val latch = CountDownLatch(1)
+        activityTestRule.runOnUiThread {
+            activity.setContent {
+                Layout({}) { _, _ ->
+                    layout(10, 10) {
+                        latch.countDown()
+                    }
+                }
+            }
+        }
+        assertTrue(latch.await(1, TimeUnit.SECONDS))
+
+        val composeView = activityTestRule.findAndroidComposeView()
+        assertTrue(composeView.isTransitionGroup)
+    }
+
     private fun Modifier.layout(onLayout: () -> Unit) = layout { measurable, constraints ->
         val placeable = measurable.measure(constraints)
         layout(placeable.width, placeable.height) {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/GraphicsLayerTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/GraphicsLayerTest.kt
index 32c9718..28cab7c 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/GraphicsLayerTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/GraphicsLayerTest.kt
@@ -17,24 +17,30 @@
 package androidx.compose.ui.draw
 
 import android.os.Build
+import android.view.View
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.requiredSize
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.foundation.shape.GenericShape
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.setValue
+import androidx.compose.testutils.assertPixelColor
 import androidx.compose.testutils.assertPixels
 import androidx.compose.ui.AbsoluteAlignment
 import androidx.compose.ui.FixedSize
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.Padding
 import androidx.compose.ui.background
+import androidx.compose.ui.geometry.CornerRadius
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.geometry.RoundRect
 import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.graphics.BlurEffect
 import androidx.compose.ui.graphics.Color
@@ -46,6 +52,7 @@
 import androidx.compose.ui.graphics.TileMode
 import androidx.compose.ui.graphics.TransformOrigin
 import androidx.compose.ui.graphics.asAndroidBitmap
+import androidx.compose.ui.graphics.compositeOver
 import androidx.compose.ui.graphics.drawscope.DrawScope
 import androidx.compose.ui.graphics.drawscope.inset
 import androidx.compose.ui.graphics.graphicsLayer
@@ -55,11 +62,13 @@
 import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.layout.boundsInRoot
 import androidx.compose.ui.layout.boundsInWindow
+import androidx.compose.ui.layout.layout
 import androidx.compose.ui.layout.onGloballyPositioned
 import androidx.compose.ui.layout.positionInRoot
 import androidx.compose.ui.layout.positionInWindow
 import androidx.compose.ui.padding
 import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.TestActivity
 import androidx.compose.ui.test.captureToImage
@@ -83,6 +92,7 @@
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
+import kotlin.math.roundToInt
 
 @MediumTest
 @RunWith(AndroidJUnit4::class)
@@ -520,15 +530,20 @@
             BoxBlur(tag, size, blurRadius)
         }
         rule.onNodeWithTag(tag).captureToImage().apply {
-            val pixelMap = toPixelMap()
-            for (x in 0 until width) {
-                for (y in 0 until height) {
-                    if (x >= blurRadius && x < width - blurRadius &&
-                        y >= blurRadius && y < height - blurRadius
-                    ) {
-                        assertEquals("Index $x, $y should be blue", Color.Blue, pixelMap[x, y])
-                    } else {
-                        assertEquals("Index $x, $y should be black", Color.Black, pixelMap[x, y])
+            with(toPixelMap()) {
+                for (x in 0 until width) {
+                    for (y in 0 until height) {
+                        if (x >= blurRadius && x < width - blurRadius &&
+                            y >= blurRadius && y < height - blurRadius
+                        ) {
+                            assertPixelColor(Color.Blue, x, y) {
+                                "Index $x, $y should be blue"
+                            }
+                        } else {
+                            assertPixelColor(Color.Black, x, y) {
+                                "Index $x, $y should be black"
+                            }
+                        }
                     }
                 }
             }
@@ -568,6 +583,452 @@
 
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    fun testSoftwareLayerOffset() {
+        val testTag = "box"
+        var offset = 0
+        val scale = 0.5f
+        val boxAlpha = 0.5f
+        val sizePx = 100
+        val squarePx = sizePx / 2
+        rule.setContent {
+            LocalView.current.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
+            val density = LocalDensity.current.density
+            val size = (sizePx / density)
+            val squareSize = (squarePx / density)
+            offset = (20f / density).roundToInt()
+            Box(Modifier.size(size.dp).background(Color.LightGray).testTag(testTag)) {
+                Box(
+                    Modifier
+                        .layout { measurable, constraints ->
+                            val placeable = measurable.measure(constraints)
+                            layout(placeable.width, placeable.height) {
+                                placeable.placeWithLayer(offset, offset) {
+                                    alpha = boxAlpha
+                                    scaleX = scale
+                                    scaleY = scale
+                                    transformOrigin = TransformOrigin(0f, 0f)
+                                }
+                            }
+                        }
+                        .size(squareSize.dp)
+                        .background(Color.Red)
+                )
+            }
+        }
+
+        rule.onNodeWithTag(testTag).captureToImage().apply {
+            with(toPixelMap()) {
+                assertEquals(Color.LightGray, this[0, 0])
+                assertEquals(Color.LightGray, this[width - 1, 0])
+                assertEquals(Color.LightGray, this[0, height - 1])
+                assertEquals(Color.LightGray, this[width - 1, height - 1])
+
+                val blended = Color.Red.copy(alpha = boxAlpha).compositeOver(Color.LightGray)
+
+                val scaledSquare = squarePx * scale
+                val scaledLeft = offset
+                val scaledTop = offset
+                val scaledRight = (offset + scaledSquare).toInt()
+                val scaledBottom = (offset + scaledSquare).toInt()
+
+                assertPixelColor(blended, scaledLeft + 3, scaledTop + 3)
+                assertPixelColor(blended, scaledRight - 3, scaledTop + 3)
+                assertPixelColor(blended, scaledLeft + 3, scaledBottom - 3)
+                assertPixelColor(blended, scaledRight - 3, scaledBottom - 3)
+            }
+        }
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    fun testSoftwareLayerRectangularClip() {
+        val testTag = "box"
+        var offset = 0
+        val scale = 0.5f
+        val boxAlpha = 0.5f
+        val sizePx = 100
+        val squarePx = sizePx / 2
+        rule.setContent {
+            LocalView.current.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
+            val density = LocalDensity.current.density
+            val size = (sizePx / density)
+            val squareSize = (squarePx / density)
+            offset = (20f / density).roundToInt()
+            Box(Modifier.size(size.dp).background(Color.LightGray).testTag(testTag)) {
+                Box(
+                    Modifier
+                        .layout { measurable, constraints ->
+                            val placeable = measurable.measure(constraints)
+                            layout(placeable.width, placeable.height) {
+                                placeable.placeWithLayer(offset, offset) {
+                                    alpha = boxAlpha
+                                    scaleX = scale
+                                    scaleY = scale
+                                    clip = true
+                                    transformOrigin = TransformOrigin(0f, 0f)
+                                }
+                            }
+                        }
+                        .size(squareSize.dp)
+                        .drawBehind {
+                            // Draw a rectangle twice the size of the original bounds
+                            // to verify rectangular clipping is applied properly and ignores
+                            // the pixels outside of the original size
+                            val width = this.size.width
+                            val height = this.size.height
+                            drawRect(
+                                color = Color.Red,
+                                topLeft = Offset(-width, -height),
+                                size = Size(width * 2, height * 2))
+                        }
+                )
+            }
+        }
+
+        rule.onNodeWithTag(testTag).captureToImage().apply {
+            with(toPixelMap()) {
+                assertEquals(Color.LightGray, this[0, 0])
+                assertEquals(Color.LightGray, this[width - 1, 0])
+                assertEquals(Color.LightGray, this[0, height - 1])
+                assertEquals(Color.LightGray, this[width - 1, height - 1])
+
+                val blended = Color.Red.copy(alpha = boxAlpha).compositeOver(Color.LightGray)
+
+                val scaledSquare = squarePx * scale
+                val scaledLeft = offset
+                val scaledTop = offset
+                val scaledRight = (offset + scaledSquare).toInt()
+                val scaledBottom = (offset + scaledSquare).toInt()
+
+                assertPixelColor(Color.LightGray, scaledLeft - 3, scaledTop - 3)
+                assertPixelColor(Color.LightGray, scaledRight + 3, scaledTop - 3)
+                assertPixelColor(Color.LightGray, scaledLeft - 3, scaledBottom + 3)
+                assertPixelColor(Color.LightGray, scaledRight + 3, scaledBottom + 3)
+
+                assertPixelColor(blended, scaledLeft + 3, scaledTop + 3)
+                assertPixelColor(blended, scaledRight - 3, scaledTop + 3)
+                assertPixelColor(blended, scaledLeft + 3, scaledBottom - 3)
+                assertPixelColor(blended, scaledRight - 3, scaledBottom - 3)
+            }
+        }
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    fun testSoftwareCircularShapeClip() {
+        val testTag = "box"
+        var offset = 0
+        val scale = 0.5f
+        val boxAlpha = 0.5f
+        val sizePx = 200
+        val squarePx = sizePx / 2
+        rule.setContent {
+            LocalView.current.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
+            val density = LocalDensity.current.density
+            val size = (sizePx / density)
+            val squareSize = (squarePx / density)
+            offset = (20f / density).roundToInt()
+            Box(Modifier.size(size.dp).background(Color.LightGray).testTag(testTag)) {
+                Box(
+                    Modifier
+                        .layout { measurable, constraints ->
+                            val placeable = measurable.measure(constraints)
+                            layout(placeable.width, placeable.height) {
+                                placeable.placeWithLayer(offset, offset) {
+                                    alpha = boxAlpha
+                                    scaleX = scale
+                                    scaleY = scale
+                                    clip = true
+                                    shape = CircleShape
+                                    transformOrigin = TransformOrigin(0f, 0f)
+                                }
+                            }
+                        }
+                        .size(squareSize.dp)
+                        .drawBehind {
+                            // Draw a rectangle twice the size of the original bounds
+                            // to verify rectangular clipping is applied properly and ignores
+                            // the pixels outside of the original size
+                            val width = this.size.width
+                            val height = this.size.height
+                            drawRect(
+                                color = Color.Red,
+                                topLeft = Offset(-width, -height),
+                                size = Size(width * 2, height * 2))
+                        }
+                )
+            }
+        }
+
+        rule.onNodeWithTag(testTag).captureToImage().apply {
+            with(toPixelMap()) {
+                assertEquals(Color.LightGray, this[0, 0])
+                assertEquals(Color.LightGray, this[width - 1, 0])
+                assertEquals(Color.LightGray, this[0, height - 1])
+                assertEquals(Color.LightGray, this[width - 1, height - 1])
+
+                val blended = Color.Red.copy(alpha = boxAlpha).compositeOver(Color.LightGray)
+
+                val scaledSquare = squarePx * scale
+                val scaledLeft = offset
+                val scaledTop = offset
+                val scaledRight = (offset + scaledSquare).toInt()
+                val scaledBottom = (offset + scaledSquare).toInt()
+
+                assertPixelColor(Color.LightGray, scaledLeft + 1, scaledTop + 1)
+                assertPixelColor(Color.LightGray, scaledRight - 1, scaledTop + 1)
+                assertPixelColor(Color.LightGray, scaledLeft + 1, scaledBottom - 1)
+                assertPixelColor(Color.LightGray, scaledRight - 1, scaledBottom - 1)
+
+                val scaledMidHorizontal = (scaledLeft + scaledRight) / 2
+                val scaledMidVertical = (scaledTop + scaledBottom) / 2
+                assertPixelColor(blended, scaledMidHorizontal, scaledTop + 3)
+                assertPixelColor(blended, scaledRight - 3, scaledMidVertical)
+                assertPixelColor(blended, scaledMidHorizontal, scaledBottom - 3)
+                assertPixelColor(blended, scaledLeft + 3, scaledMidVertical)
+            }
+        }
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    fun testSoftwareLayerManualClip() {
+        val testTag = "box"
+        var offset = 0
+        val scale = 0.5f
+        val boxAlpha = 0.5f
+        val sizePx = 100
+        val squarePx = sizePx / 2
+        rule.setContent {
+            LocalView.current.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
+            val density = LocalDensity.current.density
+            val size = (sizePx / density)
+            val squareSize = (squarePx / density)
+            offset = (20f / density).roundToInt()
+            Box(Modifier.size(size.dp).background(Color.LightGray).testTag(testTag)) {
+                Box(
+                    Modifier
+                        .layout { measurable, constraints ->
+                            val placeable = measurable.measure(constraints)
+                            layout(placeable.width, placeable.height) {
+                                placeable.placeWithLayer(offset, offset) {
+                                    alpha = boxAlpha
+                                    scaleX = scale
+                                    scaleY = scale
+                                    clip = true
+                                    shape = GenericShape { size, _ ->
+                                        lineTo(size.width, 0f)
+                                        lineTo(0f, size.height)
+                                        close()
+                                    }
+                                    transformOrigin = TransformOrigin(0f, 0f)
+                                }
+                            }
+                        }
+                        .size(squareSize.dp)
+                        .drawBehind {
+                            // Draw a rectangle twice the size of the original bounds
+                            // to verify rectangular clipping is applied properly and ignores
+                            // the pixels outside of the original size
+                            val width = this.size.width
+                            val height = this.size.height
+                            drawRect(
+                                color = Color.Red,
+                                topLeft = Offset(-width, -height),
+                                size = Size(width * 2, height * 2))
+                        }
+                )
+            }
+        }
+
+        rule.onNodeWithTag(testTag).captureToImage().apply {
+            with(toPixelMap()) {
+                assertEquals(Color.LightGray, this[0, 0])
+                assertEquals(Color.LightGray, this[width - 1, 0])
+                assertEquals(Color.LightGray, this[0, height - 1])
+                assertEquals(Color.LightGray, this[width - 1, height - 1])
+
+                val blended = Color.Red.copy(alpha = boxAlpha).compositeOver(Color.LightGray)
+
+                val scaledSquare = squarePx * scale
+                val scaledLeft = offset
+                val scaledTop = offset
+                val scaledRight = (offset + scaledSquare).toInt()
+                val scaledBottom = (offset + scaledSquare).toInt()
+
+                assertPixelColor(Color.LightGray, scaledLeft - 3, scaledTop - 3)
+                assertPixelColor(Color.LightGray, scaledRight + 3, scaledTop - 3)
+                assertPixelColor(Color.LightGray, scaledLeft - 3, scaledBottom + 3)
+                assertPixelColor(Color.LightGray, scaledRight + 3, scaledBottom + 3)
+
+                assertPixelColor(blended, scaledLeft + 3, scaledTop + 3)
+                assertPixelColor(blended, scaledRight - 5, scaledTop + 1)
+                assertPixelColor(blended, scaledLeft + 1, scaledBottom - 5)
+
+                assertPixelColor(Color.LightGray,
+                    (scaledLeft + scaledRight) / 2 + 3, (scaledTop + scaledBottom) / 2 + 3)
+            }
+        }
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    fun testSoftwareLayerOffsetRectangularClip() {
+        val testTag = "box"
+        var offset = 0
+        val scale = 0.5f
+        val boxAlpha = 0.5f
+        val sizePx = 100
+        val squarePx = sizePx / 2
+        rule.setContent {
+            LocalView.current.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
+            val density = LocalDensity.current.density
+            val size = (sizePx / density)
+            val squareSize = (squarePx / density)
+            offset = (20f / density).roundToInt()
+            Box(Modifier.size(size.dp).background(Color.LightGray).testTag(testTag)) {
+                Box(
+                    Modifier
+                        .layout { measurable, constraints ->
+                            val placeable = measurable.measure(constraints)
+                            layout(placeable.width, placeable.height) {
+                                placeable.placeWithLayer(offset, offset) {
+                                    alpha = boxAlpha
+                                    scaleX = scale
+                                    scaleY = scale
+                                    transformOrigin = TransformOrigin(0f, 0f)
+                                    clip = true
+                                    shape = object : Shape {
+                                        override fun createOutline(
+                                            size: Size,
+                                            layoutDirection: LayoutDirection,
+                                            density: Density
+                                        ): Outline {
+                                            return Outline.Rectangle(
+                                                Rect(
+                                                    left = -size.width / 2,
+                                                    top = -size.height / 2,
+                                                    right = size.width / 2,
+                                                    bottom = size.height / 2,
+                                                )
+                                            )
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                        .size(squareSize.dp)
+                        .background(Color.Red)
+                )
+            }
+        }
+
+        rule.onNodeWithTag(testTag).captureToImage().apply {
+            with(toPixelMap()) {
+                assertEquals(Color.LightGray, this[0, 0])
+                assertEquals(Color.LightGray, this[width / 2 - 1, 0])
+                assertEquals(Color.LightGray, this[0, height / 2 - 1])
+                assertEquals(Color.LightGray, this[width / 2 - 1, height / 2 - 1])
+
+                val blended = Color.Red.copy(alpha = boxAlpha).compositeOver(Color.LightGray)
+
+                val scaledSquare = squarePx * scale
+                val scaledLeft = offset
+                val scaledTop = offset
+                val scaledRight = (offset + scaledSquare / 2).toInt()
+                val scaledBottom = (offset + scaledSquare / 2).toInt()
+
+                assertPixelColor(blended, scaledLeft + 3, scaledTop + 3)
+                assertPixelColor(blended, scaledRight - 3, scaledTop + 3)
+                assertPixelColor(blended, scaledLeft + 3, scaledBottom - 3)
+                assertPixelColor(blended, scaledRight - 3, scaledBottom - 3)
+            }
+        }
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    fun testSoftwareLayerOffsetRoundedRectClip() {
+        val testTag = "box"
+        var offset = 0
+        val scale = 0.5f
+        val boxAlpha = 0.5f
+        val sizePx = 200
+        val squarePx = sizePx / 2
+        rule.setContent {
+            LocalView.current.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
+            val density = LocalDensity.current.density
+            val size = (sizePx / density)
+            val squareSize = (squarePx / density)
+            offset = (20f / density).roundToInt()
+            Box(Modifier.size(size.dp).background(Color.LightGray).testTag(testTag)) {
+                Box(
+                    Modifier
+                        .layout { measurable, constraints ->
+                            val placeable = measurable.measure(constraints)
+                            layout(placeable.width, placeable.height) {
+                                placeable.placeWithLayer(offset, offset) {
+                                    alpha = boxAlpha
+                                    scaleX = scale
+                                    scaleY = scale
+                                    clip = true
+                                    shape = object : Shape {
+                                        override fun createOutline(
+                                            size: Size,
+                                            layoutDirection: LayoutDirection,
+                                            density: Density
+                                        ): Outline {
+                                            return Outline.Rounded(
+                                                RoundRect(
+                                                    left = -size.width / 2,
+                                                    top = -size.height / 2,
+                                                    right = size.width / 2,
+                                                    bottom = size.height / 2,
+                                                    cornerRadius = CornerRadius(
+                                                        size.width / 2,
+                                                        size.height / 2
+                                                    )
+                                                )
+                                            )
+                                        }
+                                    }
+                                    transformOrigin = TransformOrigin(0f, 0f)
+                                }
+                            }
+                        }
+                        .size(squareSize.dp)
+                        .background(Color.Red)
+                )
+            }
+        }
+
+        rule.onNodeWithTag(testTag).captureToImage().apply {
+            with(toPixelMap()) {
+                assertEquals(Color.LightGray, this[0, 0])
+                assertEquals(Color.LightGray, this[width / 2 - 1, 0])
+                assertEquals(Color.LightGray, this[0, height / 2 - 1])
+                assertEquals(Color.LightGray, this[width / 2 - 1, height / 2 - 1])
+
+                val blended = Color.Red.copy(alpha = boxAlpha).compositeOver(Color.LightGray)
+
+                val scaledSquare = squarePx * scale
+                val scaledLeft = offset
+                val scaledTop = offset
+                val scaledRight = (offset + scaledSquare / 2).toInt()
+                val scaledBottom = (offset + scaledSquare / 2).toInt()
+
+                assertPixelColor(blended, scaledLeft + 3, scaledTop + 3)
+                assertPixelColor(blended, scaledRight - 3, scaledTop + 3)
+                assertPixelColor(blended, scaledLeft + 3, scaledBottom - 3)
+
+                // The bottom right corner should be clipped out and the background should be revealed
+                assertPixelColor(Color.LightGray, scaledRight, scaledBottom)
+            }
+        }
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun invalidateWhenWeHaveSemanticModifierAfterLayer() {
         var color by mutableStateOf(Color.Red)
         rule.setContent {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/KeyEventToFocusDirectionTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/KeyEventToFocusDirectionTest.kt
index 36b6c7d..5cac3dd 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/KeyEventToFocusDirectionTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/KeyEventToFocusDirectionTest.kt
@@ -144,6 +144,32 @@
     }
 
     @Test
+    fun enter_in() {
+        // Arrange.
+        val keyEvent = KeyEvent(AndroidKeyEvent(KeyDown, Key.Enter.nativeKeyCode))
+
+        // Act.
+        val focusDirection = owner.getFocusDirection(keyEvent)
+
+        // Assert.
+        @OptIn(ExperimentalComposeUiApi::class)
+        assertThat(focusDirection).isEqualTo(In)
+    }
+
+    @Test
+    fun numpadEnter_in() {
+        // Arrange.
+        val keyEvent = KeyEvent(AndroidKeyEvent(KeyDown, Key.NumPadEnter.nativeKeyCode))
+
+        // Act.
+        val focusDirection = owner.getFocusDirection(keyEvent)
+
+        // Assert.
+        @OptIn(ExperimentalComposeUiApi::class)
+        assertThat(focusDirection).isEqualTo(In)
+    }
+
+    @Test
     fun back_out() {
         // Arrange.
         val keyEvent = KeyEvent(AndroidKeyEvent(KeyDown, Key.Back.nativeKeyCode))
@@ -155,4 +181,17 @@
         @OptIn(ExperimentalComposeUiApi::class)
         assertThat(focusDirection).isEqualTo(Out)
     }
+
+    @Test
+    fun esc_out() {
+        // Arrange.
+        val keyEvent = KeyEvent(AndroidKeyEvent(KeyDown, Key.Escape.nativeKeyCode))
+
+        // Act.
+        val focusDirection = owner.getFocusDirection(keyEvent)
+
+        // Assert.
+        @OptIn(ExperimentalComposeUiApi::class)
+        assertThat(focusDirection).isEqualTo(Out)
+    }
 }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/InputModeTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/InputModeTest.kt
index 13798785..483923b 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/InputModeTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/InputModeTest.kt
@@ -103,10 +103,8 @@
         }
 
         // Assert
-        rule.runOnIdle {
-            assertThat(requestGranted).isTrue()
-            assertThat(inputModeManager.inputMode).isEqualTo(Keyboard)
-        }
+        rule.runOnIdle { assertThat(requestGranted).isTrue() }
+        rule.waitUntil { inputModeManager.inputMode == Keyboard }
     }
 
     private fun ComposeContentTestRule.setContentWithInputManager(
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/HitPathTrackerTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/HitPathTrackerTest.kt
index 3cdca2c..aeaa202 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/HitPathTrackerTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/HitPathTrackerTest.kt
@@ -3612,6 +3612,8 @@
         get() = Density(1f)
     override val textInputService: TextInputService
         get() = TODO("Not yet implemented")
+    override val pointerIconService: PointerIconService
+        get() = TODO("Not yet implemented")
     override val focusManager: FocusManager
         get() = TODO("Not yet implemented")
     override val windowInfo: WindowInfo
@@ -3648,7 +3650,7 @@
 
     override fun requestFocus(): Boolean = false
 
-    override fun measureAndLayout() {
+    override fun measureAndLayout(sendPointerUpdate: Boolean) {
     }
 
     override fun createLayer(
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/LayerTouchTransformTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/LayerTouchTransformTest.kt
index 9cb504d..e065521 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/LayerTouchTransformTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/LayerTouchTransformTest.kt
@@ -40,11 +40,11 @@
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.test.performTouchInput
-import androidx.compose.ui.unit.dp
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
 import org.junit.Assert
+import org.junit.Assert.assertTrue
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -63,7 +63,7 @@
     @Test
     fun testTransformTouchEventConsumed() {
         val testTag = "transformedComposable"
-        var latch: CountDownLatch? = null
+        var latch = CountDownLatch(1)
         rule.setContent {
             val pressed = remember { mutableStateOf(false) }
             val onStart: (Offset) -> Unit = {
@@ -84,57 +84,62 @@
                 drawRect(Color.Gray)
             }
 
-            val latchDrawModifier = Modifier.drawBehind { latch?.countDown() }
+            val latchDrawModifier = Modifier.drawBehind { latch.countDown() }
 
-            val containerDp = (200.0f / LocalDensity.current.density).dp
-            val boxDp = (50.0f / LocalDensity.current.density).dp
+            with(LocalDensity.current) {
+                val containerDp = 200f.toDp()
+                val boxDp = 50f.toDp()
 
-            val offsetX = (270.0f / LocalDensity.current.density).dp
-            val offsetY = (120.0f / LocalDensity.current.density).dp
-            Box(Modifier.testTag(testTag)) {
-                SimpleLayout(
-                    modifier = Modifier.fillMaxSize().offset(offsetX, offsetY)
-                ) {
-                    SimpleLayout(modifier = background.then(Modifier.size(containerDp))) {
-                        SimpleLayout(
-                            modifier = Modifier
-                                .graphicsLayer(
-                                    scaleX = 2.0f,
-                                    scaleY = 0.5f,
-                                    translationX = 50.0f,
-                                    translationY = 30.0f,
-                                    rotationZ = 45.0f,
-                                    transformOrigin = TransformOrigin(1.0f, 1.0f)
-                                ).drawBehind {
-                                    drawRect(color)
-                                }
-                                .then(latchDrawModifier)
-                                .size(boxDp)
-                                .pointerInput(Unit) {
-                                    detectTapGestures(
-                                        onPress = {
-                                            onStart.invoke(it)
-                                            val success = tryAwaitRelease()
-                                            if (success) onStop.invoke() else onStop.invoke()
-                                        }
-                                    )
-                                }
-                        )
+                val offsetX = 270f.toDp()
+                val offsetY = 120f.toDp()
+                Box(Modifier.testTag(testTag)) {
+                    SimpleLayout(
+                        modifier = Modifier.fillMaxSize().offset(offsetX, offsetY)
+                    ) {
+                        SimpleLayout(modifier = background.then(Modifier.size(containerDp))) {
+                            SimpleLayout(
+                                modifier = Modifier
+                                    .graphicsLayer(
+                                        scaleX = 2.0f,
+                                        scaleY = 0.5f,
+                                        translationX = 50.0f,
+                                        translationY = 30.0f,
+                                        rotationZ = 45.0f,
+                                        transformOrigin = TransformOrigin(1.0f, 1.0f)
+                                    ).drawBehind {
+                                        drawRect(color)
+                                    }
+                                    .then(latchDrawModifier)
+                                    .size(boxDp)
+                                    .pointerInput(Unit) {
+                                        detectTapGestures(
+                                            onPress = {
+                                                onStart.invoke(it)
+                                                val success = tryAwaitRelease()
+                                                if (success) onStop.invoke() else onStop.invoke()
+                                            }
+                                        )
+                                    }
+                            )
+                        }
                     }
                 }
             }
         }
 
+        rule.waitForIdle()
+        assertTrue(latch.await(5, TimeUnit.SECONDS))
+
         // Touch position outside the bounds of the target composable
         // however, after transformations, this point will be within
         // its bounds
 
+        latch = CountDownLatch(1)
         val mappedPosition = Offset(342.0f, 168.0f)
         val node = rule.onNodeWithTag(testTag).performTouchInput { down(mappedPosition) }
 
-        latch = CountDownLatch(1).apply {
-            await(5, TimeUnit.SECONDS)
-        }
+        rule.waitForIdle()
+        assertTrue(latch.await(5, TimeUnit.SECONDS))
 
         node.captureToImage().asAndroidBitmap().apply {
             Assert.assertEquals(
@@ -168,4 +173,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/MouseEventTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/MouseEventTest.kt
new file mode 100644
index 0000000..1899a3c
--- /dev/null
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/MouseEventTest.kt
@@ -0,0 +1,264 @@
+/*
+ * 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.ui.input.pointer
+
+import android.os.Handler
+import android.os.Looper
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.size
+import androidx.compose.runtime.State
+import androidx.compose.runtime.mutableStateOf
+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.ExperimentalTestApi
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.performMouseInput
+import androidx.compose.ui.test.performTouchInput
+import androidx.compose.ui.unit.dp
+import androidx.test.filters.MediumTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+
+@MediumTest
+@OptIn(ExperimentalTestApi::class)
+class MouseEventTest {
+    @get:Rule
+    val rule = createComposeRule()
+
+    val tag = "Tagged Layout"
+
+    @Test
+    fun absentEnterSent() {
+        // Sometimes the first mouse event is an ACTION_DOWN. The "Enter" event should be sent
+        // before that.
+
+        val events = mutableListOf<PointerEventType>()
+
+        rule.setContent {
+            Box(Modifier.fillMaxSize()) {
+                Box(
+                    Modifier.align(Alignment.Center).size(50.dp)
+                    .testTag(tag)
+                    .pointerInput(Unit) {
+                        awaitPointerEventScope {
+                            while (true) {
+                                events += awaitPointerEvent().type
+                            }
+                        }
+                    }
+                )
+            }
+        }
+
+        rule.waitForIdle()
+        rule.onNodeWithTag(tag).performMouseInput {
+            moveTo(Offset.Zero)
+            press()
+        }
+
+        assertThat(events).hasSize(2)
+        assertThat(events[0]).isEqualTo(PointerEventType.Enter)
+        assertThat(events[1]).isEqualTo(PointerEventType.Press)
+    }
+
+    @Test
+    fun absentExitSent() {
+        // Sometimes the ACTION_HOVER_EXIT isn't sent when a touch event comes after a mouse event.
+
+        val events = mutableListOf<PointerEventType>()
+
+        rule.setContent {
+            Box(Modifier.fillMaxSize()) {
+                Box(
+                    Modifier.align(Alignment.Center).size(50.dp)
+                    .testTag(tag)
+                    .pointerInput(Unit) {
+                        awaitPointerEventScope {
+                            while (true) {
+                                events += awaitPointerEvent().type
+                            }
+                        }
+                    }
+                )
+            }
+        }
+
+        rule.waitForIdle()
+        rule.onNodeWithTag(tag).performMouseInput {
+            moveTo(Offset.Zero)
+        }.performTouchInput {
+            down(Offset.Zero)
+            up()
+        }
+
+        assertThat(events).hasSize(4)
+        assertThat(events[0]).isEqualTo(PointerEventType.Enter)
+        assertThat(events[1]).isEqualTo(PointerEventType.Exit)
+        assertThat(events[2]).isEqualTo(PointerEventType.Press)
+        assertThat(events[3]).isEqualTo(PointerEventType.Release)
+    }
+
+    @Test
+    fun pressMoveRelease() {
+        // There was a bug in which a pointer event handler wasn't removed from the hit test
+        // if the pointer moved outside of the bounds while down.
+
+        val events = mutableListOf<PointerEventType>()
+
+        rule.setContent {
+            Box(Modifier.fillMaxSize()) {
+                Box(
+                    Modifier.align(Alignment.Center).size(50.dp)
+                        .testTag(tag)
+                        .pointerInput(Unit) {
+                            awaitPointerEventScope {
+                                while (true) {
+                                    events += awaitPointerEvent().type
+                                }
+                            }
+                        }
+                )
+            }
+        }
+
+        rule.waitForIdle()
+        rule.onNodeWithTag(tag).performMouseInput {
+            moveTo(Offset.Zero)
+            press()
+            moveTo(Offset(-10f, -10f))
+            release()
+            press()
+            release()
+        }
+
+        assertThat(events).hasSize(4)
+        assertThat(events[0]).isEqualTo(PointerEventType.Enter)
+        assertThat(events[1]).isEqualTo(PointerEventType.Press)
+        assertThat(events[2]).isEqualTo(PointerEventType.Exit)
+        assertThat(events[3]).isEqualTo(PointerEventType.Release)
+    }
+
+    @Test
+    fun relayoutUnderCursor() {
+        // When a mouse cursor is hovering and the layout that it is in moves, the hover
+        // state should update.
+
+        val alignment = mutableStateOf(Alignment.BottomCenter)
+        val events = createRelayoutComposition(alignment)
+
+        rule.onNodeWithTag(tag).performMouseInput {
+            moveTo(Offset.Zero)
+        }
+
+        assertThat(events).hasSize(1)
+        assertThat(events[0]).isEqualTo(PointerEventType.Enter)
+        events.clear()
+
+        alignment.value = Alignment.TopCenter
+
+        waitForPointerUpdate()
+
+        assertThat(events).hasSize(1)
+        assertThat(events[0]).isEqualTo(PointerEventType.Exit)
+    }
+
+    private fun waitForPointerUpdate() {
+        rule.waitForIdle()
+        val latch = CountDownLatch(1)
+        Handler(Looper.getMainLooper()).postDelayed({ latch.countDown() }, 200)
+        latch.await(2, TimeUnit.SECONDS)
+        rule.waitForIdle()
+    }
+
+    @Test
+    fun noSimulatedEventAfterUp() {
+        // After an "up" event, there's no reason to send a simulated event
+
+        val alignment = mutableStateOf(Alignment.BottomCenter)
+        val events = createRelayoutComposition(alignment)
+
+        rule.onNodeWithTag(tag).performTouchInput {
+            down(Offset.Zero)
+            up()
+        }
+
+        assertThat(events).hasSize(2)
+        events.clear()
+
+        alignment.value = Alignment.TopCenter
+
+        waitForPointerUpdate()
+
+        assertThat(events).hasSize(0)
+    }
+
+    @Test
+    fun noSimulatedEventAfterHoverExit() {
+        // After an "up" event, there's no reason to send a simulated event
+
+        val alignment = mutableStateOf(Alignment.BottomCenter)
+        val events = createRelayoutComposition(alignment)
+
+        rule.onNodeWithTag(tag).performMouseInput {
+            moveTo(Offset.Zero)
+            exit()
+        }
+
+        assertThat(events).hasSize(2)
+        assertThat(events[0]).isEqualTo(PointerEventType.Enter)
+        assertThat(events[1]).isEqualTo(PointerEventType.Exit)
+        events.clear()
+
+        alignment.value = Alignment.TopCenter
+
+        waitForPointerUpdate()
+
+        assertThat(events).hasSize(0)
+    }
+
+    private fun createRelayoutComposition(
+        alignment: State<Alignment>
+    ): MutableList<PointerEventType> {
+        val events = mutableListOf<PointerEventType>()
+
+        rule.setContent {
+            Box(Modifier.fillMaxSize()) {
+                Box(
+                    Modifier.align(alignment.value).size(50.dp)
+                        .testTag(tag)
+                        .pointerInput(Unit) {
+                            awaitPointerEventScope {
+                                while (true) {
+                                    events += awaitPointerEvent().type
+                                }
+                            }
+                        }
+                )
+            }
+        }
+
+        rule.waitForIdle()
+        return events
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessorTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessorTest.kt
index f919d4f..94149d9 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessorTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessorTest.kt
@@ -3215,6 +3215,8 @@
         get() = Density(1f)
     override val textInputService: TextInputService
         get() = TODO("Not yet implemented")
+    override val pointerIconService: PointerIconService
+        get() = TODO("Not yet implemented")
     override val focusManager: FocusManager
         get() = TODO("Not yet implemented")
     override val windowInfo: WindowInfo
@@ -3247,7 +3249,7 @@
     override fun calculateLocalPosition(positionInWindow: Offset): Offset =
         positionInWindow - position.toOffset()
 
-    override fun measureAndLayout() {
+    override fun measureAndLayout(sendPointerUpdate: Boolean) {
         delegate.measureAndLayout()
     }
 
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/RelocationModifierTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/RelocationModifierTest.kt
deleted file mode 100644
index 8e0c859..0000000
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/RelocationModifierTest.kt
+++ /dev/null
@@ -1,287 +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.compose.ui.layout
-
-import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.size
-import androidx.compose.ui.ExperimentalComposeUiApi
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.geometry.Rect
-import androidx.compose.ui.layout.LayoutCoordinateSubject.Companion.assertThat
-import androidx.compose.ui.test.TestActivity
-import androidx.compose.ui.test.junit4.createAndroidComposeRule
-import androidx.compose.ui.unit.Density
-import androidx.compose.ui.unit.Dp
-import androidx.compose.ui.unit.dp
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.google.common.truth.Fact.simpleFact
-import com.google.common.truth.FailureMetadata
-import com.google.common.truth.Subject
-import com.google.common.truth.Subject.Factory
-import com.google.common.truth.Truth
-import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.runBlocking
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@OptIn(ExperimentalComposeUiApi::class)
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class RelocationModifierTest {
-
-    @get:Rule
-    val rule = createAndroidComposeRule<TestActivity>()
-
-    lateinit var density: Density
-
-    @Before
-    fun setup() {
-        density = Density(rule.activity)
-    }
-
-    fun Float.toDp(): Dp = with(density) { this@toDp.toDp() }
-
-    @Test
-    fun zeroSizedItem_zeroSizedParent_bringIntoView_noOffsetNoRelocation() {
-        // Arrange.
-        lateinit var childRect: Rect
-        lateinit var source: Rect
-        lateinit var destination: Rect
-        val relocationRequester = RelocationRequester()
-        rule.setContent {
-            Box(
-                Modifier
-                    .onRelocationRequest(
-                        onProvideDestination = { rect, _ ->
-                            childRect = rect
-                            Rect.Zero
-                        },
-                        onPerformRelocation = { sourceRect, destinationRect ->
-                            source = sourceRect
-                            destination = destinationRect
-                        }
-                    )
-                    .relocationRequester(relocationRequester)
-            )
-        }
-
-        // Act.
-        runBlocking { relocationRequester.bringIntoView() }
-
-        // Assert.
-        assertThat(childRect).isEqualTo(Rect.Zero)
-        assertThat(source).isEqualTo(Rect.Zero)
-        assertThat(destination).isEqualTo(Rect.Zero)
-    }
-
-    @Test
-    fun bringIntoView_onPerformRelocationCalledWithSameSourceAndDestination() {
-        // Arrange.
-        lateinit var childRect: Rect
-        lateinit var source: Rect
-        lateinit var destination: Rect
-        val relocationRequester = RelocationRequester()
-        rule.setContent {
-            Box(
-                Modifier
-                    .size(20f.toDp(), 10f.toDp())
-                    .onRelocationRequest(
-                        onProvideDestination = { rect, _ ->
-                            childRect = rect
-                            rect
-                        },
-                        onPerformRelocation = { sourceRect, destinationRect ->
-                            source = sourceRect
-                            destination = destinationRect
-                        }
-                    )
-                    .relocationRequester(relocationRequester)
-            )
-        }
-
-        // Act.
-        runBlocking { relocationRequester.bringIntoView() }
-
-        // Assert.
-        assertThat(childRect).isEqualTo(Rect(0f, 0f, 20f, 10f))
-        assertThat(source).isEqualTo(childRect)
-        assertThat(destination).isEqualTo(source)
-    }
-
-    @Test
-    fun bringIntoView_onPerformRelocationCalledWithSameSourceAsOnProvideDestination() {
-        // Arrange.
-        lateinit var childRect: Rect
-        lateinit var source: Rect
-        val relocationRequester = RelocationRequester()
-        rule.setContent {
-            Box(
-                Modifier
-                    .size(20.dp, 10.dp)
-                    .onRelocationRequest(
-                        onProvideDestination = { rect, _ ->
-                            childRect = rect
-                            Rect(7f, 7f, 7f, 7f)
-                        },
-                        onPerformRelocation = { sourceRect, _ -> source = sourceRect }
-                    )
-                    .relocationRequester(relocationRequester)
-            )
-        }
-
-        // Act.
-        runBlocking { relocationRequester.bringIntoView() }
-
-        // Assert.
-        assertThat(source).isEqualTo(childRect)
-    }
-
-    @Test
-    fun bringIntoView_withOffset_onPerformRelocationCalledWithSpecifiedDestination() {
-        // Arrange.
-        lateinit var destination: Rect
-        val relocationRequester = RelocationRequester()
-        val specifiedDestination = Rect(5f, 5f, 5f, 5f)
-        rule.setContent {
-            Box(
-                Modifier
-                    .size(20.dp, 10.dp)
-                    .onRelocationRequest(
-                        onProvideDestination = { _, _ -> specifiedDestination },
-                        onPerformRelocation = { _, destinationRect ->
-                            destination = destinationRect
-                        }
-                    )
-                    .relocationRequester(relocationRequester)
-            )
-        }
-
-        // Act.
-        runBlocking { relocationRequester.bringIntoView() }
-
-        // Assert.
-        assertThat(destination).isEqualTo(specifiedDestination)
-    }
-
-    @Test
-    fun bringIntoView_onProvideDestination_receivesLayoutCoordinates() {
-        // Arrange.
-        lateinit var onProvideDestinationCoordinates: LayoutCoordinates
-        lateinit var onGloballyPositionedCoordinates: LayoutCoordinates
-        val relocationRequester = RelocationRequester()
-        rule.setContent {
-            Box(
-                Modifier
-                    .size(20.dp, 10.dp)
-                    .onRelocationRequest(
-                        onProvideDestination = { rect, coordinates ->
-                            onProvideDestinationCoordinates = coordinates
-                            rect
-                        },
-                        onPerformRelocation = { _, _ -> }
-                    )
-                    .relocationRequester(relocationRequester)
-                    .onGloballyPositioned { onGloballyPositionedCoordinates = it }
-            )
-        }
-
-        // Act.
-        runBlocking { relocationRequester.bringIntoView() }
-
-        // Assert.
-        assertThat(onProvideDestinationCoordinates).isEqualTo(onGloballyPositionedCoordinates)
-    }
-
-    @Test
-    fun onRelocationRequest_parentIsCalledWithDestinationSpecifiedByChild() {
-        // Arrange.
-        lateinit var childRect2: Rect
-        val relocationRequester = RelocationRequester()
-        val specifiedDestination2 = Rect(10f, 10f, 10f, 10f)
-        val specifiedDestination1 = Rect(5f, 5f, 5f, 5f)
-        rule.setContent {
-            Box(
-                Modifier
-                    .size(40.dp, 30.dp)
-                    .onRelocationRequest(
-                        onProvideDestination = { rect, _ ->
-                            childRect2 = rect
-                            specifiedDestination2
-                        },
-                        onPerformRelocation = { _, _ -> }
-                    )
-            ) {
-                Box(
-                    Modifier
-                        .size(20.dp, 10.dp)
-                        .onRelocationRequest(
-                            onProvideDestination = { _, _ -> specifiedDestination1 },
-                            onPerformRelocation = { _, _ -> }
-                        )
-                        .relocationRequester(relocationRequester)
-                )
-            }
-        }
-
-        // Act.
-        runBlocking { relocationRequester.bringIntoView() }
-
-        // Assert.
-        assertThat(childRect2).isEqualTo(specifiedDestination1)
-    }
-}
-
-private class LayoutCoordinateSubject(metadata: FailureMetadata?, val actual: LayoutCoordinates?) :
-    Subject(metadata, actual) {
-
-    fun isEqualTo(expected: LayoutCoordinates?) {
-        if (expected == null) {
-            assertThat(actual).isNull()
-            return
-        }
-        if (actual == null) {
-            failWithActual(simpleFact("Expected non-null layout coordinates."))
-            return
-        }
-        if (expected.size != actual.size) {
-            failWithoutActual(
-                simpleFact("Expected size be ${expected.size}"),
-                simpleFact("But was ${actual.size}")
-            )
-        }
-        if (expected.positionInParent() != actual.positionInParent()) {
-            failWithoutActual(
-                simpleFact("Expected bounds in parent to be ${expected.boundsInParent()}"),
-                simpleFact("But was ${actual.boundsInParent()}")
-            )
-        }
-    }
-
-    companion object {
-        fun assertThat(layoutCoordinates: LayoutCoordinates?): LayoutCoordinateSubject {
-            return Truth.assertAbout(subjectFactory).that(layoutCoordinates)
-        }
-
-        private val subjectFactory =
-            Factory<LayoutCoordinateSubject, LayoutCoordinates?> { metadata, actual ->
-                LayoutCoordinateSubject(metadata, actual)
-            }
-    }
-}
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/LayoutNodeWrapperInitializationTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/LayoutNodeWrapperInitializationTest.kt
new file mode 100644
index 0000000..19c96f5
--- /dev/null
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/node/LayoutNodeWrapperInitializationTest.kt
@@ -0,0 +1,149 @@
+/*
+ * 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.ui.node
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.runtime.RecomposeScope
+import androidx.compose.runtime.currentRecomposeScope
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.focus.FocusModifier
+import androidx.compose.ui.focus.FocusStateImpl
+import androidx.compose.ui.input.key.KeyInputModifier
+import androidx.compose.ui.input.pointer.PointerInputModifier
+import androidx.compose.ui.input.pointer.PointerInteropFilter
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class LayoutNodeWrapperInitializationTest {
+    @get:Rule
+    val rule = createComposeRule()
+
+    @Test
+    fun initializeIsCalledWhenFocusNodeIsCreated() {
+        // Arrange.
+        val focusModifier = FocusModifier(FocusStateImpl.Inactive)
+
+        // Act.
+        rule.setContent {
+            Box(modifier = focusModifier)
+        }
+
+        // Assert.
+        rule.runOnIdle {
+            assertThat(focusModifier.focusNode).isNotNull()
+        }
+    }
+
+    @Test
+    fun initializeIsCalledWhenKeyInputNodeIsCreated() {
+        // Arrange.
+        val keyInputModifier = KeyInputModifier(null, null)
+
+        // Act.
+        rule.setContent {
+            Box(modifier = keyInputModifier)
+        }
+
+        // Assert.
+        rule.runOnIdle {
+            assertThat(keyInputModifier.keyInputNode).isNotNull()
+        }
+    }
+
+    @OptIn(ExperimentalComposeUiApi::class)
+    @Test
+    fun initializeIsCalledWhenPointerInputNodeWrapperIsCreated() {
+        // Arrange.
+        val pointerInputModifier = PointerInteropFilter()
+
+        // Act.
+        rule.setContent {
+            Box(modifier = pointerInputModifier)
+        }
+
+        // Assert.
+        rule.runOnIdle {
+            assertThat(pointerInputModifier.pointerInputFilter.layoutCoordinates).isNotNull()
+        }
+    }
+
+    @Test
+    fun initializeIsCalledWhenFocusNodeIsReused() {
+        // Arrange.
+        lateinit var focusModifier: FocusModifier
+        lateinit var scope: RecomposeScope
+        rule.setContent {
+            scope = currentRecomposeScope
+            focusModifier = FocusModifier(FocusStateImpl.Inactive)
+            Box(modifier = focusModifier)
+        }
+
+        // Act.
+        rule.runOnIdle { scope.invalidate() }
+
+        // Assert.
+        rule.runOnIdle { assertThat(focusModifier.focusNode).isNotNull() }
+    }
+
+    @Test
+    fun initializeIsCalledWhenKeyInputNodeIsReused() {
+        // Arrange.
+        lateinit var keyInputModifier: KeyInputModifier
+        lateinit var scope: RecomposeScope
+        rule.setContent {
+            scope = currentRecomposeScope
+            keyInputModifier = KeyInputModifier(null, null)
+            Box(modifier = keyInputModifier)
+        }
+
+        // Act.
+        rule.runOnIdle { scope.invalidate() }
+
+        // Assert.
+        rule.runOnIdle {
+            assertThat(keyInputModifier.keyInputNode).isNotNull()
+        }
+    }
+
+    @ExperimentalComposeUiApi
+    @Test
+    fun initializeIsCalledWhenPointerInputNodeIsReused() {
+        // Arrange.
+        lateinit var pointerInputModifier: PointerInputModifier
+        lateinit var scope: RecomposeScope
+        rule.setContent {
+            scope = currentRecomposeScope
+            pointerInputModifier = PointerInteropFilter()
+            Box(modifier = pointerInputModifier)
+        }
+
+        // Act.
+        rule.runOnIdle { scope.invalidate() }
+
+        // Assert.
+        rule.runOnIdle {
+            assertThat(pointerInputModifier.pointerInputFilter.layoutCoordinates).isNotNull()
+        }
+    }
+}
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/PointerIcon.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/PointerIcon.android.kt
new file mode 100644
index 0000000..5662d9d
--- /dev/null
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/PointerIcon.android.kt
@@ -0,0 +1,87 @@
+/*
+ * 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.ui.input.pointer
+
+import android.os.Build
+import android.view.PointerIcon.TYPE_CROSSHAIR
+import android.view.PointerIcon.TYPE_HAND
+import android.view.PointerIcon.TYPE_DEFAULT
+import android.view.PointerIcon.TYPE_TEXT
+
+internal class AndroidPointerIconType(val type: Int) : PointerIcon {
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (javaClass != other?.javaClass) return false
+
+        other as AndroidPointerIconType
+
+        if (type != other.type) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        return type
+    }
+
+    override fun toString(): String {
+        return "AndroidPointerIcon(type=$type)"
+    }
+}
+
+internal class AndroidPointerIcon(val pointerIcon: android.view.PointerIcon) : PointerIcon {
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (javaClass != other?.javaClass) return false
+
+        other as AndroidPointerIcon
+
+        if (if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+                pointerIcon != other.pointerIcon
+            } else {
+                pointerIcon !== other.pointerIcon
+            }
+        ) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        return pointerIcon.hashCode()
+    }
+
+    override fun toString(): String {
+        return "AndroidPointerIcon(pointerIcon=$pointerIcon)"
+    }
+}
+
+/**
+ * Creates [PointerIcon] from [android.view.PointerIcon]
+ */
+fun PointerIcon(pointerIcon: android.view.PointerIcon): PointerIcon =
+    AndroidPointerIcon(pointerIcon)
+
+/**
+ * Creates [PointerIcon] from pointer icon type (see [android.view.PointerIcon.getSystemIcon]
+ */
+fun PointerIcon(pointerIconType: Int): PointerIcon =
+    AndroidPointerIconType(pointerIconType)
+
+internal actual val pointerIconDefault: PointerIcon = AndroidPointerIconType(TYPE_DEFAULT)
+internal actual val pointerIconCrosshair: PointerIcon = AndroidPointerIconType(TYPE_CROSSHAIR)
+internal actual val pointerIconText: PointerIcon = AndroidPointerIconType(TYPE_TEXT)
+internal actual val pointerIconHand: PointerIcon = AndroidPointerIconType(TYPE_HAND)
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt
index 391bd08..0ae67ef 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt
@@ -22,12 +22,19 @@
 import android.graphics.Rect
 import android.os.Build
 import android.os.Looper
+import android.os.SystemClock
 import android.util.Log
 import android.util.SparseArray
 import android.view.InputDevice
 import android.view.MotionEvent
+import android.view.MotionEvent.ACTION_CANCEL
+import android.view.MotionEvent.ACTION_HOVER_ENTER
 import android.view.MotionEvent.ACTION_HOVER_EXIT
 import android.view.MotionEvent.ACTION_HOVER_MOVE
+import android.view.MotionEvent.ACTION_MOVE
+import android.view.MotionEvent.ACTION_POINTER_UP
+import android.view.MotionEvent.ACTION_UP
+import android.view.MotionEvent.TOOL_TYPE_MOUSE
 import android.view.View
 import android.view.ViewGroup
 import android.view.ViewStructure
@@ -81,6 +88,9 @@
 import androidx.compose.ui.input.key.Key.Companion.DirectionLeft
 import androidx.compose.ui.input.key.Key.Companion.DirectionRight
 import androidx.compose.ui.input.key.Key.Companion.DirectionUp
+import androidx.compose.ui.input.key.Key.Companion.Enter
+import androidx.compose.ui.input.key.Key.Companion.Escape
+import androidx.compose.ui.input.key.Key.Companion.NumPadEnter
 import androidx.compose.ui.input.key.Key.Companion.Tab
 import androidx.compose.ui.input.key.KeyEvent
 import androidx.compose.ui.input.key.KeyEventType.Companion.KeyDown
@@ -88,12 +98,16 @@
 import androidx.compose.ui.input.key.isShiftPressed
 import androidx.compose.ui.input.key.key
 import androidx.compose.ui.input.key.type
+import androidx.compose.ui.input.pointer.AndroidPointerIcon
+import androidx.compose.ui.input.pointer.AndroidPointerIconType
 import androidx.compose.ui.input.pointer.MotionEventAdapter
+import androidx.compose.ui.input.pointer.PointerIcon
+import androidx.compose.ui.input.pointer.PointerIconDefaults
+import androidx.compose.ui.input.pointer.PointerIconService
 import androidx.compose.ui.input.pointer.PointerInputEventProcessor
 import androidx.compose.ui.input.pointer.PositionCalculator
 import androidx.compose.ui.input.pointer.ProcessResult
 import androidx.compose.ui.layout.RootMeasurePolicy
-import androidx.compose.ui.layout.onRelocationRequest
 import androidx.compose.ui.node.InternalCoreApi
 import androidx.compose.ui.node.LayoutNode
 import androidx.compose.ui.node.LayoutNode.UsageByParent
@@ -129,7 +143,6 @@
 import androidx.savedstate.ViewTreeSavedStateRegistryOwner
 import java.lang.reflect.Method
 import android.view.KeyEvent as AndroidKeyEvent
-import androidx.compose.ui.geometry.Rect as ComposeRect
 
 @SuppressLint("ViewConstructor", "VisibleForTests")
 @OptIn(ExperimentalComposeUiApi::class)
@@ -189,17 +202,11 @@
         onPreviewKeyEvent = null
     )
 
-    private val relocationModifier = Modifier.onRelocationRequest(
-        onProvideDestination = { _, _ -> ComposeRect.Zero },
-        onPerformRelocation = { rect, _ -> requestRectangleOnScreen(rect.toRect(), false) }
-    )
-
     private val canvasHolder = CanvasHolder()
 
     override val root = LayoutNode().also {
         it.measurePolicy = RootMeasurePolicy
         it.modifier = Modifier
-            .then(relocationModifier)
             .then(semanticsModifier)
             .then(_focusManager.modifier)
             .then(keyInputModifier)
@@ -392,11 +399,17 @@
     override val textToolbar: TextToolbar = AndroidTextToolbar(this)
 
     /**
-     * The previous raw position of the first pointer. This is useful for avoiding sending
-     * excess Move events when ACTION_HOVER_MOVE immediately follows a different, more meaningful
-     * event, like ACTION_SCROLL.
+     * When the first event for a mouse is ACTION_DOWN, an ACTION_HOVER_ENTER is never sent.
+     * This means that we won't receive an `Enter` event for the first mouse. In order to prevent
+     * this problem, we track whether or not the previous event was with the mouse inside and
+     * if not, we can create a simulated mouse enter event to force an enter.
      */
-    private var previousPosition = Offset.Infinite
+    private var previousMotionEvent: MotionEvent? = null
+
+    /**
+     * The time of the last layout. This is used to send a synthetic MotionEvent.
+     */
+    private var relayoutTime = 0L
 
     /**
      * A cache for OwnedLayers. Recreating ViewLayers is expensive, so we avoid it as much
@@ -404,11 +417,57 @@
      */
     private val layerCache = WeakCache<OwnedLayer>()
 
+    /**
+     * Runnable used to update the pointer position 150ms after layout. If
+     * another pointer event comes in before this runs, this Runnable will be removed and
+     * not executed.
+     */
+    private val resendMotionEventRunnable = object : Runnable {
+        override fun run() {
+            removeCallbacks(this)
+            val lastMotionEvent = previousMotionEvent
+            if (lastMotionEvent != null) {
+                val wasMouseEvent = lastMotionEvent.getToolType(0) == TOOL_TYPE_MOUSE
+                val action = lastMotionEvent.actionMasked
+                val resend = if (wasMouseEvent) {
+                    action != ACTION_HOVER_EXIT && action != ACTION_UP
+                } else {
+                    action != ACTION_UP
+                }
+                if (resend) {
+                    val newAction =
+                        if (action == ACTION_HOVER_MOVE || action == ACTION_HOVER_ENTER) {
+                            ACTION_HOVER_MOVE
+                        } else {
+                            ACTION_MOVE
+                        }
+                    sendSimulatedEvent(lastMotionEvent, newAction, relayoutTime, forceHover = false)
+                }
+            }
+        }
+    }
+
+    /**
+     * Callback for [measureAndLayout] to update the pointer position 150ms after layout.
+     */
+    private val resendMotionEventOnLayout: () -> Unit = {
+        val lastEvent = previousMotionEvent
+        if (lastEvent != null) {
+            when (lastEvent.actionMasked) {
+                // We currently only care about hover events being updated when layout changes
+                ACTION_HOVER_ENTER, ACTION_HOVER_MOVE -> {
+                    relayoutTime = SystemClock.uptimeMillis()
+                    post(resendMotionEventRunnable)
+                }
+            }
+        }
+    }
+
     init {
         setWillNotDraw(false)
         isFocusable = true
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-            AndroidComposeViewVerificationHelperMethods.focusable(
+            AndroidComposeViewVerificationHelperMethodsO.focusable(
                 this,
                 focusable = View.FOCUSABLE,
                 defaultFocusHighlightEnabled = false
@@ -416,6 +475,7 @@
         }
         isFocusableInTouchMode = true
         clipChildren = false
+        isTransitionGroup = true
         ViewCompat.setAccessibilityDelegate(this, accessibilityDelegate)
         ViewRootForTest.onViewCreatedCallback?.invoke(this)
         root.attach(this)
@@ -570,8 +630,9 @@
         }
     }
 
-    override fun measureAndLayout() {
-        val rootNodeResized = measureAndLayoutDelegate.measureAndLayout()
+    override fun measureAndLayout(sendPointerUpdate: Boolean) {
+        val resend = if (sendPointerUpdate) resendMotionEventOnLayout else null
+        val rootNodeResized = measureAndLayoutDelegate.measureAndLayout(resend)
         if (rootNodeResized) {
             requestLayout()
         }
@@ -608,7 +669,7 @@
                 wasMeasuredWithMultipleConstraints = true
             }
             measureAndLayoutDelegate.updateRootConstraints(constraints)
-            measureAndLayoutDelegate.measureAndLayout()
+            measureAndLayoutDelegate.measureAndLayout(resendMotionEventOnLayout)
             setMeasuredDimension(root.width, root.height)
             if (_androidViewsHandler != null) {
                 androidViewsHandler.measure(
@@ -741,8 +802,8 @@
             DirectionLeft -> Left
             DirectionUp -> Up
             DirectionDown -> Down
-            DirectionCenter -> In
-            Back -> Out
+            DirectionCenter, Enter, NumPadEnter -> In
+            Back, Escape -> Out
             else -> null
         }
     }
@@ -946,11 +1007,38 @@
     }
 
     private fun handleMotionEvent(motionEvent: MotionEvent): ProcessResult {
+        removeCallbacks(resendMotionEventRunnable)
         try {
             recalculateWindowPosition(motionEvent)
             forceUseMatrixCache = true
-            measureAndLayout()
+            measureAndLayout(sendPointerUpdate = false)
+            desiredPointerIcon = null
             val result = trace("AndroidOwner:onTouch") {
+                val isInBounds = isInBounds(motionEvent)
+                val action = motionEvent.actionMasked
+                val isMouseEvent = motionEvent.getToolType(0) == TOOL_TYPE_MOUSE
+                val lastEvent = previousMotionEvent
+                val wasMouseEvent = lastEvent?.getToolType(0) == TOOL_TYPE_MOUSE
+                if (!wasMouseEvent &&
+                    isInBounds &&
+                    isMouseEvent &&
+                    action != ACTION_CANCEL &&
+                    action != ACTION_HOVER_ENTER
+                ) {
+                    // We didn't previously have an enter event and we're getting our first
+                    // mouse event. Send a simulated enter event so that we have a consistent
+                    // enter/exit.
+                    sendSimulatedEvent(motionEvent, ACTION_HOVER_ENTER, motionEvent.eventTime)
+                } else if (!isMouseEvent && lastEvent != null && wasMouseEvent &&
+                    lastEvent.actionMasked != ACTION_HOVER_EXIT
+                ) {
+                    // The mouse cursor disappeared without sending an ACTION_HOVER_EXIT, so
+                    // we have to send that event.
+                    sendSimulatedEvent(lastEvent, ACTION_HOVER_EXIT, lastEvent.eventTime)
+                }
+                lastEvent?.recycle()
+                previousMotionEvent = MotionEvent.obtainNoHistory(motionEvent)
+
                 val pointerInputEvent =
                     motionEventAdapter.convertToPointerInputEvent(motionEvent, this)
                 if (pointerInputEvent != null) {
@@ -966,7 +1054,7 @@
                     pointerInputEventProcessor.process(
                         pointerInputEvent,
                         this,
-                        isInBounds(motionEvent)
+                        isInBounds
                     )
                 } else {
                     pointerInputEventProcessor.processCancel()
@@ -976,13 +1064,76 @@
                     )
                 }
             }
-            previousPosition = Offset(motionEvent.rawX, motionEvent.rawY)
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+                AndroidComposeViewVerificationHelperMethodsN.setPointerIcon(
+                    this,
+                    desiredPointerIcon
+                )
+            }
             return result
         } finally {
             forceUseMatrixCache = false
         }
     }
 
+    private fun sendSimulatedEvent(
+        motionEvent: MotionEvent,
+        action: Int,
+        eventTime: Long,
+        forceHover: Boolean = true
+    ) {
+        val oldAction = motionEvent.actionMasked
+        // don't send any events for pointers that are "up"
+        val upIndex = when (oldAction) {
+            ACTION_UP -> 0
+            ACTION_POINTER_UP -> motionEvent.actionIndex
+            else -> -1
+        }
+        val pointerCount = motionEvent.pointerCount - if (upIndex >= 0) 1 else 0
+        if (pointerCount == 0) {
+            return
+        }
+        val pointerProperties = Array(pointerCount) { MotionEvent.PointerProperties() }
+        val pointerCoords = Array(pointerCount) { MotionEvent.PointerCoords() }
+        for (i in 0 until pointerCount) {
+            val sourceIndex = i + if (upIndex < 0 || i < upIndex) 0 else 1
+            motionEvent.getPointerProperties(sourceIndex, pointerProperties[i])
+            motionEvent.getPointerCoords(sourceIndex, pointerCoords[i])
+        }
+        val buttonState = if (forceHover) 0 else motionEvent.buttonState
+
+        val downTime = if (motionEvent.downTime == motionEvent.eventTime) {
+            eventTime
+        } else {
+            motionEvent.downTime
+        }
+        val event = MotionEvent.obtain(
+            /* downTime */ downTime,
+            /* eventTime */ eventTime,
+            /* action */ action,
+            /* pointerCount */ pointerCount,
+            /* pointerProperties */ pointerProperties,
+            /* pointerCoords */ pointerCoords,
+            /* metaState */ motionEvent.metaState,
+            /* buttonState */ buttonState,
+            /* xPrecision */ motionEvent.xPrecision,
+            /* yPrecision */ motionEvent.yPrecision,
+            /* deviceId */ motionEvent.deviceId,
+            /* edgeFlags */ motionEvent.edgeFlags,
+            /* source */ motionEvent.source,
+            /* flags */ motionEvent.flags
+        )
+        val pointerInputEvent =
+            motionEventAdapter.convertToPointerInputEvent(event, this)!!
+
+        pointerInputEventProcessor.process(
+            pointerInputEvent,
+            this,
+            true
+        )
+        event.recycle()
+    }
+
     /**
      * This method is required to correctly support swipe-to-dismiss layouts on WearOS, which search
      * their children for scrollable views to determine whether or not to intercept touch events –
@@ -1140,7 +1291,8 @@
         if (event.pointerCount != 1) {
             return true
         }
-        return event.rawX != previousPosition.x || event.rawY != previousPosition.y
+        val lastEvent = previousMotionEvent
+        return lastEvent == null || event.rawX != lastEvent.rawX || event.rawY != lastEvent.rawY
     }
 
     private fun findViewByAccessibilityIdRootedAtCurrentView(
@@ -1169,6 +1321,17 @@
         return null
     }
 
+    private var desiredPointerIcon: PointerIcon? = null
+
+    override val pointerIconService: PointerIconService =
+        object : PointerIconService {
+            override var current: PointerIcon
+                get() = desiredPointerIcon ?: PointerIconDefaults.Default
+                set(value) {
+                    desiredPointerIcon = value
+                }
+        }
+
     /**
      * This overrides an @hide method in ViewGroup. Because of the @hide, the override keyword
      * cannot be used, but the override works anyway because the ViewGroup method is not final.
@@ -1240,6 +1403,8 @@
         preTransform(tmpCalculationMatrix)
     }
 
+    override fun shouldDelayChildPressedState(): Boolean = false
+
     companion object {
         private const val MaximumLayerCacheSize = 10
         private var systemPropertiesClass: Class<*>? = null
@@ -1303,12 +1468,12 @@
     { TextInputService(it) }
 
 /**
- * This class is here to ensure that the classes that use this API will get verified and can be
+ * These classes are here to ensure that the classes that use this API will get verified and can be
  * AOT compiled. It is expected that this class will soft-fail verification, but the classes
  * which use this method will pass.
  */
 @RequiresApi(Build.VERSION_CODES.O)
-internal object AndroidComposeViewVerificationHelperMethods {
+internal object AndroidComposeViewVerificationHelperMethodsO {
     @RequiresApi(Build.VERSION_CODES.O)
     @DoNotInline
     fun focusable(view: View, focusable: Int, defaultFocusHighlightEnabled: Boolean) {
@@ -1318,6 +1483,29 @@
     }
 }
 
+@RequiresApi(Build.VERSION_CODES.N)
+internal object AndroidComposeViewVerificationHelperMethodsN {
+    @DoNotInline
+    @RequiresApi(Build.VERSION_CODES.N)
+    fun setPointerIcon(view: View, icon: PointerIcon?) {
+        val iconToSet = when (icon) {
+            is AndroidPointerIcon ->
+                icon.pointerIcon
+            is AndroidPointerIconType ->
+                android.view.PointerIcon.getSystemIcon(view.context, icon.type)
+            else ->
+                android.view.PointerIcon.getSystemIcon(
+                    view.context,
+                    android.view.PointerIcon.TYPE_DEFAULT
+                )
+        }
+
+        if (view.pointerIcon != iconToSet) {
+            view.pointerIcon = iconToSet
+        }
+    }
+}
+
 /**
  * Sets this [Matrix] to be the result of this * [other]
  */
@@ -1363,7 +1551,3 @@
         m1[row, 2] * m2[2, column] +
         m1[row, 3] * m2[3, column]
 }
-
-private fun ComposeRect.toRect(): Rect {
-    return Rect(left.toInt(), top.toInt(), right.toInt(), bottom.toInt())
-}
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidViewsHandler.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidViewsHandler.android.kt
index ccf9091..c0e88da 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidViewsHandler.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidViewsHandler.android.kt
@@ -92,4 +92,6 @@
             }
         }
     }
+
+    override fun shouldDelayChildPressedState(): Boolean = false
 }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ComposeView.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ComposeView.android.kt
index 1768fea..78f6b1a 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ComposeView.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ComposeView.android.kt
@@ -376,6 +376,8 @@
         checkAddView()
         return super.addViewInLayout(child, index, params, preventRequestLayout)
     }
+
+    override fun shouldDelayChildPressedState(): Boolean = false
 }
 
 /**
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/OutlineResolver.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/OutlineResolver.android.kt
index bba2c16..6050279 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/OutlineResolver.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/OutlineResolver.android.kt
@@ -17,11 +17,13 @@
 package androidx.compose.ui.platform
 
 import android.os.Build
+import androidx.compose.ui.geometry.CornerRadius
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.geometry.RoundRect
 import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.geometry.isSimple
+import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.graphics.Outline
 import androidx.compose.ui.graphics.Path
 import androidx.compose.ui.graphics.RectangleShape
@@ -86,6 +88,22 @@
     private var usePathForClip = false
 
     /**
+     * Scratch path used for manually clipping in software backed canvases
+     */
+    private var tmpPath: Path? = null
+
+    /**
+     * Scratch [RoundRect] used for manually clipping round rects in software backed canvases
+     */
+    private var tmpRoundRect: RoundRect? = null
+
+    /**
+     * Radius value used for symmetric rounded shapes. For rectangular or path based outlines
+     * this value is 0f
+     */
+    private var roundedCornerRadius: Float = 0f
+
+    /**
      * Returns the Android Outline to be used in the layer.
      */
     val outline: AndroidOutline?
@@ -95,17 +113,42 @@
         }
 
     /**
-     * When a the layer doesn't support clipping of the outline, this returns the Path
-     * that should be used to manually clip. When the layer does support manual clipping
-     * or there is no outline, this returns null.
+     * Determines if the particular outline shape or path supports clipping.
+     * True for rect or symmetrical round rects.
+     * This method is used to determine if the framework can handle clipping to the outline
+     * for a particular shape. If not, then the clipped path must be applied directly to the canvas.
+     */
+    val outlineClipSupported: Boolean
+        get() = !usePathForClip
+
+    /**
+     * Returns the path used to manually clip regardless if the layer supports clipping or not.
+     * In some cases (i.e. software rendering) clipping must be done manually.
+     * Consumers should query whether or not the layer will handle clipping with
+     * [outlineClipSupported] first before applying the clip manually.
+     * Or when rendering in software, the clip path provided here must always be clipped manually.
      */
     val clipPath: Path?
         get() {
             updateCache()
-            return if (usePathForClip) outlinePath else null
+            return outlinePath
         }
 
     /**
+     * Returns the top left offset for a rectangular, or rounded rect outline (regardless if it
+     * is symmetric or asymmetric)
+     * For path based outlines this returns [Offset.Zero]
+     */
+    private var rectTopLeft: Offset = Offset.Zero
+
+    /**
+     * Returns the size for a rectangular, or rounded rect outline (regardless if it
+     * is symmetric or asymmetric)
+     * For path based outlines this returns [Size.Zero]
+     */
+    private var rectSize: Size = Size.Zero
+
+    /**
      * True when we are going to clip or have a non-zero elevation for shadows.
      */
     private var outlineNeeded = false
@@ -162,6 +205,57 @@
     }
 
     /**
+     * Manually applies the clip to the provided canvas based on the given outline.
+     * This is used in scenarios where clipping must be applied manually either because
+     * the outline cannot be clipped automatically for specific shapes or if the
+     * layer is being rendered in software
+     */
+    fun clipToOutline(canvas: Canvas) {
+        // If we have a clip path that means we are clipping to an arbitrary path or
+        // a rounded rect with non-uniform corner radii
+        val targetPath = clipPath
+        if (targetPath != null) {
+            canvas.clipPath(targetPath)
+        } else {
+            // If we have a non-zero radius, that means we are clipping to a symmetrical
+            // rounded rectangle.
+            // Canvas does not include a clipRoundRect API so create a path with the round rect
+            // and clip to the given path/
+            if (roundedCornerRadius > 0f) {
+                var roundRectClipPath = tmpPath
+                var roundRect = tmpRoundRect
+                if (roundRectClipPath == null ||
+                    !roundRect.isSameBounds(rectTopLeft, rectSize, roundedCornerRadius)) {
+                    roundRect = RoundRect(
+                        left = rectTopLeft.x,
+                        top = rectTopLeft.y,
+                        right = rectTopLeft.x + rectSize.width,
+                        bottom = rectTopLeft.y + rectSize.height,
+                        cornerRadius = CornerRadius(roundedCornerRadius)
+                    )
+                    if (roundRectClipPath == null) {
+                        roundRectClipPath = Path()
+                    } else {
+                        roundRectClipPath.reset()
+                    }
+                    roundRectClipPath.addRoundRect(roundRect)
+                    tmpRoundRect = roundRect
+                    tmpPath = roundRectClipPath
+                }
+                canvas.clipPath(roundRectClipPath)
+            } else {
+                // ... otherwise, just clip to the bounds of the rect
+                canvas.clipRect(
+                    left = rectTopLeft.x,
+                    top = rectTopLeft.y,
+                    right = rectTopLeft.x + rectSize.width,
+                    bottom = rectTopLeft.y + rectSize.height,
+                )
+            }
+        }
+    }
+
+    /**
      * Updates the size.
      */
     fun update(size: Size) {
@@ -173,6 +267,10 @@
 
     private fun updateCache() {
         if (cacheIsDirty) {
+            rectTopLeft = Offset.Zero
+            rectSize = size
+            roundedCornerRadius = 0f
+            outlinePath = null
             cacheIsDirty = false
             usePathForClip = false
             if (outlineNeeded && size.width > 0.0f && size.height > 0.0f) {
@@ -194,6 +292,8 @@
     }
 
     private fun updateCacheWithRect(rect: Rect) {
+        rectTopLeft = Offset(rect.left, rect.top)
+        rectSize = Size(rect.width, rect.height)
         cachedOutline.setRect(
             rect.left.roundToInt(),
             rect.top.roundToInt(),
@@ -204,6 +304,8 @@
 
     private fun updateCacheWithRoundRect(roundRect: RoundRect) {
         val radius = roundRect.topLeftCornerRadius.x
+        rectTopLeft = Offset(roundRect.left, roundRect.top)
+        rectSize = Size(roundRect.width, roundRect.height)
         if (roundRect.isSimple) {
             cachedOutline.setRoundRect(
                 roundRect.left.roundToInt(),
@@ -212,6 +314,7 @@
                 roundRect.bottom.roundToInt(),
                 radius
             )
+            roundedCornerRadius = radius
         } else {
             val path = cachedRrectPath ?: Path().also { cachedRrectPath = it }
             path.reset()
@@ -234,9 +337,19 @@
         outlinePath = composePath
     }
 
-    companion object {
-        // Because we only use these on the main thread, we can allocate just one
-        private val tmpOpPath = Path()
-        private val tmpTouchPointPath = Path()
+    /**
+     * Helper method to see if the RoundRect has the same bounds as the offset as well as the same
+     * corner radius. If the RoundRect does not have symmetrical corner radii this method always
+     * returns false
+     */
+    private fun RoundRect?.isSameBounds(offset: Offset, size: Size, radius: Float): Boolean {
+        if (this == null || !isSimple) {
+            return false
+        }
+        return left == offset.x &&
+            top == offset.y &&
+            right == (offset.x + size.width) &&
+            bottom == (offset.y + size.height) &&
+            topLeftCornerRadius.x == radius
     }
 }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeLayer.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeLayer.android.kt
index 5fd931c..86bd8a6 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeLayer.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/RenderNodeLayer.android.kt
@@ -24,6 +24,7 @@
 import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.graphics.Canvas
 import androidx.compose.ui.graphics.CanvasHolder
+import androidx.compose.ui.graphics.Paint
 import androidx.compose.ui.graphics.RectangleShape
 import androidx.compose.ui.graphics.RenderEffect
 import androidx.compose.ui.graphics.Shape
@@ -61,6 +62,12 @@
     private var isDestroyed = false
     private var drawnWithZ = false
 
+    /**
+     * Optional paint used when the RenderNode is rendered on a software backed
+     * canvas and is somewhat transparent (i.e. alpha less than 1.0f)
+     */
+    private var softwareLayerPaint: Paint? = null
+
     private val matrixCache = LayerMatrixCache(getMatrix)
 
     private val canvasHolder = CanvasHolder()
@@ -116,7 +123,7 @@
         density: Density
     ) {
         this.transformOrigin = transformOrigin
-        val wasClippingManually = renderNode.clipToOutline && outlineResolver.clipPath != null
+        val wasClippingManually = renderNode.clipToOutline && !outlineResolver.outlineClipSupported
         renderNode.scaleX = scaleX
         renderNode.scaleY = scaleY
         renderNode.alpha = alpha
@@ -141,7 +148,7 @@
             density
         )
         renderNode.setOutline(outlineResolver.outline)
-        val isClippingManually = renderNode.clipToOutline && outlineResolver.clipPath != null
+        val isClippingManually = renderNode.clipToOutline && !outlineResolver.outlineClipSupported
         if (wasClippingManually != isClippingManually || (isClippingManually && shapeChanged)) {
             invalidate()
         } else {
@@ -233,15 +240,54 @@
                 canvas.disableZ()
             }
         } else {
+            val left = renderNode.left.toFloat()
+            val top = renderNode.top.toFloat()
+            val right = renderNode.right.toFloat()
+            val bottom = renderNode.bottom.toFloat()
+            // If there is alpha applied, we must render into an offscreen buffer to
+            // properly blend the contents of this layer against the background content
+            if (renderNode.alpha < 1.0f) {
+                val paint = (softwareLayerPaint ?: Paint().also { softwareLayerPaint = it })
+                    .apply { alpha = renderNode.alpha }
+                androidCanvas.saveLayer(
+                    left,
+                    top,
+                    right,
+                    bottom,
+                    paint.asFrameworkPaint()
+                )
+            } else {
+                canvas.save()
+            }
+            // If we are software rendered we must translate the canvas based on the offset provided
+            // in the move call which operates directly on the RenderNode
+            canvas.translate(left, top)
+            canvas.concat(matrixCache.calculateMatrix(renderNode))
+            clipRenderNode(canvas)
             drawBlock?.invoke(canvas)
+            canvas.restore()
             isDirty = false
         }
     }
 
+    /**
+     * Manually clips the content of the RenderNodeLayer in the provided canvas.
+     * This is used only in software rendered use cases
+     */
+    private fun clipRenderNode(canvas: Canvas) {
+        if (renderNode.clipToOutline || renderNode.clipToBounds) {
+            outlineResolver.clipToOutline(canvas)
+        }
+    }
+
     override fun updateDisplayList() {
         if (isDirty || !renderNode.hasDisplayList) {
             isDirty = false
-            val clipPath = if (renderNode.clipToOutline) outlineResolver.clipPath else null
+            val clipPath = if (renderNode.clipToOutline && !outlineResolver.outlineClipSupported) {
+                outlineResolver.clipPath
+            } else {
+                null
+            }
             renderNode.record(canvasHolder, clipPath, drawBlock!!)
         }
     }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewLayer.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewLayer.android.kt
index d86630d..9f36649 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewLayer.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ViewLayer.android.kt
@@ -56,7 +56,11 @@
     private var clipToBounds = false
     private var clipBoundsCache: android.graphics.Rect? = null
     private val manualClipPath: Path? get() =
-        if (!clipToOutline) null else outlineResolver.clipPath
+        if (!clipToOutline || outlineResolver.outlineClipSupported) {
+            null
+        } else {
+            outlineResolver.clipPath
+        }
     var isInvalidated = false
         private set(value) {
             if (value != field) {
@@ -251,13 +255,15 @@
     override fun dispatchDraw(canvas: android.graphics.Canvas) {
         isInvalidated = false
         canvasHolder.drawInto(canvas) {
+            var didClip = false
             val clipPath = manualClipPath
-            if (clipPath != null) {
+            if (clipPath != null || !canvas.isHardwareAccelerated) {
+                didClip = true
                 save()
-                clipPath(clipPath)
+                outlineResolver.clipToOutline(this)
             }
             drawBlock?.invoke(this)
-            if (clipPath != null) {
+            if (didClip) {
                 restore()
             }
         }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/AndroidViewHolder.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/AndroidViewHolder.android.kt
index 89ac146..ac97836 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/AndroidViewHolder.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/viewinterop/AndroidViewHolder.android.kt
@@ -373,6 +373,10 @@
             MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
         }
     }
+
+    // TODO: b/203141462 - consume whether the AndroidView() is inside a scrollable container, and
+    //  use that to set this. In the meantime set true as the defensive default.
+    override fun shouldDelayChildPressedState(): Boolean = true
 }
 
 private fun View.layoutAccordingTo(layoutNode: LayoutNode) {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/InputModeManager.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/InputModeManager.kt
index c4e69bc..4c1f2aa 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/InputModeManager.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/InputModeManager.kt
@@ -47,9 +47,9 @@
 @Suppress("INLINE_CLASS_DEPRECATED")
 inline class InputMode internal constructor (@Suppress("unused") private val value: Int) {
     override fun toString() = when (this) {
-        Touch -> "touch mode"
-        Keyboard -> "Keyboard mode"
-        else -> "invalid mode"
+        Touch -> "Touch"
+        Keyboard -> "Keyboard"
+        else -> "Error"
     }
 
     companion object {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/HitPathTracker.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/HitPathTracker.kt
index f1e51280..e49c331 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/HitPathTracker.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/HitPathTracker.kt
@@ -453,7 +453,7 @@
     }
 
     private fun isCursorEvent(event: PointerEvent): Boolean {
-        return event.changes.size == 1 && event.changes[0].type != PointerType.Touch
+        return event.changes.size == 1 && event.changes[0].type == PointerType.Mouse
     }
 
     override fun cleanUpHits() {
@@ -471,8 +471,10 @@
                 }
             }
         } else {
-            // Clear when hover exit
-            if (event.type == PointerEventType.Exit && !event.buttons.areAnyPressed) {
+            // Clear when hover exit or "up" after exiting.
+            if ((event.type == PointerEventType.Exit && !event.buttons.areAnyPressed) ||
+                (!event.buttons.areAnyPressed && !isIn)
+            ) {
                 pointerIds.clear()
             }
         }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerIcon.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerIcon.kt
new file mode 100644
index 0000000..0275cb5
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerIcon.kt
@@ -0,0 +1,86 @@
+/*
+ * 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.ui.input.pointer
+
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.composed
+import androidx.compose.ui.platform.LocalPointerIconService
+import androidx.compose.ui.platform.debugInspectorInfo
+
+@ExperimentalComposeUiApi
+object PointerIconDefaults {
+    val Default = pointerIconDefault
+    val Crosshair = pointerIconCrosshair
+    val Text = pointerIconText
+    val Hand = pointerIconHand
+}
+
+/**
+ * Represents a pointer icon to use in [Modifier.pointerHoverIcon]
+ */
+interface PointerIcon
+
+internal expect val pointerIconDefault: PointerIcon
+internal expect val pointerIconCrosshair: PointerIcon
+internal expect val pointerIconText: PointerIcon
+internal expect val pointerIconHand: PointerIcon
+
+internal interface PointerIconService {
+    var current: PointerIcon
+}
+
+/**
+ * Creates modifier which specifies desired pointer icon when the cursor is over the modified
+ * element.
+ *
+ * @sample androidx.compose.ui.samples.PointerIconSample
+ *
+ * @param icon The icon to set
+ * @param overrideDescendants when false (by default) descendants are able to set their own pointer
+ * icon. if true it overrides descendants' icon.
+ */
+fun Modifier.pointerHoverIcon(icon: PointerIcon, overrideDescendants: Boolean = false) =
+    composed(
+        inspectorInfo = debugInspectorInfo {
+            name = "pointerHoverIcon"
+            properties["icon"] = icon
+            properties["overrideDescendants"] = overrideDescendants
+        }
+    ) {
+        val pointerIconService = LocalPointerIconService.current
+        if (pointerIconService == null) {
+            Modifier
+        } else {
+            this.pointerInput(icon, overrideDescendants) {
+                awaitPointerEventScope {
+                    while (true) {
+                        val pass = if (overrideDescendants)
+                            PointerEventPass.Main
+                        else
+                            PointerEventPass.Initial
+                        val event = awaitPointerEvent(pass)
+                        when (event.type) {
+                            PointerEventType.Enter, PointerEventType.Move -> {
+                                pointerIconService.current = icon
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
\ No newline at end of file
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/RelocationModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/RelocationModifier.kt
index 5bb3cc7..10920af 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/RelocationModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/RelocationModifier.kt
@@ -19,8 +19,6 @@
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Rect
-import androidx.compose.ui.platform.InspectorValueInfo
-import androidx.compose.ui.platform.debugInspectorInfo
 
 /**
  * A [modifier][Modifier.Element] that can be used to respond to relocation requests to relocate
@@ -33,11 +31,14 @@
  * compute their destinations, the framework calls [performRelocation](source, destination)
  * which performs the actual relocation (scrolling).
  *
- * @sample androidx.compose.ui.samples.BringIntoViewSample
- *
  * @see RelocationRequester
  */
+@Suppress("unused", "DeprecatedCallableAddReplaceWith")
 @ExperimentalComposeUiApi
+@Deprecated(
+    message = "Please use BringIntoViewResponder instead.",
+    level = DeprecationLevel.ERROR
+)
 interface RelocationModifier : Modifier.Element {
     /**
      * Compute the destination given the source rectangle and current bounds.
@@ -55,14 +56,15 @@
     suspend fun performRelocation(source: Rect, destination: Rect)
 }
 
-private val debugInspectorInfo = debugInspectorInfo { name = "onRelocationRequest" }
-
 /**
  * Add this modifier to respond to requests to bring an item into view.
- *
- * @sample androidx.compose.ui.samples.BringIntoViewSample
  */
+@Suppress("UNUSED_PARAMETER", "unused", "DeprecatedCallableAddReplaceWith")
 @ExperimentalComposeUiApi
+@Deprecated(
+    message = "Please use BringIntoViewResponder instead.",
+    level = DeprecationLevel.ERROR
+)
 fun Modifier.onRelocationRequest(
     /**
      * Provide the destination given the source rectangle and current bounds.
@@ -78,19 +80,4 @@
      * source rect to the destination location. (This is usually achieved by scrolling).
      */
     onPerformRelocation: suspend (sourceRect: Rect, destinationRect: Rect) -> Unit
-): Modifier {
-    return then(
-        object : RelocationModifier, InspectorValueInfo(debugInspectorInfo) {
-            override fun computeDestination(
-                source: Rect,
-                layoutCoordinates: LayoutCoordinates
-            ): Rect {
-                return onProvideDestination(source, layoutCoordinates)
-            }
-
-            override suspend fun performRelocation(source: Rect, destination: Rect) {
-                onPerformRelocation(source, destination)
-            }
-        }
-    )
-}
+): Modifier = this
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/RelocationRequester.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/RelocationRequester.kt
index 1d2e67d..9159f7f 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/RelocationRequester.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/RelocationRequester.kt
@@ -16,32 +16,25 @@
 
 package androidx.compose.ui.layout
 
-import androidx.compose.runtime.collection.MutableVector
-import androidx.compose.runtime.collection.mutableVectorOf
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.geometry.Rect
-import androidx.compose.ui.geometry.toRect
-import androidx.compose.ui.platform.ifDebug
-import androidx.compose.ui.unit.toSize
 
 /**
  * This class can be used to send relocation requests. Pass it as a parameter to
  * [Modifier.relocationRequester()][relocationRequester].
- *
- * For instance, you can call [RelocationRequester.bringIntoView][bringIntoView] to
- * make all the scrollable parents scroll so that the specified item is brought into parent
- * bounds. This sample demonstrates this use case:
- *
- * Here is a sample where a composable is brought into view:
- * @sample androidx.compose.ui.samples.BringIntoViewSample
- *
- * Here is a sample where a part of a composable is brought into view:
- * @sample androidx.compose.ui.samples.BringPartOfComposableIntoViewSample
  */
 @ExperimentalComposeUiApi
-class RelocationRequester {
-    internal val modifiers: MutableVector<RelocationRequesterModifier> = mutableVectorOf()
+@Suppress("UNUSED_PARAMETER", "RedundantSuspendModifier")
+@Deprecated(
+    message = "Please use BringIntoViewRequester instead.",
+    replaceWith = ReplaceWith(
+        "BringIntoViewRequester",
+        "androidx.compose.foundation.relocation.BringIntoViewRequester"
 
+    ),
+    level = DeprecationLevel.ERROR
+)
+class RelocationRequester {
     /**
      * Bring this item into bounds by making all the scrollable parents scroll appropriately.
      *
@@ -49,21 +42,15 @@
      * don't specify the coordinates, the coordinates of the
      * [Modifier.relocationRequester()][relocationRequester] associated with this
      * [RelocationRequester] will be used.
-     *
-     * Here is a sample where a composable is brought into view:
-     * @sample androidx.compose.ui.samples.BringIntoViewSample
-     *
-     * Here is a sample where a part of a composable is brought into view:
-     * @sample androidx.compose.ui.samples.BringPartOfComposableIntoViewSample
      */
-    suspend fun bringIntoView(rect: Rect? = null) {
-        modifiers.forEach {
-            val node = it.relocationRequesterNode
-            when {
-                rect != null -> it.bringRectIntoView(rect)
-                node.isAttached -> it.bringRectIntoView(node.size.toSize().toRect())
-                else -> ifDebug { println("Cannot calculate rectangle to be brought into view") }
-            }
-        }
-    }
+    @Deprecated(
+        message = "Please use BringIntoViewRequester instead.",
+        replaceWith = ReplaceWith(
+            "bringIntoView",
+            "androidx.compose.foundation.relocation.BringIntoViewRequester"
+
+        ),
+        level = DeprecationLevel.ERROR
+    )
+    suspend fun bringIntoView(rect: Rect? = null) {}
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/RelocationRequesterModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/RelocationRequesterModifier.kt
index f404a41..1bef983 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/RelocationRequesterModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/RelocationRequesterModifier.kt
@@ -16,51 +16,24 @@
 
 package androidx.compose.ui.layout
 
-import androidx.compose.runtime.DisposableEffect
-import androidx.compose.runtime.remember
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.composed
-import androidx.compose.ui.geometry.Rect
-import androidx.compose.ui.node.ModifiedRelocationRequesterNode
-import androidx.compose.ui.platform.debugInspectorInfo
-
-// This modifier keeps track of the coordinates when the item is positioned, and when
-// bringIntoParentBounds() is called, it asks parents to scroll to bring this item into view.
-internal class RelocationRequesterModifier : Modifier.Element {
-
-    lateinit var relocationRequesterNode: ModifiedRelocationRequesterNode
-
-    // TODO(b/191393349): Consider adding public API to RelocationRequester to let users specify
-    //  the rectangle that they want to bring inView.
-    suspend fun bringRectIntoView(rect: Rect) {
-        // Ask parents to scroll (or perform some other operation) so that the item is visible.
-        relocationRequesterNode.propagateRelocationRequest(rect)
-    }
-}
 
 /**
  * This is a modifier that can be used to send relocation requests.
  *
- * Here is an example where the a [relocationRequester] can be used to bring an item into parent
- * bounds. It demonstrates how a composable can ask its parents to scroll so that the component
- * using this modifier is brought into the bounds of all its parents.
- * @sample androidx.compose.ui.samples.BringIntoViewSample
- *
  * @param relocationRequester an instance of [RelocationRequester]. This hoisted object can be
  * used to send relocation requests to parents of the current composable.
  */
 @ExperimentalComposeUiApi
-fun Modifier.relocationRequester(relocationRequester: RelocationRequester): Modifier = composed(
-    inspectorInfo = debugInspectorInfo {
-        name = "relocationRequester"
-        properties["relocationRequester"] = relocationRequester
-    }
-) {
-    val modifier = remember { RelocationRequesterModifier() }
-    DisposableEffect(relocationRequester) {
-        relocationRequester.modifiers += modifier
-        onDispose { relocationRequester.modifiers -= modifier }
-    }
-    modifier
-}
+@Suppress("UNUSED_PARAMETER")
+@Deprecated(
+    message = "Please use bringIntoViewRequester instead.",
+    replaceWith = ReplaceWith(
+        "bringIntoViewRequester",
+        "androidx.compose.foundation.relocation.bringIntoViewRequester"
+
+    ),
+    level = DeprecationLevel.ERROR
+)
+fun Modifier.relocationRequester(relocationRequester: Any): Modifier = this
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt
index f285a7b..c5d5c58 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt
@@ -17,7 +17,6 @@
 
 import androidx.compose.runtime.collection.MutableVector
 import androidx.compose.runtime.collection.mutableVectorOf
-import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.DrawModifier
 import androidx.compose.ui.focus.FocusEventModifier
@@ -46,8 +45,6 @@
 import androidx.compose.ui.layout.OnRemeasuredModifier
 import androidx.compose.ui.layout.ParentDataModifier
 import androidx.compose.ui.layout.Placeable
-import androidx.compose.ui.layout.RelocationModifier
-import androidx.compose.ui.layout.RelocationRequesterModifier
 import androidx.compose.ui.layout.Remeasurement
 import androidx.compose.ui.layout.RemeasurementModifier
 import androidx.compose.ui.modifier.ModifierLocalConsumer
@@ -680,11 +677,16 @@
                     // it's draw bounds reflect the dimensions defined by the LayoutModifier.
                     // Please ensure that ModifierLocalProvider is the first item here so that
                     // other layoutNodeWrappers don't accidentally use values that they provided.
-                    // Also ensure that ModifierLocalConsumer is the last item here, so that the
-                    // other modifiers can access ModifierLocals read by the ModifierLocalConsumer.
+                    // Also ensure that ModifierLocalConsumer is the next item here, so that it is
+                    // created after all the other LayoutNodeWrappers are created, (So that the
+                    // other layoutNodeWrappers are initialized by the time
+                    // onModifierLocalsUpdated() is called.
                     if (mod is ModifierLocalProvider<*>) {
                         wrapper = ModifierLocalProviderNode(wrapper, mod).assignChained(toWrap)
                     }
+                    if (mod is ModifierLocalConsumer) {
+                        wrapper = ModifierLocalConsumerNode(wrapper, mod).assignChained(toWrap)
+                    }
                     if (mod is DrawModifier) {
                         wrapper = ModifiedDrawNode(wrapper, mod)
                     }
@@ -709,14 +711,6 @@
                     if (mod is NestedScrollModifier) {
                         wrapper = NestedScrollDelegatingWrapper(wrapper, mod).assignChained(toWrap)
                     }
-                    @OptIn(ExperimentalComposeUiApi::class)
-                    if (mod is RelocationModifier) {
-                        wrapper = ModifiedRelocationNode(wrapper, mod).assignChained(toWrap)
-                    }
-                    if (mod is RelocationRequesterModifier) {
-                        wrapper = ModifiedRelocationRequesterNode(wrapper, mod)
-                            .assignChained(toWrap)
-                    }
                     if (mod is LayoutModifier) {
                         wrapper = ModifiedLayoutNode(wrapper, mod).assignChained(toWrap)
                     }
@@ -734,9 +728,6 @@
                             OnGloballyPositionedModifierWrapper(wrapper, mod).assignChained(toWrap)
                         getOrCreateOnPositionedCallbacks() += wrapper
                     }
-                    if (mod is ModifierLocalConsumer) {
-                        wrapper = ModifierLocalConsumerNode(wrapper, mod).assignChained(toWrap)
-                    }
                 }
                 wrapper
             }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MeasureAndLayoutDelegate.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MeasureAndLayoutDelegate.kt
index 02ec181..37261ac 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MeasureAndLayoutDelegate.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/MeasureAndLayoutDelegate.kt
@@ -187,7 +187,7 @@
     /**
      * Iterates through all LayoutNodes that have requested layout and measures and lays them out
      */
-    fun measureAndLayout(): Boolean {
+    fun measureAndLayout(onLayout: (() -> Unit)? = null): Boolean {
         require(root.isAttached)
         require(root.isPlaced)
         require(!duringMeasureLayout)
@@ -233,6 +233,7 @@
                 duringMeasureLayout = false
             }
             consistencyChecker?.assertConsistent()
+            onLayout?.invoke()
         }
         return rootNodeResized
     }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifiedFocusNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifiedFocusNode.kt
index 77e9c95..06b1f4d 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifiedFocusNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifiedFocusNode.kt
@@ -33,13 +33,20 @@
 
 internal class ModifiedFocusNode(
     wrapped: LayoutNodeWrapper,
-    modifier: FocusModifier
-) : DelegatingLayoutNodeWrapper<FocusModifier>(wrapped, modifier) {
+    focusModifier: FocusModifier
+) : DelegatingLayoutNodeWrapper<FocusModifier>(wrapped, focusModifier) {
 
     init {
-        modifier.focusNode = this
+        focusModifier.focusNode = this
     }
 
+    override var modifier: FocusModifier
+        get() = super.modifier
+        set(value) {
+            super.modifier = value
+            value.focusNode = this
+        }
+
     var focusState: FocusStateImpl
         get() = modifier.focusState
         set(value) {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifiedKeyInputNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifiedKeyInputNode.kt
index 17b728f..3a38ad1 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifiedKeyInputNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifiedKeyInputNode.kt
@@ -19,13 +19,22 @@
 import androidx.compose.ui.input.key.KeyEvent
 import androidx.compose.ui.input.key.KeyInputModifier
 
-internal class ModifiedKeyInputNode(wrapped: LayoutNodeWrapper, modifier: KeyInputModifier) :
-    DelegatingLayoutNodeWrapper<KeyInputModifier>(wrapped, modifier) {
+internal class ModifiedKeyInputNode(
+    wrapped: LayoutNodeWrapper,
+    keyInputModifier: KeyInputModifier
+) : DelegatingLayoutNodeWrapper<KeyInputModifier>(wrapped, keyInputModifier) {
 
     init {
-        modifier.keyInputNode = this
+        keyInputModifier.keyInputNode = this
     }
 
+    override var modifier: KeyInputModifier
+        get() = super.modifier
+        set(value) {
+            super.modifier = value
+            value.keyInputNode = this
+        }
+
     override fun findPreviousKeyInputWrapper() = this
 
     override fun findNextKeyInputWrapper() = this
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifiedRelocationNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifiedRelocationNode.kt
deleted file mode 100644
index 119f17b..0000000
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifiedRelocationNode.kt
+++ /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.compose.ui.node
-
-import androidx.compose.ui.ExperimentalComposeUiApi
-import androidx.compose.ui.geometry.Rect
-import androidx.compose.ui.layout.RelocationModifier
-import kotlinx.coroutines.currentCoroutineContext
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
-
-@ExperimentalComposeUiApi
-internal class ModifiedRelocationNode(
-    wrapped: LayoutNodeWrapper,
-    modifier: RelocationModifier
-) : DelegatingLayoutNodeWrapper<RelocationModifier>(wrapped, modifier) {
-
-    override suspend fun propagateRelocationRequest(rect: Rect) {
-        // Compute the position of the item after it is brought within this node's bounding box.
-        val destinationRect = modifier.computeDestination(rect, this)
-
-        // Perform the relocation for this node, and send a relocation request to its parents.
-        //
-        // Note: For now we run both of these in parallel, but in the future we could make this
-        // configurable. (The child relocation could be executed before the parent, or parent before
-        // the child).
-        withContext(currentCoroutineContext()) {
-            launch { modifier.performRelocation(rect, destinationRect) }
-            launch { super.propagateRelocationRequest(destinationRect) }
-        }
-    }
-}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/Owner.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/Owner.kt
index c975eb4..4360215 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/Owner.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/Owner.kt
@@ -25,6 +25,7 @@
 import androidx.compose.ui.hapticfeedback.HapticFeedback
 import androidx.compose.ui.input.InputModeManager
 import androidx.compose.ui.input.key.KeyEvent
+import androidx.compose.ui.input.pointer.PointerIconService
 import androidx.compose.ui.platform.AccessibilityManager
 import androidx.compose.ui.platform.ClipboardManager
 import androidx.compose.ui.platform.TextToolbar
@@ -104,6 +105,8 @@
 
     val textInputService: TextInputService
 
+    val pointerIconService: PointerIconService
+
     /**
      * Provide a focus manager that controls focus within Compose.
      */
@@ -172,9 +175,11 @@
     fun requestFocus(): Boolean
 
     /**
-     * Iterates through all LayoutNodes that have requested layout and measures and lays them out
+     * Iterates through all LayoutNodes that have requested layout and measures and lays them out.
+     * If [sendPointerUpdate] is `true` then a simulated PointerEvent may be sent to update pointer
+     * input handlers.
      */
-    fun measureAndLayout()
+    fun measureAndLayout(sendPointerUpdate: Boolean = true)
 
     /**
      * Creates an [OwnedLayer] which will be drawing the passed [drawBlock].
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/CompositionLocals.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/CompositionLocals.kt
index 57eb120..4cdbf5a 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/CompositionLocals.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/CompositionLocals.kt
@@ -26,6 +26,7 @@
 import androidx.compose.ui.focus.FocusManager
 import androidx.compose.ui.hapticfeedback.HapticFeedback
 import androidx.compose.ui.input.InputModeManager
+import androidx.compose.ui.input.pointer.PointerIconService
 import androidx.compose.ui.layout.Layout
 import androidx.compose.ui.node.Owner
 import androidx.compose.ui.text.font.Font
@@ -151,6 +152,10 @@
     noLocalProvidedFor("LocalWindowInfo")
 }
 
+internal val LocalPointerIconService = staticCompositionLocalOf<PointerIconService?> {
+    null
+}
+
 @ExperimentalComposeUiApi
 @Composable
 internal fun ProvideCommonCompositionLocals(
@@ -174,6 +179,7 @@
         LocalUriHandler provides uriHandler,
         LocalViewConfiguration provides owner.viewConfiguration,
         LocalWindowInfo provides owner.windowInfo,
+        LocalPointerIconService provides owner.pointerIconService,
         content = content
     )
 }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/ComposeScene.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/ComposeScene.desktop.kt
index 0e457f9..5ecc568 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/ComposeScene.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/ComposeScene.desktop.kt
@@ -15,463 +15,36 @@
  */
 package androidx.compose.ui
 
-import androidx.compose.runtime.BroadcastFrameClock
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.Composition
-import androidx.compose.runtime.CompositionContext
-import androidx.compose.runtime.CompositionLocalProvider
-import androidx.compose.runtime.LaunchedEffect
-import androidx.compose.runtime.Recomposer
-import androidx.compose.runtime.rememberCoroutineScope
-import androidx.compose.runtime.snapshots.Snapshot
-import androidx.compose.runtime.staticCompositionLocalOf
-import androidx.compose.runtime.withFrameNanos
 import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.input.key.KeyEvent
-import androidx.compose.ui.input.mouse.MouseScrollEvent
-import androidx.compose.ui.input.mouse.MouseScrollOrientation
-import androidx.compose.ui.input.mouse.MouseScrollUnit
 import androidx.compose.ui.input.pointer.PointerEventType
 import androidx.compose.ui.input.pointer.PointerId
 import androidx.compose.ui.input.pointer.PointerInputEvent
 import androidx.compose.ui.input.pointer.PointerInputEventData
 import androidx.compose.ui.input.pointer.PointerType
-import androidx.compose.ui.node.LayoutNode
-import androidx.compose.ui.platform.DesktopComponent
-import androidx.compose.ui.platform.DesktopOwner
-import androidx.compose.ui.platform.DesktopPlatformInput
-import androidx.compose.ui.platform.DesktopRootForTest
-import androidx.compose.ui.platform.DummyDesktopComponent
-import androidx.compose.ui.platform.EmptyDispatcher
-import androidx.compose.ui.platform.FlushCoroutineDispatcher
-import androidx.compose.ui.platform.GlobalSnapshotManager
-import androidx.compose.ui.platform.setContent
-import androidx.compose.ui.node.RootForTest
-import androidx.compose.ui.unit.Constraints
-import androidx.compose.ui.unit.Density
-import androidx.compose.ui.unit.IntSize
-import androidx.compose.ui.unit.dp
-import androidx.compose.ui.window.Popup
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.CoroutineStart
-import kotlinx.coroutines.Job
-import kotlinx.coroutines.launch
-import org.jetbrains.skia.Canvas
 import java.awt.event.InputMethodEvent
 import java.awt.event.MouseEvent
-import kotlin.coroutines.CoroutineContext
-import androidx.compose.ui.input.key.KeyEvent as ComposeKeyEvent
 
-internal val LocalComposeScene = staticCompositionLocalOf<ComposeScene> {
-    error("CompositionLocal LocalComposeScene not provided")
-}
-
-/**
- * Virtual container that encapsulates Compose UI content. UI content can be constructed via
- * [setContent] method and with any Composable that manipulates [LayoutNode] tree.
- *
- * To draw content on [Canvas], you can use [render] method.
- *
- * To specify available size for the content, you should use [constraints].
- *
- * After [ComposeScene] will no longer needed, you should call [dispose] method, so all resources
- * and subscriptions will be properly closed. Otherwise there can be a memory leak.
- */
-class ComposeScene internal constructor(
-    coroutineContext: CoroutineContext,
-    component: DesktopComponent,
-    density: Density,
-    private val invalidate: () -> Unit
-) {
-    /**
-     * Constructs [ComposeScene]
-     *
-     * @param coroutineContext Context which will be used to launch effects ([LaunchedEffect],
-     * [rememberCoroutineScope]) and run recompositions.
-     * @param density Initial density of the content which will be used to convert [dp] units.
-     * @param invalidate Callback which will be called when the content need to be recomposed or
-     * rerendered. If you draw your content using [render] method, in this callback you should
-     * schedule the next [render] in your rendering loop.
-     */
-    constructor(
-        coroutineContext: CoroutineContext = EmptyDispatcher,
-        density: Density = Density(1f),
-        invalidate: () -> Unit = {}
-    ) : this(
-        coroutineContext,
-        DummyDesktopComponent,
-        density,
-        invalidate
-    )
-
-    private var isInvalidationDisabled = false
-
-    @Volatile
-    private var hasPendingDraws = true
-    private inline fun postponeInvalidation(block: () -> Unit) {
-        isInvalidationDisabled = true
-        try {
-            block()
-        } finally {
-            isInvalidationDisabled = false
-        }
-        invalidateIfNeeded()
-    }
-
-    private fun invalidateIfNeeded() {
-        hasPendingDraws = frameClock.hasAwaiters || list.any(DesktopOwner::needsRender)
-        if (hasPendingDraws && !isInvalidationDisabled) {
-            invalidate()
-        }
-    }
-
-    private val list = LinkedHashSet<DesktopOwner>()
-    private val listCopy = mutableListOf<DesktopOwner>()
-
-    private inline fun forEachOwner(action: (DesktopOwner) -> Unit) {
-        listCopy.addAll(list)
-        listCopy.forEach(action)
-        listCopy.clear()
-    }
-
-    /**
-     * All currently registered [DesktopRootForTest]s. After calling [setContent] the first root
-     * will be added. If there is an any [Popup] is present in the content, it will be added as
-     * another [DesktopRootForTest]
-     */
-    val roots: Set<RootForTest> get() = list
-
-    private var pointerId = 0L
-    private var isMousePressed = false
-
-    private val job = Job()
-    private val dispatcher = FlushCoroutineDispatcher(CoroutineScope(coroutineContext + job))
-    private val frameClock = BroadcastFrameClock(onNewAwaiters = ::invalidateIfNeeded)
-    private val coroutineScope = CoroutineScope(coroutineContext + job + dispatcher + frameClock)
-
-    private val recomposer = Recomposer(coroutineScope.coroutineContext)
-    internal val platformInputService: DesktopPlatformInput = DesktopPlatformInput(component)
-
-    private var mainOwner: DesktopOwner? = null
-    private var composition: Composition? = null
-
-    /**
-     * Density of the content which will be used to convert [dp] units.
-     */
-    var density: Density = density
-        set(value) {
-            check(!isDisposed) { "ComposeScene is disposed" }
-            field = value
-            mainOwner?.density = value
-        }
-
-    private var isDisposed = false
-
-    init {
-        GlobalSnapshotManager.ensureStarted()
-        coroutineScope.launch(start = CoroutineStart.UNDISPATCHED) {
-            recomposer.runRecomposeAndApplyChanges()
-        }
-    }
-
-    /**
-     * Close all resources and subscriptions. Not calling this method when [ComposeScene] is no
-     * longer needed will cause a memory leak.
-     *
-     * All effects launched via [LaunchedEffect] or [rememberCoroutineScope] will be cancelled
-     * (but not immediately).
-     *
-     * After calling this method, you cannot call any other method of this [ComposeScene].
-     */
-    fun dispose() {
-        composition?.dispose()
-        mainOwner?.dispose()
-        recomposer.cancel()
-        job.cancel()
-        isDisposed = true
-    }
-
-    private fun dispatchCommand(command: () -> Unit) {
-        coroutineScope.launch {
-            command()
-        }
-    }
-
-    /**
-     * Returns true if there are pending recompositions, renders or dispatched tasks.
-     * Can be called from any thread.
-     */
-    fun hasInvalidations() = hasPendingDraws ||
-        recomposer.hasPendingWork ||
-        dispatcher.hasTasks()
-
-    internal fun attach(desktopOwner: DesktopOwner) {
-        check(!isDisposed) { "ComposeScene is disposed" }
-        list.add(desktopOwner)
-        desktopOwner.onNeedsRender = ::invalidateIfNeeded
-        desktopOwner.onDispatchCommand = ::dispatchCommand
-        desktopOwner.constraints = constraints
-        invalidateIfNeeded()
-        if (desktopOwner.isFocusable) {
-            focusedOwner = desktopOwner
-        }
-    }
-
-    internal fun detach(desktopOwner: DesktopOwner) {
-        check(!isDisposed) { "ComposeScene is disposed" }
-        list.remove(desktopOwner)
-        desktopOwner.onDispatchCommand = null
-        desktopOwner.onNeedsRender = null
-        invalidateIfNeeded()
-        if (desktopOwner == focusedOwner) {
-            focusedOwner = list.lastOrNull { it.isFocusable }
-        }
-    }
-
-    /**
-     * Update the composition with the content described by the [content] composable. After this
-     * has been called the changes to produce the initial composition has been calculated and
-     * applied to the composition.
-     *
-     * Will throw an [IllegalStateException] if the composition has been disposed.
-     *
-     * @param content Content of the [ComposeScene]
-     */
-    fun setContent(
-        content: @Composable () -> Unit
-    ) = setContent(
-        parentComposition = null,
-        content = content
-    )
-
-    // TODO(demin): We should configure routing of key events if there
-    //  are any popups/root present:
-    //   - ComposeScene.sendKeyEvent
-    //   - ComposeScene.onPreviewKeyEvent (or Window.onPreviewKeyEvent)
-    //   - Popup.onPreviewKeyEvent
-    //   - NestedPopup.onPreviewKeyEvent
-    //   - NestedPopup.onKeyEvent
-    //   - Popup.onKeyEvent
-    //   - ComposeScene.onKeyEvent
-    //  Currently we have this routing:
-    //   - [active Popup or the main content].onPreviewKeyEvent
-    //   - [active Popup or the main content].onKeyEvent
-    //   After we change routing, we can remove onPreviewKeyEvent/onKeyEvent from this method
-    internal fun setContent(
-        parentComposition: CompositionContext? = null,
-        onPreviewKeyEvent: (ComposeKeyEvent) -> Boolean = { false },
-        onKeyEvent: (ComposeKeyEvent) -> Boolean = { false },
-        content: @Composable () -> Unit
-    ) {
-        check(!isDisposed) { "ComposeScene is disposed" }
-        composition?.dispose()
-        mainOwner?.dispose()
-        val mainOwner = DesktopOwner(
-            platformInputService,
-            density,
-            onPreviewKeyEvent = onPreviewKeyEvent,
-            onKeyEvent = onKeyEvent
-        )
-        attach(mainOwner)
-        composition = mainOwner.setContent(parentComposition ?: recomposer) {
-            CompositionLocalProvider(
-                LocalComposeScene provides this,
-                content = content
-            )
-        }
-        this.mainOwner = mainOwner
-
-        // to perform all pending work synchronously. to start LaunchedEffect for example
-        dispatcher.flush()
-    }
-
-    /**
-     * Set constraints, which will be used to measure and layout content.
-     */
-    var constraints: Constraints = Constraints()
-        set(value) {
-            field = value
-            forEachOwner {
-                it.constraints = constraints
+internal actual fun ComposeScene.onPlatformInputMethodEvent(event: Any) {
+    require(event is InputMethodEvent)
+    if (!event.isConsumed) {
+        when (event.id) {
+            InputMethodEvent.INPUT_METHOD_TEXT_CHANGED -> {
+                platformInputService.replaceInputMethodText(event)
+                event.consume()
             }
-        }
-
-    /**
-     * Returns the current content size
-     */
-    val contentSize: IntSize
-        get() {
-            check(!isDisposed) { "ComposeScene is disposed" }
-            val mainOwner = mainOwner ?: return IntSize.Zero
-            mainOwner.measureAndLayout()
-            return IntSize(mainOwner.root.width, mainOwner.root.height)
-        }
-
-    /**
-     * Render the current content on [canvas]. Passed [nanoTime] will be used to drive all
-     * animations in the content (or any other code, which uses [withFrameNanos]
-     */
-    fun render(canvas: Canvas, nanoTime: Long) {
-        check(!isDisposed) { "ComposeScene is disposed" }
-        postponeInvalidation {
-            // TODO(https://github.com/JetBrains/compose-jb/issues/1135):
-            //  Temporarily workaround for flaky tests in WithComposeUiTest.
-            //  It fails when we remove synchronized and run:
-            //  ./gradlew desktopTest -Pandroidx.compose.multiplatformEnabled=true
-            //  We should make a minimal reproducer, and fix race condition somewhere
-            //  else, not here.
-            //  See also GlobalSnapshotManager.
-            synchronized(Snapshot.current) {
-                // We must see the actual state before we will render the frame
-                Snapshot.sendApplyNotifications()
-                dispatcher.flush()
-                frameClock.sendFrame(nanoTime)
-            }
-
-            forEachOwner {
-                it.render(canvas)
-            }
-        }
-    }
-
-    private var focusedOwner: DesktopOwner? = null
-    private val hoveredOwner: DesktopOwner?
-        get() = list.lastOrNull { it.isHovered(pointLocation) } ?: list.lastOrNull()
-
-    private fun DesktopOwner?.isAbove(
-        targetOwner: DesktopOwner?
-    ) = list.indexOf(this) > list.indexOf(targetOwner)
-
-    // TODO(demin): return Boolean (when it is consumed).
-    //  see ComposeLayer todo about AWTDebounceEventQueue
-    /**
-     * Send pointer event to the content.
-     *
-     * @param eventType Indicates the primary reason that the event was sent.
-     * @param position The [Offset] of the current pointer event, relative to the content.
-     * @param timeMillis The time of the current pointer event, in milliseconds. The start (`0`) time
-     * is platform-dependent.
-     * @param type The device type that produced the event, such as [mouse][PointerType.Mouse],
-     * or [touch][PointerType.Touch].
-     * @param mouseEvent The original native event.
-     */
-    @OptIn(ExperimentalComposeUiApi::class)
-    fun sendPointerEvent(
-        eventType: PointerEventType,
-        position: Offset,
-        timeMillis: Long = System.nanoTime() / 1_000_000L,
-        type: PointerType = PointerType.Mouse,
-        mouseEvent: MouseEvent? = null,
-        // TODO(demin): support PointerButtons, PointerKeyboardModifiers
-//        buttons: PointerButtons? = null,
-//        keyboardModifiers: PointerKeyboardModifiers? = null,
-    ) {
-        check(!isDisposed) { "ComposeScene is disposed" }
-        when (eventType) {
-            PointerEventType.Press -> isMousePressed = true
-            PointerEventType.Release -> isMousePressed = false
-        }
-        val event = pointerInputEvent(
-            eventType, position, timeMillis, mouseEvent, type, isMousePressed, pointerId
-        )
-        when (eventType) {
-            PointerEventType.Press -> onMousePressed(event)
-            PointerEventType.Release -> onMouseReleased(event)
-            PointerEventType.Move -> {
-                pointLocation = position
-                hoveredOwner?.processPointerInput(event)
-            }
-            PointerEventType.Enter -> hoveredOwner?.processPointerInput(event)
-            PointerEventType.Exit -> hoveredOwner?.processPointerInput(event)
-        }
-    }
-
-    // TODO(demin): remove/change when we will have scroll event support in the common code
-    // TODO(demin): return Boolean (when it is consumed).
-    //  see ComposeLayer todo about AWTDebounceEventQueue
-    /**
-     * Send pointer scroll event to the content.
-     *
-     * @param position The [Offset] of the current pointer event, relative to the content
-     * @param delta Change of mouse scroll.
-     * Positive if scrolling down, negative if scrolling up.
-     * @param orientation Orientation in which scrolling event occurs.
-     * Up/down wheel scrolling causes events in vertical orientation.
-     * Left/right wheel scrolling causes events in horizontal orientation.
-     * @param timeMillis The time of the current pointer event, in milliseconds. The start (`0`) time
-     * is platform-dependent.
-     * @param type The device type that produced the event, such as [mouse][PointerType.Mouse],
-     * or [touch][PointerType.Touch].
-     * @param mouseEvent The original native event
-     */
-    @OptIn(ExperimentalComposeUiApi::class)
-    @Suppress("UNUSED_PARAMETER")
-    @ExperimentalComposeUiApi // it is more experimental than ComposeScene itself
-    fun sendPointerScrollEvent(
-        position: Offset,
-        delta: MouseScrollUnit,
-        orientation: MouseScrollOrientation = MouseScrollOrientation.Vertical,
-        timeMillis: Long = System.nanoTime() / 1_000_000L,
-        type: PointerType = PointerType.Mouse,
-        mouseEvent: MouseEvent? = null,
-//        buttons: PointerButtons? = null,
-//        keyboardModifiers: PointerKeyboardModifiers? = null,
-    ) {
-        check(!isDisposed) { "ComposeScene is disposed" }
-        hoveredOwner?.onMouseScroll(position, MouseScrollEvent(delta, orientation))
-    }
-
-    private fun onMousePressed(event: PointerInputEvent) {
-        val currentOwner = hoveredOwner
-        if (currentOwner != null) {
-            if (focusedOwner.isAbove(currentOwner)) {
-                focusedOwner?.onDismissRequest?.invoke()
-            } else {
-                currentOwner.processPointerInput(event)
-            }
-        } else {
-            focusedOwner?.processPointerInput(event)
-        }
-    }
-
-    private fun onMouseReleased(event: PointerInputEvent) {
-        val owner = hoveredOwner ?: focusedOwner
-        owner?.processPointerInput(event)
-        pointerId += 1
-    }
-
-    private var pointLocation = Offset.Zero
-
-    /**
-     * Send [KeyEvent] to the content.
-     * @return true if the event was consumed by the content
-     */
-    fun sendKeyEvent(event: ComposeKeyEvent): Boolean {
-        return focusedOwner?.sendKeyEvent(event) == true
-    }
-
-    internal fun onInputMethodEvent(event: InputMethodEvent) {
-        check(!isDisposed) { "ComposeScene is disposed" }
-        if (!event.isConsumed) {
-            when (event.id) {
-                InputMethodEvent.INPUT_METHOD_TEXT_CHANGED -> {
-                    platformInputService.replaceInputMethodText(event)
-                    event.consume()
-                }
-                InputMethodEvent.CARET_POSITION_CHANGED -> {
-                    platformInputService.inputMethodCaretPositionChanged(event)
-                    event.consume()
-                }
+            InputMethodEvent.CARET_POSITION_CHANGED -> {
+                platformInputService.inputMethodCaretPositionChanged(event)
+                event.consume()
             }
         }
     }
 }
 
-private fun pointerInputEvent(
+internal actual fun pointerInputEvent(
     eventType: PointerEventType,
     position: Offset,
     timeMillis: Long,
-    nativeEvent: MouseEvent?,
+    nativeEvent: Any?,
     type: PointerType,
     isMousePressed: Boolean,
     pointerId: Long
@@ -489,6 +62,6 @@
                 type
             )
         ),
-        nativeEvent
+        nativeEvent as MouseEvent?
     )
 }
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeDialog.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeDialog.desktop.kt
index 504f69c..b82b38c 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeDialog.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeDialog.desktop.kt
@@ -21,6 +21,9 @@
 import androidx.compose.ui.window.DialogWindowScope
 import androidx.compose.ui.window.UndecoratedWindowResizer
 import org.jetbrains.skiko.GraphicsApi
+import org.jetbrains.skiko.hostOs
+import org.jetbrains.skiko.OS
+import java.awt.Color
 import java.awt.Component
 import java.awt.Window
 import java.awt.event.MouseListener
@@ -109,6 +112,30 @@
     }
 
     /**
+     * `true` if background of the window is transparent, `false` otherwise
+     * Transparency should be set only if window is not showing and `isUndecorated` is set to
+     * `true`, otherwise AWT will throw an exception.
+     */
+    var isTransparent: Boolean
+        get() = layer.component.transparency
+        set(value) {
+            if (value != layer.component.transparency) {
+                check(isUndecorated) { "Window should be undecorated!" }
+                check(!isDisplayable) {
+                    "Cannot change transparency if window is already displayable."
+                }
+                layer.component.transparency = value
+                if (value) {
+                    if (hostOs != OS.Windows) {
+                        background = Color(0, 0, 0, 0)
+                    }
+                } else {
+                    background = null
+                }
+            }
+        }
+
+    /**
      * Registers a task to run when the rendering API changes.
      */
     fun onRenderApiChanged(action: () -> Unit) {
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 d2af98b..cd9aaf9 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
@@ -23,7 +23,7 @@
 import androidx.compose.ui.input.mouse.MouseScrollUnit
 import androidx.compose.ui.input.pointer.PointerEventType
 import androidx.compose.ui.input.pointer.PointerType
-import androidx.compose.ui.platform.DesktopComponent
+import androidx.compose.ui.platform.PlatformComponent
 import androidx.compose.ui.ComposeScene
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Density
@@ -33,6 +33,7 @@
 import org.jetbrains.skia.Canvas
 import org.jetbrains.skiko.SkiaLayer
 import org.jetbrains.skiko.SkiaRenderer
+import java.awt.Cursor
 import java.awt.Dimension
 import java.awt.Graphics
 import java.awt.Point
@@ -68,7 +69,7 @@
 
     private val density get() = _component.density.density
 
-    private inner class ComponentImpl : SkiaLayer(), DesktopComponent {
+    private inner class ComponentImpl : SkiaLayer(), PlatformComponent {
         var currentInputMethodRequests: InputMethodRequests? = null
 
         override fun addNotify() {
@@ -83,6 +84,9 @@
         }
 
         override fun getInputMethodRequests() = currentInputMethodRequests
+        override var componentCursor: Cursor
+            get() = super.getCursor()
+            set(value) { super.setCursor(value) }
 
         override fun enableInput(inputMethodRequests: InputMethodRequests) {
             currentInputMethodRequests = inputMethodRequests
@@ -254,7 +258,7 @@
         position = Offset(event.x.toFloat(), event.y.toFloat()) * density,
         timeMillis = event.`when`,
         type = PointerType.Mouse,
-        mouseEvent = event
+        nativeEvent = event
     )
 }
 
@@ -279,7 +283,7 @@
         },
         timeMillis = event.`when`,
         type = PointerType.Mouse,
-        mouseEvent = event
+        nativeEvent = event
     )
 }
 
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeWindow.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeWindow.desktop.kt
index eefacdb..e0b8e92 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeWindow.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeWindow.desktop.kt
@@ -22,6 +22,9 @@
 import androidx.compose.ui.window.UndecoratedWindowResizer
 import androidx.compose.ui.window.WindowPlacement
 import org.jetbrains.skiko.GraphicsApi
+import org.jetbrains.skiko.hostOs
+import org.jetbrains.skiko.OS
+import java.awt.Color
 import java.awt.Component
 import java.awt.event.MouseListener
 import java.awt.event.MouseMotionListener
@@ -105,6 +108,30 @@
         undecoratedWindowResizer.enabled = isUndecorated && isResizable
     }
 
+    /**
+     * `true` if background of the window is transparent, `false` otherwise
+     * Transparency should be set only if window is not showing and `isUndecorated` is set to
+     * `true`, otherwise AWT will throw an exception.
+     */
+    var isTransparent: Boolean
+        get() = layer.component.transparency
+        set(value) {
+            if (value != layer.component.transparency) {
+                check(isUndecorated) { "Window should be undecorated!" }
+                check(!isDisplayable) {
+                    "Cannot change transparency if window is already displayable."
+                }
+                layer.component.transparency = value
+                if (value) {
+                    if (hostOs != OS.Windows) {
+                        background = Color(0, 0, 0, 0)
+                    }
+                } else {
+                    background = null
+                }
+            }
+        }
+
     var placement: WindowPlacement
         get() = when {
             isFullscreen -> WindowPlacement.Fullscreen
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerIcon.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerIcon.desktop.kt
new file mode 100644
index 0000000..06534e7
--- /dev/null
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerIcon.desktop.kt
@@ -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.compose.ui.input.pointer
+
+import java.awt.Cursor
+
+internal class AwtCursor(val cursor: Cursor) : PointerIcon {
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (javaClass != other?.javaClass) return false
+
+        other as AwtCursor
+
+        if (cursor != other.cursor) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        return cursor.hashCode()
+    }
+
+    override fun toString(): String {
+        return "AwtCursor(cursor=$cursor)"
+    }
+}
+
+/**
+ * Creates [PointerIcon] from [Cursor]
+ */
+fun PointerIcon(cursor: Cursor): PointerIcon = AwtCursor(cursor)
+
+internal actual val pointerIconDefault: PointerIcon = AwtCursor(Cursor(Cursor.DEFAULT_CURSOR))
+internal actual val pointerIconCrosshair: PointerIcon = AwtCursor(Cursor(Cursor.CROSSHAIR_CURSOR))
+internal actual val pointerIconText: PointerIcon = AwtCursor(Cursor(Cursor.TEXT_CURSOR))
+internal actual val pointerIconHand: PointerIcon = AwtCursor(Cursor(Cursor.HAND_CURSOR))
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerInputEvent.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerInputEvent.desktop.kt
index ad14344..b83805c 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerInputEvent.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerInputEvent.desktop.kt
@@ -16,8 +16,6 @@
 
 package androidx.compose.ui.input.pointer
 
-import androidx.compose.ui.InternalComposeUiApi
-import androidx.compose.ui.geometry.Offset
 import java.awt.event.MouseEvent
 
 internal actual class PointerInputEvent(
@@ -26,17 +24,3 @@
     actual val pointers: List<PointerInputEventData>,
     val mouseEvent: MouseEvent? = null
 )
-
-/**
- * This exposes PointerInputEventData for testing purposes.
- */
-@InternalComposeUiApi
-class TestPointerInputEventData(
-    val id: PointerId,
-    val uptime: Long,
-    val position: Offset,
-    val down: Boolean
-) {
-    internal fun toPointerInputEventData() =
-        PointerInputEventData(id, uptime, position, position, down, PointerType.Mouse)
-}
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 ede7c5c..15586dd5 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
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 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,364 +14,41 @@
  * limitations under the License.
  */
 
-@file:Suppress("DEPRECATION")
-
 package androidx.compose.ui.platform
 
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.setValue
-import androidx.compose.ui.ExperimentalComposeUiApi
-import androidx.compose.ui.InternalComposeUiApi
-import androidx.compose.ui.autofill.Autofill
-import androidx.compose.ui.autofill.AutofillTree
-import androidx.compose.ui.focus.FocusDirection
-import androidx.compose.ui.focus.FocusDirection.Companion.In
-import androidx.compose.ui.focus.FocusDirection.Companion.Next
-import androidx.compose.ui.focus.FocusDirection.Companion.Out
-import androidx.compose.ui.focus.FocusDirection.Companion.Previous
-import androidx.compose.ui.focus.FocusManager
-import androidx.compose.ui.focus.FocusManagerImpl
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.graphics.Canvas
-import androidx.compose.ui.graphics.asComposeCanvas
-import androidx.compose.ui.input.InputModeManager
-import androidx.compose.ui.input.InputModeManagerImpl
-import androidx.compose.ui.input.InputMode.Companion.Keyboard
-import androidx.compose.ui.input.key.Key.Companion.Back
-import androidx.compose.ui.input.key.Key.Companion.DirectionCenter
-import androidx.compose.ui.input.key.Key.Companion.Tab
+import androidx.compose.ui.input.key.KeyInputModifier
 import androidx.compose.ui.input.key.KeyEvent
 import androidx.compose.ui.input.key.KeyEventType
-import androidx.compose.ui.input.key.KeyEventType.Companion.KeyDown
-import androidx.compose.ui.input.key.KeyInputModifier
-import androidx.compose.ui.input.key.isShiftPressed
-import androidx.compose.ui.input.key.key
 import androidx.compose.ui.input.key.type
-import androidx.compose.ui.input.mouse.MouseScrollEvent
-import androidx.compose.ui.input.mouse.MouseScrollEventFilter
-import androidx.compose.ui.input.pointer.PointerEventType
-import androidx.compose.ui.input.pointer.PointerInputEvent
-import androidx.compose.ui.input.pointer.PointerInputEventProcessor
-import androidx.compose.ui.input.pointer.PointerInputFilter
-import androidx.compose.ui.input.pointer.PositionCalculator
-import androidx.compose.ui.input.pointer.ProcessResult
-import androidx.compose.ui.input.pointer.TestPointerInputEventData
-import androidx.compose.ui.layout.RootMeasurePolicy
-import androidx.compose.ui.node.HitTestResult
-import androidx.compose.ui.node.InternalCoreApi
-import androidx.compose.ui.node.LayoutNode
-import androidx.compose.ui.node.LayoutNodeDrawScope
-import androidx.compose.ui.node.MeasureAndLayoutDelegate
-import androidx.compose.ui.node.Owner
-import androidx.compose.ui.node.OwnerSnapshotObserver
-import androidx.compose.ui.node.RootForTest
-import androidx.compose.ui.semantics.SemanticsModifierCore
-import androidx.compose.ui.semantics.SemanticsOwner
-import androidx.compose.ui.text.input.TextInputService
-import androidx.compose.ui.text.platform.FontLoader
-import androidx.compose.ui.unit.Constraints
-import androidx.compose.ui.unit.Density
-import androidx.compose.ui.unit.IntSize
-import androidx.compose.ui.unit.IntOffset
-import androidx.compose.ui.unit.IntRect
-import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.input.pointer.AwtCursor
+import androidx.compose.ui.input.pointer.PointerIcon
+import java.awt.Cursor
 
-private typealias Command = () -> Unit
-
-@OptIn(
-    ExperimentalComposeUiApi::class,
-    InternalCoreApi::class,
-    InternalComposeUiApi::class
-)
-internal class DesktopOwner(
-    private val platformInputService: DesktopPlatformInput,
-    density: Density = Density(1f, 1f),
-    val isPopup: Boolean = false,
-    val isFocusable: Boolean = true,
-    val onDismissRequest: (() -> Unit)? = null,
-    private val onPreviewKeyEvent: (KeyEvent) -> Boolean = { false },
-    private val onKeyEvent: (KeyEvent) -> Boolean = { false },
-) : Owner, RootForTest, DesktopRootForTest, PositionCalculator {
-
-    internal fun isHovered(point: Offset): Boolean {
-        val intOffset = IntOffset(point.x.toInt(), point.y.toInt())
-        return bounds.contains(intOffset)
+internal actual fun sendKeyEvent(
+    platformInputService: PlatformInput,
+    keyInputModifier: KeyInputModifier,
+    keyEvent: KeyEvent
+): Boolean {
+    when {
+        keyEvent.nativeKeyEvent.id == java.awt.event.KeyEvent.KEY_TYPED ->
+            platformInputService.charKeyPressed = true
+        keyEvent.type == KeyEventType.KeyUp ->
+            platformInputService.charKeyPressed = false
     }
 
-    internal var bounds by mutableStateOf(IntRect.Zero)
-
-    override var density by mutableStateOf(density)
-
-    // TODO(demin): support RTL
-    override val layoutDirection: LayoutDirection = LayoutDirection.Ltr
-
-    override val sharedDrawScope = LayoutNodeDrawScope()
-
-    private val semanticsModifier = SemanticsModifierCore(
-        id = SemanticsModifierCore.generateSemanticsId(),
-        mergeDescendants = false,
-        clearAndSetSemantics = false,
-        properties = {}
-    )
-
-    private val _focusManager: FocusManagerImpl = FocusManagerImpl().apply {
-        // TODO(demin): support RTL [onRtlPropertiesChanged]
-        layoutDirection = LayoutDirection.Ltr
-    }
-    override val focusManager: FocusManager
-        get() = _focusManager
-
-    // TODO: Set the input mode. For now we don't support touch mode, (always in Key mode).
-    private val _inputModeManager = InputModeManagerImpl(
-        initialInputMode = Keyboard,
-        onRequestInputModeChange = {
-            // TODO: Change the input mode programmatically. For now we just return true if the
-            //  requested input mode is Keyboard mode.
-            it == Keyboard
-        }
-    )
-    override val inputModeManager: InputModeManager
-        get() = _inputModeManager
-
-    // TODO: set/clear _windowInfo.isWindowFocused when the window gains/loses focus.
-    private val _windowInfo: WindowInfoImpl = WindowInfoImpl()
-    override val windowInfo: WindowInfo
-        get() = _windowInfo
-
-    // TODO(b/177931787) : Consider creating a KeyInputManager like we have for FocusManager so
-    //  that this common logic can be used by all owners.
-    private val keyInputModifier: KeyInputModifier = KeyInputModifier(
-        onKeyEvent = {
-            val focusDirection = getFocusDirection(it)
-            if (focusDirection == null || it.type != KeyDown) return@KeyInputModifier false
-
-            // Consume the key event if we moved focus.
-            focusManager.moveFocus(focusDirection)
-        },
-        onPreviewKeyEvent = null
-    )
-
-    var constraints: Constraints = Constraints()
-        set(value) {
-            field = value
-
-            if (!isPopup) {
-                this.bounds = IntRect(
-                    IntOffset(bounds.left, bounds.top),
-                    IntSize(constraints.maxWidth, constraints.maxHeight)
-                )
-            }
-        }
-
-    override val root = LayoutNode().also {
-        it.measurePolicy = RootMeasurePolicy
-        it.modifier = semanticsModifier
-            .then(_focusManager.modifier)
-            .then(keyInputModifier)
-            .then(
-                KeyInputModifier(
-                    onKeyEvent = onKeyEvent,
-                    onPreviewKeyEvent = onPreviewKeyEvent
-                )
-            )
-    }
-
-    override val rootForTest = this
-
-    override val snapshotObserver = OwnerSnapshotObserver { command ->
-        onDispatchCommand?.invoke(command)
-    }
-    private val pointerInputEventProcessor = PointerInputEventProcessor(root)
-    private val measureAndLayoutDelegate = MeasureAndLayoutDelegate(root)
-
-    init {
-        snapshotObserver.startObserving()
-        root.attach(this)
-        _focusManager.takeFocus()
-    }
-
-    fun dispose() {
-        snapshotObserver.stopObserving()
-        // we don't need to call root.detach() because root will be garbage collected
-    }
-
-    override val textInputService = TextInputService(platformInputService)
-
-    override val fontLoader = FontLoader()
-
-    override val hapticFeedBack = DesktopHapticFeedback()
-
-    override val clipboardManager = DesktopClipboardManager()
-
-    override val accessibilityManager = DesktopAccessibilityManager()
-
-    override val textToolbar = DesktopTextToolbar()
-
-    override val semanticsOwner: SemanticsOwner = SemanticsOwner(root)
-
-    override val autofillTree = AutofillTree()
-
-    override val autofill: Autofill? get() = null
-
-    override val viewConfiguration: ViewConfiguration = DesktopViewConfiguration(density)
-
-    override fun sendKeyEvent(keyEvent: KeyEvent): Boolean {
-        when {
-            keyEvent.nativeKeyEvent.id == java.awt.event.KeyEvent.KEY_TYPED ->
-                platformInputService.charKeyPressed = true
-            keyEvent.type == KeyEventType.KeyUp ->
-                platformInputService.charKeyPressed = false
-        }
-
-        return keyInputModifier.processKeyInput(keyEvent)
-    }
-
-    override var showLayoutBounds = false
-
-    override fun requestFocus() = true
-
-    override fun onAttach(node: LayoutNode) = Unit
-
-    override fun onDetach(node: LayoutNode) {
-        measureAndLayoutDelegate.onNodeDetached(node)
-        snapshotObserver.clear(node)
-        needClearObservations = true
-    }
-
-    override val measureIteration: Long get() = measureAndLayoutDelegate.measureIteration
-
-    private var needsLayout = true
-    private var needsDraw = true
-
-    val needsRender get() = needsLayout || needsDraw
-    var onNeedsRender: (() -> Unit)? = null
-    var onDispatchCommand: ((Command) -> Unit)? = null
-
-    fun render(canvas: org.jetbrains.skia.Canvas) {
-        needsLayout = false
-        measureAndLayout()
-        needsDraw = false
-        draw(canvas)
-        clearInvalidObservations()
-    }
-
-    private var needClearObservations = false
-
-    private fun clearInvalidObservations() {
-        if (needClearObservations) {
-            snapshotObserver.clearInvalidObservations()
-            needClearObservations = false
-        }
-    }
-
-    private fun requestLayout() {
-        needsLayout = true
-        needsDraw = true
-        onNeedsRender?.invoke()
-    }
-
-    private fun requestDraw() {
-        needsDraw = true
-        onNeedsRender?.invoke()
-    }
-
-    override fun measureAndLayout() {
-        measureAndLayoutDelegate.updateRootConstraints(constraints)
-        if (measureAndLayoutDelegate.measureAndLayout()) {
-            requestDraw()
-        }
-        measureAndLayoutDelegate.dispatchOnPositionedCallbacks()
-    }
-
-    override fun onRequestMeasure(layoutNode: LayoutNode) {
-        if (measureAndLayoutDelegate.requestRemeasure(layoutNode)) {
-            requestLayout()
-        }
-    }
-
-    override fun onRequestRelayout(layoutNode: LayoutNode) {
-        if (measureAndLayoutDelegate.requestRelayout(layoutNode)) {
-            requestLayout()
-        }
-    }
-
-    override fun createLayer(
-        drawBlock: (Canvas) -> Unit,
-        invalidateParentLayer: () -> Unit
-    ) = SkiaLayer(
-        density,
-        invalidateParentLayer = {
-            invalidateParentLayer()
-            requestDraw()
-        },
-        drawBlock = drawBlock,
-        onDestroy = { needClearObservations = true }
-    )
-
-    override fun onSemanticsChange() = Unit
-
-    override fun onLayoutChange(layoutNode: LayoutNode) = Unit
-
-    override fun getFocusDirection(keyEvent: KeyEvent): FocusDirection? {
-        return when (keyEvent.key) {
-            Tab -> if (keyEvent.isShiftPressed) Previous else Next
-            DirectionCenter -> In
-            Back -> Out
-            else -> null
-        }
-    }
-
-    override fun calculatePositionInWindow(localPosition: Offset): Offset = localPosition
-
-    override fun calculateLocalPosition(positionInWindow: Offset): Offset = positionInWindow
-
-    override fun localToScreen(localPosition: Offset): Offset = localPosition
-
-    override fun screenToLocal(positionOnScreen: Offset): Offset = positionOnScreen
-
-    fun draw(canvas: org.jetbrains.skia.Canvas) {
-        root.draw(canvas.asComposeCanvas())
-    }
-
-    internal fun processPointerInput(event: PointerInputEvent): ProcessResult {
-        measureAndLayout()
-        return pointerInputEventProcessor.process(
-            event,
-            this,
-            isInBounds = event.pointers.all {
-                it.position.x in 0f..root.width.toFloat() &&
-                    it.position.y in 0f..root.height.toFloat()
-            }
-        )
-    }
-
-    override fun processPointerInput(timeMillis: Long, pointers: List<TestPointerInputEventData>) {
-        processPointerInput(
-            PointerInputEvent(
-                PointerEventType.Unknown,
-                timeMillis,
-                pointers.map { it.toPointerInputEventData() }
-            )
-        )
-    }
-
-    // TODO(demin): This is likely temporary. After PointerInputEvent can handle mouse events
-    //  (scroll in particular), we can replace it with processPointerInput. see b/166105940
-    internal fun onMouseScroll(position: Offset, event: MouseScrollEvent) {
-        measureAndLayout()
-
-        val inputFilters = HitTestResult<PointerInputFilter>()
-        root.hitTest(position, inputFilters)
-
-        for (
-            filter in inputFilters
-                .asReversed()
-                .asSequence()
-                .filterIsInstance<MouseScrollEventFilter>()
-        ) {
-            val isConsumed = filter.onMouseScroll(event)
-            if (isConsumed) break
-        }
-    }
+    return keyInputModifier.processKeyInput(keyEvent)
 }
+
+private val defaultCursor = Cursor(Cursor.DEFAULT_CURSOR)
+
+internal actual fun setPointerIcon(
+    containerCursor: PlatformComponentWithCursor?,
+    icon: PointerIcon?
+) {
+    when (icon) {
+        is AwtCursor -> containerCursor?.componentCursor = icon.cursor
+        else -> if (containerCursor?.componentCursor != defaultCursor) {
+            containerCursor?.componentCursor = defaultCursor
+        }
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopPlatformInput.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopPlatformInput.desktop.kt
index 01e0170..8a748fb 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopPlatformInput.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopPlatformInput.desktop.kt
@@ -39,7 +39,7 @@
 import kotlin.math.max
 import kotlin.math.min
 
-internal interface DesktopInputComponent {
+internal actual interface PlatformInputComponent {
     fun enableInput(inputMethodRequests: InputMethodRequests)
     fun disableInput()
     // Input service needs to know this information to implement Input Method support
@@ -47,7 +47,7 @@
     val density: Density
 }
 
-internal class DesktopPlatformInput(val component: DesktopComponent) :
+internal actual class PlatformInput actual constructor (val component: PlatformComponent) :
     PlatformTextInputService {
     data class CurrentInput(
         var value: TextFieldValue,
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/GlobalSnapshotManager.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/GlobalSnapshotManager.desktop.kt
index afd95d6..1786f77 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/GlobalSnapshotManager.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/GlobalSnapshotManager.desktop.kt
@@ -37,10 +37,10 @@
  * For desktop, these notifications are always sent on [Dispatchers.Swing]. Other platforms
  * may establish different policies for these notifications.
  */
-internal object GlobalSnapshotManager {
+internal actual object GlobalSnapshotManager {
     private val started = AtomicBoolean(false)
 
-    fun ensureStarted() {
+    actual fun ensureStarted() {
         if (started.compareAndSet(false, true)) {
             val channel = Channel<Unit>(Channel.CONFLATED)
             CoroutineScope(Dispatchers.Swing).launch {
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopClipboardManager.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformClipboardManager.desktop.kt
similarity index 95%
rename from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopClipboardManager.desktop.kt
rename to compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformClipboardManager.desktop.kt
index a7b54c7..1936290 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopClipboardManager.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformClipboardManager.desktop.kt
@@ -22,7 +22,7 @@
 import java.awt.datatransfer.StringSelection
 import java.awt.datatransfer.UnsupportedFlavorException
 
-internal class DesktopClipboardManager : ClipboardManager {
+internal actual class PlatformClipboardManager : ClipboardManager {
     internal val systemClipboard = try {
         Toolkit.getDefaultToolkit().getSystemClipboard()
     } catch (e: java.awt.HeadlessException) { null }
@@ -40,4 +40,4 @@
     override fun setText(annotatedString: AnnotatedString) {
         systemClipboard?.setContents(StringSelection(annotatedString.text), null)
     }
-}
\ No newline at end of file
+}
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopComponent.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformComponent.desktop.kt
similarity index 75%
rename from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopComponent.desktop.kt
rename to compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformComponent.desktop.kt
index 982ab77..e6615a0 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopComponent.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformComponent.desktop.kt
@@ -17,12 +17,18 @@
 package androidx.compose.ui.platform
 
 import androidx.compose.ui.unit.Density
+import java.awt.Cursor
 import java.awt.Point
 import java.awt.im.InputMethodRequests
 
-internal interface DesktopComponent : DesktopInputComponent
+internal actual interface PlatformComponent : PlatformInputComponent, PlatformComponentWithCursor
 
-internal object DummyDesktopComponent : DesktopComponent {
+internal actual interface PlatformComponentWithCursor {
+    var componentCursor: Cursor
+}
+
+internal actual object DummyPlatformComponent : PlatformComponent {
+    override var componentCursor: Cursor = Cursor(Cursor.CROSSHAIR_CURSOR)
     var enabledInput: InputMethodRequests? = null
     override fun enableInput(inputMethodRequests: InputMethodRequests) {
         enabledInput = inputMethodRequests
@@ -31,4 +37,4 @@
     override val locationOnScreen = Point(0, 0)
     override val density: Density
         get() = Density(1f, 1f)
-}
\ No newline at end of file
+}
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformUriHandler.desktop.kt
similarity index 93%
rename from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt
rename to compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformUriHandler.desktop.kt
index e5bb607..c9ab2d9 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/PlatformUriHandler.desktop.kt
@@ -19,8 +19,8 @@
 import java.awt.Desktop
 import java.net.URI
 
-internal class DesktopUriHandler : UriHandler {
+internal actual class PlatformUriHandler : UriHandler {
     override fun openUri(uri: String) {
         Desktop.getDesktop().browse(URI(uri))
     }
-}
\ No newline at end of file
+}
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DesktopPopup.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DesktopPopup.desktop.kt
index d07f47f..35b909c 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DesktopPopup.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DesktopPopup.desktop.kt
@@ -31,7 +31,7 @@
 import androidx.compose.ui.input.key.KeyEvent
 import androidx.compose.ui.layout.Layout
 import androidx.compose.ui.layout.onGloballyPositioned
-import androidx.compose.ui.platform.DesktopOwner
+import androidx.compose.ui.platform.SkiaBasedOwner
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.setContent
 import androidx.compose.ui.unit.Dp
@@ -168,7 +168,7 @@
 
     val parentComposition = rememberCompositionContext()
     val (owner, composition) = remember {
-        val owner = DesktopOwner(
+        val owner = SkiaBasedOwner(
             platformInputService = scene.platformInputService,
             density = density,
             isPopup = true,
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Dialog.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Dialog.desktop.kt
index 1cf9d71..b33edcc 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Dialog.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Dialog.desktop.kt
@@ -78,6 +78,9 @@
  * will leave the composition.
  * @param title Title in the titlebar of the dialog
  * @param icon Icon in the titlebar of the dialog (for platforms which support this)
+ * @param undecorated Disables or enables decorations for this window.
+ * @param transparent Disables or enables window transparency. Transparency should be set
+ * only if window is undecorated, otherwise an exception will be thrown.
  * @param resizable Can dialog be resized by the user (application still can resize the dialog
  * changing [state])
  * @param enabled Can dialog react to input events
@@ -100,6 +103,7 @@
     title: String = "Untitled",
     icon: Painter? = null,
     undecorated: Boolean = false,
+    transparent: Boolean = false,
     resizable: Boolean = true,
     enabled: Boolean = true,
     focusable: Boolean = true,
@@ -113,6 +117,7 @@
     val currentTitle by rememberUpdatedState(title)
     val currentIcon by rememberUpdatedState(icon)
     val currentUndecorated by rememberUpdatedState(undecorated)
+    val currentTransparent by rememberUpdatedState(transparent)
     val currentResizable by rememberUpdatedState(resizable)
     val currentEnabled by rememberUpdatedState(enabled)
     val currentFocusable by rememberUpdatedState(focusable)
@@ -150,6 +155,7 @@
                 set(currentTitle, dialog::setTitle)
                 set(currentIcon, dialog::setIcon)
                 set(currentUndecorated, dialog::setUndecoratedSafely)
+                set(currentTransparent, dialog::isTransparent::set)
                 set(currentResizable, dialog::setResizable)
                 set(currentEnabled, dialog::setEnabled)
                 set(currentFocusable, dialog::setFocusable)
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Window.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Window.desktop.kt
index b80c265..3bf5827 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Window.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Window.desktop.kt
@@ -91,6 +91,9 @@
  * will leave the composition.
  * @param title Title in the titlebar of the window
  * @param icon Icon in the titlebar of the window (for platforms which support this)
+ * @param undecorated Disables or enables decorations for this window.
+ * @param transparent Disables or enables window transparency. Transparency should be set
+ * only if window is undecorated, otherwise an exception will be thrown.
  * @param resizable Can window be resized by the user (application still can resize the window
  * changing [state])
  * @param enabled Can window react to input events
@@ -114,6 +117,7 @@
     title: String = "Untitled",
     icon: Painter? = null,
     undecorated: Boolean = false,
+    transparent: Boolean = false,
     resizable: Boolean = true,
     enabled: Boolean = true,
     focusable: Boolean = true,
@@ -126,6 +130,7 @@
     val currentTitle by rememberUpdatedState(title)
     val currentIcon by rememberUpdatedState(icon)
     val currentUndecorated by rememberUpdatedState(undecorated)
+    val currentTransparent by rememberUpdatedState(transparent)
     val currentResizable by rememberUpdatedState(resizable)
     val currentEnabled by rememberUpdatedState(enabled)
     val currentFocusable by rememberUpdatedState(focusable)
@@ -172,6 +177,7 @@
                 set(currentTitle, window::setTitle)
                 set(currentIcon, window::setIcon)
                 set(currentUndecorated, window::setUndecoratedSafely)
+                set(currentTransparent, window::isTransparent::set)
                 set(currentResizable, window::setResizable)
                 set(currentEnabled, window::setEnabled)
                 set(currentFocusable, window::setFocusable)
@@ -213,6 +219,9 @@
  * will leave the composition.
  * @param title Title in the titlebar of the window
  * @param icon Icon in the titlebar of the window (for platforms which support this)
+ * @param undecorated Disables or enables decorations for this window.
+ * @param transparent Disables or enables window transparency. Transparency should be set
+ * only if window is undecorated, otherwise an exception will be thrown.
  * @param resizable Can window be resized by the user (application still can resize the window
  * changing [state])
  * @param enabled Can window react to input events
@@ -234,6 +243,7 @@
     title: String = "Untitled",
     icon: Painter? = null,
     undecorated: Boolean = false,
+    transparent: Boolean = false,
     resizable: Boolean = true,
     enabled: Boolean = true,
     focusable: Boolean = true,
@@ -249,6 +259,7 @@
         title,
         icon,
         undecorated,
+        transparent,
         resizable,
         enabled,
         focusable,
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/pointer/PointerIconTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/pointer/PointerIconTest.kt
new file mode 100644
index 0000000..55c7892
--- /dev/null
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/pointer/PointerIconTest.kt
@@ -0,0 +1,133 @@
+/*
+ * 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.ui.input.pointer
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.size
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalPointerIconService
+import androidx.compose.ui.platform.TestComposeWindow
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.dp
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+@OptIn(ExperimentalComposeUiApi::class)
+class PointerIconTest {
+    private val window = TestComposeWindow(width = 100, height = 100, density = Density(1f))
+
+    private val iconService = object : PointerIconService {
+        override var current: PointerIcon = PointerIconDefaults.Default
+    }
+
+    @Test
+    fun basicTest() {
+        window.setContent {
+            CompositionLocalProvider(
+                LocalPointerIconService provides iconService
+            ) {
+                Box(
+                    modifier = Modifier
+                        .size(30.dp, 30.dp)
+                ) {
+                    Box(
+                        modifier = Modifier
+                            .pointerHoverIcon(PointerIconDefaults.Text)
+                            .size(10.dp, 10.dp)
+                    )
+                }
+            }
+        }
+
+        window.onMouseMoved(
+            x = 5,
+            y = 5
+        )
+        assertThat(iconService.current).isEqualTo(PointerIconDefaults.Text)
+    }
+
+    @Test
+    fun parentWins() {
+        window.setContent {
+            CompositionLocalProvider(
+                LocalPointerIconService provides iconService
+            ) {
+                Box(
+                    modifier = Modifier
+                        .pointerHoverIcon(PointerIconDefaults.Hand, true)
+                        .size(30.dp, 30.dp)
+                ) {
+                    Box(
+                        modifier = Modifier
+                            .pointerHoverIcon(PointerIconDefaults.Text)
+                            .size(10.dp, 10.dp)
+                    )
+                }
+            }
+        }
+
+        window.onMouseMoved(
+            x = 5,
+            y = 5
+        )
+        assertThat(iconService.current).isEqualTo(PointerIconDefaults.Hand)
+
+        window.onMouseMoved(
+            x = 15,
+            y = 15
+        )
+        assertThat(iconService.current).isEqualTo(PointerIconDefaults.Hand)
+    }
+
+    @Test
+    fun childWins() {
+        window.setContent {
+            CompositionLocalProvider(
+                LocalPointerIconService provides iconService
+            ) {
+                Box(
+                    modifier = Modifier
+                        .pointerHoverIcon(PointerIconDefaults.Hand)
+                        .size(30.dp, 30.dp)
+                ) {
+                    Box(
+                        modifier = Modifier
+                            .pointerHoverIcon(PointerIconDefaults.Text)
+                            .size(10.dp, 10.dp)
+                    )
+                }
+            }
+        }
+
+        window.onMouseMoved(
+            x = 5,
+            y = 5
+        )
+        assertThat(iconService.current).isEqualTo(PointerIconDefaults.Text)
+
+        window.onMouseMoved(
+            x = 15,
+            y = 15
+        )
+        assertThat(iconService.current).isEqualTo(PointerIconDefaults.Hand)
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopInputComponentTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopInputComponentTest.kt
index 587d2352..9bc4693 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopInputComponentTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopInputComponentTest.kt
@@ -41,7 +41,7 @@
     fun replaceInputMethodText_basic() {
         val processor = EditProcessor()
 
-        val input = DesktopPlatformInput(DummyDesktopComponent)
+        val input = PlatformInput(DummyPlatformComponent)
         val inputService = TextInputService(input)
 
         val session = inputService.startInput(
@@ -77,8 +77,8 @@
         assumeTrue(isMacOs)
         val processor = EditProcessor()
 
-        val component = DummyDesktopComponent
-        val input = DesktopPlatformInput(component)
+        val component = DummyPlatformComponent
+        val input = PlatformInput(component)
         val inputService = TextInputService(input)
 
         val session = inputService.startInput(
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/ComposeScene.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/ComposeScene.skiko.kt
new file mode 100644
index 0000000..f84afcd7
--- /dev/null
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/ComposeScene.skiko.kt
@@ -0,0 +1,462 @@
+/*
+ * 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.ui
+
+import androidx.compose.runtime.BroadcastFrameClock
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Composition
+import androidx.compose.runtime.CompositionContext
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.Recomposer
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.runtime.snapshots.Snapshot
+import androidx.compose.runtime.staticCompositionLocalOf
+import androidx.compose.runtime.withFrameNanos
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.input.key.KeyEvent as ComposeKeyEvent
+import androidx.compose.ui.input.mouse.MouseScrollEvent
+import androidx.compose.ui.input.mouse.MouseScrollOrientation
+import androidx.compose.ui.input.mouse.MouseScrollUnit
+import androidx.compose.ui.input.pointer.PointerEventType
+import androidx.compose.ui.input.pointer.PointerInputEvent
+import androidx.compose.ui.input.pointer.PointerType
+import androidx.compose.ui.node.LayoutNode
+import androidx.compose.ui.platform.PlatformComponent
+import androidx.compose.ui.platform.SkiaBasedOwner
+import androidx.compose.ui.platform.PlatformInput
+import androidx.compose.ui.platform.SkiaRootForTest
+import androidx.compose.ui.platform.DummyPlatformComponent
+import androidx.compose.ui.platform.EmptyDispatcher
+import androidx.compose.ui.platform.FlushCoroutineDispatcher
+import androidx.compose.ui.platform.GlobalSnapshotManager
+import androidx.compose.ui.platform.setContent
+import androidx.compose.ui.node.RootForTest
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.unit.dp
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.CoroutineStart
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.launch
+import org.jetbrains.skia.Canvas
+import kotlin.coroutines.CoroutineContext
+import kotlin.jvm.Volatile
+
+internal val LocalComposeScene = staticCompositionLocalOf<ComposeScene> {
+    error("CompositionLocal LocalComposeScene not provided")
+}
+
+/**
+ * Virtual container that encapsulates Compose UI content. UI content can be constructed via
+ * [setContent] method and with any Composable that manipulates [LayoutNode] tree.
+ *
+ * To draw content on [Canvas], you can use [render] method.
+ *
+ * To specify available size for the content, you should use [constraints].
+ *
+ * After [ComposeScene] will no longer needed, you should call [dispose] method, so all resources
+ * and subscriptions will be properly closed. Otherwise there can be a memory leak.
+ */
+class ComposeScene internal constructor(
+    coroutineContext: CoroutineContext,
+    private val component: PlatformComponent,
+    density: Density,
+    private val invalidate: () -> Unit
+) {
+    /**
+     * Constructs [ComposeScene]
+     *
+     * @param coroutineContext Context which will be used to launch effects ([LaunchedEffect],
+     * [rememberCoroutineScope]) and run recompositions.
+     * @param density Initial density of the content which will be used to convert [dp] units.
+     * @param invalidate Callback which will be called when the content need to be recomposed or
+     * rerendered. If you draw your content using [render] method, in this callback you should
+     * schedule the next [render] in your rendering loop.
+     */
+    constructor(
+        coroutineContext: CoroutineContext = EmptyDispatcher,
+        density: Density = Density(1f),
+        invalidate: () -> Unit = {}
+    ) : this(
+        coroutineContext,
+        DummyPlatformComponent,
+        density,
+        invalidate
+    )
+
+    private var isInvalidationDisabled = false
+
+    @Volatile
+    private var hasPendingDraws = true
+    private inline fun postponeInvalidation(block: () -> Unit) {
+        isInvalidationDisabled = true
+        try {
+            block()
+        } finally {
+            isInvalidationDisabled = false
+        }
+        invalidateIfNeeded()
+    }
+
+    private fun invalidateIfNeeded() {
+        hasPendingDraws = frameClock.hasAwaiters || list.any(SkiaBasedOwner::needsRender)
+        if (hasPendingDraws && !isInvalidationDisabled) {
+            invalidate()
+        }
+    }
+
+    private val list = LinkedHashSet<SkiaBasedOwner>()
+    private val listCopy = mutableListOf<SkiaBasedOwner>()
+
+    private inline fun forEachOwner(action: (SkiaBasedOwner) -> Unit) {
+        listCopy.addAll(list)
+        listCopy.forEach(action)
+        listCopy.clear()
+    }
+
+    /**
+     * All currently registered [SkiaRootForTest]s. After calling [setContent] the first root
+     * will be added. If there is an any Popup is present in the content, it will be added as
+     * another [SkiaRootForTest]
+     */
+    val roots: Set<RootForTest> get() = list
+
+    private var pointerId = 0L
+    private var isMousePressed = false
+
+    private val job = Job()
+    private val dispatcher = FlushCoroutineDispatcher(CoroutineScope(coroutineContext + job))
+    private val frameClock = BroadcastFrameClock(onNewAwaiters = ::invalidateIfNeeded)
+    private val coroutineScope = CoroutineScope(coroutineContext + job + dispatcher + frameClock)
+
+    private val recomposer = Recomposer(coroutineScope.coroutineContext)
+    internal val platformInputService: PlatformInput = PlatformInput(component)
+
+    private var mainOwner: SkiaBasedOwner? = null
+    private var composition: Composition? = null
+
+    /**
+     * Density of the content which will be used to convert [dp] units.
+     */
+    var density: Density = density
+        set(value) {
+            check(!isDisposed) { "ComposeScene is disposed" }
+            field = value
+            mainOwner?.density = value
+        }
+
+    private var isDisposed = false
+
+    init {
+        GlobalSnapshotManager.ensureStarted()
+        coroutineScope.launch(start = CoroutineStart.UNDISPATCHED) {
+            recomposer.runRecomposeAndApplyChanges()
+        }
+    }
+
+    /**
+     * Close all resources and subscriptions. Not calling this method when [ComposeScene] is no
+     * longer needed will cause a memory leak.
+     *
+     * All effects launched via [LaunchedEffect] or [rememberCoroutineScope] will be cancelled
+     * (but not immediately).
+     *
+     * After calling this method, you cannot call any other method of this [ComposeScene].
+     */
+    fun dispose() {
+        composition?.dispose()
+        mainOwner?.dispose()
+        recomposer.cancel()
+        job.cancel()
+        isDisposed = true
+    }
+
+    private fun dispatchCommand(command: () -> Unit) {
+        coroutineScope.launch {
+            command()
+        }
+    }
+
+    /**
+     * Returns true if there are pending recompositions, renders or dispatched tasks.
+     * Can be called from any thread.
+     */
+    fun hasInvalidations() = hasPendingDraws ||
+        recomposer.hasPendingWork ||
+        dispatcher.hasTasks()
+
+    internal fun attach(skiaBasedOwner: SkiaBasedOwner) {
+        check(!isDisposed) { "ComposeScene is disposed" }
+        list.add(skiaBasedOwner)
+        skiaBasedOwner.onNeedsRender = ::invalidateIfNeeded
+        skiaBasedOwner.onDispatchCommand = ::dispatchCommand
+        skiaBasedOwner.constraints = constraints
+        skiaBasedOwner.containerCursor = component
+        invalidateIfNeeded()
+        if (skiaBasedOwner.isFocusable) {
+            focusedOwner = skiaBasedOwner
+        }
+    }
+
+    internal fun detach(skiaBasedOwner: SkiaBasedOwner) {
+        check(!isDisposed) { "ComposeScene is disposed" }
+        list.remove(skiaBasedOwner)
+        skiaBasedOwner.onDispatchCommand = null
+        skiaBasedOwner.onNeedsRender = null
+        invalidateIfNeeded()
+        if (skiaBasedOwner == focusedOwner) {
+            focusedOwner = list.lastOrNull { it.isFocusable }
+        }
+    }
+
+    /**
+     * Update the composition with the content described by the [content] composable. After this
+     * has been called the changes to produce the initial composition has been calculated and
+     * applied to the composition.
+     *
+     * Will throw an [IllegalStateException] if the composition has been disposed.
+     *
+     * @param content Content of the [ComposeScene]
+     */
+    fun setContent(
+        content: @Composable () -> Unit
+    ) = setContent(
+        parentComposition = null,
+        content = content
+    )
+
+    // TODO(demin): We should configure routing of key events if there
+    //  are any popups/root present:
+    //   - ComposeScene.sendKeyEvent
+    //   - ComposeScene.onPreviewKeyEvent (or Window.onPreviewKeyEvent)
+    //   - Popup.onPreviewKeyEvent
+    //   - NestedPopup.onPreviewKeyEvent
+    //   - NestedPopup.onKeyEvent
+    //   - Popup.onKeyEvent
+    //   - ComposeScene.onKeyEvent
+    //  Currently we have this routing:
+    //   - [active Popup or the main content].onPreviewKeyEvent
+    //   - [active Popup or the main content].onKeyEvent
+    //   After we change routing, we can remove onPreviewKeyEvent/onKeyEvent from this method
+    internal fun setContent(
+        parentComposition: CompositionContext? = null,
+        onPreviewKeyEvent: (ComposeKeyEvent) -> Boolean = { false },
+        onKeyEvent: (ComposeKeyEvent) -> Boolean = { false },
+        content: @Composable () -> Unit
+    ) {
+        check(!isDisposed) { "ComposeScene is disposed" }
+        composition?.dispose()
+        mainOwner?.dispose()
+        val mainOwner = SkiaBasedOwner(
+            platformInputService,
+            density,
+            onPreviewKeyEvent = onPreviewKeyEvent,
+            onKeyEvent = onKeyEvent
+        )
+        attach(mainOwner)
+        composition = mainOwner.setContent(parentComposition ?: recomposer) {
+            CompositionLocalProvider(
+                LocalComposeScene provides this,
+                content = content
+            )
+        }
+        this.mainOwner = mainOwner
+
+        // to perform all pending work synchronously. to start LaunchedEffect for example
+        dispatcher.flush()
+    }
+
+    /**
+     * Set constraints, which will be used to measure and layout content.
+     */
+    var constraints: Constraints = Constraints()
+        set(value) {
+            field = value
+            forEachOwner {
+                it.constraints = constraints
+            }
+        }
+
+    /**
+     * Returns the current content size
+     */
+    val contentSize: IntSize
+        get() {
+            check(!isDisposed) { "ComposeScene is disposed" }
+            val mainOwner = mainOwner ?: return IntSize.Zero
+            mainOwner.measureAndLayout()
+            return IntSize(mainOwner.root.width, mainOwner.root.height)
+        }
+
+    /**
+     * Render the current content on [canvas]. Passed [nanoTime] will be used to drive all
+     * animations in the content (or any other code, which uses [withFrameNanos]
+     */
+    fun render(canvas: Canvas, nanoTime: Long) {
+        check(!isDisposed) { "ComposeScene is disposed" }
+        postponeInvalidation {
+            // TODO(https://github.com/JetBrains/compose-jb/issues/1135):
+            //  Temporarily workaround for flaky tests in WithComposeUiTest.
+            //  It fails when we remove synchronized and run:
+            //  ./gradlew desktopTest -Pandroidx.compose.multiplatformEnabled=true
+            //  We should make a minimal reproducer, and fix race condition somewhere
+            //  else, not here.
+            //  See also GlobalSnapshotManager.
+            synchronized(Snapshot.current) {
+                // We must see the actual state before we will render the frame
+                Snapshot.sendApplyNotifications()
+                dispatcher.flush()
+                frameClock.sendFrame(nanoTime)
+            }
+
+            forEachOwner {
+                it.render(canvas)
+            }
+        }
+    }
+
+    private var focusedOwner: SkiaBasedOwner? = null
+    private val hoveredOwner: SkiaBasedOwner?
+        get() = list.lastOrNull { it.isHovered(pointLocation) } ?: list.lastOrNull()
+
+    private fun SkiaBasedOwner?.isAbove(
+        targetOwner: SkiaBasedOwner?
+    ) = list.indexOf(this) > list.indexOf(targetOwner)
+
+    // TODO(demin): return Boolean (when it is consumed).
+    //  see ComposeLayer todo about AWTDebounceEventQueue
+    /**
+     * Send pointer event to the content.
+     *
+     * @param eventType Indicates the primary reason that the event was sent.
+     * @param position The [Offset] of the current pointer event, relative to the content.
+     * @param timeMillis The time of the current pointer event, in milliseconds. The start (`0`) time
+     * is platform-dependent.
+     * @param type The device type that produced the event, such as [mouse][PointerType.Mouse],
+     * or [touch][PointerType.Touch].
+     * @param nativeEvent The original native event.
+     */
+    @OptIn(ExperimentalComposeUiApi::class)
+    fun sendPointerEvent(
+        eventType: PointerEventType,
+        position: Offset,
+        timeMillis: Long = System.nanoTime() / 1_000_000L,
+        type: PointerType = PointerType.Mouse,
+        nativeEvent: Any? = null,
+        // TODO(demin): support PointerButtons, PointerKeyboardModifiers
+//        buttons: PointerButtons? = null,
+//        keyboardModifiers: PointerKeyboardModifiers? = null,
+    ) {
+        check(!isDisposed) { "ComposeScene is disposed" }
+        when (eventType) {
+            PointerEventType.Press -> isMousePressed = true
+            PointerEventType.Release -> isMousePressed = false
+        }
+        val event = pointerInputEvent(
+            eventType, position, timeMillis, nativeEvent, type, isMousePressed, pointerId
+        )
+        when (eventType) {
+            PointerEventType.Press -> onMousePressed(event)
+            PointerEventType.Release -> onMouseReleased(event)
+            PointerEventType.Move -> {
+                pointLocation = position
+                hoveredOwner?.processPointerInput(event)
+            }
+            PointerEventType.Enter -> hoveredOwner?.processPointerInput(event)
+            PointerEventType.Exit -> hoveredOwner?.processPointerInput(event)
+        }
+    }
+
+    // TODO(demin): remove/change when we will have scroll event support in the common code
+    // TODO(demin): return Boolean (when it is consumed).
+    //  see ComposeLayer todo about AWTDebounceEventQueue
+    /**
+     * Send pointer scroll event to the content.
+     *
+     * @param position The [Offset] of the current pointer event, relative to the content
+     * @param delta Change of mouse scroll.
+     * Positive if scrolling down, negative if scrolling up.
+     * @param orientation Orientation in which scrolling event occurs.
+     * Up/down wheel scrolling causes events in vertical orientation.
+     * Left/right wheel scrolling causes events in horizontal orientation.
+     * @param timeMillis The time of the current pointer event, in milliseconds. The start (`0`) time
+     * is platform-dependent.
+     * @param type The device type that produced the event, such as [mouse][PointerType.Mouse],
+     * or [touch][PointerType.Touch].
+     * @param nativeEvent The original native event
+     */
+    @OptIn(ExperimentalComposeUiApi::class)
+    @Suppress("UNUSED_PARAMETER")
+    @ExperimentalComposeUiApi // it is more experimental than ComposeScene itself
+    fun sendPointerScrollEvent(
+        position: Offset,
+        delta: MouseScrollUnit,
+        orientation: MouseScrollOrientation = MouseScrollOrientation.Vertical,
+        timeMillis: Long = System.nanoTime() / 1_000_000L,
+        type: PointerType = PointerType.Mouse,
+        nativeEvent: Any? = null,
+//        buttons: PointerButtons? = null,
+//        keyboardModifiers: PointerKeyboardModifiers? = null,
+    ) {
+        check(!isDisposed) { "ComposeScene is disposed" }
+        hoveredOwner?.onMouseScroll(position, MouseScrollEvent(delta, orientation))
+    }
+
+    private fun onMousePressed(event: PointerInputEvent) {
+        val currentOwner = hoveredOwner
+        if (currentOwner != null) {
+            if (focusedOwner.isAbove(currentOwner)) {
+                focusedOwner?.onDismissRequest?.invoke()
+            } else {
+                currentOwner.processPointerInput(event)
+            }
+        } else {
+            focusedOwner?.processPointerInput(event)
+        }
+    }
+
+    private fun onMouseReleased(event: PointerInputEvent) {
+        val owner = hoveredOwner ?: focusedOwner
+        owner?.processPointerInput(event)
+        pointerId += 1
+    }
+
+    private var pointLocation = Offset.Zero
+
+    /**
+     * Send [KeyEvent] to the content.
+     * @return true if the event was consumed by the content
+     */
+    fun sendKeyEvent(event: ComposeKeyEvent): Boolean {
+        return focusedOwner?.sendKeyEvent(event) == true
+    }
+
+    internal fun onInputMethodEvent(event: Any) = this.onPlatformInputMethodEvent(event)
+}
+
+internal expect fun ComposeScene.onPlatformInputMethodEvent(event: Any)
+
+internal expect fun pointerInputEvent(
+    eventType: PointerEventType,
+    position: Offset,
+    timeMillis: Long,
+    nativeEvent: Any?,
+    type: PointerType,
+    isMousePressed: Boolean,
+    pointerId: Long
+): PointerInputEvent
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/mouse/MouseScrollFilter.desktop.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/input/mouse/MouseScrollFilter.skiko.kt
similarity index 100%
rename from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/mouse/MouseScrollFilter.desktop.kt
rename to compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/input/mouse/MouseScrollFilter.skiko.kt
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/input/pointer/TestPointerInputEventData.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/input/pointer/TestPointerInputEventData.skiko.kt
new file mode 100644
index 0000000..c99348e
--- /dev/null
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/input/pointer/TestPointerInputEventData.skiko.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.compose.ui.input.pointer
+
+import androidx.compose.ui.InternalComposeUiApi
+import androidx.compose.ui.geometry.Offset
+
+/**
+ * This exposes PointerInputEventData for testing purposes.
+ */
+@InternalComposeUiApi
+class TestPointerInputEventData(
+    val id: PointerId,
+    val uptime: Long,
+    val position: Offset,
+    val down: Boolean
+) {
+    internal fun toPointerInputEventData() =
+        PointerInputEventData(id, uptime, position, position, down, PointerType.Mouse)
+}
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/CoroutineDispatchers.desktop.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/CoroutineDispatchers.skiko.kt
similarity index 100%
rename from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/CoroutineDispatchers.desktop.kt
rename to compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/CoroutineDispatchers.skiko.kt
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopAccessibilityManager.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/DefaultAccessibilityManager.skiko.kt
similarity index 92%
rename from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopAccessibilityManager.kt
rename to compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/DefaultAccessibilityManager.skiko.kt
index c007938..b487c98 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopAccessibilityManager.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/DefaultAccessibilityManager.skiko.kt
@@ -16,7 +16,7 @@
 
 package androidx.compose.ui.platform
 
-internal class DesktopAccessibilityManager : AccessibilityManager {
+internal class DefaultAccessibilityManager : AccessibilityManager {
     override fun calculateRecommendedTimeoutMillis(
         originalTimeoutMillis: Long,
         containsIcons: Boolean,
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopHapticFeedback.desktop.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/DefaultHapticFeedback.skiko.kt
similarity index 93%
rename from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopHapticFeedback.desktop.kt
rename to compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/DefaultHapticFeedback.skiko.kt
index 9f4ad8a..eafdf15 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopHapticFeedback.desktop.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/DefaultHapticFeedback.skiko.kt
@@ -20,7 +20,7 @@
 import androidx.compose.ui.hapticfeedback.HapticFeedbackType
 
 // TODO(demin): implement HapticFeedback
-internal class DesktopHapticFeedback : HapticFeedback {
+internal class DefaultHapticFeedback : HapticFeedback {
     override fun performHapticFeedback(hapticFeedbackType: HapticFeedbackType) {
     }
 }
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopTextToolbar.desktop.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/DefaultTextToolbar.skiko.kt
similarity index 94%
rename from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopTextToolbar.desktop.kt
rename to compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/DefaultTextToolbar.skiko.kt
index 62fd237..7295336 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopTextToolbar.desktop.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/DefaultTextToolbar.skiko.kt
@@ -19,7 +19,7 @@
 import androidx.compose.ui.geometry.Rect
 
 // TODO(demin): implement TextToolbar
-internal class DesktopTextToolbar : TextToolbar {
+internal class DefaultTextToolbar : TextToolbar {
     override val status: TextToolbarStatus
         get() = TextToolbarStatus.Hidden
 
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUiApplier.desktop.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/DefaultUiApplier.skiko.kt
similarity index 96%
rename from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUiApplier.desktop.kt
rename to compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/DefaultUiApplier.skiko.kt
index c07eaf5..24da863 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUiApplier.desktop.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/DefaultUiApplier.skiko.kt
@@ -19,7 +19,7 @@
 import androidx.compose.runtime.AbstractApplier
 import androidx.compose.ui.node.LayoutNode
 
-internal class DesktopUiApplier(
+internal class DefaultUiApplier(
     root: LayoutNode
 ) : AbstractApplier<LayoutNode>(root) {
     override fun insertTopDown(index: Int, instance: LayoutNode) {
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopViewConfiguration.desktop.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/DefaultViewConfiguration.skiko.kt
similarity index 93%
rename from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopViewConfiguration.desktop.kt
rename to compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/DefaultViewConfiguration.skiko.kt
index 2a1b030..d581a1f 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopViewConfiguration.desktop.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/DefaultViewConfiguration.skiko.kt
@@ -19,7 +19,7 @@
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.Density
 
-class DesktopViewConfiguration(private val density: Density) : ViewConfiguration {
+class DefaultViewConfiguration(private val density: Density) : ViewConfiguration {
     override val longPressTimeoutMillis: Long
         get() = 500
 
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/GlobalSnapshotManager.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/GlobalSnapshotManager.skiko.kt
new file mode 100644
index 0000000..d011e09
--- /dev/null
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/GlobalSnapshotManager.skiko.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.compose.ui.platform
+
+/**
+ * Platform-specific mechanism for starting a monitor of global snapshot state writes
+ * in order to schedule the periodic dispatch of snapshot apply notifications.
+ * This process should remain platform-specific; it is tied to the threading and update model of
+ * a particular platform and framework target.
+ *
+ * Composition bootstrapping mechanisms for a particular platform/framework should call
+ * [ensureStarted] during setup to initialize periodic global snapshot notifications.
+ * For desktop, these notifications are always sent on [Dispatchers.Swing]. Other platforms
+ * may establish different policies for these notifications.
+ */
+internal expect object GlobalSnapshotManager {
+    fun ensureStarted()
+}
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/OutlineCache.desktop.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/OutlineCache.skiko.kt
similarity index 100%
rename from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/OutlineCache.desktop.kt
rename to compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/OutlineCache.skiko.kt
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformClipboardManager.skiko.kt
similarity index 77%
copy from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt
copy to compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformClipboardManager.skiko.kt
index e5bb607..860f026 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformClipboardManager.skiko.kt
@@ -16,11 +16,4 @@
 
 package androidx.compose.ui.platform
 
-import java.awt.Desktop
-import java.net.URI
-
-internal class DesktopUriHandler : UriHandler {
-    override fun openUri(uri: String) {
-        Desktop.getDesktop().browse(URI(uri))
-    }
-}
\ No newline at end of file
+internal expect class PlatformClipboardManager : ClipboardManager
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformComponent.skiko.kt
similarity index 68%
copy from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt
copy to compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformComponent.skiko.kt
index e5bb607..1e782ea 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformComponent.skiko.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 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.
@@ -13,14 +13,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package androidx.compose.ui.platform
 
-import java.awt.Desktop
-import java.net.URI
+internal expect interface PlatformComponent : PlatformInputComponent, PlatformComponentWithCursor
 
-internal class DesktopUriHandler : UriHandler {
-    override fun openUri(uri: String) {
-        Desktop.getDesktop().browse(URI(uri))
-    }
-}
\ No newline at end of file
+internal expect interface PlatformComponentWithCursor
+
+internal expect object DummyPlatformComponent : PlatformComponent
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformInput.skiko.kt
similarity index 75%
copy from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt
copy to compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformInput.skiko.kt
index e5bb607..bb7bf15 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformInput.skiko.kt
@@ -13,14 +13,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package androidx.compose.ui.platform
 
-import java.awt.Desktop
-import java.net.URI
+import androidx.compose.ui.text.input.PlatformTextInputService
 
-internal class DesktopUriHandler : UriHandler {
-    override fun openUri(uri: String) {
-        Desktop.getDesktop().browse(URI(uri))
-    }
-}
\ No newline at end of file
+internal expect interface PlatformInputComponent
+
+internal expect class PlatformInput(component: PlatformComponent) :
+    PlatformTextInputService
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformUriHandler.skiko.kt
similarity index 71%
copy from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt
copy to compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformUriHandler.skiko.kt
index e5bb607..5ad7aab 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformUriHandler.skiko.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 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.
@@ -16,11 +16,4 @@
 
 package androidx.compose.ui.platform
 
-import java.awt.Desktop
-import java.net.URI
-
-internal class DesktopUriHandler : UriHandler {
-    override fun openUri(uri: String) {
-        Desktop.getDesktop().browse(URI(uri))
-    }
-}
\ No newline at end of file
+internal expect class PlatformUriHandler : UriHandler
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaBasedOwner.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaBasedOwner.skiko.kt
new file mode 100644
index 0000000..7223491
--- /dev/null
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaBasedOwner.skiko.kt
@@ -0,0 +1,395 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("DEPRECATION")
+
+package androidx.compose.ui.platform
+
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.InternalComposeUiApi
+import androidx.compose.ui.autofill.Autofill
+import androidx.compose.ui.autofill.AutofillTree
+import androidx.compose.ui.focus.FocusDirection
+import androidx.compose.ui.focus.FocusDirection.Companion.In
+import androidx.compose.ui.focus.FocusDirection.Companion.Next
+import androidx.compose.ui.focus.FocusDirection.Companion.Out
+import androidx.compose.ui.focus.FocusDirection.Companion.Previous
+import androidx.compose.ui.focus.FocusManager
+import androidx.compose.ui.focus.FocusManagerImpl
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.graphics.Canvas
+import androidx.compose.ui.graphics.asComposeCanvas
+import androidx.compose.ui.input.InputModeManager
+import androidx.compose.ui.input.InputModeManagerImpl
+import androidx.compose.ui.input.InputMode.Companion.Keyboard
+import androidx.compose.ui.input.key.Key.Companion.Back
+import androidx.compose.ui.input.key.Key.Companion.DirectionCenter
+import androidx.compose.ui.input.key.Key.Companion.Tab
+import androidx.compose.ui.input.key.KeyEvent
+import androidx.compose.ui.input.key.KeyEventType.Companion.KeyDown
+import androidx.compose.ui.input.key.KeyInputModifier
+import androidx.compose.ui.input.key.isShiftPressed
+import androidx.compose.ui.input.key.key
+import androidx.compose.ui.input.key.type
+import androidx.compose.ui.input.mouse.MouseScrollEvent
+import androidx.compose.ui.input.mouse.MouseScrollEventFilter
+import androidx.compose.ui.input.pointer.PointerEventType
+import androidx.compose.ui.input.pointer.PointerIcon
+import androidx.compose.ui.input.pointer.PointerIconDefaults
+import androidx.compose.ui.input.pointer.PointerIconService
+import androidx.compose.ui.input.pointer.PointerInputEvent
+import androidx.compose.ui.input.pointer.PointerInputEventProcessor
+import androidx.compose.ui.input.pointer.PointerInputFilter
+import androidx.compose.ui.input.pointer.PositionCalculator
+import androidx.compose.ui.input.pointer.ProcessResult
+import androidx.compose.ui.input.pointer.TestPointerInputEventData
+import androidx.compose.ui.layout.RootMeasurePolicy
+import androidx.compose.ui.node.HitTestResult
+import androidx.compose.ui.node.InternalCoreApi
+import androidx.compose.ui.node.LayoutNode
+import androidx.compose.ui.node.LayoutNodeDrawScope
+import androidx.compose.ui.node.MeasureAndLayoutDelegate
+import androidx.compose.ui.node.Owner
+import androidx.compose.ui.node.OwnerSnapshotObserver
+import androidx.compose.ui.node.RootForTest
+import androidx.compose.ui.semantics.SemanticsModifierCore
+import androidx.compose.ui.semantics.SemanticsOwner
+import androidx.compose.ui.text.input.TextInputService
+import androidx.compose.ui.text.platform.FontLoader
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.unit.IntOffset
+import androidx.compose.ui.unit.IntRect
+import androidx.compose.ui.unit.LayoutDirection
+
+private typealias Command = () -> Unit
+
+@OptIn(
+    ExperimentalComposeUiApi::class,
+    InternalCoreApi::class,
+    InternalComposeUiApi::class
+)
+internal class SkiaBasedOwner(
+    private val platformInputService: PlatformInput,
+    density: Density = Density(1f, 1f),
+    val isPopup: Boolean = false,
+    val isFocusable: Boolean = true,
+    val onDismissRequest: (() -> Unit)? = null,
+    private val onPreviewKeyEvent: (KeyEvent) -> Boolean = { false },
+    private val onKeyEvent: (KeyEvent) -> Boolean = { false },
+) : Owner, RootForTest, SkiaRootForTest, PositionCalculator {
+
+    internal fun isHovered(point: Offset): Boolean {
+        val intOffset = IntOffset(point.x.toInt(), point.y.toInt())
+        return bounds.contains(intOffset)
+    }
+
+    internal var bounds by mutableStateOf(IntRect.Zero)
+
+    override var density by mutableStateOf(density)
+
+    // TODO(demin): support RTL
+    override val layoutDirection: LayoutDirection = LayoutDirection.Ltr
+
+    override val sharedDrawScope = LayoutNodeDrawScope()
+
+    private val semanticsModifier = SemanticsModifierCore(
+        id = SemanticsModifierCore.generateSemanticsId(),
+        mergeDescendants = false,
+        clearAndSetSemantics = false,
+        properties = {}
+    )
+
+    private val _focusManager: FocusManagerImpl = FocusManagerImpl().apply {
+        // TODO(demin): support RTL [onRtlPropertiesChanged]
+        layoutDirection = LayoutDirection.Ltr
+    }
+    override val focusManager: FocusManager
+        get() = _focusManager
+
+    // TODO: Set the input mode. For now we don't support touch mode, (always in Key mode).
+    private val _inputModeManager = InputModeManagerImpl(
+        initialInputMode = Keyboard,
+        onRequestInputModeChange = {
+            // TODO: Change the input mode programmatically. For now we just return true if the
+            //  requested input mode is Keyboard mode.
+            it == Keyboard
+        }
+    )
+    override val inputModeManager: InputModeManager
+        get() = _inputModeManager
+
+    // TODO: set/clear _windowInfo.isWindowFocused when the window gains/loses focus.
+    private val _windowInfo: WindowInfoImpl = WindowInfoImpl()
+    override val windowInfo: WindowInfo
+        get() = _windowInfo
+
+    // TODO(b/177931787) : Consider creating a KeyInputManager like we have for FocusManager so
+    //  that this common logic can be used by all owners.
+    private val keyInputModifier: KeyInputModifier = KeyInputModifier(
+        onKeyEvent = {
+            val focusDirection = getFocusDirection(it)
+            if (focusDirection == null || it.type != KeyDown) return@KeyInputModifier false
+
+            // Consume the key event if we moved focus.
+            focusManager.moveFocus(focusDirection)
+        },
+        onPreviewKeyEvent = null
+    )
+
+    var constraints: Constraints = Constraints()
+        set(value) {
+            field = value
+
+            if (!isPopup) {
+                this.bounds = IntRect(
+                    IntOffset(bounds.left, bounds.top),
+                    IntSize(constraints.maxWidth, constraints.maxHeight)
+                )
+            }
+        }
+
+    override val root = LayoutNode().also {
+        it.measurePolicy = RootMeasurePolicy
+        it.modifier = semanticsModifier
+            .then(_focusManager.modifier)
+            .then(keyInputModifier)
+            .then(
+                KeyInputModifier(
+                    onKeyEvent = onKeyEvent,
+                    onPreviewKeyEvent = onPreviewKeyEvent
+                )
+            )
+    }
+
+    override val rootForTest = this
+
+    override val snapshotObserver = OwnerSnapshotObserver { command ->
+        onDispatchCommand?.invoke(command)
+    }
+    private val pointerInputEventProcessor = PointerInputEventProcessor(root)
+    private val measureAndLayoutDelegate = MeasureAndLayoutDelegate(root)
+
+    init {
+        snapshotObserver.startObserving()
+        root.attach(this)
+        _focusManager.takeFocus()
+    }
+
+    fun dispose() {
+        snapshotObserver.stopObserving()
+        // we don't need to call root.detach() because root will be garbage collected
+    }
+
+    override val textInputService = TextInputService(platformInputService)
+
+    override val fontLoader = FontLoader()
+
+    override val hapticFeedBack = DefaultHapticFeedback()
+
+    override val clipboardManager = PlatformClipboardManager()
+
+    override val accessibilityManager = DefaultAccessibilityManager()
+
+    override val textToolbar = DefaultTextToolbar()
+
+    override val semanticsOwner: SemanticsOwner = SemanticsOwner(root)
+
+    override val autofillTree = AutofillTree()
+
+    override val autofill: Autofill? get() = null
+
+    override val viewConfiguration: ViewConfiguration = DefaultViewConfiguration(density)
+
+    override fun sendKeyEvent(keyEvent: KeyEvent): Boolean =
+        sendKeyEvent(platformInputService, keyInputModifier, keyEvent)
+
+    override var showLayoutBounds = false
+
+    override fun requestFocus() = true
+
+    override fun onAttach(node: LayoutNode) = Unit
+
+    override fun onDetach(node: LayoutNode) {
+        measureAndLayoutDelegate.onNodeDetached(node)
+        snapshotObserver.clear(node)
+        needClearObservations = true
+    }
+
+    override val measureIteration: Long get() = measureAndLayoutDelegate.measureIteration
+
+    private var needsLayout = true
+    private var needsDraw = true
+
+    val needsRender get() = needsLayout || needsDraw
+    var onNeedsRender: (() -> Unit)? = null
+    var onDispatchCommand: ((Command) -> Unit)? = null
+    var containerCursor: PlatformComponentWithCursor? = null
+
+    fun render(canvas: org.jetbrains.skia.Canvas) {
+        needsLayout = false
+        measureAndLayout()
+        needsDraw = false
+        draw(canvas)
+        clearInvalidObservations()
+    }
+
+    private var needClearObservations = false
+
+    private fun clearInvalidObservations() {
+        if (needClearObservations) {
+            snapshotObserver.clearInvalidObservations()
+            needClearObservations = false
+        }
+    }
+
+    private fun requestLayout() {
+        needsLayout = true
+        needsDraw = true
+        onNeedsRender?.invoke()
+    }
+
+    private fun requestDraw() {
+        needsDraw = true
+        onNeedsRender?.invoke()
+    }
+
+    override fun measureAndLayout(sendPointerUpdate: Boolean) {
+        measureAndLayoutDelegate.updateRootConstraints(constraints)
+        if (measureAndLayoutDelegate.measureAndLayout()) {
+            requestDraw()
+        }
+        measureAndLayoutDelegate.dispatchOnPositionedCallbacks()
+    }
+
+    override fun onRequestMeasure(layoutNode: LayoutNode) {
+        if (measureAndLayoutDelegate.requestRemeasure(layoutNode)) {
+            requestLayout()
+        }
+    }
+
+    override fun onRequestRelayout(layoutNode: LayoutNode) {
+        if (measureAndLayoutDelegate.requestRelayout(layoutNode)) {
+            requestLayout()
+        }
+    }
+
+    override fun createLayer(
+        drawBlock: (Canvas) -> Unit,
+        invalidateParentLayer: () -> Unit
+    ) = SkiaLayer(
+        density,
+        invalidateParentLayer = {
+            invalidateParentLayer()
+            requestDraw()
+        },
+        drawBlock = drawBlock,
+        onDestroy = { needClearObservations = true }
+    )
+
+    override fun onSemanticsChange() = Unit
+
+    override fun onLayoutChange(layoutNode: LayoutNode) = Unit
+
+    override fun getFocusDirection(keyEvent: KeyEvent): FocusDirection? {
+        return when (keyEvent.key) {
+            Tab -> if (keyEvent.isShiftPressed) Previous else Next
+            DirectionCenter -> In
+            Back -> Out
+            else -> null
+        }
+    }
+
+    override fun calculatePositionInWindow(localPosition: Offset): Offset = localPosition
+
+    override fun calculateLocalPosition(positionInWindow: Offset): Offset = positionInWindow
+
+    override fun localToScreen(localPosition: Offset): Offset = localPosition
+
+    override fun screenToLocal(positionOnScreen: Offset): Offset = positionOnScreen
+
+    fun draw(canvas: org.jetbrains.skia.Canvas) {
+        root.draw(canvas.asComposeCanvas())
+    }
+
+    private var desiredPointerIcon: PointerIcon? = null
+
+    internal fun processPointerInput(event: PointerInputEvent): ProcessResult {
+        measureAndLayout()
+        desiredPointerIcon = null
+        return pointerInputEventProcessor.process(
+            event,
+            this,
+            isInBounds = event.pointers.all {
+                it.position.x in 0f..root.width.toFloat() &&
+                    it.position.y in 0f..root.height.toFloat()
+            }
+        ).also {
+            setPointerIcon(containerCursor, desiredPointerIcon)
+        }
+    }
+
+    override fun processPointerInput(timeMillis: Long, pointers: List<TestPointerInputEventData>) {
+        processPointerInput(
+            PointerInputEvent(
+                PointerEventType.Unknown,
+                timeMillis,
+                pointers.map { it.toPointerInputEventData() }
+            )
+        )
+    }
+
+    // TODO(demin): This is likely temporary. After PointerInputEvent can handle mouse events
+    //  (scroll in particular), we can replace it with processPointerInput. see b/166105940
+    internal fun onMouseScroll(position: Offset, event: MouseScrollEvent) {
+        measureAndLayout()
+
+        val inputFilters = HitTestResult<PointerInputFilter>()
+        root.hitTest(position, inputFilters)
+
+        for (
+            filter in inputFilters
+                .asReversed()
+                .asSequence()
+                .filterIsInstance<MouseScrollEventFilter>()
+        ) {
+            val isConsumed = filter.onMouseScroll(event)
+            if (isConsumed) break
+        }
+    }
+
+    override val pointerIconService: PointerIconService =
+        object : PointerIconService {
+            override var current: PointerIcon
+                get() = desiredPointerIcon ?: PointerIconDefaults.Default
+                set(value) { desiredPointerIcon = value }
+        }
+}
+
+internal expect fun sendKeyEvent(
+    platformInputService: PlatformInput,
+    keyInputModifier: KeyInputModifier,
+    keyEvent: KeyEvent
+): Boolean
+
+internal expect fun setPointerIcon(
+    containerCursor: PlatformComponentWithCursor?,
+    icon: PointerIcon?
+)
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/SkiaLayer.desktop.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaLayer.skiko.kt
similarity index 100%
rename from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/SkiaLayer.desktop.kt
rename to compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaLayer.skiko.kt
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopRootForTest.desktop.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaRootForTest.skiko.kt
similarity index 95%
rename from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopRootForTest.desktop.kt
rename to compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaRootForTest.skiko.kt
index 3ebf22f..e21e539 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopRootForTest.desktop.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/SkiaRootForTest.skiko.kt
@@ -25,7 +25,7 @@
  * To be used in tests.
  */
 @InternalComposeUiApi
-interface DesktopRootForTest : RootForTest {
+interface SkiaRootForTest : RootForTest {
     /**
      * Process pointer event
      *
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/Wrapper.desktop.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/Wrapper.skiko.kt
similarity index 86%
rename from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/Wrapper.desktop.kt
rename to compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/Wrapper.skiko.kt
index 4037e39..9498ca3 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/Wrapper.desktop.kt
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/Wrapper.skiko.kt
@@ -22,22 +22,22 @@
 import androidx.compose.ui.node.LayoutNode
 
 /**
- * Composes the given composable into [DesktopOwner]
+ * Composes the given composable into [SkiaBasedOwner]
  *
  * @param parent The parent composition reference to coordinate scheduling of composition updates
  *        If null then default root composition will be used.
  * @param content A `@Composable` function declaring the UI contents
  */
 @OptIn(ExperimentalComposeUiApi::class)
-internal fun DesktopOwner.setContent(
+internal fun SkiaBasedOwner.setContent(
     parent: CompositionContext,
     content: @Composable () -> Unit
 ): Composition {
-    val composition = Composition(DesktopUiApplier(root), parent)
+    val composition = Composition(DefaultUiApplier(root), parent)
     composition.setContent {
         ProvideCommonCompositionLocals(
             owner = this,
-            uriHandler = DesktopUriHandler(),
+            uriHandler = PlatformUriHandler(),
             content = content
         )
     }
@@ -48,6 +48,6 @@
     container: LayoutNode,
     parent: CompositionContext
 ): Composition = Composition(
-    DesktopUiApplier(container),
+    DefaultUiApplier(container),
     parent
 )
diff --git a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/node/LayoutNodeTest.kt b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/node/LayoutNodeTest.kt
index 6494d1f..4b0dbb6 100644
--- a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/node/LayoutNodeTest.kt
+++ b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/node/LayoutNodeTest.kt
@@ -37,6 +37,7 @@
 import androidx.compose.ui.input.key.KeyEvent
 import androidx.compose.ui.input.pointer.PointerEvent
 import androidx.compose.ui.input.pointer.PointerEventPass
+import androidx.compose.ui.input.pointer.PointerIconService
 import androidx.compose.ui.input.pointer.PointerInputFilter
 import androidx.compose.ui.input.pointer.PointerInputModifier
 import androidx.compose.ui.layout.AlignmentLine
@@ -2274,6 +2275,8 @@
         get() = Density(1f)
     override val textInputService: TextInputService
         get() = TODO("Not yet implemented")
+    override val pointerIconService: PointerIconService
+        get() = TODO("Not yet implemented")
     override val focusManager: FocusManager
         get() = TODO("Not yet implemented")
     override val windowInfo: WindowInfo
@@ -2310,7 +2313,7 @@
 
     override fun requestFocus(): Boolean = false
 
-    override fun measureAndLayout() {
+    override fun measureAndLayout(sendPointerUpdate: Boolean) {
     }
 
     override fun createLayer(
diff --git a/core/core-remoteviews/integration-tests/demos/build.gradle b/core/core-remoteviews/integration-tests/demos/build.gradle
new file mode 100644
index 0000000..66f4833
--- /dev/null
+++ b/core/core-remoteviews/integration-tests/demos/build.gradle
@@ -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.
+ */
+
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.application")
+    id("org.jetbrains.kotlin.android")
+}
+
+dependencies {
+    implementation(libs.kotlinStdlib)
+    implementation(project(":core:core-remoteviews"))
+}
+
+android {
+    defaultConfig {
+        // Change the APK name to match the *testapp regex we use to pick up APKs for testing as
+        // part of CI.
+        archivesBaseName = "core-remoteviews-demos-testapp"
+    }
+}
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/layoutTemplates/list1.xml b/core/core-remoteviews/integration-tests/demos/lint-baseline.xml
similarity index 73%
copy from glance/glance-appwidget/src/androidMain/layoutTemplates/list1.xml
copy to core/core-remoteviews/integration-tests/demos/lint-baseline.xml
index d228e836..9aeee86 100644
--- a/glance/glance-appwidget/src/androidMain/layoutTemplates/list1.xml
+++ b/core/core-remoteviews/integration-tests/demos/lint-baseline.xml
@@ -1,4 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?><!--
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
   Copyright 2021 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,6 +15,6 @@
   limitations under the License.
   -->
 
-<ListView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@id/glanceListView1"
-    android:divider="@null" />
+<issues format="6" by="lint 7.2.0-dev" type="baseline" client="gradle" dependencies="false" name="AGP (7.2.0-dev)" variant="all" version="7.2.0-dev">
+
+</issues>
diff --git a/core/core-remoteviews/integration-tests/demos/src/main/AndroidManifest.xml b/core/core-remoteviews/integration-tests/demos/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..25b3752
--- /dev/null
+++ b/core/core-remoteviews/integration-tests/demos/src/main/AndroidManifest.xml
@@ -0,0 +1,37 @@
+<?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 xmlns:android="http://schemas.android.com/apk/res/android"
+    package="androidx.core.remoteviews.demos">
+
+    <application
+        android:supportsRtl="true"
+        android:allowBackup="false"
+        android:label="RemoteViewsCompatDemo">
+        <receiver
+            android:name=".SampleAppWidgetProvider"
+            android:label="RemoteViewsCompat Demo"
+            android:exported="true">
+            <intent-filter>
+                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
+                <action android:name="android.intent.action.LOCALE_CHANGED" />
+            </intent-filter>
+            <meta-data
+                android:name="android.appwidget.provider"
+                android:resource="@xml/my_app_widget_info" />
+        </receiver>
+    </application>
+</manifest>
\ No newline at end of file
diff --git a/core/core-remoteviews/integration-tests/demos/src/main/java/androidx/core/remoteviews/demos/SampleAppWidgetProvider.kt b/core/core-remoteviews/integration-tests/demos/src/main/java/androidx/core/remoteviews/demos/SampleAppWidgetProvider.kt
new file mode 100644
index 0000000..1e4f6a9
--- /dev/null
+++ b/core/core-remoteviews/integration-tests/demos/src/main/java/androidx/core/remoteviews/demos/SampleAppWidgetProvider.kt
@@ -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.
+ */
+
+package androidx.core.remoteviews.demos
+
+import android.appwidget.AppWidgetManager
+import android.appwidget.AppWidgetProvider
+import android.content.Context
+import android.widget.RemoteViews
+import androidx.core.widget.RemoteViewsCompat
+import androidx.core.widget.RemoteViewsCompat.RemoteCollectionItems
+
+public class SampleAppWidgetProvider : AppWidgetProvider() {
+    override fun onUpdate(
+        context: Context,
+        appWidgetManager: AppWidgetManager,
+        appWidgetIds: IntArray
+    ) {
+        appWidgetIds.forEach { appWidgetId ->
+            val mainRemoteViews = RemoteViews(context.packageName, R.layout.main_layout)
+
+            val itemsBuilder = RemoteCollectionItems.Builder()
+            for (i in 0 until 10) {
+                val itemRv = RemoteViews(context.packageName, R.layout.item_layout)
+                itemRv.setTextViewText(R.id.text, "Row ${i + 1}")
+                itemsBuilder.addItem(id = i.toLong(), view = itemRv)
+            }
+            RemoteViewsCompat.setRemoteAdapter(
+                context = context,
+                remoteViews = mainRemoteViews,
+                appWidgetId = appWidgetId,
+                viewId = R.id.list,
+                items = itemsBuilder.build()
+            )
+
+            appWidgetManager.updateAppWidget(appWidgetId, mainRemoteViews)
+        }
+    }
+}
diff --git a/glance/glance-appwidget/src/androidMain/layoutTemplates/list1.xml b/core/core-remoteviews/integration-tests/demos/src/main/res/drawable/widget_background.xml
similarity index 71%
copy from glance/glance-appwidget/src/androidMain/layoutTemplates/list1.xml
copy to core/core-remoteviews/integration-tests/demos/src/main/res/drawable/widget_background.xml
index d228e836..14d8e2d 100644
--- a/glance/glance-appwidget/src/androidMain/layoutTemplates/list1.xml
+++ b/core/core-remoteviews/integration-tests/demos/src/main/res/drawable/widget_background.xml
@@ -1,4 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?><!--
+<?xml version="1.0" encoding="utf-8"?>
+<!--
   Copyright 2021 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,6 +15,8 @@
   limitations under the License.
   -->
 
-<ListView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@id/glanceListView1"
-    android:divider="@null" />
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="#FFEEEEEE" />
+    <corners android:radius="16dp"/>
+</shape>
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/layoutTemplates/list1.xml b/core/core-remoteviews/integration-tests/demos/src/main/res/layout/empty.xml
similarity index 61%
copy from glance/glance-appwidget/src/androidMain/layoutTemplates/list1.xml
copy to core/core-remoteviews/integration-tests/demos/src/main/res/layout/empty.xml
index d228e836..534f30e 100644
--- a/glance/glance-appwidget/src/androidMain/layoutTemplates/list1.xml
+++ b/core/core-remoteviews/integration-tests/demos/src/main/res/layout/empty.xml
@@ -14,6 +14,13 @@
   limitations under the License.
   -->
 
-<ListView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@id/glanceListView1"
-    android:divider="@null" />
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@android:id/background"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:text="Loading ..." />
+</FrameLayout>
\ No newline at end of file
diff --git a/core/core-remoteviews/integration-tests/demos/src/main/res/layout/item_layout.xml b/core/core-remoteviews/integration-tests/demos/src/main/res/layout/item_layout.xml
new file mode 100644
index 0000000..e4bf497
--- /dev/null
+++ b/core/core-remoteviews/integration-tests/demos/src/main/res/layout/item_layout.xml
@@ -0,0 +1,29 @@
+<?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.
+  -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="horizontal"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <TextView
+        android:id="@+id/text"
+        android:paddingHorizontal="16dp"
+        android:paddingVertical="8dp"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/res/layout/responsive_preview_layout.xml b/core/core-remoteviews/integration-tests/demos/src/main/res/layout/main_layout.xml
similarity index 61%
copy from glance/glance-appwidget/integration-tests/demos/src/main/res/layout/responsive_preview_layout.xml
copy to core/core-remoteviews/integration-tests/demos/src/main/res/layout/main_layout.xml
index 81a4a56..fad18f7 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/res/layout/responsive_preview_layout.xml
+++ b/core/core-remoteviews/integration-tests/demos/src/main/res/layout/main_layout.xml
@@ -15,24 +15,25 @@
   -->
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
     android:id="@android:id/background"
+    android:orientation="vertical"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:padding="8dp"
-    android:background="@color/responsive_widget_background"
-    android:gravity="center_vertical">
+    android:background="@drawable/widget_background"
+    android:clipToOutline="true">
+
     <TextView
-        android:layout_width="wrap_content"
+        android:text="List demo"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:text="@string/responsive_widget_title"
-        android:textAppearance="@style/TextAppearance.Title"/>
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="Current layout: 100dp x 100dp" />
-    <Button
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text = "Button" />
+        android:paddingVertical="8dp"
+        android:paddingHorizontal="16dp"
+        android:textColor="?android:attr/textColorPrimary"
+        android:textSize="14sp"/>
+
+    <ListView
+        android:id="@+id/list"
+        android:scrollbars="none"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"/>
 </LinearLayout>
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/layoutTemplates/list1.xml b/core/core-remoteviews/integration-tests/demos/src/main/res/xml/my_app_widget_info.xml
similarity index 63%
copy from glance/glance-appwidget/src/androidMain/layoutTemplates/list1.xml
copy to core/core-remoteviews/integration-tests/demos/src/main/res/xml/my_app_widget_info.xml
index d228e836..9d20af0 100644
--- a/glance/glance-appwidget/src/androidMain/layoutTemplates/list1.xml
+++ b/core/core-remoteviews/integration-tests/demos/src/main/res/xml/my_app_widget_info.xml
@@ -14,6 +14,12 @@
   limitations under the License.
   -->
 
-<ListView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@id/glanceListView1"
-    android:divider="@null" />
+<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
+    android:minWidth="100dp"
+    android:minHeight="100dp"
+    android:minResizeWidth="40dp"
+    android:minResizeHeight="40dp"
+    android:initialLayout="@layout/empty"
+    android:resizeMode="horizontal|vertical"
+    android:widgetCategory="home_screen">
+</appwidget-provider>
\ No newline at end of file
diff --git a/core/core-splashscreen/api/current.txt b/core/core-splashscreen/api/current.txt
index 898f855..5208466 100644
--- a/core/core-splashscreen/api/current.txt
+++ b/core/core-splashscreen/api/current.txt
@@ -3,7 +3,7 @@
 
   public final class SplashScreen {
     method public static androidx.core.splashscreen.SplashScreen installSplashScreen(android.app.Activity);
-    method public void setKeepVisibleCondition(androidx.core.splashscreen.SplashScreen.KeepOnScreenCondition condition);
+    method public void setKeepOnScreenCondition(androidx.core.splashscreen.SplashScreen.KeepOnScreenCondition condition);
     method public void setOnExitAnimationListener(androidx.core.splashscreen.SplashScreen.OnExitAnimationListener listener);
     field public static final androidx.core.splashscreen.SplashScreen.Companion Companion;
   }
diff --git a/core/core-splashscreen/api/public_plus_experimental_current.txt b/core/core-splashscreen/api/public_plus_experimental_current.txt
index 898f855..5208466 100644
--- a/core/core-splashscreen/api/public_plus_experimental_current.txt
+++ b/core/core-splashscreen/api/public_plus_experimental_current.txt
@@ -3,7 +3,7 @@
 
   public final class SplashScreen {
     method public static androidx.core.splashscreen.SplashScreen installSplashScreen(android.app.Activity);
-    method public void setKeepVisibleCondition(androidx.core.splashscreen.SplashScreen.KeepOnScreenCondition condition);
+    method public void setKeepOnScreenCondition(androidx.core.splashscreen.SplashScreen.KeepOnScreenCondition condition);
     method public void setOnExitAnimationListener(androidx.core.splashscreen.SplashScreen.OnExitAnimationListener listener);
     field public static final androidx.core.splashscreen.SplashScreen.Companion Companion;
   }
diff --git a/core/core-splashscreen/api/restricted_current.txt b/core/core-splashscreen/api/restricted_current.txt
index 898f855..5208466 100644
--- a/core/core-splashscreen/api/restricted_current.txt
+++ b/core/core-splashscreen/api/restricted_current.txt
@@ -3,7 +3,7 @@
 
   public final class SplashScreen {
     method public static androidx.core.splashscreen.SplashScreen installSplashScreen(android.app.Activity);
-    method public void setKeepVisibleCondition(androidx.core.splashscreen.SplashScreen.KeepOnScreenCondition condition);
+    method public void setKeepOnScreenCondition(androidx.core.splashscreen.SplashScreen.KeepOnScreenCondition condition);
     method public void setOnExitAnimationListener(androidx.core.splashscreen.SplashScreen.OnExitAnimationListener listener);
     field public static final androidx.core.splashscreen.SplashScreen.Companion Companion;
   }
diff --git a/core/core-splashscreen/samples/src/main/java/androidx/core/splashscreen/sample/SplashScreenSampleActivity.kt b/core/core-splashscreen/samples/src/main/java/androidx/core/splashscreen/sample/SplashScreenSampleActivity.kt
index 2cc239c..5abcc47 100644
--- a/core/core-splashscreen/samples/src/main/java/androidx/core/splashscreen/sample/SplashScreenSampleActivity.kt
+++ b/core/core-splashscreen/samples/src/main/java/androidx/core/splashscreen/sample/SplashScreenSampleActivity.kt
@@ -55,7 +55,7 @@
         setContentView(R.layout.main_activity)
 
         // (Optional) We can keep the splash screen visible until our app is ready.
-        splashScreen.setKeepVisibleCondition { !appReady }
+        splashScreen.setKeepOnScreenCondition { !appReady }
 
         // (Optional) Setting an OnExitAnimationListener on the SplashScreen indicates
         // to the system that the application will handle the exit animation.
diff --git a/core/core-splashscreen/src/androidTest/java/androidx/core/splashscreen/test/SplashScreenTestController.kt b/core/core-splashscreen/src/androidTest/java/androidx/core/splashscreen/test/SplashScreenTestController.kt
index 071fb7f..dd4d89a 100644
--- a/core/core-splashscreen/src/androidTest/java/androidx/core/splashscreen/test/SplashScreenTestController.kt
+++ b/core/core-splashscreen/src/androidTest/java/androidx/core/splashscreen/test/SplashScreenTestController.kt
@@ -87,7 +87,7 @@
         activity.setContentView(R.layout.main_activity)
 
         if (waitForSplashscreen) {
-            splashScreen.setKeepVisibleCondition {
+            splashScreen.setKeepOnScreenCondition {
                 waitedLatch.countDown()
                 val shouldWait = waitBarrier.get() || waitedLatch.count > 0L
                 if (!shouldWait && takeScreenShot && splashScreenScreenshot == null) {
diff --git a/core/core-splashscreen/src/main/java/androidx/core/splashscreen/SplashScreen.kt b/core/core-splashscreen/src/main/java/androidx/core/splashscreen/SplashScreen.kt
index 618384e..57fef19 100644
--- a/core/core-splashscreen/src/main/java/androidx/core/splashscreen/SplashScreen.kt
+++ b/core/core-splashscreen/src/main/java/androidx/core/splashscreen/SplashScreen.kt
@@ -86,8 +86,8 @@
      * @param condition The condition evaluated to decide whether to keep the splash screen on
      * screen
      */
-    public fun setKeepVisibleCondition(condition: KeepOnScreenCondition) {
-        impl.setKeepVisibleCondition(condition)
+    public fun setKeepOnScreenCondition(condition: KeepOnScreenCondition) {
+        impl.setKeepOnScreenCondition(condition)
     }
 
     /**
@@ -104,7 +104,7 @@
      * @param listener The [OnExitAnimationListener] that will be called when the splash screen
      * is ready to be dismissed.
      *
-     * @see setKeepVisibleCondition
+     * @see setKeepOnScreenCondition
      * @see OnExitAnimationListener
      * @see SplashScreenViewProvider
      */
@@ -211,7 +211,7 @@
             }
         }
 
-        open fun setKeepVisibleCondition(keepOnScreenCondition: KeepOnScreenCondition) {
+        open fun setKeepOnScreenCondition(keepOnScreenCondition: KeepOnScreenCondition) {
             splashScreenWaitPredicate = keepOnScreenCondition
             val contentView = activity.findViewById<View>(android.R.id.content)
             val observer = contentView.viewTreeObserver
@@ -314,7 +314,7 @@
             setPostSplashScreenTheme(activity.theme, TypedValue())
         }
 
-        override fun setKeepVisibleCondition(keepOnScreenCondition: KeepOnScreenCondition) {
+        override fun setKeepOnScreenCondition(keepOnScreenCondition: KeepOnScreenCondition) {
             splashScreenWaitPredicate = keepOnScreenCondition
             val contentView = activity.findViewById<View>(android.R.id.content)
             val observer = contentView.viewTreeObserver
diff --git a/core/core/api/current.txt b/core/core/api/current.txt
index 0043002..073640d 100644
--- a/core/core/api/current.txt
+++ b/core/core/api/current.txt
@@ -379,6 +379,7 @@
     method @androidx.core.app.NotificationCompat.Action.SemanticAction public int getSemanticAction();
     method public boolean getShowsUserInterface();
     method public CharSequence? getTitle();
+    method public boolean isAuthenticationRequired();
     method public boolean isContextual();
     field public static final int SEMANTIC_ACTION_ARCHIVE = 5; // 0x5
     field public static final int SEMANTIC_ACTION_CALL = 10; // 0xa
@@ -406,6 +407,7 @@
     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 setAuthenticationRequired(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);
diff --git a/core/core/api/public_plus_experimental_current.txt b/core/core/api/public_plus_experimental_current.txt
index 4f2f9a2..fd7fb45 100644
--- a/core/core/api/public_plus_experimental_current.txt
+++ b/core/core/api/public_plus_experimental_current.txt
@@ -379,6 +379,7 @@
     method @androidx.core.app.NotificationCompat.Action.SemanticAction public int getSemanticAction();
     method public boolean getShowsUserInterface();
     method public CharSequence? getTitle();
+    method public boolean isAuthenticationRequired();
     method public boolean isContextual();
     field public static final int SEMANTIC_ACTION_ARCHIVE = 5; // 0x5
     field public static final int SEMANTIC_ACTION_CALL = 10; // 0xa
@@ -406,6 +407,7 @@
     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 setAuthenticationRequired(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);
diff --git a/core/core/api/restricted_current.txt b/core/core/api/restricted_current.txt
index 82e22b2..8fdd3e6 100644
--- a/core/core/api/restricted_current.txt
+++ b/core/core/api/restricted_current.txt
@@ -424,6 +424,7 @@
     method @androidx.core.app.NotificationCompat.Action.SemanticAction public int getSemanticAction();
     method public boolean getShowsUserInterface();
     method public CharSequence? getTitle();
+    method public boolean isAuthenticationRequired();
     method public boolean isContextual();
     field public static final int SEMANTIC_ACTION_ARCHIVE = 5; // 0x5
     field public static final int SEMANTIC_ACTION_CALL = 10; // 0xa
@@ -452,6 +453,7 @@
     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 setAuthenticationRequired(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);
diff --git a/core/core/src/androidTest/java/androidx/core/app/NotificationCompatTest.java b/core/core/src/androidTest/java/androidx/core/app/NotificationCompatTest.java
index 9a47e38..b07dc73 100644
--- a/core/core/src/androidTest/java/androidx/core/app/NotificationCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/app/NotificationCompatTest.java
@@ -2017,6 +2017,39 @@
     }
 
     @Test
+    public void action_builder_defaultNoAuthRequired() {
+        NotificationCompat.Action action = newActionBuilder().build();
+        assertFalse(action.isAuthenticationRequired());
+    }
+
+    @Test
+    public void action_builder_setAuthRequired() {
+        PendingIntent pendingIntent = PendingIntent.getActivity(
+                mContext, 0, new Intent(), PendingIntent.FLAG_IMMUTABLE);
+        NotificationCompat.Action action =
+                new NotificationCompat.Action.Builder(0, "Test Title", pendingIntent)
+                        .setAuthenticationRequired(true)
+                        .build();
+        assertTrue(action.isAuthenticationRequired());
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = 31)
+    public void action_authRequired_toAndFromNotification() {
+        if (Build.VERSION.SDK_INT < 31) return;
+        PendingIntent pendingIntent = PendingIntent.getActivity(
+                mContext, 0, new Intent(), PendingIntent.FLAG_IMMUTABLE);
+        NotificationCompat.Action action = new NotificationCompat.Action.Builder(
+                R.drawable.notification_bg, "Test Title", pendingIntent)
+                .setAuthenticationRequired(true)
+                .build();
+        Notification notification = newNotificationBuilder().addAction(action).build();
+        NotificationCompat.Action result = NotificationCompat.getAction(notification, 0);
+
+        assertTrue(result.isAuthenticationRequired());
+    }
+
+    @Test
     public void setBubbleMetadataIntent() {
         IconCompat icon = IconCompat.createWithAdaptiveBitmap(BitmapFactory.decodeResource(
                 mContext.getResources(),
diff --git a/core/core/src/androidTest/java/androidx/core/view/ViewCompatReceiveContentTest.java b/core/core/src/androidTest/java/androidx/core/view/ViewCompatReceiveContentTest.java
index 97d1d7b..eb11b4e 100644
--- a/core/core/src/androidTest/java/androidx/core/view/ViewCompatReceiveContentTest.java
+++ b/core/core/src/androidTest/java/androidx/core/view/ViewCompatReceiveContentTest.java
@@ -29,6 +29,7 @@
 import androidx.test.annotation.UiThreadTest;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.rule.ActivityTestRule;
 
 import org.junit.Before;
@@ -55,6 +56,7 @@
         mMockReceiver = Mockito.mock(OnReceiveContentListener.class);
     }
 
+    @SdkSuppress(maxSdkVersion = 30) // b/202524605
     @UiThreadTest
     @Test
     public void testSetOnReceiveContentListener() throws Exception {
diff --git a/core/core/src/main/java/androidx/core/app/NotificationCompat.java b/core/core/src/main/java/androidx/core/app/NotificationCompat.java
index ee63746..8419c4a 100644
--- a/core/core/src/main/java/androidx/core/app/NotificationCompat.java
+++ b/core/core/src/main/java/androidx/core/app/NotificationCompat.java
@@ -4599,6 +4599,8 @@
          */
         public PendingIntent actionIntent;
 
+        private boolean mAuthenticationRequired;
+
         public Action(int icon, @Nullable CharSequence title, @Nullable PendingIntent intent) {
             this(icon == 0 ? null : IconCompat.createWithResource(null, "", icon), title, intent);
         }
@@ -4610,17 +4612,17 @@
         public Action(@Nullable IconCompat icon, @Nullable CharSequence title,
                 @Nullable PendingIntent intent) {
             this(icon, title, intent, new Bundle(), null, null, true, SEMANTIC_ACTION_NONE, true,
-                    false /* isContextual */);
+                    false /* isContextual */, false /* authRequired */);
         }
 
         Action(int icon, @Nullable CharSequence title, @Nullable PendingIntent intent,
                 @Nullable Bundle extras,
                 @Nullable RemoteInput[] remoteInputs, @Nullable RemoteInput[] dataOnlyRemoteInputs,
                 boolean allowGeneratedReplies, @SemanticAction int semanticAction,
-                boolean showsUserInterface, boolean isContextual) {
+                boolean showsUserInterface, boolean isContextual, boolean requireAuth) {
             this(icon == 0 ? null : IconCompat.createWithResource(null, "", icon), title,
                     intent, extras, remoteInputs, dataOnlyRemoteInputs, allowGeneratedReplies,
-                    semanticAction, showsUserInterface, isContextual);
+                    semanticAction, showsUserInterface, isContextual, requireAuth);
         }
 
         // Package private access to avoid adding a SyntheticAccessor for the Action.Builder class.
@@ -4629,7 +4631,7 @@
                 @Nullable PendingIntent intent, @Nullable Bundle extras,
                 @Nullable RemoteInput[] remoteInputs, @Nullable RemoteInput[] dataOnlyRemoteInputs,
                 boolean allowGeneratedReplies, @SemanticAction int semanticAction,
-                boolean showsUserInterface, boolean isContextual) {
+                boolean showsUserInterface, boolean isContextual, boolean requireAuth) {
             this.mIcon = icon;
             if (icon != null && icon.getType() == IconCompat.TYPE_RESOURCE) {
                 this.icon = icon.getResId();
@@ -4643,6 +4645,7 @@
             this.mSemanticAction = semanticAction;
             this.mShowsUserInterface = showsUserInterface;
             this.mIsContextual = isContextual;
+            this.mAuthenticationRequired = requireAuth;
         }
 
         /**
@@ -4689,6 +4692,17 @@
         }
 
         /**
+         * Returns whether the OS should only send this action's {@link PendingIntent} on an
+         * unlocked device.
+         *
+         * If the device is locked when the action is invoked, the OS should show the keyguard and
+         * require successful authentication before invoking the intent.
+         */
+        public boolean isAuthenticationRequired() {
+            return mAuthenticationRequired;
+        }
+
+        /**
          * Get the list of inputs to be collected from the user when this action is sent.
          * May return null if no remote inputs were added. Only returns inputs which accept
          * a text input. For inputs which only accept data use {@link #getDataOnlyRemoteInputs}.
@@ -4752,6 +4766,7 @@
             private @SemanticAction int mSemanticAction;
             private boolean mShowsUserInterface = true;
             private boolean mIsContextual;
+            private boolean mAuthenticationRequired;
 
             /**
              * Creates a {@link Builder} from an {@link android.app.Notification.Action}.
@@ -4788,6 +4803,9 @@
                 if (Build.VERSION.SDK_INT >= 29) {
                     builder.setContextual(action.isContextual());
                 }
+                if (Build.VERSION.SDK_INT >= 31) {
+                    builder.setAuthenticationRequired(action.isAuthenticationRequired());
+                }
                 return builder;
             }
 
@@ -4803,7 +4821,7 @@
             public Builder(@Nullable IconCompat icon, @Nullable CharSequence title,
                     @Nullable PendingIntent intent) {
                 this(icon, title, intent, new Bundle(), null, true, SEMANTIC_ACTION_NONE, true,
-                        false /* isContextual */);
+                        false /* isContextual */, false /* authRequiored */);
             }
 
             /**
@@ -4820,7 +4838,7 @@
                         true,
                         SEMANTIC_ACTION_NONE,
                         true,
-                        false /* isContextual */);
+                        false /* isContextual */, false /* authRequired */);
             }
 
             /**
@@ -4833,14 +4851,14 @@
                         new Bundle(action.mExtras),
                         action.getRemoteInputs(), action.getAllowGeneratedReplies(),
                         action.getSemanticAction(), action.mShowsUserInterface,
-                        action.isContextual());
+                        action.isContextual(), action.isAuthenticationRequired());
             }
 
             private Builder(@Nullable IconCompat icon, @Nullable CharSequence title,
                     @Nullable PendingIntent intent, @NonNull Bundle extras,
                     @Nullable RemoteInput[] remoteInputs, boolean allowGeneratedReplies,
                     @SemanticAction int semanticAction, boolean showsUserInterface,
-                    boolean isContextual) {
+                    boolean isContextual, boolean authRequired) {
                 mIcon = icon;
                 mTitle = NotificationCompat.Builder.limitCharSequenceLength(title);
                 mIntent = intent;
@@ -4851,6 +4869,7 @@
                 mSemanticAction = semanticAction;
                 mShowsUserInterface = showsUserInterface;
                 mIsContextual = isContextual;
+                mAuthenticationRequired = authRequired;
             }
 
             /**
@@ -4931,6 +4950,21 @@
             }
 
             /**
+             * From API 31, sets whether the OS should only send this action's {@link PendingIntent}
+             * on an unlocked device.
+             *
+             * If this is true and the device is locked when the action is invoked, the OS will
+             * show the keyguard and require successful authentication before invoking the intent.
+             * If this is false and the device is locked, the OS will decide whether authentication
+             * should be required.
+             */
+            @NonNull
+            public Builder setAuthenticationRequired(boolean authenticationRequired) {
+                mAuthenticationRequired = authenticationRequired;
+                return this;
+            }
+
+            /**
              * Set whether or not this {@link Action}'s {@link PendingIntent} will open a user
              * interface.
              * @param showsUserInterface {@code true} if this {@link Action}'s {@link PendingIntent}
@@ -4992,7 +5026,7 @@
                         ? null : textInputs.toArray(new RemoteInput[textInputs.size()]);
                 return new Action(mIcon, mTitle, mIntent, mExtras, textInputsArr,
                         dataOnlyInputsArr, mAllowGeneratedReplies, mSemanticAction,
-                        mShowsUserInterface, mIsContextual);
+                        mShowsUserInterface, mIsContextual, mAuthenticationRequired);
             }
         }
 
@@ -5644,6 +5678,9 @@
             if (Build.VERSION.SDK_INT >= 24) {
                 actionBuilder.setAllowGeneratedReplies(actionCompat.getAllowGeneratedReplies());
             }
+            if (Build.VERSION.SDK_INT >= 31) {
+                actionBuilder.setAuthenticationRequired(actionCompat.isAuthenticationRequired());
+            }
             actionBuilder.addExtras(actionExtras);
             RemoteInput[] remoteInputCompats = actionCompat.getRemoteInputs();
             if (remoteInputCompats != null) {
@@ -7466,21 +7503,24 @@
 
         final boolean isContextual = Build.VERSION.SDK_INT >= 29 ? action.isContextual() : false;
 
+        final boolean authRequired =
+                Build.VERSION.SDK_INT >= 31 ? action.isAuthenticationRequired() : false;
+
         if (Build.VERSION.SDK_INT >= 23) {
             if (action.getIcon() == null && action.icon != 0) {
                 return new Action(action.icon, action.title, action.actionIntent,
                         action.getExtras(), remoteInputs, null, allowGeneratedReplies,
-                        semanticAction, showsUserInterface, isContextual);
+                        semanticAction, showsUserInterface, isContextual, authRequired);
             }
             IconCompat icon = action.getIcon() == null
                     ? null : IconCompat.createFromIconOrNullIfZeroResId(action.getIcon());
             return new Action(icon, action.title, action.actionIntent, action.getExtras(),
                     remoteInputs, null, allowGeneratedReplies, semanticAction, showsUserInterface,
-                    isContextual);
+                    isContextual, authRequired);
         } else {
             return new Action(action.icon, action.title, action.actionIntent, action.getExtras(),
                     remoteInputs, null, allowGeneratedReplies, semanticAction, showsUserInterface,
-                    isContextual);
+                    isContextual, authRequired);
         }
     }
 
diff --git a/core/core/src/main/java/androidx/core/app/NotificationCompatBuilder.java b/core/core/src/main/java/androidx/core/app/NotificationCompatBuilder.java
index 827b9bf..76a9bcd 100644
--- a/core/core/src/main/java/androidx/core/app/NotificationCompatBuilder.java
+++ b/core/core/src/main/java/androidx/core/app/NotificationCompatBuilder.java
@@ -394,6 +394,10 @@
                 actionBuilder.setContextual(action.isContextual());
             }
 
+            if (Build.VERSION.SDK_INT >= 31) {
+                actionBuilder.setAuthenticationRequired(action.isAuthenticationRequired());
+            }
+
             actionExtras.putBoolean(NotificationCompat.Action.EXTRA_SHOWS_USER_INTERFACE,
                     action.getShowsUserInterface());
             actionBuilder.addExtras(actionExtras);
diff --git a/core/core/src/main/java/androidx/core/app/NotificationCompatJellybean.java b/core/core/src/main/java/androidx/core/app/NotificationCompatJellybean.java
index 35a7b45..b71685c 100644
--- a/core/core/src/main/java/androidx/core/app/NotificationCompatJellybean.java
+++ b/core/core/src/main/java/androidx/core/app/NotificationCompatJellybean.java
@@ -133,7 +133,8 @@
         }
         return new NotificationCompat.Action(icon, title, actionIntent, extras, remoteInputs,
                 dataOnlyRemoteInputs, allowGeneratedReplies,
-                NotificationCompat.Action.SEMANTIC_ACTION_NONE, true, false /* isContextual */);
+                NotificationCompat.Action.SEMANTIC_ACTION_NONE, true, false /* isContextual */,
+                false /* authRequired */);
     }
 
     public static Bundle writeActionAndGetExtras(
@@ -247,7 +248,8 @@
                 allowGeneratedReplies,
                 bundle.getInt(KEY_SEMANTIC_ACTION),
                 bundle.getBoolean(KEY_SHOWS_USER_INTERFACE),
-                false /* is_contextual is only supported for Q+ devices */);
+                false /* is_contextual is only supported for Q+ devices */,
+                false /* authRequired */);
     }
 
     static Bundle getBundleForAction(NotificationCompat.Action action) {
diff --git a/core/core/src/main/java/androidx/core/view/inputmethod/InputConnectionCompat.java b/core/core/src/main/java/androidx/core/view/inputmethod/InputConnectionCompat.java
index c635be2..d83e1cb 100644
--- a/core/core/src/main/java/androidx/core/view/inputmethod/InputConnectionCompat.java
+++ b/core/core/src/main/java/androidx/core/view/inputmethod/InputConnectionCompat.java
@@ -141,18 +141,6 @@
     public static boolean commitContent(@NonNull InputConnection inputConnection,
             @NonNull EditorInfo editorInfo, @NonNull InputContentInfoCompat inputContentInfo,
             int flags, @Nullable Bundle opts) {
-        final ClipDescription description = inputContentInfo.getDescription();
-        boolean supported = false;
-        for (String mimeType : EditorInfoCompat.getContentMimeTypes(editorInfo)) {
-            if (description.hasMimeType(mimeType)) {
-                supported = true;
-                break;
-            }
-        }
-        if (!supported) {
-            return false;
-        }
-
         if (Build.VERSION.SDK_INT >= 25) {
             return inputConnection.commitContent(
                     (InputContentInfo) inputContentInfo.unwrap(), flags, opts);
diff --git a/datastore/datastore-core/api/current.txt b/datastore/datastore-core/api/current.txt
index d63f849d..abfdd9c 100644
--- a/datastore/datastore-core/api/current.txt
+++ b/datastore/datastore-core/api/current.txt
@@ -1,7 +1,7 @@
 // Signature format: 4.0
 package androidx.datastore.core {
 
-  public final class CorruptionException extends androidx.datastore.core.StorageException {
+  public final class CorruptionException extends java.io.IOException {
     ctor public CorruptionException(String message, optional Throwable? cause);
   }
 
@@ -32,10 +32,6 @@
     property public abstract T! defaultValue;
   }
 
-  public class StorageException extends java.io.IOException {
-    ctor public StorageException(String message, optional Throwable? cause);
-  }
-
 }
 
 package androidx.datastore.core.handlers {
diff --git a/datastore/datastore-core/api/public_plus_experimental_current.txt b/datastore/datastore-core/api/public_plus_experimental_current.txt
index d63f849d..abfdd9c 100644
--- a/datastore/datastore-core/api/public_plus_experimental_current.txt
+++ b/datastore/datastore-core/api/public_plus_experimental_current.txt
@@ -1,7 +1,7 @@
 // Signature format: 4.0
 package androidx.datastore.core {
 
-  public final class CorruptionException extends androidx.datastore.core.StorageException {
+  public final class CorruptionException extends java.io.IOException {
     ctor public CorruptionException(String message, optional Throwable? cause);
   }
 
@@ -32,10 +32,6 @@
     property public abstract T! defaultValue;
   }
 
-  public class StorageException extends java.io.IOException {
-    ctor public StorageException(String message, optional Throwable? cause);
-  }
-
 }
 
 package androidx.datastore.core.handlers {
diff --git a/datastore/datastore-core/api/restricted_current.txt b/datastore/datastore-core/api/restricted_current.txt
index d63f849d..abfdd9c 100644
--- a/datastore/datastore-core/api/restricted_current.txt
+++ b/datastore/datastore-core/api/restricted_current.txt
@@ -1,7 +1,7 @@
 // Signature format: 4.0
 package androidx.datastore.core {
 
-  public final class CorruptionException extends androidx.datastore.core.StorageException {
+  public final class CorruptionException extends java.io.IOException {
     ctor public CorruptionException(String message, optional Throwable? cause);
   }
 
@@ -32,10 +32,6 @@
     property public abstract T! defaultValue;
   }
 
-  public class StorageException extends java.io.IOException {
-    ctor public StorageException(String message, optional Throwable? cause);
-  }
-
 }
 
 package androidx.datastore.core.handlers {
diff --git a/datastore/datastore-core/src/main/java/androidx/datastore/core/Serializer.kt b/datastore/datastore-core/src/main/java/androidx/datastore/core/Serializer.kt
index c2ca9b0..74ae35c 100644
--- a/datastore/datastore-core/src/main/java/androidx/datastore/core/Serializer.kt
+++ b/datastore/datastore-core/src/main/java/androidx/datastore/core/Serializer.kt
@@ -16,6 +16,7 @@
 
 package androidx.datastore.core
 
+import java.io.IOException
 import java.io.InputStream
 import java.io.OutputStream
 
@@ -50,9 +51,9 @@
 }
 
 /**
- * A subclass of StorageException that indicates that the file could not be de-serialized due to
- * data format corruption. This exception should not be thrown when the StorageException is due
- * to a transient IO issue or permissions issue.
+ * A subclass of IOException that indicates that the file could not be de-serialized due
+ * to data format corruption. This exception should not be thrown when the IOException is
+ * due to a transient IO issue or permissions issue.
  */
 public class CorruptionException(message: String, cause: Throwable? = null) :
-    StorageException(message, cause)
\ No newline at end of file
+    IOException(message, cause)
\ No newline at end of file
diff --git a/development/build_log_simplifier/messages.ignore b/development/build_log_simplifier/messages.ignore
index 333a3bd..5be8b46 100644
--- a/development/build_log_simplifier/messages.ignore
+++ b/development/build_log_simplifier/messages.ignore
@@ -125,12 +125,12 @@
 CHECKOUT=\$CHECKOUT
 GRADLE_USER_HOME=\$GRADLE_USER_HOME
 Downloading file\:\$SUPPORT\/gradle\/wrapper\/.*
-\.\.\.\.\.\.\.\.\.\.10%\.\.\.\.\.\.\.\.\.\.\.20%\.\.\.\.\.\.\.\.\.\.\.30%\.\.\.\.\.\.\.\.\.\.\.40%\.\.\.\.\.\.\.\.\.\.\.50%\.\.\.\.\.\.\.\.\.\.\.60%\.\.\.\.\.\.\.\.\.\.\.70%\.\.\.\.\.\.\.\.\.\.\.80%\.\.\.\.\.\.\.\.\.\.\.90%\.\.\.\.\.\.\.\.\.\.\.100%
+[.]+10%[.]+20%[.]+30%[.]+40%[.]+50%[.]+60%[.]+70%[.]+80%[.]+90%[.]+100%
 Welcome to Gradle .*
 Here are the highlights of this release:
-\- Toolchain support for Scala
-\- More cache hits when Java source files have platform-specific line endings
-\- More resilient remote HTTP build cache behavior
+\- Easily declare new test suites in Java projects
+\- Support for Java 17
+\- Support for Scala 3
 For more details see .*
 Daemon will be stopped at the end of the build
 # > Task :buildSrc:build
@@ -230,11 +230,12 @@
 \- Task `:docs\-tip\-of\-tree:unzipSampleSources` of type `org\.gradle\.api\.tasks\.Sync`: cannot deserialize object of type 'org\.gradle\.api\.Project' as these are not supported with the configuration cache\.
 [0-9]+ actionable tasks: [0-9]+ executed, [0-9]+ up\-to\-date
 Configuration cache entry reused with [0-9]+ problems\.
-See the profiling report at: file://\$GRADLE_USER_HOME/daemon/[0-9]+\.[0-9]+/reports/profile/profile\-[0-9]+\-[0-9]+\-[0-9]+\-[0-9]+\-[0-9]+\-[0-9]+\.html
+See the profiling report at: file://\$GRADLE_USER_HOME/daemon/.*/reports/profile/profile\-[0-9]+\-[0-9]+\-[0-9]+\-[0-9]+\-[0-9]+\-[0-9]+\.html
 Configuration cache entry reused\.
 Configuration cache entry stored with [0-9]+ problems\.
 Configuration cache entry stored with [0-9] problem\.
 [0-9]+ actionable tasks: [0-9]+ executed, [0-9]+ from cache
+A build scan will not be published due to this build running offline\.
 Configuration cache entry stored\.
 See the profiling report at\: file\:\/\/\$OUT_DIR\/androidx\/build\/reports\/profile\/profile\-[0-9]+\-[0-9]+\-[0-9]+\-[0-9]+\-[0-9]+\-[0-9]+\.html
 See the profiling report at\: file\:\/\/\$OUT_DIR\/gradle\/external\/doclava\/build\/reports\/profile\/profile\-[0-9]+\-[0-9]+\-[0-9]+\-[0-9]+\-[0-9]+\-[0-9]+\.html
@@ -324,14 +325,14 @@
 \- Task `:listTaskOutputs` of type `androidx\.build\.ListTaskOutputsTask`: invocation of 'Task\.project' at execution time is unsupported\.
 \- Task `[^ ]*checkExternalLicenses` of type `[^ ]*CheckExternalDependencyLicensesTask`: invocation of 'Task\.project' at execution time is unsupported\.
 \- Plugin class 'androidx\.build\.AndroidXImplPlugin': read system property 'user\.dir'
-See https://docs\.gradle\.org/[0-9]+\.[0-9]+/userguide/configuration_cache\.html\#config_cache:requirements:undeclared_sys_prop_read
+See https://docs\.gradle\.org/[0-9]+\.[0-9]+.*/userguide/configuration_cache\.html\#config_cache:requirements:undeclared_sys_prop_read
 \- Task `[^ ]*generateInspectionPlatformVersionRelease` of type `androidx\.inspection\.gradle\.GenerateInspectionPlatformVersionTask`: invocation of 'Task\.project' at execution time is unsupported\.
-See https://docs\.gradle\.org/[0-9]+\.[0-9]+/userguide/configuration_cache\.html\#config_cache:requirements:use_project_during_execution
+See https://docs\.gradle\.org/[0-9]+\.[0-9]+.*/userguide/configuration_cache\.html\#config_cache:requirements:use_project_during_execution
 \- Task `[^ ]*validateProperties` of type `[^ ]*ValidatePropertiesTask`: invocation of 'Task\.project' at execution time is unsupported\.
 \- Task `[^ ]*verifyDependencyVersions` of type `[^ ]*VerifyDependencyVersionsTask`: invocation of 'Task\.project' at execution time is unsupported\.
 \- Task `[^ ]*createLibraryBuildInfoFiles` of type `[^ ]*CreateLibraryBuildInfoFileTask`: invocation of 'Task\.project' at execution time is unsupported\.
 \- Task `[^ ]* of type `org\.gradle\.api\.tasks\.testing\.Test`: cannot serialize object of type 'org\.gradle\.api\.tasks\.bundling\.Zip', a subtype of 'org\.gradle\.api\.Task', as these are not supported with the configuration cache\.
-See https://docs\.gradle\.org/[0-9]+\.[0-9]+/userguide/configuration_cache\.html\#config_cache:requirements:task_access
+See https://docs\.gradle\.org/[0-9]+\.[0-9]+.*/userguide/configuration_cache\.html\#config_cache:requirements:task_access
 \- Task [^ ]* of type `com\.android\.build\.gradle\.tasks\.factory\.AndroidUnitTest`: cannot serialize object of type 'org\.gradle\.api\.tasks\.bundling\.Zip', a subtype of 'org\.gradle\.api\.Task', as these are not supported with the configuration cache\.
 plus [0-9]+ more problems\. Please see the report for details\.
 See the complete report at file://\$SUPPORT/build/reports/configuration\-cache/[^/]*/[^/]*/configuration\-cache\-report\.html
@@ -349,6 +350,7 @@
 Run the build with '\-\-info' for more details\.
 # > Task :room:room-compiler:test
 WARNING: Illegal reflective access by androidx\.room\.compiler\.processing\.javac\.JavacProcessingEnvMessager\$Companion \(file:\$OUT_DIR/androidx/room/room\-compiler\-processing/build/(classes/kotlin/main/|libs/room\-compiler\-processing\-[0-9]+\.[0-9]+\.[0-9]+(\-(alpha|beta|rc)[0-9]+)?\.jar)\) to field com\.sun\.tools\.javac\.code\.Symbol\$ClassSymbol\.classfile
+WARNING: Illegal reflective access by androidx\.room\.compiler\.processing\.javac\.JavacProcessingEnvMessager\$Companion \(file:\$OUT_DIR/androidx/room/room\-compiler\-processing/build/(classes/kotlin/main/|libs/room\-compiler\-processing\-[0-9]+\.[0-9]+\.[0-9]+(\-(alpha|beta|rc)[0-9]+)?\.jar)\) to field com\.sun\.tools\.javac\.code\.Symbol\.owner
 WARNING: Please consider reporting this to the maintainers of androidx\.room\.compiler\.processing\.javac\.JavacProcessingEnvMessager\$Companion
 # > Task :docs-runner:dokkaJavaTipOfTreeDocs
 \$CHECKOUT/prebuilts/androidx/external/org/jetbrains/kotlin/kotlin\-stdlib\-jdk[0-9]+/[0-9]+\.[0-9]+\.[0-9]+-?[A-Z0-9]*/kotlin\-stdlib\-jdk[0-9]+\-[0-9]+\.[0-9]+\.[0-9]+-?[A-Z0-9]*\.jar \(version [0-9]+\.[0-9]+-?[A-Z0-9]*\)
@@ -657,4 +659,4 @@
 [0-9]+ problems were found storing the configuration cache\.
 [0-9]+ problems were found storing the configuration cache, [0-9]+ of which seems unique\.
 # > Task :car:app:app:generateProtocolApi
-\- Task `:car:app:app:generateProtocolApi` of type `GenerateProtocolApiTask`: invocation of 'Task\.project' at execution time is unsupported\.
+\- Task `:car:app:app:generateProtocolApi` of type `GenerateProtocolApiTask`: invocation of 'Task\.project' at execution time is unsupported\.
\ No newline at end of file
diff --git a/development/diagnose-build-failure/diagnose-build-failure.sh b/development/diagnose-build-failure/diagnose-build-failure.sh
index d74338b..aabbd37 100755
--- a/development/diagnose-build-failure/diagnose-build-failure.sh
+++ b/development/diagnose-build-failure/diagnose-build-failure.sh
@@ -35,6 +35,7 @@
 
 expectedMessage=""
 timeoutSeconds=""
+grepOptions=""
 while true; do
   if [ "$#" -lt 1 ]; then
     usage
@@ -75,13 +76,13 @@
 done
 
 if [ "$#" -gt 0 ]; then
-  echo "Unrecognized argument: $1"
+  echo "Unrecognized argument: $1" >&2
   exit 1
 fi
 
 workingDir="$(pwd)"
 if [ ! -e "$workingDir/gradlew" ]; then
-  echo "Error; ./gradlew does not exist. Must cd to a dir containing a ./gradlew first"
+  echo "Error; ./gradlew does not exist. Must cd to a dir containing a ./gradlew first" >&2
   # so that this script knows which gradlew to use (in frameworks/support or frameworks/support/ui)
   exit 1
 fi
@@ -113,12 +114,12 @@
 COLOR_GREEN="\e[32m"
 
 function checkStatusRepo() {
-  repo status
+  repo status >&2
 }
 
 function checkStatusGit() {
-  git status
-  git log -1
+  git status >&2
+  git log -1 >&2
 }
 
 function checkStatus() {
@@ -133,9 +134,9 @@
 # echos a shell command for running the build in the current directory
 function getBuildCommand() {
   if [ "$expectedMessage" == "" ]; then
-    testCommand="$*"
+    testCommand="$* 2>&1"
   else
-    testCommand="$* >log 2>&1; $vgrep '$expectedMessage' log"
+    testCommand="$* >log 2>&1; $vgrep '$expectedMessage' log $grepOptions"
   fi
   echo "$testCommand"
 }
@@ -205,11 +206,11 @@
   restoreState /dev/null
 }
 
-echo
-echo "Making sure that we can reproduce the build failure"
+echo >&2
+echo "diagnose-build-failure making sure that we can reproduce the build failure" >&2
 if runBuild ./gradlew -Pandroidx.summarizeStderr $gradleArgs; then
-  echo
-  echo "This script failed to reproduce the build failure."
+  echo >&2
+  echo "This script failed to reproduce the build failure." >&2
   echo "If the build failure you were observing was in Android Studio, then:"
   echo '  Were you launching Android Studio by running `./studiow`?'
   echo "  Try asking a team member why Android Studio is failing but gradlew is succeeding"
@@ -220,8 +221,8 @@
   echo "    If this seems likely to you, then please open a bug."
   exit 1
 else
-  echo
-  echo "Reproduced build failure"
+  echo >&2
+  echo "Reproduced build failure" >&2
 fi
 
 if [ "$expectedMessage" == "" ]; then
@@ -234,7 +235,8 @@
   echo
   echo "$longestLine"
   echo
-  if grep "$longestLine" "$summaryLog" >/dev/null 2>/dev/null; then
+  grepOptions="-F" # interpret grep query as a fixed string, not a regex
+  if grep $grepOptions "$longestLine" "$summaryLog" >/dev/null 2>/dev/null; then
     echo "We will use this as the message to test for"
     echo
     expectedMessage="$longestLine"
@@ -245,77 +247,77 @@
 fi
 
 echo
-echo "Stopping the Gradle Daemon and rebuilding"
+echo "diagnose-build-failure stopping the Gradle Daemon and rebuilding" >&2
 cd "$supportRoot"
 ./gradlew --stop || true
 if runBuild ./gradlew --no-daemon $gradleArgs; then
-  echo
-  echo "The build passed when disabling the Gradle Daemon"
-  echo "This suggests that there is some state saved in the Gradle Daemon that is causing a failure."
-  echo "Unfortunately, this script does not know how to diagnose this further."
-  echo "You could ask a team member if they've seen this error."
+  echo >&2
+  echo "The build passed when disabling the Gradle Daemon" >&2
+  echo "This suggests that there is some state saved in the Gradle Daemon that is causing a failure." >&2
+  echo "Unfortunately, this script does not know how to diagnose this further." >&2
+  echo "You could ask a team member if they've seen this error." >&2
   exit 1
 else
-  echo
-  echo "The build failed even with the Gradle Daemon disabled."
-  echo "This may mean that there is state stored in a file somewhere, triggering the build to fail."
-  echo "We will investigate the possibility of saved state next."
-  echo
+  echo >&2
+  echo "The build failed even with the Gradle Daemon disabled." >&2
+  echo "This may mean that there is state stored in a file somewhere, triggering the build to fail." >&2
+  echo "We will investigate the possibility of saved state next." >&2
+  echo >&2
   # We're going to immediately overwrite the user's current state,
   # so we can simply move the current state into $tempDir/prev rather than copying it
   backupState "$tempDir/prev" --move
 fi
 
-echo
-echo "Checking whether a clean build passes"
+echo >&2
+echo "Checking whether a clean build passes" >&2
 clearState
 backupState "$tempDir/empty"
 successState="$tempDir/empty"
 if runBuild ./gradlew --no-daemon $gradleArgs; then
-  echo
-  echo "The clean build passed, so we can now investigate what cached state is triggering this build to fail."
+  echo >&2
+  echo "The clean build passed, so we can now investigate what cached state is triggering this build to fail." >&2
   backupState "$tempDir/clean"
 else
-  echo
-  echo "The clean build also reproduced the issue."
-  echo "This may mean that everyone is observing this issue"
-  echo "This may mean that something about your checkout is different from others'"
-  echo "You may be interested in running development/simplify-build-failure/simplify-build-failure.sh to identify the minimal set of source files required to reproduce this error"
-  echo "Checking the status of your checkout:"
+  echo >&2
+  echo "The clean build also reproduced the issue." >&2
+  echo "This may mean that everyone is observing this issue" >&2
+  echo "This may mean that something about this checkout is different from others'" >&2
+  echo "You may be interested in running development/simplify-build-failure/simplify-build-failure.sh to identify the minimal set of source files required to reproduce this error" >&2
+  echo "Checking the status of the checkout:" >&2
   checkStatus
   exit 1
 fi
 
-echo
-echo "Checking whether a second build passes when starting from the output of the first clean build"
+echo >&2
+echo "Checking whether a second build passes when starting from the output of the first clean build" >&2
 if runBuild ./gradlew --no-daemon $gradleArgs; then
-  echo
-  echo "The next build after the clean build passed, so we can use the output of the first clean build as the successful state to compare against"
+  echo >&2
+  echo "The next build after the clean build passed, so we can use the output of the first clean build as the successful state to compare against" >&2
   successState="$tempDir/clean"
 else
-  echo
-  echo "The next build after the clean build failed."
-  echo "Although this is unexpected, we should still be able to diagnose it."
-  echo "This might be slower than normal, though, because it may require us to rebuild more things more often"
+  echo >&2
+  echo "The next build after the clean build failed." >&2
+  echo "Although this is unexpected, we should still be able to diagnose it." >&2
+  echo "This might be slower than normal, though, because it may require us to rebuild more things more often" >&2
 fi
 
-echo
-echo "Next we'll double-check that after restoring the failing state, the build fails"
+echo >&2
+echo "Next we'll double-check that after restoring the failing state, the build fails" >&2
 restoreState "$tempDir/prev"
 if runBuild ./gradlew --no-daemon $gradleArgs; then
-  echo
-  echo "After restoring the saved state, the build passed."
-  echo "This might mean that there is additional state being saved somewhere else that this script does not know about"
-  echo "This might mean that the success or failure status of the build is dependent on timestamps."
-  echo "This might mean that the build is nondeterministic."
-  echo "Unfortunately, this script does not know how to diagnose this further."
-  echo "You could:"
-  echo "  Ask a team member if they know where the state may be stored"
-  echo "  Ask a team member if they recognize the build error"
+  echo >&2
+  echo "After restoring the saved state, the build passed." >&2
+  echo "This might mean that there is additional state being saved somewhere else that this script does not know about" >&2
+  echo "This might mean that the success or failure status of the build is dependent on timestamps." >&2
+  echo "This might mean that the build is nondeterministic." >&2
+  echo "Unfortunately, this script does not know how to diagnose this further." >&2
+  echo "You could:" >&2
+  echo "  Ask a team member if they know where the state may be stored" >&2
+  echo "  Ask a team member if they recognize the build error" >&2
   exit 1
 else
-  echo
-  echo "After restoring the saved state, the build failed. This confirms that this script is successfully saving and restoring the relevant state"
+  echo >&2
+  echo "After restoring the saved state, the build failed. This confirms that this script is successfully saving and restoring the relevant state" >&2
 fi
 
 # Ask diff-filterer.py to run a binary search to determine the minimum set of tasks that must be passed to reproduce this error
@@ -349,10 +351,10 @@
   fullFiltererCommand="$(getTestStateCommand --invert $buildCommand)"
 
   if $supportRoot/development/file-utils/diff-filterer.py $timeoutArg --work-path "$tempDir" "$requiredTasksWork" "$tempDir/prev"  "$fullFiltererCommand"; then
-    echo diff-filterer successfully identified a minimal set of required tasks. Saving into $requiredTasksDir
+    echo diff-filterer successfully identified a minimal set of required tasks. Saving into $requiredTasksDir >&2
     cp -r "$tempDir/bestResults/tasks" "$requiredTasksDir"
   else
-    echo diff-filterer was unable to identify a minimal set of tasks required to reproduce the error
+    echo diff-filterer was unable to identify a minimal set of tasks required to reproduce the error >&2
     exit 1
   fi
 }
@@ -362,10 +364,10 @@
 gradleArgs="$gradleOptions $gradleTasks"
 
 # Now ask diff-filterer.py to run a binary search to determine what the relevant differences are between "$tempDir/prev" and "$tempDir/clean"
-echo
-echo "Binary-searching the contents of the two output directories until the relevant differences are identified."
+echo >&2
+echo "Binary-searching the contents of the two output directories until the relevant differences are identified." >&2
 echo "This may take a while."
-echo
+echo >&2
 
 # command for running a build
 buildCommand="$(getBuildCommand "./gradlew --no-daemon $gradleArgs")"
@@ -373,13 +375,13 @@
 fullFiltererCommand="$(getTestStateCommand $buildCommand)"
 
 if $supportRoot/development/file-utils/diff-filterer.py $timeoutArg --assume-input-states-are-correct --work-path $tempDir $successState $tempDir/prev "$fullFiltererCommand"; then
-  echo
-  echo "There should be something wrong with the above file state"
-  echo "Hopefully the output from diff-filterer.py above is enough information for you to figure out what is wrong"
-  echo "If not, you could ask a team member about your original error message and see if they have any ideas"
+  echo >&2
+  echo "There should be something wrong with the above file state" >&2
+  echo "Hopefully the output from diff-filterer.py above is enough information for you to figure out what is wrong" >&2
+  echo "If not, you could ask a team member about your original error message and see if they have any ideas" >&2
 else
-  echo
-  echo "Something went wrong running diff-filterer.py"
-  echo "Maybe that means the build is nondeterministic"
-  echo "Maybe that means that there's something wrong with this script ($0)"
+  echo >&2
+  echo "Something went wrong running diff-filterer.py" >&2
+  echo "Maybe that means the build is nondeterministic" >&2
+  echo "Maybe that means that there's something wrong with this script ($0)" >&2
 fi
diff --git a/development/diagnose-build-failure/impl/vgrep.sh b/development/diagnose-build-failure/impl/vgrep.sh
index 2cb497f..8af36e0 100755
--- a/development/diagnose-build-failure/impl/vgrep.sh
+++ b/development/diagnose-build-failure/impl/vgrep.sh
@@ -3,6 +3,7 @@
 
 query="$1"
 filepath="$2"
+grepOptions="$3"
 if [ "$query" == "" ]; then
   echo "Usage: vgrep.sh <query> <log>"
   echo "Uses grep to search for <query> in <log>, and inverts the return code"
@@ -10,7 +11,7 @@
   exit 2
 fi
 
-if grep "$1" "$filepath"; then
+if grep $grepOptions "$1" "$filepath"; then
   exit 1
 fi
 tail -n 40 "$filepath"
diff --git a/development/referenceDocs/stageReferenceDocs.sh b/development/referenceDocs/stageReferenceDocs.sh
deleted file mode 100755
index c80b41e..0000000
--- a/development/referenceDocs/stageReferenceDocs.sh
+++ /dev/null
@@ -1,89 +0,0 @@
-#!/bin/bash
-set -e
-
-cd "$(dirname $0)"
-
-# Save current working directory
-scriptDirectory=$(pwd)
-
-if [[ -z "$1" ]]; then
-      printf "Please supply a buildID from the android build server\n"
-      exit
-fi
-
-buildId=$1
-
-newDir="reference-docs"
-# Remove the existing out directory to avoid conflicts from previous runs
-rm -rf out
-mkdir -p out/$newDir
-cd out/$newDir
-
-androidxPublicKotlinDocsZip="dokka-public-docs-${buildId}.zip"
-androidxPublicJavaDocsZip="doclava-public-docs-${buildId}.zip"
-
-
-printf "============================ STEP 1 =============================== \n"
-printf "== Downloading the doc zip files from the build server... \n"
-printf "== If this script hangs, try running glogin or gcert.\n"
-printf "=================================================================== \n"
-
-/google/data/ro/projects/android/fetch_artifact --bid $buildId --target androidx $androidxPublicKotlinDocsZip
-/google/data/ro/projects/android/fetch_artifact --bid $buildId --target androidx $androidxPublicJavaDocsZip
-
-printf "============================ STEP 2 =============================== \n"
-printf "== Unzip the doc zip files \n"
-printf "=================================================================== \n"
-
-unzip $androidxPublicKotlinDocsZip
-unzip $androidxPublicJavaDocsZip
-
-printf "============================ STEP 3 =============================== \n"
-printf "== Format the doc zip files \n"
-printf "=================================================================== \n"
-
-# Remove directories we never publish
-rm en -rf
-rm reference/java -rf
-rm reference/org -rf
-rm reference/hierarchy.html
-rm reference/kotlin/org -rf
-
-# Move package list into the correct location
-mv reference/kotlin/package-list reference/kotlin/androidx/package-list 
-
-# Remove javascript files that have no use
-rm -f reference/androidx/lists.js
-rm -f reference/androidx/navtree_data.js
-
-# Remove extraneous _book.yaml that improperly overwrites the correct one
-rm -f reference/androidx/_book.yaml
-
-# Remove the version_added labels to the _toc.yaml that don't do anything
-sed -i "s/  version_added/# version_added/" reference/androidx/_toc.yaml
-sed -i "s/    # version_added/#     version_added/" reference/androidx/_toc.yaml
-
-
-printf "============================ STEP 4 =============================== \n"
-printf "== Generate the language switcher \n"
-printf "=================================================================== \n"
-
-cd reference
-python3 ./../../../switcher.py --work androidx
-python3 ./../../../switcher.py --work support
-
-printf "============================ STEP 5 =============================== \n"
-printf "== Run the following command to copy the docs into Google3 \n"
-printf "=================================================================== \n"
-
-printf "
-\`\`\`
-g4d -f androidx-ref-docs-stage && \
-cd third_party/devsite/android/en/reference && \
-g4 sync && \
-cp -r $(pwd)/* . && \
-/google/data/ro/projects/devsite/two/live/devsite2.par stage androidx && \
-/google/data/ro/projects/devsite/two/live/devsite2.par stage kotlin/androidx
-\`\`\`\n"
-
-exit
diff --git a/development/referenceDocs/stageReferenceDocsWithDackka.sh b/development/referenceDocs/stageReferenceDocsWithDackka.sh
index 8c52bde..4b95bf2 100755
--- a/development/referenceDocs/stageReferenceDocsWithDackka.sh
+++ b/development/referenceDocs/stageReferenceDocsWithDackka.sh
@@ -8,7 +8,8 @@
 #
 #   ./stageReferenceDocsWithDackka.sh --buildId 1234567
 #
-# Stage locally-generated refdocs (to the default staging DB) *:
+# Stage locally-generated refdocs (to the default staging DB) *.
+# The directory path must be absolute (can't contain ~):
 #
 #   /stageReferenceDocsWithDackka.sh --buildId 0
 #   --sourceDir=/dir/to/androidx-main/out/androidx/docs-public/build
@@ -33,7 +34,7 @@
 DEFINE_string buildId --required "" "The build ID from the Android build server. This is ignored when specifying the 'sourceDir' flag."
 DEFINE_string dateStr "<insert date here>" "Date string used for CL message. Enclose date in double quotes (ex: \"April 29, 2021\")"
 DEFINE_string db "$defaultDb" "The database used for staging. Omitting this value will stage changes to the staging DB."
-DEFINE_string sourceDir "" "Local directory to fetch doc artifacts from"
+DEFINE_string sourceDir "" "Local directory to fetch doc artifacts from. Directory must be absolute (can't contain ~)."
 DEFINE_bool useToT false "Stage docs from tip-of-tree docs build rather than public docs build"
 
 gbash::init_google "$@"
@@ -275,7 +276,6 @@
 
 # Construct the devsite command and parameters
 devsiteCmd="/google/data/ro/projects/devsite/devsite2 stage"
-devsiteCmd+=" --parallelize_build"
 devsiteCmd+=" --use_large_thread_pools"
 devsiteCmd+=" --upload_safety_check_mode=ignore"
 
diff --git a/docs-public/build.gradle b/docs-public/build.gradle
index 66b6df8..bb5ae12 100644
--- a/docs-public/build.gradle
+++ b/docs-public/build.gradle
@@ -4,16 +4,16 @@
 }
 
 dependencies {
-    docs("androidx.activity:activity:1.4.0-rc01")
-    docs("androidx.activity:activity-compose:1.4.0-rc01")
-    samples("androidx.activity:activity-compose-samples:1.4.0-rc01")
-    docs("androidx.activity:activity-ktx:1.4.0-rc01")
+    docs("androidx.activity:activity:1.4.0")
+    docs("androidx.activity:activity-compose:1.4.0")
+    samples("androidx.activity:activity-compose-samples:1.4.0")
+    docs("androidx.activity:activity-ktx:1.4.0")
     docs("androidx.ads:ads-identifier:1.0.0-alpha04")
     docs("androidx.ads:ads-identifier-provider:1.0.0-alpha04")
-    docs("androidx.annotation:annotation:1.3.0-beta01")
+    docs("androidx.annotation:annotation:1.3.0-rc01")
     docs("androidx.annotation:annotation-experimental:1.2.0-alpha01")
-    docs("androidx.appcompat:appcompat:1.4.0-beta01")
-    docs("androidx.appcompat:appcompat-resources:1.4.0-beta01")
+    docs("androidx.appcompat:appcompat:1.4.0-rc01")
+    docs("androidx.appcompat:appcompat-resources:1.4.0-rc01")
     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")
@@ -45,48 +45,50 @@
     docs("androidx.cardview:cardview:1.0.0")
     docs("androidx.collection:collection:1.2.0-beta01")
     docs("androidx.collection:collection-ktx:1.2.0-beta01")
-    docs("androidx.compose.animation:animation:1.1.0-alpha06")
-    docs("androidx.compose.animation:animation-core:1.1.0-alpha06")
-    docs("androidx.compose.animation:animation-graphics:1.1.0-alpha06")
-    samples("androidx.compose.animation:animation-samples:1.1.0-alpha06")
-    samples("androidx.compose.animation:animation-core-samples:1.1.0-alpha06")
-    samples("androidx.compose.animation:animation-graphics-samples:1.1.0-alpha06")
-    docs("androidx.compose.foundation:foundation:1.1.0-alpha06")
-    docs("androidx.compose.foundation:foundation-layout:1.1.0-alpha06")
-    samples("androidx.compose.foundation:foundation-layout-samples:1.1.0-alpha06")
-    samples("androidx.compose.foundation:foundation-samples:1.1.0-alpha06")
-    docs("androidx.compose.material:material:1.1.0-alpha06")
-    docs("androidx.compose.material:material-icons-core:1.1.0-alpha06")
-    samples("androidx.compose.material:material-icons-core-samples:1.1.0-alpha06")
-    docs("androidx.compose.material:material-ripple:1.1.0-alpha06")
-    samples("androidx.compose.material:material-samples:1.1.0-alpha06")
-    docs("androidx.compose.runtime:runtime:1.1.0-alpha06")
-    docs("androidx.compose.runtime:runtime-livedata:1.1.0-alpha06")
-    samples("androidx.compose.runtime:runtime-livedata-samples:1.1.0-alpha06")
-    docs("androidx.compose.runtime:runtime-rxjava2:1.1.0-alpha06")
-    samples("androidx.compose.runtime:runtime-rxjava2-samples:1.1.0-alpha06")
-    docs("androidx.compose.runtime:runtime-rxjava3:1.1.0-alpha06")
-    samples("androidx.compose.runtime:runtime-rxjava3-samples:1.1.0-alpha06")
-    docs("androidx.compose.runtime:runtime-saveable:1.1.0-alpha06")
-    samples("androidx.compose.runtime:runtime-saveable-samples:1.1.0-alpha06")
-    samples("androidx.compose.runtime:runtime-samples:1.1.0-alpha06")
-    docs("androidx.compose.ui:ui:1.1.0-alpha06")
-    docs("androidx.compose.ui:ui-geometry:1.1.0-alpha06")
-    docs("androidx.compose.ui:ui-graphics:1.1.0-alpha06")
-    samples("androidx.compose.ui:ui-graphics-samples:1.1.0-alpha06")
-    docs("androidx.compose.ui:ui-test:1.1.0-alpha06")
-    docs("androidx.compose.ui:ui-test-junit4:1.1.0-alpha06")
-    docs("androidx.compose.ui:ui-text:1.1.0-alpha06")
-    samples("androidx.compose.ui:ui-text-samples:1.1.0-alpha06")
-    docs("androidx.compose.ui:ui-tooling:1.1.0-alpha06")
-    docs("androidx.compose.ui:ui-tooling-data:1.1.0-alpha06")
-    docs("androidx.compose.ui:ui-tooling-preview:1.1.0-alpha06")
-    docs("androidx.compose.ui:ui-unit:1.1.0-alpha06")
-    samples("androidx.compose.ui:ui-unit-samples:1.1.0-alpha06")
-    docs("androidx.compose.ui:ui-util:1.1.0-alpha06")
-    docs("androidx.compose.ui:ui-viewbinding:1.1.0-alpha06")
-    samples("androidx.compose.ui:ui-viewbinding-samples:1.1.0-alpha06")
-    samples("androidx.compose.ui:ui-samples:1.1.0-alpha06")
+    docs("androidx.compose.animation:animation:1.1.0-beta01")
+    docs("androidx.compose.animation:animation-core:1.1.0-beta01")
+    docs("androidx.compose.animation:animation-graphics:1.1.0-beta01")
+    samples("androidx.compose.animation:animation-samples:1.1.0-beta01")
+    samples("androidx.compose.animation:animation-core-samples:1.1.0-beta01")
+    samples("androidx.compose.animation:animation-graphics-samples:1.1.0-beta01")
+    docs("androidx.compose.foundation:foundation:1.1.0-beta01")
+    docs("androidx.compose.foundation:foundation-layout:1.1.0-beta01")
+    samples("androidx.compose.foundation:foundation-layout-samples:1.1.0-beta01")
+    samples("androidx.compose.foundation:foundation-samples:1.1.0-beta01")
+    docs("androidx.compose.material3:material3:1.0.0-alpha01")
+    samples("androidx.compose.material3:material3-samples:1.0.0-alpha01")
+    docs("androidx.compose.material:material:1.1.0-beta01")
+    docs("androidx.compose.material:material-icons-core:1.1.0-beta01")
+    samples("androidx.compose.material:material-icons-core-samples:1.1.0-beta01")
+    docs("androidx.compose.material:material-ripple:1.1.0-beta01")
+    samples("androidx.compose.material:material-samples:1.1.0-beta01")
+    docs("androidx.compose.runtime:runtime:1.1.0-beta01")
+    docs("androidx.compose.runtime:runtime-livedata:1.1.0-beta01")
+    samples("androidx.compose.runtime:runtime-livedata-samples:1.1.0-beta01")
+    docs("androidx.compose.runtime:runtime-rxjava2:1.1.0-beta01")
+    samples("androidx.compose.runtime:runtime-rxjava2-samples:1.1.0-beta01")
+    docs("androidx.compose.runtime:runtime-rxjava3:1.1.0-beta01")
+    samples("androidx.compose.runtime:runtime-rxjava3-samples:1.1.0-beta01")
+    docs("androidx.compose.runtime:runtime-saveable:1.1.0-beta01")
+    samples("androidx.compose.runtime:runtime-saveable-samples:1.1.0-beta01")
+    samples("androidx.compose.runtime:runtime-samples:1.1.0-beta01")
+    docs("androidx.compose.ui:ui:1.1.0-beta01")
+    docs("androidx.compose.ui:ui-geometry:1.1.0-beta01")
+    docs("androidx.compose.ui:ui-graphics:1.1.0-beta01")
+    samples("androidx.compose.ui:ui-graphics-samples:1.1.0-beta01")
+    docs("androidx.compose.ui:ui-test:1.1.0-beta01")
+    docs("androidx.compose.ui:ui-test-junit4:1.1.0-beta01")
+    docs("androidx.compose.ui:ui-text:1.1.0-beta01")
+    samples("androidx.compose.ui:ui-text-samples:1.1.0-beta01")
+    docs("androidx.compose.ui:ui-tooling:1.1.0-beta01")
+    docs("androidx.compose.ui:ui-tooling-data:1.1.0-beta01")
+    docs("androidx.compose.ui:ui-tooling-preview:1.1.0-beta01")
+    docs("androidx.compose.ui:ui-unit:1.1.0-beta01")
+    samples("androidx.compose.ui:ui-unit-samples:1.1.0-beta01")
+    docs("androidx.compose.ui:ui-util:1.1.0-beta01")
+    docs("androidx.compose.ui:ui-viewbinding:1.1.0-beta01")
+    samples("androidx.compose.ui:ui-viewbinding-samples:1.1.0-beta01")
+    samples("androidx.compose.ui:ui-samples:1.1.0-beta01")
     docs("androidx.concurrent:concurrent-futures:1.1.0")
     docs("androidx.concurrent:concurrent-futures-ktx:1.1.0")
     docs("androidx.contentpager:contentpager:1.0.0")
@@ -112,19 +114,19 @@
     docs("androidx.drawerlayout:drawerlayout:1.1.1")
     docs("androidx.dynamicanimation:dynamicanimation:1.1.0-alpha02")
     docs("androidx.dynamicanimation:dynamicanimation-ktx:1.0.0-alpha03")
-    docs("androidx.emoji2:emoji2:1.0.0-beta01")
-    docs("androidx.emoji2:emoji2-bundled:1.0.0-beta01")
-    docs("androidx.emoji2:emoji2-views:1.0.0-beta01")
-    docs("androidx.emoji2:emoji2-views-helper:1.0.0-beta01")
+    docs("androidx.emoji2:emoji2:1.0.0-rc01")
+    docs("androidx.emoji2:emoji2-bundled:1.0.0-rc01")
+    docs("androidx.emoji2:emoji2-views:1.0.0-rc01")
+    docs("androidx.emoji2:emoji2-views-helper:1.0.0-rc01")
     docs("androidx.emoji:emoji:1.2.0-alpha03")
     docs("androidx.emoji:emoji-appcompat:1.2.0-alpha03")
     docs("androidx.emoji:emoji-bundled:1.2.0-alpha03")
     docs("androidx.enterprise:enterprise-feedback:1.1.0")
     docs("androidx.enterprise:enterprise-feedback-testing:1.1.0")
     docs("androidx.exifinterface:exifinterface:1.3.3")
-    docs("androidx.fragment:fragment:1.4.0-alpha10")
-    docs("androidx.fragment:fragment-ktx:1.4.0-alpha10")
-    docs("androidx.fragment:fragment-testing:1.4.0-alpha10")
+    docs("androidx.fragment:fragment:1.4.0-beta01")
+    docs("androidx.fragment:fragment-ktx:1.4.0-beta01")
+    docs("androidx.fragment:fragment-testing:1.4.0-beta01")
     docs("androidx.gridlayout:gridlayout:1.0.0")
     docs("androidx.health:health-services-client:1.0.0-alpha02")
     docs("androidx.heifwriter:heifwriter:1.1.0-alpha01")
@@ -139,25 +141,25 @@
     docs("androidx.leanback:leanback-paging:1.1.0-alpha08")
     docs("androidx.leanback:leanback-preference:1.2.0-alpha01")
     docs("androidx.leanback:leanback-tab:1.1.0-beta01")
-    docs("androidx.lifecycle:lifecycle-common:2.4.0-rc01")
-    docs("androidx.lifecycle:lifecycle-common-java8:2.4.0-rc01")
+    docs("androidx.lifecycle:lifecycle-common:2.4.0")
+    docs("androidx.lifecycle:lifecycle-common-java8:2.4.0")
     docs("androidx.lifecycle:lifecycle-extensions:2.2.0")
-    docs("androidx.lifecycle:lifecycle-livedata:2.4.0-rc01")
-    docs("androidx.lifecycle:lifecycle-livedata-core:2.4.0-rc01")
-    docs("androidx.lifecycle:lifecycle-livedata-core-ktx:2.4.0-rc01")
-    docs("androidx.lifecycle:lifecycle-livedata-ktx:2.4.0-rc01")
-    docs("androidx.lifecycle:lifecycle-process:2.4.0-rc01")
-    docs("androidx.lifecycle:lifecycle-reactivestreams:2.4.0-rc01")
-    docs("androidx.lifecycle:lifecycle-reactivestreams-ktx:2.4.0-rc01")
-    docs("androidx.lifecycle:lifecycle-runtime:2.4.0-rc01")
-    docs("androidx.lifecycle:lifecycle-runtime-ktx:2.4.0-rc01")
-    docs("androidx.lifecycle:lifecycle-runtime-testing:2.4.0-rc01")
-    docs("androidx.lifecycle:lifecycle-service:2.4.0-rc01")
-    docs("androidx.lifecycle:lifecycle-viewmodel:2.4.0-rc01")
-    docs("androidx.lifecycle:lifecycle-viewmodel-compose:2.4.0-rc01")
-    samples("androidx.lifecycle:lifecycle-viewmodel-compose-samples:2.4.0-rc01")
-    docs("androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0-rc01")
-    docs("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.4.0-rc01")
+    docs("androidx.lifecycle:lifecycle-livedata:2.4.0")
+    docs("androidx.lifecycle:lifecycle-livedata-core:2.4.0")
+    docs("androidx.lifecycle:lifecycle-livedata-core-ktx:2.4.0")
+    docs("androidx.lifecycle:lifecycle-livedata-ktx:2.4.0")
+    docs("androidx.lifecycle:lifecycle-process:2.4.0")
+    docs("androidx.lifecycle:lifecycle-reactivestreams:2.4.0")
+    docs("androidx.lifecycle:lifecycle-reactivestreams-ktx:2.4.0")
+    docs("androidx.lifecycle:lifecycle-runtime:2.4.0")
+    docs("androidx.lifecycle:lifecycle-runtime-ktx:2.4.0")
+    docs("androidx.lifecycle:lifecycle-runtime-testing:2.4.0")
+    docs("androidx.lifecycle:lifecycle-service:2.4.0")
+    docs("androidx.lifecycle:lifecycle-viewmodel:2.4.0")
+    docs("androidx.lifecycle:lifecycle-viewmodel-compose:2.4.0")
+    samples("androidx.lifecycle:lifecycle-viewmodel-compose-samples:2.4.0")
+    docs("androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0")
+    docs("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.4.0")
     docs("androidx.loader:loader:1.1.0")
     docs("androidx.localbroadcastmanager:localbroadcastmanager:1.1.0-alpha01")
     docs("androidx.media2:media2-common:1.2.0")
@@ -166,19 +168,19 @@
     docs("androidx.media2:media2-widget:1.2.0")
     docs("androidx.media:media:1.4.3")
     docs("androidx.mediarouter:mediarouter:1.2.5")
-    docs("androidx.navigation:navigation-common:2.4.0-alpha10")
-    docs("androidx.navigation:navigation-common-ktx:2.4.0-alpha10")
-    docs("androidx.navigation:navigation-compose:2.4.0-alpha10")
-    samples("androidx.navigation:navigation-compose-samples:2.4.0-alpha10")
-    docs("androidx.navigation:navigation-dynamic-features-fragment:2.4.0-alpha10")
-    docs("androidx.navigation:navigation-dynamic-features-runtime:2.4.0-alpha10")
-    docs("androidx.navigation:navigation-fragment:2.4.0-alpha10")
-    docs("androidx.navigation:navigation-fragment-ktx:2.4.0-alpha10")
-    docs("androidx.navigation:navigation-runtime:2.4.0-alpha10")
-    docs("androidx.navigation:navigation-runtime-ktx:2.4.0-alpha10")
-    docs("androidx.navigation:navigation-testing:2.4.0-alpha10")
-    docs("androidx.navigation:navigation-ui:2.4.0-alpha10")
-    docs("androidx.navigation:navigation-ui-ktx:2.4.0-alpha10")
+    docs("androidx.navigation:navigation-common:2.4.0-beta01")
+    docs("androidx.navigation:navigation-common-ktx:2.4.0-beta01")
+    docs("androidx.navigation:navigation-compose:2.4.0-beta01")
+    samples("androidx.navigation:navigation-compose-samples:2.4.0-beta01")
+    docs("androidx.navigation:navigation-dynamic-features-fragment:2.4.0-beta01")
+    docs("androidx.navigation:navigation-dynamic-features-runtime:2.4.0-beta01")
+    docs("androidx.navigation:navigation-fragment:2.4.0-beta01")
+    docs("androidx.navigation:navigation-fragment-ktx:2.4.0-beta01")
+    docs("androidx.navigation:navigation-runtime:2.4.0-beta01")
+    docs("androidx.navigation:navigation-runtime-ktx:2.4.0-beta01")
+    docs("androidx.navigation:navigation-testing:2.4.0-beta01")
+    docs("androidx.navigation:navigation-ui:2.4.0-beta01")
+    docs("androidx.navigation:navigation-ui-ktx:2.4.0-beta01")
     docs("androidx.paging:paging-common:3.1.0-beta01")
     docs("androidx.paging:paging-common-ktx:3.1.0-beta01")
     docs("androidx.paging:paging-compose:1.0.0-alpha14")
@@ -193,15 +195,15 @@
     docs("androidx.palette:palette:1.0.0")
     docs("androidx.palette:palette-ktx:1.0.0")
     docs("androidx.percentlayout:percentlayout:1.0.1")
-    docs("androidx.preference:preference:1.1.1")
-    docs("androidx.preference:preference-ktx:1.1.1")
+    docs("androidx.preference:preference:1.2.0-alpha01")
+    docs("androidx.preference:preference-ktx:1.2.0-alpha01")
     docs("androidx.print:print:1.1.0-beta01")
-    docs("androidx.profileinstaller:profileinstaller:1.1.0-alpha07")
+    docs("androidx.profileinstaller:profileinstaller:1.1.0-beta01")
     docs("androidx.recommendation:recommendation:1.0.0")
     docs("androidx.recyclerview:recyclerview:1.3.0-alpha01")
     docs("androidx.recyclerview:recyclerview-selection:2.0.0-alpha01")
     docs("androidx.remotecallback:remotecallback:1.0.0-alpha02")
-    docs("androidx.resourceinspection:resourceinspection-annotation:1.0.0-beta01")
+    docs("androidx.resourceinspection:resourceinspection-annotation:1.0.0-rc01")
     docs("androidx.room:room-common:2.4.0-beta01")
     docs("androidx.room:room-guava:2.4.0-beta01")
     docs("androidx.room:room-ktx:2.4.0-beta01")
@@ -241,28 +243,30 @@
     docs("androidx.versionedparcelable:versionedparcelable:1.1.1")
     docs("androidx.viewpager2:viewpager2:1.1.0-beta01")
     docs("androidx.viewpager:viewpager:1.1.0-alpha01")
-    docs("androidx.wear.compose:compose-foundation:1.0.0-alpha08")
-    samples("androidx.wear.compose:compose-foundation-samples:1.0.0-alpha08")
-    docs("androidx.wear.compose:compose-material:1.0.0-alpha08")
-    samples("androidx.wear.compose:compose-material-samples:1.0.0-alpha08")
-    docs("androidx.wear.compose:compose-navigation:1.0.0-alpha08")
-    docs("androidx.wear.tiles:tiles:1.0.0-alpha12")
-    docs("androidx.wear.tiles:tiles-renderer:1.0.0-alpha12")
-    docs("androidx.wear.tiles:tiles-testing:1.0.0-alpha12")
-    docs("androidx.wear.watchface:watchface:1.0.0-alpha24")
-    docs("androidx.wear.watchface:watchface-client:1.0.0-alpha24")
-    docs("androidx.wear.watchface:watchface-client-guava:1.0.0-alpha24")
-    docs("androidx.wear.watchface:watchface-complications-data:1.0.0-alpha24")
-    docs("androidx.wear.watchface:watchface-complications-data-source:1.0.0-alpha24")
-    docs("androidx.wear.watchface:watchface-complications-data-source-ktx:1.0.0-alpha24")
-    docs("androidx.wear.watchface:watchface-complications-rendering:1.0.0-alpha24")
-    docs("androidx.wear.watchface:watchface-data:1.0.0-alpha24")
-    docs("androidx.wear.watchface:watchface-editor:1.0.0-alpha24")
-    docs("androidx.wear.watchface:watchface-editor-guava:1.0.0-alpha24")
-    samples("androidx.wear.watchface:watchface-editor-samples:1.0.0-alpha24")
-    docs("androidx.wear.watchface:watchface-guava:1.0.0-alpha24")
-    samples("androidx.wear.watchface:watchface-samples:1.0.0-alpha24")
-    docs("androidx.wear.watchface:watchface-style:1.0.0-alpha24")
+    docs("androidx.wear.compose:compose-foundation:1.0.0-alpha09")
+    samples("androidx.wear.compose:compose-foundation-samples:1.0.0-alpha09")
+    docs("androidx.wear.compose:compose-material:1.0.0-alpha09")
+    samples("androidx.wear.compose:compose-material-samples:1.0.0-alpha09")
+    docs("androidx.wear.compose:compose-navigation:1.0.0-alpha09")
+    docs("androidx.wear.tiles:tiles:1.0.0-rc01")
+    docs("androidx.wear.tiles:tiles-proto:1.0.0-rc01")
+    docs("androidx.wear.tiles:tiles-renderer:1.0.0-rc01")
+    docs("androidx.wear.tiles:tiles-testing:1.0.0-rc01")
+    docs("androidx.wear.watchface:watchface:1.0.0-beta01")
+    docs("androidx.wear.watchface:watchface-client:1.0.0-beta01")
+    docs("androidx.wear.watchface:watchface-client-guava:1.0.0-beta01")
+    docs("androidx.wear.watchface:watchface-complications:1.0.0-beta01")
+    docs("androidx.wear.watchface:watchface-complications-data:1.0.0-beta01")
+    docs("androidx.wear.watchface:watchface-complications-data-source:1.0.0-beta01")
+    docs("androidx.wear.watchface:watchface-complications-data-source-ktx:1.0.0-beta01")
+    docs("androidx.wear.watchface:watchface-complications-rendering:1.0.0-beta01")
+    docs("androidx.wear.watchface:watchface-data:1.0.0-beta01")
+    docs("androidx.wear.watchface:watchface-editor:1.0.0-beta01")
+    docs("androidx.wear.watchface:watchface-editor-guava:1.0.0-beta01")
+    samples("androidx.wear.watchface:watchface-editor-samples:1.0.0-beta01")
+    docs("androidx.wear.watchface:watchface-guava:1.0.0-beta01")
+    samples("androidx.wear.watchface:watchface-samples:1.0.0-beta01")
+    docs("androidx.wear.watchface:watchface-style:1.0.0-beta01")
     docs("androidx.wear:wear:1.3.0-alpha01")
     stubs(fileTree(dir: "../wear/wear_stubs/", include: ["com.google.android.wearable-stubs.jar"]))
     docs("androidx.wear:wear-ongoing:1.1.0-alpha01")
@@ -272,13 +276,13 @@
     samples("androidx.wear:wear-input-samples:1.2.0-alpha01")
     docs("androidx.wear:wear-input-testing:1.2.0-alpha02")
     docs("androidx.webkit:webkit:1.4.0")
-    docs("androidx.window:window:1.0.0-beta02")
+    docs("androidx.window:window:1.0.0-beta03")
     stubs(fileTree(dir: "../window/stubs/", include: ["window-sidecar-release-0.1.0-alpha01.aar"]))
     stubs("androidx.window:window-extensions:1.0.0-alpha01")
-    docs("androidx.window:window-java:1.0.0-beta02")
-    docs("androidx.window:window-rxjava2:1.0.0-beta02")
-    docs("androidx.window:window-rxjava3:1.0.0-beta02")
-    docs("androidx.window:window-testing:1.0.0-beta02")
+    docs("androidx.window:window-java:1.0.0-beta03")
+    docs("androidx.window:window-rxjava2:1.0.0-beta03")
+    docs("androidx.window:window-rxjava3:1.0.0-beta03")
+    docs("androidx.window:window-testing:1.0.0-beta03")
     docs("androidx.work:work-gcm:2.7.0")
     docs("androidx.work:work-multiprocess:2.7.0")
     docs("androidx.work:work-runtime:2.7.0")
diff --git a/docs/api_guidelines.md b/docs/api_guidelines.md
index 16a0053..315585a2 100644
--- a/docs/api_guidelines.md
+++ b/docs/api_guidelines.md
@@ -791,12 +791,17 @@
 Developers **may** use `Bundle` in simple cases that require sending `Binder`s
 or `FileDescriptor`s across IPC. Note that `Bundle` has several caveats:
 
--   Accessing *any* entry in a `Bundle` will result in the platform attempting
-    to load *every* entry. If a single entry cannot be loaded -- for example if
-    a developer added a custom `Parcelable` that doesn't exist in the receiver's
-    classpath -- an exception will be thrown when accessing *any* entry. Library
-    code that accesses `Bundle`s received from outside the process **must** do
-    so defensively. Library code that sends `Bundle`s outside the process
+-   When running on Android S and below, accessing *any* entry in a `Bundle`
+    will result in the platform attempting to deserialize *every* entry. This
+    has been fixed in Android T and later with "lazy" bundles, but developers
+    should be careful when accessing `Bundle` on earlier platforms. If a single
+    entry cannot be loaded -- for example if a developer added a custom
+    `Parcelable` that doesn't exist in the receiver's classpath -- an exception
+    will be thrown when accessing *any* entry.
+-   On all platforms, library code that receives `Bundle`s data from outside the
+    process **must** read the data defensively. See previous note regarding
+    additional concerns for Android S and below.
+-   On all platforms, library code that sends `Bundle`s outside the process
     *should* discourage clients from passing custom `Parcelable`s.
 -   `Bundle` provides no versioning and Jetpack provides no affordances for
     tracking the keys or value types associated with a `Bundle`. Library owners
@@ -1340,19 +1345,26 @@
 [Incremental annotation processing](https://docs.gradle.org/current/userguide/java_plugin.html#sec:incremental_annotation_processing)
 documentation for information on how to opt-in.
 
-### Experimental `@RequiresOptIn` APIs {#experimental-api}
+### `@RequiresOptIn` APIs {#experimental-api}
 
 Jetpack libraries may choose to annotate API surfaces as unstable using either
 Kotlin's
-[`@RequiresOptIn` annotation](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-requires-opt-in/)
+[`@RequiresOptIn` meta-annotation](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-requires-opt-in/)
 for APIs written in Kotlin or Jetpack's
-[`@RequiresOptIn` annotation](https://developer.android.com/reference/kotlin/androidx/annotation/RequiresOptIn)
+[`@RequiresOptIn` meta-annotation](https://developer.android.com/reference/kotlin/androidx/annotation/RequiresOptIn)
 for APIs written in Java.
 
-In both cases, API surfaces marked as experimental are considered alpha and will
-be excluded from API compatibility guarantees. Due to the lack of compatibility
-guarantees, stable libraries *must never* call experimental APIs exposed by
-other libraries outside of their
+> `@RequiresOptIn` at-a-glance:
+>
+> *   Use for unstable API surfaces
+> *   Can be called by anyone
+> *   Documented in public documentation
+> *   Does not maintain compatibility
+
+For either annotation, API surfaces marked as opt-in are considered alpha and
+will be excluded from API compatibility guarantees. Due to the lack of
+compatibility guarantees, stable libraries *must never* call experimental APIs
+exposed by other libraries outside of their
 [same-version group](#same-version-atomic-groups) and *may not* use the `@OptIn`
 annotation except in the following cases:
 
@@ -1375,6 +1387,27 @@
 `@RequiresOptIn` APIs that are guaranteed to remain binary compatible *may* be
 used in `beta`, but usages must be removed when the library moves to `rc`.
 
+#### When to mark an API surface as experimental
+
+*Do not* use `@RequiresOptIn` for a stable API surface that is difficult to use.
+It is not a substitute for a properly-designed API surface.
+
+*Do not* use `@RequiresOptIn` for an API surface that is unreliable or unstable
+because it is missing tests. It is not a substitute for a properly-tested API
+surface, and all APIs -- including those in `alpha` -- are expected to be
+functionally stable.
+
+*Do not* use `@RequiresOptIn` for an internal-facing API surface. Use either the
+appropriate language visibility (ex. `private` or `internal`) or `@RestrictTo`.
+
+*Do not* use `@RequiresOptIn` for an API that you expect library developers to
+call. Experimental APIs do not maintain binary compatibility guarantees, and you
+will put external clients in a difficult situation.
+
+*Do* use `@RequiresOptIn` for API surfaces that must be publicly available and
+documented but need the flexibility to stay in `alpha` (and break compatibility)
+during the rest of the library's `beta`, `rc`, or stable cycles.
+
 #### How to mark an API surface as experimental
 
 All libraries using `@RequiresOptIn` annotations *must* depend on the
@@ -1402,30 +1435,33 @@
 #### How to transition an API out of experimental
 
 When an API surface is ready to transition out of experimental, the annotation
-may only be removed during an alpha pre-release stage since removing the
-experimental marker from an API is equivalent to adding the API to the current
-API surface.
+may only be removed during an alpha pre-release stage. Removing the experimental
+marker from an API is equivalent to adding the API to the current API surface.
 
 When transitioning an entire feature surface out of experimental, you *should*
-remove the associated annotations.
+remove the definition for the associated annotation.
 
 When making any change to the experimental API surface, you *must* run
 `./gradlew updateApi` prior to uploading your change.
 
-### Restricted APIs {#restricted-api}
+### `@RestrictTo` APIs {#restricted-api}
 
 Jetpack's library tooling supports hiding Java-visible (ex. `public` and
 `protected`) APIs from developers using a combination of the `@RestrictTo`
 source annotation, and the `@hide` docs annotation (`@suppress` in Kotlin).
 These annotations **must** be paired together when used, and are validated as
-part of presubmit checks for Java code (Kotlin not yet supported by Checkstyle).
+part of presubmit checks for Java code.
 
-The effects of hiding an API are as follows:
+> `@RestrictTo` at-a-glance:
+>
+> *   Use for internal-facing API surfaces
+> *   Can be called within the specified `Scope`
+> *   Does not appear in public documentation
+> *   Does not maintain compatibility in most scopes
 
-*   The API will not appear in documentation
-*   Android Studio will warn the developer not to use the API
-
-Hiding an API does *not* provide strong guarantees about usage:
+While restricted APIs do not appear in documentation and Android Studio will
+warn against calling them, hiding an API does *not* provide strong guarantees
+about usage:
 
 *   There are no runtime restrictions on calling hidden APIs
 *   Android Studio will not warn if hidden APIs are called using reflection
@@ -1476,21 +1512,31 @@
         <td><code>RestrictTo.Scope</code></td>
         <td>Visibility by Maven coordinate</td>
         <td>Versioning</td>
+        <td>Note</td>
     </tr>
     <tr>
         <td><code>LIBRARY</code></td>
         <td><code>androidx.concurrent:concurrent</code></td>
-        <td>No compatibility gurantees (same as private)</td>
+        <td>No compatibility guarantees (same as private)</td>
+        <td></td>
     </tr>
     <tr>
         <td><code>LIBRARY_GROUP</code></td>
         <td><code>androidx.concurrent:*</code></td>
         <td>Semantic versioning (including deprecation)</td>
+        <td></td>
     </tr>
     <tr>
         <td><code>LIBRARY_GROUP_PREFIX</code></td>
         <td><code>androidx.*:*</code></td>
         <td>Semantic versioning (including deprecation)</td>
+        <td></td>
+    </tr>
+    <tr>
+        <td><code>TEST</code></td>
+        <td><code>*</code></td>
+        <td>No compatibility guarantees (same as private)</td>
+        <td>Not recommended. Prefer language visibility, e.g. `internal` or package-private.</td>
     </tr>
 </table>
 
@@ -1963,7 +2009,7 @@
 baseline with the `updateApiLintBaseline` task.
 
 ```shell
-./gradlew core:updateApiLintBaseline
+./gradlew :core:core:updateApiLintBaseline
 ```
 
 This will create/amend the `api_lint.ignore` file that lives in a library's
diff --git a/docs/onboarding.md b/docs/onboarding.md
index e1c9537..3af170e 100644
--- a/docs/onboarding.md
+++ b/docs/onboarding.md
@@ -98,7 +98,7 @@
 
 ### Synchronize the branch {#source-checkout}
 
-Use the following `repo` commands to check out your branch.
+Use the following commands to check out your branch.
 
 #### Public main development branch {#androidx-main}
 
@@ -432,13 +432,13 @@
 This will create the artifact
 `{androidx-main}/out/dist/doclava-public-docs-0.zip`. This command builds docs
 based on the version specified in
-`{androidx-main-checkout}/frameworks/support/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt`
-and uses the prebuilt checked into
+`{androidx-main-checkout}/frameworks/support/docs-public/build.gradle` and uses
+the prebuilt checked into
 `{androidx-main-checkout}/prebuilts/androidx/internal/androidx/`. We
-colloquially refer to this two step process of (1) updating
-`PublishDocsRules.kt` and (2) checking in a prebuilt artifact into the prebuilts
-directory as [The Prebuilts Dance](releasing_detailed.md#the-prebuilts-dance™).
-So, to build javadocs that will be published to
+colloquially refer to this two step process of (1) updating `docs-public` and
+(2) checking in a prebuilt artifact into the prebuilts directory as
+[The Prebuilts Dance](releasing_detailed.md#the-prebuilts-dance™). So, to build
+javadocs that will be published to
 https://developer.android.com/reference/androidx/packages, both of these steps
 need to be completed.
 
diff --git a/draganddrop/draganddrop/api/api_lint.ignore b/draganddrop/draganddrop/api/api_lint.ignore
new file mode 100644
index 0000000..e5bf0d1
--- /dev/null
+++ b/draganddrop/draganddrop/api/api_lint.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+ExecutorRegistration: androidx.draganddrop.DropHelper#configureView(android.app.Activity, android.view.View, String[], androidx.draganddrop.DropHelper.Options, androidx.core.view.OnReceiveContentListener):
+    Registration methods should have overload that accepts delivery Executor: `configureView`
diff --git a/draganddrop/draganddrop/api/current.txt b/draganddrop/draganddrop/api/current.txt
index e6f50d0..7390973 100644
--- a/draganddrop/draganddrop/api/current.txt
+++ b/draganddrop/draganddrop/api/current.txt
@@ -1 +1,26 @@
 // Signature format: 4.0
+package androidx.draganddrop {
+
+  @RequiresApi(android.os.Build.VERSION_CODES.N) public final class DropHelper {
+    method public static void configureView(android.app.Activity, android.view.View, String![], androidx.core.view.OnReceiveContentListener);
+    method public static void configureView(android.app.Activity, android.view.View, String![], androidx.draganddrop.DropHelper.Options, androidx.core.view.OnReceiveContentListener);
+  }
+
+  @RequiresApi(android.os.Build.VERSION_CODES.N) public static final class DropHelper.Options {
+    method @ColorInt public int getHighlightColor();
+    method public int getHighlightCornerRadiusPx();
+    method public java.util.List<android.widget.EditText!> getInnerEditTexts();
+    method public boolean hasHighlightColor();
+    method public boolean hasHighlightCornerRadiusPx();
+  }
+
+  @RequiresApi(android.os.Build.VERSION_CODES.N) public static final class DropHelper.Options.Builder {
+    ctor public DropHelper.Options.Builder();
+    method public androidx.draganddrop.DropHelper.Options.Builder addInnerEditTexts(android.widget.EditText!...);
+    method public androidx.draganddrop.DropHelper.Options build();
+    method public androidx.draganddrop.DropHelper.Options.Builder setHighlightColor(@ColorInt int);
+    method public androidx.draganddrop.DropHelper.Options.Builder setHighlightCornerRadiusPx(int);
+  }
+
+}
+
diff --git a/draganddrop/draganddrop/api/public_plus_experimental_current.txt b/draganddrop/draganddrop/api/public_plus_experimental_current.txt
index e6f50d0..7390973 100644
--- a/draganddrop/draganddrop/api/public_plus_experimental_current.txt
+++ b/draganddrop/draganddrop/api/public_plus_experimental_current.txt
@@ -1 +1,26 @@
 // Signature format: 4.0
+package androidx.draganddrop {
+
+  @RequiresApi(android.os.Build.VERSION_CODES.N) public final class DropHelper {
+    method public static void configureView(android.app.Activity, android.view.View, String![], androidx.core.view.OnReceiveContentListener);
+    method public static void configureView(android.app.Activity, android.view.View, String![], androidx.draganddrop.DropHelper.Options, androidx.core.view.OnReceiveContentListener);
+  }
+
+  @RequiresApi(android.os.Build.VERSION_CODES.N) public static final class DropHelper.Options {
+    method @ColorInt public int getHighlightColor();
+    method public int getHighlightCornerRadiusPx();
+    method public java.util.List<android.widget.EditText!> getInnerEditTexts();
+    method public boolean hasHighlightColor();
+    method public boolean hasHighlightCornerRadiusPx();
+  }
+
+  @RequiresApi(android.os.Build.VERSION_CODES.N) public static final class DropHelper.Options.Builder {
+    ctor public DropHelper.Options.Builder();
+    method public androidx.draganddrop.DropHelper.Options.Builder addInnerEditTexts(android.widget.EditText!...);
+    method public androidx.draganddrop.DropHelper.Options build();
+    method public androidx.draganddrop.DropHelper.Options.Builder setHighlightColor(@ColorInt int);
+    method public androidx.draganddrop.DropHelper.Options.Builder setHighlightCornerRadiusPx(int);
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/draganddrop/draganddrop/api/res-current.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to draganddrop/draganddrop/api/res-current.txt
diff --git a/draganddrop/draganddrop/api/restricted_current.txt b/draganddrop/draganddrop/api/restricted_current.txt
index e6f50d0..7390973 100644
--- a/draganddrop/draganddrop/api/restricted_current.txt
+++ b/draganddrop/draganddrop/api/restricted_current.txt
@@ -1 +1,26 @@
 // Signature format: 4.0
+package androidx.draganddrop {
+
+  @RequiresApi(android.os.Build.VERSION_CODES.N) public final class DropHelper {
+    method public static void configureView(android.app.Activity, android.view.View, String![], androidx.core.view.OnReceiveContentListener);
+    method public static void configureView(android.app.Activity, android.view.View, String![], androidx.draganddrop.DropHelper.Options, androidx.core.view.OnReceiveContentListener);
+  }
+
+  @RequiresApi(android.os.Build.VERSION_CODES.N) public static final class DropHelper.Options {
+    method @ColorInt public int getHighlightColor();
+    method public int getHighlightCornerRadiusPx();
+    method public java.util.List<android.widget.EditText!> getInnerEditTexts();
+    method public boolean hasHighlightColor();
+    method public boolean hasHighlightCornerRadiusPx();
+  }
+
+  @RequiresApi(android.os.Build.VERSION_CODES.N) public static final class DropHelper.Options.Builder {
+    ctor public DropHelper.Options.Builder();
+    method public androidx.draganddrop.DropHelper.Options.Builder addInnerEditTexts(android.widget.EditText!...);
+    method public androidx.draganddrop.DropHelper.Options build();
+    method public androidx.draganddrop.DropHelper.Options.Builder setHighlightColor(@ColorInt int);
+    method public androidx.draganddrop.DropHelper.Options.Builder setHighlightCornerRadiusPx(int);
+  }
+
+}
+
diff --git a/draganddrop/draganddrop/build.gradle b/draganddrop/draganddrop/build.gradle
index 07918b0..7f03ac5 100644
--- a/draganddrop/draganddrop/build.gradle
+++ b/draganddrop/draganddrop/build.gradle
@@ -20,12 +20,29 @@
 
 plugins {
     id("AndroidXPlugin")
-    id("java-library")
+    id("com.android.library")
 }
 
 dependencies {
+    api("androidx.annotation:annotation:1.1.0")
+    api("androidx.appcompat:appcompat:1.3.0")
+    api(project(":core:core"))
     annotationProcessor(libs.nullaway)
-    // Add dependencies here
+    implementation("androidx.core:core:1.3.0-beta01")
+    androidTestImplementation(libs.robolectric)
+    androidTestImplementation(libs.mockitoAndroid)
+
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+}
+
+android {
+    defaultConfig {
+        minSdkVersion 24
+    }
+    testOptions.unitTests.includeAndroidResources = true
 }
 
 androidx {
diff --git a/draganddrop/draganddrop/src/androidTest/AndroidManifest.xml b/draganddrop/draganddrop/src/androidTest/AndroidManifest.xml
index 7d51e3a..8ffc93e 100644
--- a/draganddrop/draganddrop/src/androidTest/AndroidManifest.xml
+++ b/draganddrop/draganddrop/src/androidTest/AndroidManifest.xml
@@ -1,20 +1,33 @@
 <?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.
+  ~ 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.
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="androidx.draganddrop.test">
+    xmlns:tools="http://schemas.android.com/tools"
+    package="androidx.draganddrop">
+
+    <application
+        android:allowBackup="true"
+        android:label="@string/app_name"
+        android:supportsRtl="true"
+        android:theme="@style/Theme.AppCompat.Light.NoActionBar"
+        tools:ignore="AllowBackup,GoogleAppIndexingWarning,MissingApplicationIcon">
+        <activity android:name=".DragAndDropActivity" android:exported="true">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.DEFAULT"/>
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
 
 </manifest>
diff --git a/draganddrop/draganddrop/src/androidTest/java/androidx/draganddrop/DragAndDropActivity.java b/draganddrop/draganddrop/src/androidTest/java/androidx/draganddrop/DragAndDropActivity.java
new file mode 100644
index 0000000..16c8944
--- /dev/null
+++ b/draganddrop/draganddrop/src/androidTest/java/androidx/draganddrop/DragAndDropActivity.java
@@ -0,0 +1,43 @@
+/*
+ * 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.draganddrop;
+
+import android.os.Bundle;
+import android.os.Parcel;
+import android.view.DragAndDropPermissions;
+import android.view.DragEvent;
+
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.draganddrop.test.R;
+
+/**
+ * A simple activity for testing the AndroidX drag and drop library.
+ */
+public class DragAndDropActivity extends AppCompatActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.drag_and_drop_activity);
+    }
+
+    /** Stub implementation so we can 'successfully' request permissions in tests. */
+    @Override
+    public DragAndDropPermissions requestDragAndDropPermissions(DragEvent event) {
+        return DragAndDropPermissions.CREATOR.createFromParcel(Parcel.obtain());
+    }
+}
diff --git a/draganddrop/draganddrop/src/androidTest/java/androidx/draganddrop/DragAndDropTestUtils.java b/draganddrop/draganddrop/src/androidTest/java/androidx/draganddrop/DragAndDropTestUtils.java
new file mode 100644
index 0000000..540c6be
--- /dev/null
+++ b/draganddrop/draganddrop/src/androidTest/java/androidx/draganddrop/DragAndDropTestUtils.java
@@ -0,0 +1,76 @@
+/*
+ * 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.draganddrop;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+
+import android.content.ClipData;
+import android.content.ClipData.Item;
+import android.content.ClipDescription;
+import android.net.Uri;
+import android.view.DragEvent;
+
+/** Helper utilities for creating drag events. */
+public final class DragAndDropTestUtils {
+
+    private static final String LABEL = "Label";
+    static final String SAMPLE_TEXT = "Drag Text";
+    static final Uri SAMPLE_URI = Uri.parse("http://www.google.com");
+
+    private DragAndDropTestUtils() {}
+
+    /**
+     * Makes a stub drag event containing fake text data.
+     *
+     * @param action One of the {@link DragEvent} actions.
+     */
+    public static DragEvent makeTextDragEvent(int action) {
+        return makeDragEvent(action, new Item(SAMPLE_TEXT), ClipDescription.MIMETYPE_TEXT_PLAIN);
+    }
+
+    /**
+     * Makes a stub drag event containing text data.
+     *
+     * @param action One of the {@link DragEvent} actions.
+     * @param text The text being dragged.
+     */
+    public static DragEvent makeTextDragEvent(int action, String text) {
+        return makeDragEvent(action, new Item(text), ClipDescription.MIMETYPE_TEXT_PLAIN);
+    }
+
+    /**
+     * Makes a stub drag event containing an image mimetype and fake uri.
+     *
+     * @param action One of the {@link DragEvent} actions.
+     */
+    public static DragEvent makeImageDragEvent(int action) {
+        // We're not actually resolving Uris in these tests, so this can be anything:
+        String mimeType = "image/*";
+        return makeDragEvent(action, new Item(SAMPLE_URI), mimeType);
+    }
+
+    private static DragEvent makeDragEvent(int action, ClipData.Item item, String mimeType) {
+        ClipData clipData = new ClipData(LABEL, new String[] {mimeType}, item);
+        ClipDescription clipDescription = new ClipDescription(LABEL, new String[] {mimeType});
+        DragEvent dragEvent = mock(DragEvent.class);
+        doReturn(action).when(dragEvent).getAction();
+        doReturn(clipData).when(dragEvent).getClipData();
+        doReturn(clipDescription).when(dragEvent).getClipDescription();
+        return dragEvent;
+    }
+}
diff --git a/draganddrop/draganddrop/src/androidTest/java/androidx/draganddrop/DropHelperTest.java b/draganddrop/draganddrop/src/androidTest/java/androidx/draganddrop/DropHelperTest.java
new file mode 100644
index 0000000..1ffa2a0
--- /dev/null
+++ b/draganddrop/draganddrop/src/androidTest/java/androidx/draganddrop/DropHelperTest.java
@@ -0,0 +1,501 @@
+/*
+ * 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.draganddrop;
+
+import static android.view.DragEvent.ACTION_DRAG_ENDED;
+import static android.view.DragEvent.ACTION_DRAG_ENTERED;
+import static android.view.DragEvent.ACTION_DRAG_EXITED;
+import static android.view.DragEvent.ACTION_DRAG_STARTED;
+import static android.view.DragEvent.ACTION_DROP;
+
+import static androidx.draganddrop.DragAndDropTestUtils.makeImageDragEvent;
+import static androidx.draganddrop.DragAndDropTestUtils.makeTextDragEvent;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import static java.lang.Math.max;
+import static java.lang.Math.round;
+
+import android.app.Activity;
+import android.content.ClipData;
+import android.content.res.ColorStateList;
+import android.graphics.drawable.GradientDrawable;
+import android.os.SystemClock;
+import android.util.Pair;
+import android.view.DragEvent;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import androidx.annotation.ColorInt;
+import androidx.appcompat.widget.AppCompatEditText;
+import androidx.core.view.ContentInfoCompat;
+import androidx.core.view.OnReceiveContentListener;
+import androidx.draganddrop.test.R;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.concurrent.Callable;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/** Tests for {@link androidx.draganddrop.DropHelper}. */
+@RunWith(AndroidJUnit4.class)
+public class DropHelperTest {
+
+    private static final int UI_REFRESH_TIMEOUT_MS = 2000;
+
+    private Activity mActivity;
+    private EditText mDropTarget;
+    private AppCompatEditText mAppCompatEditText;
+    private View mOuterNestedDropTarget;
+    private EditText mInnerNestedEditText;
+    private OnReceiveContentListener mListener;
+    private final AtomicBoolean mListenerCalled = new AtomicBoolean(false);
+    private final ArrayList<ClipData.Item> mDroppedUriItems = new ArrayList<>();
+
+    private static final @ColorInt int COLOR_FULL_OPACITY = 0xFF112233;
+    private static final @ColorInt int COLOR_INACTIVE_OPACITY = 0x33112233;
+    private static final @ColorInt int COLOR_ACTIVE_OPACITY = 0xA5112233;
+
+    @SuppressWarnings("deprecation")
+    @Rule public androidx.test.rule.ActivityTestRule<DragAndDropActivity> mActivityRule =
+            new androidx.test.rule.ActivityTestRule<>(DragAndDropActivity.class);
+
+    @Before
+    @UiThreadTest
+    public void setUp() {
+        mActivity = mActivityRule.getActivity();
+        mDropTarget = mActivity.findViewById(R.id.drop_target);
+        mAppCompatEditText = mActivity.findViewById(R.id.app_compat_edit_text_drop_target);
+        mOuterNestedDropTarget = mActivity.findViewById(R.id.outer_drop_target);
+        mInnerNestedEditText = mActivity.findViewById(R.id.inner_edit_text);
+        mListenerCalled.set(false);
+        mDroppedUriItems.clear();
+        mListener = (view, payload) -> {
+            mListenerCalled.set(true);
+            Pair<ContentInfoCompat, ContentInfoCompat> parts =
+                    payload.partition(item -> item.getUri() != null);
+            ContentInfoCompat uriItems = parts.first;
+            if (uriItems != null) {
+                for (int i = 0; i < uriItems.getClip().getItemCount(); i++) {
+                    mDroppedUriItems.add(uriItems.getClip().getItemAt(i));
+                }
+            }
+            return parts.second;
+        };
+    }
+
+    // We attempted to add a test that drops onto mOuterNestedDropTarget and asserts that the drop
+    // is handled. This fails in tests, but works in practice, as seen in the sample app.
+
+    @Test
+    public void testDropHelper_startDrag_hasInactiveHighlight() throws Exception {
+        DropHelper.configureView(
+                mActivity,
+                mDropTarget,
+                new String[]{"text/*"},
+                new DropHelper.Options.Builder().setHighlightColor(COLOR_FULL_OPACITY).build(),
+                mListener);
+
+        sendEventAndWaitForHighlightColor(
+                mDropTarget,
+                makeTextDragEvent(ACTION_DRAG_STARTED),
+                mDropTarget,
+                COLOR_INACTIVE_OPACITY);
+    }
+
+    @Test
+    public void testDropHelper_endDrag_hasNoHighlight() throws Exception {
+        DropHelper.configureView(
+                mActivity,
+                mDropTarget,
+                new String[]{"text/*"},
+                new DropHelper.Options.Builder().setHighlightColor(COLOR_FULL_OPACITY).build(),
+                mListener);
+
+        sendEventAndWaitForHighlightColor(
+                mDropTarget,
+                makeTextDragEvent(ACTION_DRAG_STARTED),
+                mDropTarget,
+                COLOR_INACTIVE_OPACITY);
+
+        sendEventAndWaitForNoHighlight(
+                mDropTarget,
+                makeTextDragEvent(ACTION_DRAG_ENDED),
+                mDropTarget);
+    }
+
+    @Test
+    public void testDropHelper_wrongMimeTypeImage_hasNoHighlight() throws Exception {
+        DropHelper.configureView(
+                mActivity,
+                mDropTarget,
+                new String[]{"image/*"},
+                new DropHelper.Options.Builder().setHighlightColor(COLOR_FULL_OPACITY).build(),
+                mListener);
+
+        sendEventAndWaitForNoHighlight(
+                mDropTarget,
+                makeTextDragEvent(ACTION_DRAG_STARTED),
+                mDropTarget);
+
+    }
+
+    @Test
+    public void testDropHelper_wrongMimeTypeText_hasNoHighlight() throws Exception {
+        DropHelper.configureView(
+                mActivity,
+                mDropTarget,
+                new String[]{"text/*"},
+                new DropHelper.Options.Builder().setHighlightColor(COLOR_FULL_OPACITY).build(),
+                mListener);
+
+        sendEventAndWaitForNoHighlight(
+                mDropTarget,
+                makeImageDragEvent(ACTION_DRAG_STARTED),
+                mDropTarget);
+    }
+
+    @Test
+    public void testDropHelper_enterAndExit_togglesHighlight() throws Exception {
+        DropHelper.configureView(
+                mActivity,
+                mDropTarget,
+                new String[]{"text/*"},
+                new DropHelper.Options.Builder().setHighlightColor(COLOR_FULL_OPACITY).build(),
+                mListener);
+
+        sendEventAndWaitForHighlightColor(
+                mDropTarget,
+                makeTextDragEvent(ACTION_DRAG_STARTED),
+                mDropTarget,
+                COLOR_INACTIVE_OPACITY);
+
+        sendEventAndWaitForHighlightColor(
+                mDropTarget,
+                makeTextDragEvent(ACTION_DRAG_ENTERED),
+                mDropTarget,
+                COLOR_ACTIVE_OPACITY);
+
+        sendEventAndWaitForHighlightColor(
+                mDropTarget,
+                makeTextDragEvent(ACTION_DRAG_EXITED),
+                mDropTarget,
+                COLOR_INACTIVE_OPACITY);
+
+        sendEventAndWaitForHighlightColor(
+                mDropTarget,
+                makeTextDragEvent(ACTION_DRAG_ENTERED),
+                mDropTarget,
+                COLOR_ACTIVE_OPACITY);
+    }
+
+    @Test
+    public void testDropHelper_dragToInnerNestedView_retainsActiveHighlight()
+            throws Exception {
+        DropHelper.configureView(
+                mActivity,
+                mOuterNestedDropTarget,
+                new String[]{"text/*"},
+                new DropHelper.Options.Builder()
+                        .setHighlightColor(COLOR_FULL_OPACITY)
+                        .addInnerEditTexts(mInnerNestedEditText)
+                        .build(),
+                mListener);
+
+        sendEventAndWaitForHighlightColor(
+                mInnerNestedEditText,
+                makeTextDragEvent(ACTION_DRAG_STARTED),
+                mOuterNestedDropTarget,
+                COLOR_INACTIVE_OPACITY);
+
+        sendEventAndWaitForHighlightColor(
+                mInnerNestedEditText,
+                makeTextDragEvent(ACTION_DRAG_ENTERED),
+                mOuterNestedDropTarget,
+                COLOR_ACTIVE_OPACITY);
+    }
+
+    @Test
+    public void testDropHelper_usesColorFromSystemAsDefault() throws Exception {
+        DropHelper.configureView(
+                mActivity,
+                mDropTarget,
+                new String[]{"text/*"},
+                mListener);
+
+        @ColorInt int color = mActivity.obtainStyledAttributes(
+                new int[]{androidx.appcompat.R.attr.colorAccent}).getColor(0, 0);
+
+        sendEventAndWaitForHighlightColor(
+                mDropTarget,
+                makeTextDragEvent(ACTION_DRAG_STARTED),
+                mDropTarget,
+                colorWithOpacity(color, DropAffordanceHighlighter.FILL_OPACITY_INACTIVE));
+
+        sendEventAndWaitForHighlightColor(
+                mDropTarget,
+                makeTextDragEvent(ACTION_DRAG_ENTERED),
+                mDropTarget,
+                colorWithOpacity(color, DropAffordanceHighlighter.FILL_OPACITY_ACTIVE));
+    }
+
+    @Test
+    public void testDropHelper_usesDefaultCornerRadius() throws Exception {
+        DropHelper.configureView(
+                mActivity,
+                mDropTarget,
+                new String[]{"text/*"},
+                new DropHelper.Options.Builder().setHighlightColor(COLOR_FULL_OPACITY).build(),
+                mListener);
+
+        sendEventAndWaitForHighlightColor(
+                mDropTarget,
+                makeTextDragEvent(ACTION_DRAG_STARTED),
+                mDropTarget,
+                COLOR_INACTIVE_OPACITY);
+
+        GradientDrawable foreground = (GradientDrawable) mDropTarget.getForeground();
+        assertEquals(dpToPx(DropAffordanceHighlighter.DEFAULT_CORNER_RADIUS_DP),
+                (int) foreground.getCornerRadius());
+    }
+
+    @Test
+    public void testDropHelper_usesCornerRadius() throws Exception {
+        DropHelper.configureView(
+                mActivity,
+                mDropTarget,
+                new String[]{"text/*"},
+                new DropHelper.Options.Builder()
+                        .setHighlightCornerRadiusPx(1)
+                        .setHighlightColor(COLOR_FULL_OPACITY).build(),
+                mListener);
+
+        sendEventAndWaitForHighlightColor(
+                mDropTarget,
+                makeTextDragEvent(ACTION_DRAG_STARTED),
+                mDropTarget,
+                COLOR_INACTIVE_OPACITY);
+
+        GradientDrawable foreground = (GradientDrawable) mDropTarget.getForeground();
+        assertEquals(1, (int) foreground.getCornerRadius());
+    }
+
+    @Test
+    public void testDropHelper_drop_callsListener() throws Exception {
+        DropHelper.configureView(
+                mActivity,
+                mDropTarget,
+                new String[]{"text/*"},
+                new DropHelper.Options.Builder().setHighlightColor(COLOR_FULL_OPACITY).build(),
+                mListener);
+
+        sendEventAndWaitForHighlightColor(
+                mDropTarget,
+                makeTextDragEvent(ACTION_DRAG_STARTED),
+                mDropTarget,
+                COLOR_INACTIVE_OPACITY);
+
+        sendEventAndWaitForHighlightColor(
+                mDropTarget,
+                makeTextDragEvent(ACTION_DRAG_ENTERED),
+                mDropTarget,
+                COLOR_ACTIVE_OPACITY);
+
+        sendEvent(mDropTarget, makeTextDragEvent(ACTION_DROP));
+        sendEventAndWaitForNoHighlight(
+                mDropTarget,
+                makeTextDragEvent(ACTION_DRAG_ENDED),
+                mDropTarget);
+
+        assertTrue(mListenerCalled.get());
+    }
+
+    @Test
+    public void testDropHelper_drop_editText_insertsText() throws Exception {
+        assertFalse(mDropTarget instanceof AppCompatEditText);
+        DropHelper.configureView(
+                mActivity,
+                mDropTarget,
+                new String[]{"text/*"},
+                new DropHelper.Options.Builder().setHighlightColor(COLOR_FULL_OPACITY).build(),
+                mListener);
+
+        sendEventAndWaitForHighlightColor(
+                mDropTarget,
+                makeTextDragEvent(ACTION_DRAG_STARTED),
+                mDropTarget,
+                COLOR_INACTIVE_OPACITY);
+
+        sendEventAndWaitForHighlightColor(
+                mDropTarget,
+                makeTextDragEvent(ACTION_DRAG_ENTERED),
+                mDropTarget,
+                COLOR_ACTIVE_OPACITY);
+
+        sendEvent(mDropTarget, makeTextDragEvent(ACTION_DROP));
+        sendEventAndWaitForNoHighlight(
+                mDropTarget,
+                makeTextDragEvent(ACTION_DRAG_ENDED),
+                mDropTarget);
+
+        String foundText = ((TextView) mDropTarget).getText().toString();
+        assertTrue(foundText.contains(DragAndDropTestUtils.SAMPLE_TEXT));
+    }
+
+    @Test
+    public void testDropHelper_drop_editText_handlesUri() throws Exception {
+        assertFalse(mDropTarget instanceof AppCompatEditText);
+        DropHelper.configureView(
+                mActivity,
+                mDropTarget,
+                new String[]{"image/*"},
+                new DropHelper.Options.Builder().setHighlightColor(COLOR_FULL_OPACITY).build(),
+                mListener);
+
+        sendEventAndWaitForHighlightColor(
+                mDropTarget,
+                makeImageDragEvent(ACTION_DRAG_STARTED),
+                mDropTarget,
+                COLOR_INACTIVE_OPACITY);
+
+        sendEventAndWaitForHighlightColor(
+                mDropTarget,
+                makeImageDragEvent(ACTION_DRAG_ENTERED),
+                mDropTarget,
+                COLOR_ACTIVE_OPACITY);
+
+        sendEvent(mDropTarget, makeImageDragEvent(ACTION_DROP));
+        sendEventAndWaitForNoHighlight(
+                mDropTarget,
+                makeImageDragEvent(ACTION_DRAG_ENDED),
+                mDropTarget);
+
+        assertTrue(mDroppedUriItems.get(0).getUri().equals(DragAndDropTestUtils.SAMPLE_URI));
+    }
+
+    @Test
+    public void testDropHelper_drop_appCompatEditText_insertsText() throws Exception {
+        DropHelper.configureView(
+                mActivity,
+                mAppCompatEditText,
+                new String[]{"text/*"},
+                new DropHelper.Options.Builder().setHighlightColor(COLOR_FULL_OPACITY).build(),
+                mListener);
+
+        sendEventAndWaitForHighlightColor(
+                mAppCompatEditText,
+                makeTextDragEvent(ACTION_DRAG_STARTED),
+                mAppCompatEditText,
+                COLOR_INACTIVE_OPACITY);
+
+        sendEventAndWaitForHighlightColor(
+                mAppCompatEditText,
+                makeTextDragEvent(ACTION_DRAG_ENTERED),
+                mAppCompatEditText,
+                COLOR_ACTIVE_OPACITY);
+
+        sendEvent(mAppCompatEditText, makeTextDragEvent(ACTION_DROP));
+        sendEventAndWaitForNoHighlight(
+                mAppCompatEditText,
+                makeTextDragEvent(ACTION_DRAG_ENDED),
+                mAppCompatEditText);
+
+        String foundText = mAppCompatEditText.getText().toString();
+        assertTrue(foundText.contains(DragAndDropTestUtils.SAMPLE_TEXT));
+    }
+
+    @Test
+    public void testDropHelper_drop_appCompatEditText_handlesUri() throws Exception {
+        DropHelper.configureView(
+                mActivity,
+                mAppCompatEditText,
+                new String[]{"image/*"},
+                new DropHelper.Options.Builder().setHighlightColor(COLOR_FULL_OPACITY).build(),
+                mListener);
+
+        sendEventAndWaitForHighlightColor(
+                mAppCompatEditText,
+                makeImageDragEvent(ACTION_DRAG_STARTED),
+                mAppCompatEditText,
+                COLOR_INACTIVE_OPACITY);
+
+        sendEventAndWaitForHighlightColor(
+                mAppCompatEditText,
+                makeImageDragEvent(ACTION_DRAG_ENTERED),
+                mAppCompatEditText,
+                COLOR_ACTIVE_OPACITY);
+
+        sendEvent(mAppCompatEditText, makeImageDragEvent(ACTION_DROP));
+        sendEventAndWaitForNoHighlight(
+                mAppCompatEditText,
+                makeImageDragEvent(ACTION_DRAG_ENDED),
+                mAppCompatEditText);
+
+        assertTrue(mDroppedUriItems.get(0).getUri().equals(DragAndDropTestUtils.SAMPLE_URI));
+    }
+
+    private void sendEventAndWaitForHighlightColor(View viewToReceiveEvent, DragEvent event,
+            View viewToAssertHighlight, @ColorInt int color) throws Exception {
+        sendEventAndWait(viewToReceiveEvent, event,
+                () -> hasHighlightWithColor(viewToAssertHighlight, color));
+    }
+
+    private void sendEventAndWaitForNoHighlight(View viewToReceiveEvent, DragEvent event,
+            View viewToAssertNoHighlight) throws Exception {
+        sendEventAndWait(viewToReceiveEvent, event,
+                () -> viewToAssertNoHighlight.getForeground() == null);
+    }
+
+    private void sendEventAndWait(View view, DragEvent dragEvent, Callable<Boolean> criteria)
+            throws Exception {
+        sendEvent(view, dragEvent);
+        long endTime = SystemClock.uptimeMillis() + UI_REFRESH_TIMEOUT_MS;
+        while (!criteria.call()) {
+            if (SystemClock.uptimeMillis() > endTime) {
+                fail("Criteria not met after timeout.");
+            }
+            Thread.sleep(20);
+        }
+    }
+
+    private void sendEvent(View view, DragEvent dragEvent) {
+        mActivity.runOnUiThread(() -> view.dispatchDragEvent(dragEvent));
+    }
+
+    private static boolean hasHighlightWithColor(View view, @ColorInt int color) {
+        GradientDrawable foreground = (GradientDrawable) view.getForeground();
+        return foreground != null && foreground.getColor().equals(ColorStateList.valueOf(color));
+    }
+
+    private int dpToPx(int valueDp) {
+        return round(max(0, valueDp) * mActivity.getResources().getDisplayMetrics().density);
+    }
+
+    private static @ColorInt int colorWithOpacity(@ColorInt int color, float opacity) {
+        return (0x00ffffff & color) | (((int) (255 * opacity)) << 24);
+    }
+}
diff --git a/draganddrop/draganddrop/src/androidTest/res/layout/drag_and_drop_activity.xml b/draganddrop/draganddrop/src/androidTest/res/layout/drag_and_drop_activity.xml
new file mode 100644
index 0000000..bf5595f
--- /dev/null
+++ b/draganddrop/draganddrop/src/androidTest/res/layout/drag_and_drop_activity.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ 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.
+  -->
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:padding="20dp"
+        android:orientation="vertical">
+        <android.widget.EditText
+            android:id="@+id/drop_target"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:padding="20dp"
+            android:text="I am a drop target" />
+        <androidx.appcompat.widget.AppCompatEditText
+            android:id="@+id/app_compat_edit_text_drop_target"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:padding="20dp"
+            android:text="I am a drop target" />
+        <LinearLayout
+            android:id="@+id/outer_drop_target"
+            android:orientation="vertical"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:background="@color/androidx_core_ripple_material_light"
+            android:padding="50dp"
+            android:layout_margin="20dp" >
+            <EditText
+                android:id="@+id/inner_edit_text"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:padding="50dp"
+                android:text="I'm a nested EditText" />
+        </LinearLayout>
+    </LinearLayout>
+</ScrollView>
\ No newline at end of file
diff --git a/draganddrop/draganddrop/src/androidTest/res/values/donottranslate-strings.xml b/draganddrop/draganddrop/src/androidTest/res/values/donottranslate-strings.xml
new file mode 100644
index 0000000..89486c6
--- /dev/null
+++ b/draganddrop/draganddrop/src/androidTest/res/values/donottranslate-strings.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ 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.
+  -->
+<resources>
+    <string name="app_name">Drag and Drop</string>
+</resources>
diff --git a/draganddrop/draganddrop/src/main/AndroidManifest.xml b/draganddrop/draganddrop/src/main/AndroidManifest.xml
index 56c387a..eaef83d 100644
--- a/draganddrop/draganddrop/src/main/AndroidManifest.xml
+++ b/draganddrop/draganddrop/src/main/AndroidManifest.xml
@@ -16,5 +16,4 @@
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="androidx.draganddrop">
-
-</manifest>
\ No newline at end of file
+</manifest>
diff --git a/draganddrop/draganddrop/src/main/java/androidx/draganddrop/DropAffordanceHighlighter.java b/draganddrop/draganddrop/src/main/java/androidx/draganddrop/DropAffordanceHighlighter.java
new file mode 100644
index 0000000..3517032
--- /dev/null
+++ b/draganddrop/draganddrop/src/main/java/androidx/draganddrop/DropAffordanceHighlighter.java
@@ -0,0 +1,288 @@
+/*
+ * 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.draganddrop;
+
+import static android.view.DragEvent.ACTION_DRAG_ENDED;
+import static android.view.DragEvent.ACTION_DRAG_ENTERED;
+import static android.view.DragEvent.ACTION_DRAG_EXITED;
+import static android.view.DragEvent.ACTION_DRAG_STARTED;
+
+import static java.lang.Math.max;
+import static java.lang.Math.round;
+
+import android.annotation.SuppressLint;
+import android.content.ClipDescription;
+import android.content.Context;
+import android.content.res.ColorStateList;
+import android.content.res.TypedArray;
+import android.graphics.BlendMode;
+import android.graphics.PorterDuff.Mode;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.GradientDrawable;
+import android.os.Build;
+import android.view.DragEvent;
+import android.view.Gravity;
+import android.view.View;
+
+import androidx.annotation.ColorInt;
+import androidx.annotation.DoNotInline;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.core.util.Preconditions;
+import androidx.core.util.Predicate;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/** Used for visually indicating a View's affordance as a drop target. */
+@RequiresApi(Build.VERSION_CODES.N)
+final class DropAffordanceHighlighter {
+    static final float FILL_OPACITY_INACTIVE = .2f;
+    static final float FILL_OPACITY_ACTIVE = .65f;
+    private static final float STROKE_OPACITY_INACTIVE = .4f;
+    private static final int STROKE_OPACITY_ACTIVE = 1;
+    private static final int STROKE_WIDTH_DP = 3;
+
+    static final int DEFAULT_CORNER_RADIUS_DP = 16;
+    private static final @ColorInt int DEFAULT_COLOR = 0xFF1A73E8;
+
+    private static final int DEFAULT_GRAVITY = Gravity.FILL;
+
+    private boolean mDragInProgress = false;
+
+    final View mViewToHighlight;
+    private final Predicate<ClipDescription> mEligibilityPredicate;
+    /** Highlight for possible targets (light) */
+    private final Drawable mHighlightAffordance;
+    /** Highlight for the current target that will receive the content if the user lets go (dark) */
+    private final Drawable mSelectedAffordance;
+
+    private final Set<View> mViewsWithDragFocus = new HashSet<>();
+
+    @Nullable
+    private Drawable mOriginalForeground;
+    private int mOriginalForegroundGravity = DEFAULT_GRAVITY;
+    @Nullable
+    BlendMode mOriginalForegroundTintBlendMode;
+    @Nullable
+    private ColorStateList mOriginalForegroundTintList;
+    @Nullable
+    private Mode mOriginalForegroundTintMode;
+
+    DropAffordanceHighlighter(
+            View viewToHighlight,
+            Predicate<ClipDescription> eligibilityPredicate,
+            @ColorInt int highlightColor,
+            int cornerRadiusPx) {
+        this.mViewToHighlight = viewToHighlight;
+        this.mEligibilityPredicate = eligibilityPredicate;
+
+        @ColorInt int  inactiveColor = colorWithOpacity(
+                highlightColor, FILL_OPACITY_INACTIVE);
+        @ColorInt int  activeColor = colorWithOpacity(
+                highlightColor, FILL_OPACITY_ACTIVE);
+        @ColorInt int  inactiveStrokeColor = colorWithOpacity(
+                highlightColor, STROKE_OPACITY_INACTIVE);
+        @ColorInt int  activeStrokeColor = colorWithOpacity(
+                highlightColor, STROKE_OPACITY_ACTIVE);
+        this.mHighlightAffordance = DropAffordanceHighlighter.makeDrawable(
+                mViewToHighlight.getContext(), inactiveColor, inactiveStrokeColor, cornerRadiusPx);
+        this.mSelectedAffordance = DropAffordanceHighlighter.makeDrawable(
+                mViewToHighlight.getContext(), activeColor, activeStrokeColor, cornerRadiusPx);
+    }
+
+    /** Makes a new builder for highlighting the given view. */
+    static @NonNull DropAffordanceHighlighter.Builder forView(
+            @NonNull View viewToHighlight,
+            @NonNull Predicate<ClipDescription> eligibilityPredicate) {
+        Preconditions.checkNotNull(viewToHighlight);
+        Preconditions.checkNotNull(eligibilityPredicate);
+        return new DropAffordanceHighlighter.Builder(viewToHighlight, eligibilityPredicate);
+    }
+
+    /** Sets the highlight state based on the drag events. */
+    boolean onDrag(@NonNull View reportingView, @NonNull DragEvent dragEvent) {
+        int action = dragEvent.getAction();
+        // ClipDescription is not present in ACTION_DRAG_ENDED.
+        if (action != ACTION_DRAG_ENDED
+                && !mEligibilityPredicate.test(dragEvent.getClipDescription())) {
+            return false;
+        }
+        handleDragEvent(reportingView, action);
+        // Return true on DRAG_STARTED, so we continue to receive events.
+        // @see https://developer.android.com/reference/android/view/DragEvent#ACTION_DRAG_STARTED
+        return action == ACTION_DRAG_STARTED;
+    }
+
+    private static @ColorInt int colorWithOpacity(@ColorInt int color, float opacity) {
+        return (0x00ffffff & color) | (((int) (255 * opacity)) << 24);
+    }
+
+    private void handleDragEvent(View reportingView, int action) {
+        switch (action) {
+            case ACTION_DRAG_STARTED:
+                // Multiple views can report DRAG_STARTED events, so we only care about one.
+                if (!mDragInProgress) {
+                    mDragInProgress = true;
+                    backUpOriginalForeground();
+                }
+                break;
+            case ACTION_DRAG_ENDED:
+                // Multiple views can report DRAG_ENDED events, so we only care about one.
+                if (mDragInProgress) {
+                    mDragInProgress = false;
+                    restoreOriginalForeground();
+                    mViewsWithDragFocus.clear();
+                }
+                break;
+            case ACTION_DRAG_ENTERED:
+                mViewsWithDragFocus.add(reportingView);
+                break;
+            case ACTION_DRAG_EXITED:
+                mViewsWithDragFocus.remove(reportingView);
+                break;
+        }
+
+        if (mDragInProgress) {
+            // A drag is in progress. We want the darker "selected" highlight as long as the user's
+            // finger is over one of the relevant views, to indicate that they are over an active
+            // drop target. Otherwise, we want the lighter highlight. See go/nested-drop for more
+            // details.
+            if (!mViewsWithDragFocus.isEmpty()) {
+                mViewToHighlight.setForeground(mSelectedAffordance);
+            } else {
+                mViewToHighlight.setForeground(mHighlightAffordance);
+            }
+        }
+    }
+
+    private static GradientDrawable makeDrawable(
+            Context context,
+            @ColorInt int highlightColor,
+            @ColorInt int strokeColor,
+            int cornerRadiusPx) {
+        GradientDrawable drawable = new GradientDrawable();
+        drawable.setShape(GradientDrawable.RECTANGLE);
+        drawable.setColor(highlightColor);
+        drawable.setStroke(dpToPx(context, STROKE_WIDTH_DP), strokeColor);
+        drawable.setCornerRadius(cornerRadiusPx);
+        return drawable;
+    }
+
+    static int dpToPx(Context context, int valueDp) {
+        return round(max(0, valueDp) * context.getResources().getDisplayMetrics().density);
+    }
+
+    private void backUpOriginalForeground() {
+        mOriginalForeground = mViewToHighlight.getForeground();
+        mOriginalForegroundGravity = mViewToHighlight.getForegroundGravity();
+        mOriginalForegroundTintList = mViewToHighlight.getForegroundTintList();
+        mOriginalForegroundTintMode = mViewToHighlight.getForegroundTintMode();
+        mViewToHighlight.setForegroundGravity(DEFAULT_GRAVITY);
+        mViewToHighlight.setForegroundTintList(null);
+        mViewToHighlight.setForegroundTintMode(null);
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+            Api29BackUpImpl.backUp(this);
+        }
+    }
+
+    private void restoreOriginalForeground() {
+        mViewToHighlight.setForeground(mOriginalForeground);
+        mViewToHighlight.setForegroundGravity(mOriginalForegroundGravity);
+        mViewToHighlight.setForegroundTintList(mOriginalForegroundTintList);
+        mViewToHighlight.setForegroundTintMode(mOriginalForegroundTintMode);
+        mOriginalForeground = null;
+        mOriginalForegroundGravity = DEFAULT_GRAVITY;
+        mOriginalForegroundTintList = null;
+        mOriginalForegroundTintMode = null;
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+            Api29RestoreImpl.restore(this);
+        }
+    }
+
+    @RequiresApi(Build.VERSION_CODES.Q)
+    private static class Api29BackUpImpl {
+        @DoNotInline
+        static void backUp(DropAffordanceHighlighter highlighter) {
+            highlighter.mOriginalForegroundTintBlendMode =
+                    highlighter.mViewToHighlight.getForegroundTintBlendMode();
+            highlighter.mViewToHighlight.setForegroundTintBlendMode(null);
+        }
+    }
+
+    @RequiresApi(Build.VERSION_CODES.Q)
+    private static class Api29RestoreImpl {
+        @DoNotInline
+        static void restore(DropAffordanceHighlighter highlighter) {
+            highlighter.mViewToHighlight.setForegroundTintBlendMode(
+                    highlighter.mOriginalForegroundTintBlendMode);
+            highlighter.mOriginalForegroundTintBlendMode = null;
+        }
+    }
+
+    /** Builder for {@link DropAffordanceHighlighter}. */
+    @RequiresApi(Build.VERSION_CODES.N)
+    static final class Builder {
+        private final View mViewToHighlight;
+        private final Predicate<ClipDescription> mEligibilityPredicate;
+        private int mCornerRadiusPx;
+        private @ColorInt int mHighlightColor;
+        private boolean mHighlightColorHasBeenSupplied = false;
+
+        Builder(View viewToHighlight, Predicate<ClipDescription> eligibilityPredicate) {
+            this.mViewToHighlight = viewToHighlight;
+            this.mEligibilityPredicate = eligibilityPredicate;
+            mCornerRadiusPx = dpToPx(viewToHighlight.getContext(), DEFAULT_CORNER_RADIUS_DP);
+        }
+
+        /** Sets the color of the affordance highlight. */
+        @SuppressLint("MissingGetterMatchingBuilder")
+        @NonNull Builder setHighlightColor(@ColorInt int highlightColor) {
+            this.mHighlightColor = highlightColor;
+            this.mHighlightColorHasBeenSupplied = true;
+            return this;
+        }
+
+        /** Sets the corner radius (px) of the affordance highlight. */
+        @SuppressLint("MissingGetterMatchingBuilder")
+        @NonNull Builder setHighlightCornerRadiusPx(int cornerRadiusPx) {
+            this.mCornerRadiusPx = cornerRadiusPx;
+            return this;
+        }
+
+        /** Creates the {@link androidx.draganddrop.DropAffordanceHighlighter}. */
+        @NonNull DropAffordanceHighlighter build() {
+            return new DropAffordanceHighlighter(
+                    mViewToHighlight, mEligibilityPredicate, getHighlightColor(), mCornerRadiusPx);
+        }
+
+        private @ColorInt int getHighlightColor() {
+            if (mHighlightColorHasBeenSupplied) {
+                return mHighlightColor;
+            }
+
+            TypedArray values = mViewToHighlight.getContext().obtainStyledAttributes(
+                    new int[]{androidx.appcompat.R.attr.colorAccent});
+            try {
+                return values.getColor(0, DEFAULT_COLOR);
+            } finally {
+                values.recycle();
+            }
+        }
+    }
+}
diff --git a/draganddrop/draganddrop/src/main/java/androidx/draganddrop/DropHelper.java b/draganddrop/draganddrop/src/main/java/androidx/draganddrop/DropHelper.java
new file mode 100644
index 0000000..45041dc
--- /dev/null
+++ b/draganddrop/draganddrop/src/main/java/androidx/draganddrop/DropHelper.java
@@ -0,0 +1,370 @@
+/*
+ * 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.draganddrop;
+
+import android.app.Activity;
+import android.content.ClipData;
+import android.os.Build;
+import android.view.DragAndDropPermissions;
+import android.view.DragEvent;
+import android.view.View;
+import android.view.View.OnDragListener;
+import android.widget.EditText;
+
+import androidx.annotation.ColorInt;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.appcompat.widget.AppCompatEditText;
+import androidx.core.view.ContentInfoCompat;
+import androidx.core.view.OnReceiveContentListener;
+import androidx.core.view.ViewCompat;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * This class is used to configure {@code View}s to receive data dropped via drag-and-drop. It also
+ * adds highlighting when the user is dragging, to indicate to the user where they can drop. It
+ * will also add support for content insertion via all methods supported by
+ * {@link OnReceiveContentListener}s, when supported.
+ *
+ * <p>All {@code EditText}(s) in the drop target View's descendant tree (i.e. any contained within
+ * the drop target) <b>must</b> be provided via
+ * {@link Options.Builder#addInnerEditTexts(EditText...)}. This is to ensure the
+ * highlighting works correctly. Without this, the EditText will "steal" the focus during
+ * the drag-and-drop operation, causing undesired highlighting behavior.
+ *
+ * <p>If the user is dragging text data in the DragEvent alongside URI data, one of the EditTexts
+ * will be chosen to handle that additional text data. If the user has positioned the cursor in one
+ * of the EditTexts, or drops directly on it, that will be correctly delegated to. If not, the first
+ * one provided is the one that will be used as a default. For example, if your drop target handles
+ * images, and contains two editable text fields, you should ensure the one that you want to receive
+ * the additional text by default is provided first to
+ * {@link Options.Builder#addInnerEditTexts(EditText...)}.
+ *
+ * <p>Under the hood, this attaches an {@link OnReceiveContentListener}. It will also attach an
+ * {@link OnDragListener}. It is not recommended to attach either of these manually if using
+ * {@link DropHelper}.
+ *
+ * <p>This requires Android N+.
+ *
+ * @see <a href="http://developer.android.com/guide/topics/ui/drag-drop">Drag and Drop</a>
+ * @see <a href="http://developer.android.com/guide/topics/ui/multi-window">Multi-window</a>
+ */
+@RequiresApi(Build.VERSION_CODES.N)
+public final class DropHelper {
+
+    private static final String TAG = "DropHelper";
+
+    private DropHelper() {}
+
+    /**
+     * Same as
+     * {@link #configureView(Activity, View, String[], Options, OnReceiveContentListener)}, but
+     * with default options.
+     */
+    public static void configureView(
+            @NonNull Activity activity,
+            @NonNull View dropTarget,
+            @NonNull String[] mimeTypes,
+            @NonNull @SuppressWarnings("ExecutorRegistration")
+                    OnReceiveContentListener onReceiveContentListener) {
+        configureView(
+                activity,
+                dropTarget,
+                mimeTypes,
+                new Options.Builder().build(),
+                onReceiveContentListener);
+    }
+
+    /**
+     * Configures a View to receive content and highlight during drag and drop operations.
+     *
+     * <p>If there are any EditTexts contained in the drop target's hierarchy, they must all be
+     * provided via {@code options}.
+     *
+     * <p>Highlighting will only occur for a particular drag action if it matches the MIME type
+     * provided here, wildcards allowed (e.g. 'image/*'). A drop can be executed and will be
+     * passed on to the onReceiveContentListener even if the MIME type is not matched.
+     *
+     * <p>See {@link DropHelper} for full instructions.
+     *
+     * @param activity The current {@code Activity}, used for URI permissions.
+     * @param dropTarget The View that should become a drop target.
+     * @param mimeTypes  The MIME types that can be accepted.
+     * @param options Options for configuration.
+     * @param onReceiveContentListener    The listener to handle dropped data.
+     */
+    public static void configureView(
+            @NonNull Activity activity,
+            @NonNull View dropTarget,
+            @NonNull String[] mimeTypes,
+            @NonNull Options options,
+            @NonNull @SuppressWarnings("ExecutorRegistration")
+                    OnReceiveContentListener onReceiveContentListener) {
+        DropAffordanceHighlighter.Builder highlighterBuilder = DropAffordanceHighlighter.forView(
+                dropTarget,
+                clipDescription -> {
+                    if (clipDescription == null) {
+                        return false;
+                    }
+                    for (String mimeType : mimeTypes) {
+                        if (clipDescription.hasMimeType(mimeType)) {
+                            return true;
+                        }
+                    }
+                    return false;
+                });
+        if (options.hasHighlightColor()) {
+            highlighterBuilder.setHighlightColor(options.getHighlightColor());
+        }
+        if (options.hasHighlightCornerRadiusPx()) {
+            highlighterBuilder.setHighlightCornerRadiusPx(options.getHighlightCornerRadiusPx());
+        }
+        DropAffordanceHighlighter highlighter = highlighterBuilder.build();
+        List<EditText> innerEditTexts = options.getInnerEditTexts();
+        if (!innerEditTexts.isEmpty()) {
+            // Any inner EditTexts need to know how to handle the drop.
+            for (EditText innerEditText : innerEditTexts) {
+                setHighlightingAndHandling(innerEditText, mimeTypes, highlighter,
+                        onReceiveContentListener, activity);
+            }
+            // When handling drops to the outer view, delegate to the correct inner EditText.
+            dropTarget.setOnDragListener(createDelegatingHighlightingOnDragListener(
+                    activity, highlighter, innerEditTexts));
+        } else {
+            // With no inner EditTexts, the main View can handle everything.
+            setHighlightingAndHandling(
+                    dropTarget, mimeTypes, highlighter, onReceiveContentListener, activity);
+        }
+    }
+
+    private static void setHighlightingAndHandling(
+            View view,
+            String[] mimeTypes,
+            DropAffordanceHighlighter highlighter,
+            OnReceiveContentListener onReceiveContentListener,
+            Activity activity) {
+        ViewCompat.setOnReceiveContentListener(view, mimeTypes, onReceiveContentListener);
+        if (view instanceof AppCompatEditText) {
+            // In AppCompatEditText, the OnReceiveContentListener will handle the drop. We just
+            // need to add highlighting.
+            view.setOnDragListener(highlighter::onDrag);
+        } else {
+            // Otherwise, trigger the OnReceiveContentListener from an OnDragListener.
+            view.setOnDragListener(createHighlightingOnDragListener(highlighter, activity));
+        }
+    }
+
+    /**
+     * Creates an OnDragListener that performs highlighting and triggers the
+     * OnReceiveContentListener.
+     */
+    private static OnDragListener createHighlightingOnDragListener(
+            DropAffordanceHighlighter highlighter,
+            Activity activity) {
+        return (v, dragEvent) -> {
+            if (dragEvent.getAction() == DragEvent.ACTION_DROP) {
+                ContentInfoCompat data = new ContentInfoCompat.Builder(
+                        dragEvent.getClipData(), ContentInfoCompat.SOURCE_DRAG_AND_DROP).build();
+                try {
+                    requestPermissionsIfNeeded(activity, dragEvent);
+                } catch (CouldNotObtainPermissionsException e) {
+                    return false;
+                }
+                ViewCompat.performReceiveContent(v, data);
+            }
+            return highlighter.onDrag(v, dragEvent);
+        };
+    }
+
+    private static void requestPermissionsIfNeeded(Activity activity, DragEvent dragEvent)
+            throws CouldNotObtainPermissionsException {
+        ClipData clipData = dragEvent.getClipData();
+        if (clipData != null && hasUris(clipData)) {
+            DragAndDropPermissions permissions = activity.requestDragAndDropPermissions(dragEvent);
+            if (permissions == null) {
+                throw new CouldNotObtainPermissionsException("Couldn't get DragAndDropPermissions");
+            }
+        }
+    }
+
+    private static class CouldNotObtainPermissionsException extends Exception {
+        CouldNotObtainPermissionsException(String msg) {
+            super(msg);
+        }
+    }
+
+    private static boolean hasUris(ClipData clipData) {
+        for (int i = 0; i < clipData.getItemCount(); i++) {
+            if (clipData.getItemAt(i).getUri() != null) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /** Creates an OnDragListener that performs highlighting and delegates to an inner EditText. */
+    private static OnDragListener createDelegatingHighlightingOnDragListener(
+            Activity activity, DropAffordanceHighlighter highlighter, List<EditText> editTexts) {
+        return (v, dragEvent) -> {
+            if (dragEvent.getAction() == DragEvent.ACTION_DROP) {
+                ContentInfoCompat data = new ContentInfoCompat.Builder(
+                        dragEvent.getClipData(), ContentInfoCompat.SOURCE_DRAG_AND_DROP).build();
+                try {
+                    requestPermissionsIfNeeded(activity, dragEvent);
+                } catch (CouldNotObtainPermissionsException e) {
+                    return false;
+                }
+                for (EditText editText : editTexts) {
+                    if (editText.hasFocus()) {
+                        ViewCompat.performReceiveContent(editText, data);
+                        return true;
+                    }
+                }
+                // If none had focus, default to the first one provided.
+                ViewCompat.performReceiveContent(editTexts.get(0), data);
+                return true;
+            }
+            return highlighter.onDrag(v, dragEvent);
+        };
+    }
+
+    /** Options for configuring {@link DropHelper}. */
+    @RequiresApi(Build.VERSION_CODES.N)
+    public static final class Options {
+        private final @ColorInt int mHighlightColor;
+        private final boolean mHighlightColorHasBeenSupplied;
+        private final int mHighlightCornerRadiusPx;
+        private final boolean mHighlightCornerRadiusPxHasBeenSupplied;
+        private final @NonNull List<EditText> mInnerEditTexts;
+
+        Options(
+                @ColorInt int highlightColor,
+                boolean highlightColorHasBeenSupplied,
+                int highlightCornerRadiusPx,
+                boolean highlightCornerRadiusPxHasBeenSupplied,
+                @Nullable List<EditText> innerEditTexts) {
+            this.mHighlightColor = highlightColor;
+            this.mHighlightColorHasBeenSupplied = highlightColorHasBeenSupplied;
+            this.mHighlightCornerRadiusPx = highlightCornerRadiusPx;
+            this.mHighlightCornerRadiusPxHasBeenSupplied = highlightCornerRadiusPxHasBeenSupplied;
+            this.mInnerEditTexts =
+                    innerEditTexts != null ? new ArrayList<>(innerEditTexts) : new ArrayList<>();
+        }
+
+        /** The color to use for highlighting, if set.
+         *
+         * @see #hasHighlightColor()
+         */
+        public @ColorInt int getHighlightColor() {
+            return mHighlightColor;
+        }
+
+        /** Whether or not a highlight color has been set. If not, a default will be used. */
+        public boolean hasHighlightColor() {
+            return mHighlightColorHasBeenSupplied;
+        }
+
+        /** The desired corner radius, if set.
+         *
+         * @see #hasHighlightCornerRadiusPx()
+         */
+        public int getHighlightCornerRadiusPx() {
+            return mHighlightCornerRadiusPx;
+        }
+
+        /** Whether or not a corner radius has been set. If not, a default will be used. */
+        public boolean hasHighlightCornerRadiusPx() {
+            return mHighlightCornerRadiusPxHasBeenSupplied;
+        }
+
+        /** The EditText instances supplied when constructing this instance. */
+        public @NonNull List<EditText> getInnerEditTexts() {
+            return Collections.unmodifiableList(mInnerEditTexts);
+        }
+
+        /** Builder for constructing {@link Options}. */
+        @RequiresApi(Build.VERSION_CODES.N)
+        public static final class Builder {
+            private @ColorInt int mHighlightColor;
+            private boolean mHighlightColorHasBeenSupplied = false;
+            private int mHighlightCornerRadiusPx;
+            private boolean mHighlightCornerRadiusPxHasBeenSupplied = false;
+            private @Nullable List<EditText> mInnerEditTexts;
+
+            /** Builds the {@link Options} instance. */
+            public @NonNull Options build() {
+                return new Options(
+                        mHighlightColor,
+                        mHighlightColorHasBeenSupplied,
+                        mHighlightCornerRadiusPx,
+                        mHighlightCornerRadiusPxHasBeenSupplied,
+                        mInnerEditTexts);
+            }
+
+            /**
+             * All {@code EditText}(s) in the drop target View's descendant tree (i.e. any contained
+             * within the drop target) <b>must</b> be provided via this option.
+             *
+             * <p>If the user is dragging text data in the DragEvent alongside URI data, one of the
+             * EditTexts will be chosen to handle that additional text data. If the user has
+             * positioned the cursor in one of the EditTexts, or drops directly on it, that will
+             * be correctly delegated to. If not, the first one provided is the one that will be
+             * used as a default. For example, if your drop target handles images, and contains
+             * two editable text fields, you should ensure the one that you want to receive the
+             * additional text by default is provided first.
+             *
+             * <p>Behavior is undefined if EditTexts are added or removed after configuation.
+             *
+             * <p>See {@link DropHelper} for full instructions and explanation.
+             */
+            public @NonNull Options.Builder addInnerEditTexts(
+                    @NonNull EditText... editTexts) {
+                if (this.mInnerEditTexts == null) {
+                    this.mInnerEditTexts = new ArrayList<>();
+                }
+                Collections.addAll(this.mInnerEditTexts, editTexts);
+                return this;
+            }
+
+            /**
+             * Sets the color of the highlight shown while a drag-and-drop operation is in progress.
+             *
+             * <p>Note that opacity, if provided, is ignored.
+             */
+            public @NonNull Options.Builder setHighlightColor(@ColorInt int highlightColor) {
+                this.mHighlightColor = highlightColor;
+                this.mHighlightColorHasBeenSupplied = true;
+                return this;
+            }
+
+            /**
+             * Sets the corner radius (px) of the highlight shown while a drag-and-drop operation is
+             * in progress.
+             */
+            public @NonNull Options.Builder setHighlightCornerRadiusPx(
+                    int highlightCornerRadiusPx) {
+                this.mHighlightCornerRadiusPx = highlightCornerRadiusPx;
+                this.mHighlightCornerRadiusPxHasBeenSupplied = true;
+                return this;
+            }
+        }
+    }
+}
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt b/draganddrop/integration-tests/sampleapp/build.gradle
similarity index 64%
copy from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt
copy to draganddrop/integration-tests/sampleapp/build.gradle
index e5bb607..903296d 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt
+++ b/draganddrop/integration-tests/sampleapp/build.gradle
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * 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.
@@ -14,13 +14,18 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.platform
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.application")
+}
 
-import java.awt.Desktop
-import java.net.URI
+dependencies {
+    implementation("androidx.appcompat:appcompat:1.3.0")
+    implementation(project(":draganddrop:draganddrop"))
+}
 
-internal class DesktopUriHandler : UriHandler {
-    override fun openUri(uri: String) {
-        Desktop.getDesktop().browse(URI(uri))
+android {
+    defaultConfig {
+        minSdkVersion 24
     }
-}
\ No newline at end of file
+}
diff --git a/draganddrop/integration-tests/sampleapp/src/main/AndroidManifest.xml b/draganddrop/integration-tests/sampleapp/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..d49ac61
--- /dev/null
+++ b/draganddrop/integration-tests/sampleapp/src/main/AndroidManifest.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ 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.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    package="androidx.draganddrop.sampleapp">
+    <application
+        android:allowBackup="true"
+        android:label="DropHelper"
+        android:supportsRtl="true"
+        android:theme="@style/Theme.AppCompat.Light.NoActionBar"
+        tools:ignore="AllowBackup,GoogleAppIndexingWarning,MissingApplicationIcon">
+        <activity android:name=".DropHelperSampleActivity" android:exported="true">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.DEFAULT"/>
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>
diff --git a/draganddrop/integration-tests/sampleapp/src/main/java/androidx/draganddrop/sampleapp/DropHelperSampleActivity.java b/draganddrop/integration-tests/sampleapp/src/main/java/androidx/draganddrop/sampleapp/DropHelperSampleActivity.java
new file mode 100644
index 0000000..20bd006
--- /dev/null
+++ b/draganddrop/integration-tests/sampleapp/src/main/java/androidx/draganddrop/sampleapp/DropHelperSampleActivity.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.draganddrop.sampleapp;
+
+import android.content.ClipData;
+import android.graphics.Color;
+import android.net.Uri;
+import android.os.Bundle;
+import android.util.Log;
+import android.util.Pair;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.Toast;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.view.ContentInfoCompat;
+import androidx.core.view.OnReceiveContentListener;
+import androidx.draganddrop.DropHelper;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+/** Sample activity for {@link DropHelper}/ */
+public class DropHelperSampleActivity extends AppCompatActivity {
+    private static final String TAG = "DropHelperSampleActivity";
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.drop_helper_sample_activity);
+    }
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+
+        OnReceiveContentListener toastingOnReceiveContentListener = (view, payload) -> {
+            Toast.makeText(DropHelperSampleActivity.this.getApplicationContext(),
+                    "Drop", Toast.LENGTH_SHORT).show();
+            return payload;
+        };
+
+        OnReceiveContentListener imageDisplayingOnReceiveContentListener = (view, payload) -> {
+            Pair<ContentInfoCompat, ContentInfoCompat> split =
+                    payload.partition(item -> item.getUri() != null);
+            ContentInfoCompat uriContent = split.first;
+            ContentInfoCompat textContent = split.second;
+            if (uriContent != null && uriContent.getClip() != null) {
+                ClipData clipData = uriContent.getClip();
+                for (int i = 0; i < clipData.getItemCount(); i++) {
+                    try {
+                        Uri localImageUri = storeImage(clipData.getItemAt(i).getUri());
+                        showImage(localImageUri);
+                    } catch (IOException e) {
+                        Log.w(TAG, "Error resolving and storing dropped data", e);
+                    }
+                }
+            }
+            return textContent;
+        };
+
+        DropHelper.configureView(this,
+                findViewById(R.id.drop_target),
+                new String[]{"image/*"},
+                imageDisplayingOnReceiveContentListener);
+
+        DropHelper.configureView(this,
+                findViewById(R.id.drop_target_2),
+                new String[]{"text/*", "image/*"},
+                new DropHelper.Options.Builder()
+                        .setHighlightColor(Color.RED)
+                        .build(),
+                toastingOnReceiveContentListener);
+
+        DropHelper.configureView(this,
+                findViewById(R.id.outer_drop_target),
+                new String[]{"image/*", "text/*"},
+                new DropHelper.Options.Builder()
+                        .addInnerEditTexts(findViewById(R.id.inner_edit_text))
+                        .build(),
+                toastingOnReceiveContentListener);
+    }
+
+    /**
+     * Stores the image found at the provided Uri and returns a Uri to our local copy.
+     *
+     * <p>Apps *SHOULD NOT* use the dropped URI(s) directly (there may be, e.g. an expiration for
+     * the URI). You should read and store the content in your app.
+     */
+    private Uri storeImage(Uri uri) throws IOException {
+        InputStream input = getContentResolver().openTypedAssetFileDescriptor(
+                uri, "image/*", /* opts= */ null).createInputStream();
+        File file = File.createTempFile("droppedimage", /* suffix= */ null);
+        FileOutputStream fileOutputStream = new FileOutputStream(file);
+        byte[] buffer = new byte[1024];
+        try {
+            int len = input.read(buffer);
+            while (len != -1) {
+                fileOutputStream.write(buffer, 0, len);
+                len = input.read(buffer);
+            }
+        } finally {
+            fileOutputStream.close();
+        }
+        return Uri.fromFile(file);
+    }
+
+    private void showImage(Uri imageUri) {
+        ImageView view = new ImageView(this);
+        view.setAdjustViewBounds(true);
+        view.setMaxHeight(100);
+        view.setImageURI(imageUri);
+        ((ViewGroup) findViewById(R.id.dropped_data_display)).addView(view);
+    }
+}
diff --git a/draganddrop/integration-tests/sampleapp/src/main/res/layout/drop_helper_sample_activity.xml b/draganddrop/integration-tests/sampleapp/src/main/res/layout/drop_helper_sample_activity.xml
new file mode 100644
index 0000000..8e11228
--- /dev/null
+++ b/draganddrop/integration-tests/sampleapp/src/main/res/layout/drop_helper_sample_activity.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ 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.
+  -->
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:padding="20dp"
+        android:orientation="vertical">
+        <EditText
+            android:id="@+id/drop_target"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:padding="20dp"
+            android:text="I respond to image drops" />
+        <LinearLayout
+            android:id="@+id/dropped_data_display"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal" />
+        <TextView
+            android:id="@+id/drop_target_2"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:padding="20dp"
+            android:text="I highlight in the color red" />
+        <LinearLayout
+            android:id="@+id/outer_drop_target"
+            android:orientation="vertical"
+            android:background="@android:color/darker_gray"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:padding="50dp"
+            android:layout_margin="20dp" >
+            <EditText
+                android:id="@+id/inner_edit_text"
+                android:background="?android:attr/colorBackground"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:padding="50dp"
+                android:text="I'm nested" />
+        </LinearLayout>
+    </LinearLayout>
+</ScrollView>
\ No newline at end of file
diff --git a/fragment/fragment-ktx/api/1.4.0-beta02.txt b/fragment/fragment-ktx/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..64ef804
--- /dev/null
+++ b/fragment/fragment-ktx/api/1.4.0-beta02.txt
@@ -0,0 +1,34 @@
+// Signature format: 4.0
+package androidx.fragment.app {
+
+  public final class FragmentKt {
+    method public static void clearFragmentResult(androidx.fragment.app.Fragment, String requestKey);
+    method public static void clearFragmentResultListener(androidx.fragment.app.Fragment, String requestKey);
+    method public static void setFragmentResult(androidx.fragment.app.Fragment, String requestKey, android.os.Bundle result);
+    method public static void setFragmentResultListener(androidx.fragment.app.Fragment, String requestKey, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit> listener);
+  }
+
+  public final class FragmentManagerKt {
+    method public static inline void commit(androidx.fragment.app.FragmentManager, optional boolean allowStateLoss, kotlin.jvm.functions.Function1<? super androidx.fragment.app.FragmentTransaction,kotlin.Unit> body);
+    method public static inline void commitNow(androidx.fragment.app.FragmentManager, optional boolean allowStateLoss, kotlin.jvm.functions.Function1<? super androidx.fragment.app.FragmentTransaction,kotlin.Unit> body);
+    method @Deprecated public static inline void transaction(androidx.fragment.app.FragmentManager, optional boolean now, optional boolean allowStateLoss, kotlin.jvm.functions.Function1<? super androidx.fragment.app.FragmentTransaction,kotlin.Unit> body);
+  }
+
+  public final class FragmentTransactionKt {
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction! add(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, optional String tag, optional android.os.Bundle? args);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction! add(androidx.fragment.app.FragmentTransaction, String tag, optional android.os.Bundle? args);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction! replace(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, optional String tag, optional android.os.Bundle? args);
+  }
+
+  public final class FragmentViewModelLazyKt {
+    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM>! activityViewModels(androidx.fragment.app.Fragment, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+    method @MainThread public static <VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<VM> createViewModelLazy(androidx.fragment.app.Fragment, kotlin.reflect.KClass<VM> viewModelClass, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelStore> storeProducer, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM>! viewModels(androidx.fragment.app.Fragment, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelStoreOwner> ownerProducer, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+  }
+
+  public final class ViewKt {
+    method public static <F extends androidx.fragment.app.Fragment> F findFragment(android.view.View);
+  }
+
+}
+
diff --git a/fragment/fragment-ktx/api/public_plus_experimental_1.4.0-beta02.txt b/fragment/fragment-ktx/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..64ef804
--- /dev/null
+++ b/fragment/fragment-ktx/api/public_plus_experimental_1.4.0-beta02.txt
@@ -0,0 +1,34 @@
+// Signature format: 4.0
+package androidx.fragment.app {
+
+  public final class FragmentKt {
+    method public static void clearFragmentResult(androidx.fragment.app.Fragment, String requestKey);
+    method public static void clearFragmentResultListener(androidx.fragment.app.Fragment, String requestKey);
+    method public static void setFragmentResult(androidx.fragment.app.Fragment, String requestKey, android.os.Bundle result);
+    method public static void setFragmentResultListener(androidx.fragment.app.Fragment, String requestKey, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit> listener);
+  }
+
+  public final class FragmentManagerKt {
+    method public static inline void commit(androidx.fragment.app.FragmentManager, optional boolean allowStateLoss, kotlin.jvm.functions.Function1<? super androidx.fragment.app.FragmentTransaction,kotlin.Unit> body);
+    method public static inline void commitNow(androidx.fragment.app.FragmentManager, optional boolean allowStateLoss, kotlin.jvm.functions.Function1<? super androidx.fragment.app.FragmentTransaction,kotlin.Unit> body);
+    method @Deprecated public static inline void transaction(androidx.fragment.app.FragmentManager, optional boolean now, optional boolean allowStateLoss, kotlin.jvm.functions.Function1<? super androidx.fragment.app.FragmentTransaction,kotlin.Unit> body);
+  }
+
+  public final class FragmentTransactionKt {
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction! add(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, optional String tag, optional android.os.Bundle? args);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction! add(androidx.fragment.app.FragmentTransaction, String tag, optional android.os.Bundle? args);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction! replace(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, optional String tag, optional android.os.Bundle? args);
+  }
+
+  public final class FragmentViewModelLazyKt {
+    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM>! activityViewModels(androidx.fragment.app.Fragment, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+    method @MainThread public static <VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<VM> createViewModelLazy(androidx.fragment.app.Fragment, kotlin.reflect.KClass<VM> viewModelClass, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelStore> storeProducer, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM>! viewModels(androidx.fragment.app.Fragment, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelStoreOwner> ownerProducer, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+  }
+
+  public final class ViewKt {
+    method public static <F extends androidx.fragment.app.Fragment> F findFragment(android.view.View);
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/fragment/fragment-ktx/api/res-1.4.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to fragment/fragment-ktx/api/res-1.4.0-beta02.txt
diff --git a/fragment/fragment-ktx/api/restricted_1.4.0-beta02.txt b/fragment/fragment-ktx/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..64ef804
--- /dev/null
+++ b/fragment/fragment-ktx/api/restricted_1.4.0-beta02.txt
@@ -0,0 +1,34 @@
+// Signature format: 4.0
+package androidx.fragment.app {
+
+  public final class FragmentKt {
+    method public static void clearFragmentResult(androidx.fragment.app.Fragment, String requestKey);
+    method public static void clearFragmentResultListener(androidx.fragment.app.Fragment, String requestKey);
+    method public static void setFragmentResult(androidx.fragment.app.Fragment, String requestKey, android.os.Bundle result);
+    method public static void setFragmentResultListener(androidx.fragment.app.Fragment, String requestKey, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit> listener);
+  }
+
+  public final class FragmentManagerKt {
+    method public static inline void commit(androidx.fragment.app.FragmentManager, optional boolean allowStateLoss, kotlin.jvm.functions.Function1<? super androidx.fragment.app.FragmentTransaction,kotlin.Unit> body);
+    method public static inline void commitNow(androidx.fragment.app.FragmentManager, optional boolean allowStateLoss, kotlin.jvm.functions.Function1<? super androidx.fragment.app.FragmentTransaction,kotlin.Unit> body);
+    method @Deprecated public static inline void transaction(androidx.fragment.app.FragmentManager, optional boolean now, optional boolean allowStateLoss, kotlin.jvm.functions.Function1<? super androidx.fragment.app.FragmentTransaction,kotlin.Unit> body);
+  }
+
+  public final class FragmentTransactionKt {
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction! add(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, optional String tag, optional android.os.Bundle? args);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction! add(androidx.fragment.app.FragmentTransaction, String tag, optional android.os.Bundle? args);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction! replace(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, optional String tag, optional android.os.Bundle? args);
+  }
+
+  public final class FragmentViewModelLazyKt {
+    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM>! activityViewModels(androidx.fragment.app.Fragment, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+    method @MainThread public static <VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<VM> createViewModelLazy(androidx.fragment.app.Fragment, kotlin.reflect.KClass<VM> viewModelClass, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelStore> storeProducer, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM>! viewModels(androidx.fragment.app.Fragment, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelStoreOwner> ownerProducer, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+  }
+
+  public final class ViewKt {
+    method public static <F extends androidx.fragment.app.Fragment> F findFragment(android.view.View);
+  }
+
+}
+
diff --git a/fragment/fragment-testing/api/1.4.0-beta01.txt b/fragment/fragment-testing/api/1.4.0-beta01.txt
index 271ab04..e784213 100644
--- a/fragment/fragment-testing/api/1.4.0-beta01.txt
+++ b/fragment/fragment-testing/api/1.4.0-beta01.txt
@@ -45,12 +45,12 @@
   }
 
   public final class FragmentScenarioKt {
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, kotlin.jvm.functions.Function0<? extends F> instantiate);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, kotlin.jvm.functions.Function0<? extends F> instantiate);
     method public static inline <reified F extends androidx.fragment.app.Fragment, T> T! withFragment(androidx.fragment.app.testing.FragmentScenario<F>, kotlin.jvm.functions.Function1<? super F,? extends T> block);
diff --git a/fragment/fragment-testing/api/1.4.0-beta02.txt b/fragment/fragment-testing/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..e784213
--- /dev/null
+++ b/fragment/fragment-testing/api/1.4.0-beta02.txt
@@ -0,0 +1,60 @@
+// Signature format: 4.0
+package androidx.fragment.app.testing {
+
+  public final class FragmentScenario<F extends androidx.fragment.app.Fragment> implements java.io.Closeable {
+    method public void close();
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, android.os.Bundle? fragmentArgs, androidx.fragment.app.FragmentFactory? factory);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, android.os.Bundle? fragmentArgs, @StyleRes int themeResId, androidx.fragment.app.FragmentFactory? factory);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, android.os.Bundle? fragmentArgs, androidx.fragment.app.FragmentFactory? factory);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, android.os.Bundle? fragmentArgs, @StyleRes int themeResId, androidx.fragment.app.FragmentFactory? factory);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass);
+    method public androidx.fragment.app.testing.FragmentScenario<F> moveToState(androidx.lifecycle.Lifecycle.State newState);
+    method public androidx.fragment.app.testing.FragmentScenario<F> onFragment(androidx.fragment.app.testing.FragmentScenario.FragmentAction<F> action);
+    method public androidx.fragment.app.testing.FragmentScenario<F> recreate();
+    field public static final androidx.fragment.app.testing.FragmentScenario.Companion Companion;
+  }
+
+  public static final class FragmentScenario.Companion {
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, android.os.Bundle? fragmentArgs, androidx.fragment.app.FragmentFactory? factory);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, android.os.Bundle? fragmentArgs, @StyleRes int themeResId, androidx.fragment.app.FragmentFactory? factory);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, android.os.Bundle? fragmentArgs, androidx.fragment.app.FragmentFactory? factory);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, android.os.Bundle? fragmentArgs, @StyleRes int themeResId, androidx.fragment.app.FragmentFactory? factory);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass);
+  }
+
+  public static fun interface FragmentScenario.FragmentAction<F extends androidx.fragment.app.Fragment> {
+    method public void perform(F fragment);
+  }
+
+  public final class FragmentScenarioKt {
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, kotlin.jvm.functions.Function0<? extends F> instantiate);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, kotlin.jvm.functions.Function0<? extends F> instantiate);
+    method public static inline <reified F extends androidx.fragment.app.Fragment, T> T! withFragment(androidx.fragment.app.testing.FragmentScenario<F>, kotlin.jvm.functions.Function1<? super F,? extends T> block);
+  }
+
+}
+
diff --git a/fragment/fragment-testing/api/api_lint.ignore b/fragment/fragment-testing/api/api_lint.ignore
index eb23956..f0f2d71 100644
--- a/fragment/fragment-testing/api/api_lint.ignore
+++ b/fragment/fragment-testing/api/api_lint.ignore
@@ -1,17 +1,9 @@
 // Baseline format: 1.0
-MissingNullability: androidx.fragment.app.testing.FragmentScenarioKt#launchFragment(android.os.Bundle, int, androidx.fragment.app.FragmentFactory):
-    Missing nullability on method `launchFragment` return
 MissingNullability: androidx.fragment.app.testing.FragmentScenarioKt#launchFragment(android.os.Bundle, int, androidx.lifecycle.Lifecycle.State, androidx.fragment.app.FragmentFactory):
     Missing nullability on method `launchFragment` return
 MissingNullability: androidx.fragment.app.testing.FragmentScenarioKt#launchFragment(android.os.Bundle, int, androidx.lifecycle.Lifecycle.State, kotlin.jvm.functions.Function0<? extends F>):
     Missing nullability on method `launchFragment` return
-MissingNullability: androidx.fragment.app.testing.FragmentScenarioKt#launchFragment(android.os.Bundle, int, kotlin.jvm.functions.Function0<? extends F>):
-    Missing nullability on method `launchFragment` return
-MissingNullability: androidx.fragment.app.testing.FragmentScenarioKt#launchFragmentInContainer(android.os.Bundle, int, androidx.fragment.app.FragmentFactory):
-    Missing nullability on method `launchFragmentInContainer` return
 MissingNullability: androidx.fragment.app.testing.FragmentScenarioKt#launchFragmentInContainer(android.os.Bundle, int, androidx.lifecycle.Lifecycle.State, androidx.fragment.app.FragmentFactory):
     Missing nullability on method `launchFragmentInContainer` return
 MissingNullability: androidx.fragment.app.testing.FragmentScenarioKt#launchFragmentInContainer(android.os.Bundle, int, androidx.lifecycle.Lifecycle.State, kotlin.jvm.functions.Function0<? extends F>):
     Missing nullability on method `launchFragmentInContainer` return
-MissingNullability: androidx.fragment.app.testing.FragmentScenarioKt#launchFragmentInContainer(android.os.Bundle, int, kotlin.jvm.functions.Function0<? extends F>):
-    Missing nullability on method `launchFragmentInContainer` return
diff --git a/fragment/fragment-testing/api/current.txt b/fragment/fragment-testing/api/current.txt
index 271ab04..e784213 100644
--- a/fragment/fragment-testing/api/current.txt
+++ b/fragment/fragment-testing/api/current.txt
@@ -45,12 +45,12 @@
   }
 
   public final class FragmentScenarioKt {
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, kotlin.jvm.functions.Function0<? extends F> instantiate);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, kotlin.jvm.functions.Function0<? extends F> instantiate);
     method public static inline <reified F extends androidx.fragment.app.Fragment, T> T! withFragment(androidx.fragment.app.testing.FragmentScenario<F>, kotlin.jvm.functions.Function1<? super F,? extends T> block);
diff --git a/fragment/fragment-testing/api/public_plus_experimental_1.4.0-beta01.txt b/fragment/fragment-testing/api/public_plus_experimental_1.4.0-beta01.txt
index 271ab04..e784213 100644
--- a/fragment/fragment-testing/api/public_plus_experimental_1.4.0-beta01.txt
+++ b/fragment/fragment-testing/api/public_plus_experimental_1.4.0-beta01.txt
@@ -45,12 +45,12 @@
   }
 
   public final class FragmentScenarioKt {
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, kotlin.jvm.functions.Function0<? extends F> instantiate);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, kotlin.jvm.functions.Function0<? extends F> instantiate);
     method public static inline <reified F extends androidx.fragment.app.Fragment, T> T! withFragment(androidx.fragment.app.testing.FragmentScenario<F>, kotlin.jvm.functions.Function1<? super F,? extends T> block);
diff --git a/fragment/fragment-testing/api/public_plus_experimental_1.4.0-beta02.txt b/fragment/fragment-testing/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..e784213
--- /dev/null
+++ b/fragment/fragment-testing/api/public_plus_experimental_1.4.0-beta02.txt
@@ -0,0 +1,60 @@
+// Signature format: 4.0
+package androidx.fragment.app.testing {
+
+  public final class FragmentScenario<F extends androidx.fragment.app.Fragment> implements java.io.Closeable {
+    method public void close();
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, android.os.Bundle? fragmentArgs, androidx.fragment.app.FragmentFactory? factory);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, android.os.Bundle? fragmentArgs, @StyleRes int themeResId, androidx.fragment.app.FragmentFactory? factory);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, android.os.Bundle? fragmentArgs, androidx.fragment.app.FragmentFactory? factory);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, android.os.Bundle? fragmentArgs, @StyleRes int themeResId, androidx.fragment.app.FragmentFactory? factory);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass);
+    method public androidx.fragment.app.testing.FragmentScenario<F> moveToState(androidx.lifecycle.Lifecycle.State newState);
+    method public androidx.fragment.app.testing.FragmentScenario<F> onFragment(androidx.fragment.app.testing.FragmentScenario.FragmentAction<F> action);
+    method public androidx.fragment.app.testing.FragmentScenario<F> recreate();
+    field public static final androidx.fragment.app.testing.FragmentScenario.Companion Companion;
+  }
+
+  public static final class FragmentScenario.Companion {
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, android.os.Bundle? fragmentArgs, androidx.fragment.app.FragmentFactory? factory);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, android.os.Bundle? fragmentArgs, @StyleRes int themeResId, androidx.fragment.app.FragmentFactory? factory);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, android.os.Bundle? fragmentArgs, androidx.fragment.app.FragmentFactory? factory);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, android.os.Bundle? fragmentArgs, @StyleRes int themeResId, androidx.fragment.app.FragmentFactory? factory);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass);
+  }
+
+  public static fun interface FragmentScenario.FragmentAction<F extends androidx.fragment.app.Fragment> {
+    method public void perform(F fragment);
+  }
+
+  public final class FragmentScenarioKt {
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, kotlin.jvm.functions.Function0<? extends F> instantiate);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, kotlin.jvm.functions.Function0<? extends F> instantiate);
+    method public static inline <reified F extends androidx.fragment.app.Fragment, T> T! withFragment(androidx.fragment.app.testing.FragmentScenario<F>, kotlin.jvm.functions.Function1<? super F,? extends T> block);
+  }
+
+}
+
diff --git a/fragment/fragment-testing/api/public_plus_experimental_current.txt b/fragment/fragment-testing/api/public_plus_experimental_current.txt
index 271ab04..e784213 100644
--- a/fragment/fragment-testing/api/public_plus_experimental_current.txt
+++ b/fragment/fragment-testing/api/public_plus_experimental_current.txt
@@ -45,12 +45,12 @@
   }
 
   public final class FragmentScenarioKt {
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, kotlin.jvm.functions.Function0<? extends F> instantiate);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, kotlin.jvm.functions.Function0<? extends F> instantiate);
     method public static inline <reified F extends androidx.fragment.app.Fragment, T> T! withFragment(androidx.fragment.app.testing.FragmentScenario<F>, kotlin.jvm.functions.Function1<? super F,? extends T> block);
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/fragment/fragment-testing/api/res-1.4.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to fragment/fragment-testing/api/res-1.4.0-beta02.txt
diff --git a/fragment/fragment-testing/api/restricted_1.4.0-beta01.txt b/fragment/fragment-testing/api/restricted_1.4.0-beta01.txt
index 271ab04..e784213 100644
--- a/fragment/fragment-testing/api/restricted_1.4.0-beta01.txt
+++ b/fragment/fragment-testing/api/restricted_1.4.0-beta01.txt
@@ -45,12 +45,12 @@
   }
 
   public final class FragmentScenarioKt {
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, kotlin.jvm.functions.Function0<? extends F> instantiate);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, kotlin.jvm.functions.Function0<? extends F> instantiate);
     method public static inline <reified F extends androidx.fragment.app.Fragment, T> T! withFragment(androidx.fragment.app.testing.FragmentScenario<F>, kotlin.jvm.functions.Function1<? super F,? extends T> block);
diff --git a/fragment/fragment-testing/api/restricted_1.4.0-beta02.txt b/fragment/fragment-testing/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..e784213
--- /dev/null
+++ b/fragment/fragment-testing/api/restricted_1.4.0-beta02.txt
@@ -0,0 +1,60 @@
+// Signature format: 4.0
+package androidx.fragment.app.testing {
+
+  public final class FragmentScenario<F extends androidx.fragment.app.Fragment> implements java.io.Closeable {
+    method public void close();
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, android.os.Bundle? fragmentArgs, androidx.fragment.app.FragmentFactory? factory);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, android.os.Bundle? fragmentArgs, @StyleRes int themeResId, androidx.fragment.app.FragmentFactory? factory);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, android.os.Bundle? fragmentArgs, androidx.fragment.app.FragmentFactory? factory);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, android.os.Bundle? fragmentArgs, @StyleRes int themeResId, androidx.fragment.app.FragmentFactory? factory);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs);
+    method public static <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass);
+    method public androidx.fragment.app.testing.FragmentScenario<F> moveToState(androidx.lifecycle.Lifecycle.State newState);
+    method public androidx.fragment.app.testing.FragmentScenario<F> onFragment(androidx.fragment.app.testing.FragmentScenario.FragmentAction<F> action);
+    method public androidx.fragment.app.testing.FragmentScenario<F> recreate();
+    field public static final androidx.fragment.app.testing.FragmentScenario.Companion Companion;
+  }
+
+  public static final class FragmentScenario.Companion {
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, android.os.Bundle? fragmentArgs, androidx.fragment.app.FragmentFactory? factory);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, android.os.Bundle? fragmentArgs, @StyleRes int themeResId, androidx.fragment.app.FragmentFactory? factory);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launch(Class<F> fragmentClass);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, android.os.Bundle? fragmentArgs, androidx.fragment.app.FragmentFactory? factory);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, android.os.Bundle? fragmentArgs, @StyleRes int themeResId, androidx.fragment.app.FragmentFactory? factory);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass, optional android.os.Bundle? fragmentArgs);
+    method public <F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F> launchInContainer(Class<F> fragmentClass);
+  }
+
+  public static fun interface FragmentScenario.FragmentAction<F extends androidx.fragment.app.Fragment> {
+    method public void perform(F fragment);
+  }
+
+  public final class FragmentScenarioKt {
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, kotlin.jvm.functions.Function0<? extends F> instantiate);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, kotlin.jvm.functions.Function0<? extends F> instantiate);
+    method public static inline <reified F extends androidx.fragment.app.Fragment, T> T! withFragment(androidx.fragment.app.testing.FragmentScenario<F>, kotlin.jvm.functions.Function1<? super F,? extends T> block);
+  }
+
+}
+
diff --git a/fragment/fragment-testing/api/restricted_current.txt b/fragment/fragment-testing/api/restricted_current.txt
index 271ab04..e784213 100644
--- a/fragment/fragment-testing/api/restricted_current.txt
+++ b/fragment/fragment-testing/api/restricted_current.txt
@@ -45,12 +45,12 @@
   }
 
   public final class FragmentScenarioKt {
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragment(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, kotlin.jvm.functions.Function0<? extends F> instantiate);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.fragment.app.FragmentFactory? factory);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, kotlin.jvm.functions.Function0<? extends F> instantiate);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, optional androidx.fragment.app.FragmentFactory? factory);
     method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.testing.FragmentScenario<F>! launchFragmentInContainer(optional android.os.Bundle? fragmentArgs, optional @StyleRes int themeResId, optional androidx.lifecycle.Lifecycle.State initialState, kotlin.jvm.functions.Function0<? extends F> instantiate);
     method public static inline <reified F extends androidx.fragment.app.Fragment, T> T! withFragment(androidx.fragment.app.testing.FragmentScenario<F>, kotlin.jvm.functions.Function1<? super F,? extends T> block);
diff --git a/fragment/fragment/api/1.4.0-beta02.txt b/fragment/fragment/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..d8d30ad
--- /dev/null
+++ b/fragment/fragment/api/1.4.0-beta02.txt
@@ -0,0 +1,543 @@
+// Signature format: 4.0
+package androidx.fragment.app {
+
+  public class DialogFragment extends androidx.fragment.app.Fragment implements android.content.DialogInterface.OnCancelListener android.content.DialogInterface.OnDismissListener {
+    ctor public DialogFragment();
+    ctor public DialogFragment(@LayoutRes int);
+    method public void dismiss();
+    method public void dismissAllowingStateLoss();
+    method public android.app.Dialog? getDialog();
+    method public boolean getShowsDialog();
+    method @StyleRes public int getTheme();
+    method public boolean isCancelable();
+    method public void onCancel(android.content.DialogInterface);
+    method @MainThread public android.app.Dialog onCreateDialog(android.os.Bundle?);
+    method public void onDismiss(android.content.DialogInterface);
+    method public final android.app.Dialog requireDialog();
+    method public void setCancelable(boolean);
+    method public void setShowsDialog(boolean);
+    method public void setStyle(int, @StyleRes int);
+    method public void show(androidx.fragment.app.FragmentManager, String?);
+    method public int show(androidx.fragment.app.FragmentTransaction, String?);
+    method public void showNow(androidx.fragment.app.FragmentManager, String?);
+    field public static final int STYLE_NORMAL = 0; // 0x0
+    field public static final int STYLE_NO_FRAME = 2; // 0x2
+    field public static final int STYLE_NO_INPUT = 3; // 0x3
+    field public static final int STYLE_NO_TITLE = 1; // 0x1
+  }
+
+  public class Fragment implements androidx.activity.result.ActivityResultCaller android.content.ComponentCallbacks androidx.lifecycle.HasDefaultViewModelProviderFactory androidx.lifecycle.LifecycleOwner androidx.savedstate.SavedStateRegistryOwner android.view.View.OnCreateContextMenuListener androidx.lifecycle.ViewModelStoreOwner {
+    ctor public Fragment();
+    ctor @ContentView public Fragment(@LayoutRes int);
+    method public void dump(String, java.io.FileDescriptor?, java.io.PrintWriter, String![]?);
+    method public final boolean equals(Object?);
+    method public final androidx.fragment.app.FragmentActivity? getActivity();
+    method public boolean getAllowEnterTransitionOverlap();
+    method public boolean getAllowReturnTransitionOverlap();
+    method public final android.os.Bundle? getArguments();
+    method public final androidx.fragment.app.FragmentManager getChildFragmentManager();
+    method public android.content.Context? getContext();
+    method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
+    method public Object? getEnterTransition();
+    method public Object? getExitTransition();
+    method @Deprecated public final androidx.fragment.app.FragmentManager? getFragmentManager();
+    method public final Object? getHost();
+    method public final int getId();
+    method public final android.view.LayoutInflater getLayoutInflater();
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method @Deprecated public androidx.loader.app.LoaderManager getLoaderManager();
+    method public final androidx.fragment.app.Fragment? getParentFragment();
+    method public final androidx.fragment.app.FragmentManager getParentFragmentManager();
+    method public Object? getReenterTransition();
+    method public final android.content.res.Resources getResources();
+    method @Deprecated public final boolean getRetainInstance();
+    method public Object? getReturnTransition();
+    method public final androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+    method public Object? getSharedElementEnterTransition();
+    method public Object? getSharedElementReturnTransition();
+    method public final String getString(@StringRes int);
+    method public final String getString(@StringRes int, java.lang.Object!...);
+    method public final String? getTag();
+    method @Deprecated public final androidx.fragment.app.Fragment? getTargetFragment();
+    method @Deprecated public final int getTargetRequestCode();
+    method public final CharSequence getText(@StringRes int);
+    method @Deprecated public boolean getUserVisibleHint();
+    method public android.view.View? getView();
+    method @MainThread public androidx.lifecycle.LifecycleOwner getViewLifecycleOwner();
+    method public androidx.lifecycle.LiveData<androidx.lifecycle.LifecycleOwner!> getViewLifecycleOwnerLiveData();
+    method public androidx.lifecycle.ViewModelStore getViewModelStore();
+    method public final int hashCode();
+    method @Deprecated public static androidx.fragment.app.Fragment instantiate(android.content.Context, String);
+    method @Deprecated public static androidx.fragment.app.Fragment instantiate(android.content.Context, String, android.os.Bundle?);
+    method public final boolean isAdded();
+    method public final boolean isDetached();
+    method public final boolean isHidden();
+    method public final boolean isInLayout();
+    method public final boolean isRemoving();
+    method public final boolean isResumed();
+    method public final boolean isStateSaved();
+    method public final boolean isVisible();
+    method @Deprecated @CallSuper @MainThread public void onActivityCreated(android.os.Bundle?);
+    method @Deprecated public void onActivityResult(int, int, android.content.Intent?);
+    method @CallSuper @MainThread public void onAttach(android.content.Context);
+    method @Deprecated @CallSuper @MainThread public void onAttach(android.app.Activity);
+    method @Deprecated @MainThread public void onAttachFragment(androidx.fragment.app.Fragment);
+    method @CallSuper public void onConfigurationChanged(android.content.res.Configuration);
+    method @MainThread public boolean onContextItemSelected(android.view.MenuItem);
+    method @CallSuper @MainThread public void onCreate(android.os.Bundle?);
+    method @MainThread public android.view.animation.Animation? onCreateAnimation(int, boolean, int);
+    method @MainThread public android.animation.Animator? onCreateAnimator(int, boolean, int);
+    method @MainThread public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo?);
+    method @MainThread public void onCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
+    method @MainThread public android.view.View? onCreateView(android.view.LayoutInflater, android.view.ViewGroup?, android.os.Bundle?);
+    method @CallSuper @MainThread public void onDestroy();
+    method @MainThread public void onDestroyOptionsMenu();
+    method @CallSuper @MainThread public void onDestroyView();
+    method @CallSuper @MainThread public void onDetach();
+    method public android.view.LayoutInflater onGetLayoutInflater(android.os.Bundle?);
+    method @MainThread public void onHiddenChanged(boolean);
+    method @CallSuper @UiThread public void onInflate(android.content.Context, android.util.AttributeSet, android.os.Bundle?);
+    method @Deprecated @CallSuper @UiThread public void onInflate(android.app.Activity, android.util.AttributeSet, android.os.Bundle?);
+    method @CallSuper @MainThread public void onLowMemory();
+    method public void onMultiWindowModeChanged(boolean);
+    method @MainThread public boolean onOptionsItemSelected(android.view.MenuItem);
+    method @MainThread public void onOptionsMenuClosed(android.view.Menu);
+    method @CallSuper @MainThread public void onPause();
+    method public void onPictureInPictureModeChanged(boolean);
+    method @MainThread public void onPrepareOptionsMenu(android.view.Menu);
+    method @MainThread public void onPrimaryNavigationFragmentChanged(boolean);
+    method @Deprecated public void onRequestPermissionsResult(int, String![], int[]);
+    method @CallSuper @MainThread public void onResume();
+    method @MainThread public void onSaveInstanceState(android.os.Bundle);
+    method @CallSuper @MainThread public void onStart();
+    method @CallSuper @MainThread public void onStop();
+    method @MainThread public void onViewCreated(android.view.View, android.os.Bundle?);
+    method @CallSuper @MainThread public void onViewStateRestored(android.os.Bundle?);
+    method public void postponeEnterTransition();
+    method public final void postponeEnterTransition(long, java.util.concurrent.TimeUnit);
+    method @MainThread public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method @MainThread public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+    method public void registerForContextMenu(android.view.View);
+    method @Deprecated public final void requestPermissions(String![], int);
+    method public final androidx.fragment.app.FragmentActivity requireActivity();
+    method public final android.os.Bundle requireArguments();
+    method public final android.content.Context requireContext();
+    method @Deprecated public final androidx.fragment.app.FragmentManager requireFragmentManager();
+    method public final Object requireHost();
+    method public final androidx.fragment.app.Fragment requireParentFragment();
+    method public final android.view.View requireView();
+    method public void setAllowEnterTransitionOverlap(boolean);
+    method public void setAllowReturnTransitionOverlap(boolean);
+    method public void setArguments(android.os.Bundle?);
+    method public void setEnterSharedElementCallback(androidx.core.app.SharedElementCallback?);
+    method public void setEnterTransition(Object?);
+    method public void setExitSharedElementCallback(androidx.core.app.SharedElementCallback?);
+    method public void setExitTransition(Object?);
+    method public void setHasOptionsMenu(boolean);
+    method public void setInitialSavedState(androidx.fragment.app.Fragment.SavedState?);
+    method public void setMenuVisibility(boolean);
+    method public void setReenterTransition(Object?);
+    method @Deprecated public void setRetainInstance(boolean);
+    method public void setReturnTransition(Object?);
+    method public void setSharedElementEnterTransition(Object?);
+    method public void setSharedElementReturnTransition(Object?);
+    method @Deprecated public void setTargetFragment(androidx.fragment.app.Fragment?, int);
+    method @Deprecated public void setUserVisibleHint(boolean);
+    method public boolean shouldShowRequestPermissionRationale(String);
+    method public void startActivity(android.content.Intent!);
+    method public void startActivity(android.content.Intent!, android.os.Bundle?);
+    method @Deprecated public void startActivityForResult(android.content.Intent!, int);
+    method @Deprecated public void startActivityForResult(android.content.Intent!, int, android.os.Bundle?);
+    method @Deprecated public void startIntentSenderForResult(android.content.IntentSender!, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+    method public void startPostponedEnterTransition();
+    method public void unregisterForContextMenu(android.view.View);
+  }
+
+  public static class Fragment.InstantiationException extends java.lang.RuntimeException {
+    ctor public Fragment.InstantiationException(String, Exception?);
+  }
+
+  public static class Fragment.SavedState implements android.os.Parcelable {
+    method public int describeContents();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.fragment.app.Fragment.SavedState!> CREATOR;
+  }
+
+  public class FragmentActivity extends androidx.activity.ComponentActivity implements androidx.core.app.ActivityCompat.OnRequestPermissionsResultCallback androidx.lifecycle.LifecycleOwner {
+    ctor public FragmentActivity();
+    ctor @ContentView public FragmentActivity(@LayoutRes int);
+    method public androidx.fragment.app.FragmentManager getSupportFragmentManager();
+    method @Deprecated public androidx.loader.app.LoaderManager getSupportLoaderManager();
+    method @Deprecated @MainThread public void onAttachFragment(androidx.fragment.app.Fragment);
+    method @CallSuper public void onMultiWindowModeChanged(boolean);
+    method @CallSuper public void onPictureInPictureModeChanged(boolean);
+    method protected void onResumeFragments();
+    method public void onStateNotSaved();
+    method public void setEnterSharedElementCallback(androidx.core.app.SharedElementCallback?);
+    method public void setExitSharedElementCallback(androidx.core.app.SharedElementCallback?);
+    method public void startActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent!, int);
+    method public void startActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent!, int, android.os.Bundle?);
+    method @Deprecated public void startIntentSenderFromFragment(androidx.fragment.app.Fragment, android.content.IntentSender!, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+    method public void supportFinishAfterTransition();
+    method @Deprecated public void supportInvalidateOptionsMenu();
+    method public void supportPostponeEnterTransition();
+    method public void supportStartPostponedEnterTransition();
+    method @Deprecated public final void validateRequestPermissionsRequestCode(int);
+  }
+
+  public abstract class FragmentContainer {
+    ctor public FragmentContainer();
+    method @Deprecated public androidx.fragment.app.Fragment instantiate(android.content.Context, String, android.os.Bundle?);
+    method public abstract android.view.View? onFindViewById(@IdRes int);
+    method public abstract boolean onHasView();
+  }
+
+  public final class FragmentContainerView extends android.widget.FrameLayout {
+    ctor public FragmentContainerView(android.content.Context context);
+    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();
+  }
+
+  public class FragmentController {
+    method public void attachHost(androidx.fragment.app.Fragment?);
+    method public static androidx.fragment.app.FragmentController createController(androidx.fragment.app.FragmentHostCallback<?>);
+    method public void dispatchActivityCreated();
+    method public void dispatchConfigurationChanged(android.content.res.Configuration);
+    method public boolean dispatchContextItemSelected(android.view.MenuItem);
+    method public void dispatchCreate();
+    method public boolean dispatchCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
+    method public void dispatchDestroy();
+    method public void dispatchDestroyView();
+    method public void dispatchLowMemory();
+    method public void dispatchMultiWindowModeChanged(boolean);
+    method public boolean dispatchOptionsItemSelected(android.view.MenuItem);
+    method public void dispatchOptionsMenuClosed(android.view.Menu);
+    method public void dispatchPause();
+    method public void dispatchPictureInPictureModeChanged(boolean);
+    method public boolean dispatchPrepareOptionsMenu(android.view.Menu);
+    method @Deprecated public void dispatchReallyStop();
+    method public void dispatchResume();
+    method public void dispatchStart();
+    method public void dispatchStop();
+    method @Deprecated public void doLoaderDestroy();
+    method @Deprecated public void doLoaderRetain();
+    method @Deprecated public void doLoaderStart();
+    method @Deprecated public void doLoaderStop(boolean);
+    method @Deprecated public void dumpLoaders(String, java.io.FileDescriptor?, java.io.PrintWriter, String![]?);
+    method public boolean execPendingActions();
+    method public androidx.fragment.app.Fragment? findFragmentByWho(String);
+    method public java.util.List<androidx.fragment.app.Fragment!> getActiveFragments(java.util.List<androidx.fragment.app.Fragment!>!);
+    method public int getActiveFragmentsCount();
+    method public androidx.fragment.app.FragmentManager getSupportFragmentManager();
+    method @Deprecated public androidx.loader.app.LoaderManager! getSupportLoaderManager();
+    method public void noteStateNotSaved();
+    method public android.view.View? onCreateView(android.view.View?, String, android.content.Context, android.util.AttributeSet);
+    method @Deprecated public void reportLoaderStart();
+    method @Deprecated public void restoreAllState(android.os.Parcelable?, java.util.List<androidx.fragment.app.Fragment!>?);
+    method @Deprecated public void restoreAllState(android.os.Parcelable?, androidx.fragment.app.FragmentManagerNonConfig?);
+    method @Deprecated public void restoreLoaderNonConfig(androidx.collection.SimpleArrayMap<java.lang.String!,androidx.loader.app.LoaderManager!>!);
+    method @Deprecated public void restoreSaveState(android.os.Parcelable?);
+    method @Deprecated public androidx.collection.SimpleArrayMap<java.lang.String!,androidx.loader.app.LoaderManager!>? retainLoaderNonConfig();
+    method @Deprecated public androidx.fragment.app.FragmentManagerNonConfig? retainNestedNonConfig();
+    method @Deprecated public java.util.List<androidx.fragment.app.Fragment!>? retainNonConfig();
+    method @Deprecated public android.os.Parcelable? saveAllState();
+  }
+
+  public class FragmentFactory {
+    ctor public FragmentFactory();
+    method public androidx.fragment.app.Fragment instantiate(ClassLoader, String);
+    method public static Class<? extends androidx.fragment.app.Fragment> loadFragmentClass(ClassLoader, String);
+  }
+
+  public abstract class FragmentHostCallback<E> extends androidx.fragment.app.FragmentContainer {
+    ctor public FragmentHostCallback(android.content.Context, android.os.Handler, int);
+    method public void onDump(String, java.io.FileDescriptor?, java.io.PrintWriter, String![]?);
+    method public android.view.View? onFindViewById(int);
+    method public abstract E? onGetHost();
+    method public android.view.LayoutInflater onGetLayoutInflater();
+    method public int onGetWindowAnimations();
+    method public boolean onHasView();
+    method public boolean onHasWindowAnimations();
+    method @Deprecated public void onRequestPermissionsFromFragment(androidx.fragment.app.Fragment, String![], int);
+    method public boolean onShouldSaveFragmentState(androidx.fragment.app.Fragment);
+    method public boolean onShouldShowRequestPermissionRationale(String);
+    method public void onStartActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent!, int);
+    method public void onStartActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent!, int, android.os.Bundle?);
+    method @Deprecated public void onStartIntentSenderFromFragment(androidx.fragment.app.Fragment, android.content.IntentSender!, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+    method public void onSupportInvalidateOptionsMenu();
+  }
+
+  public abstract class FragmentManager implements androidx.fragment.app.FragmentResultOwner {
+    ctor public FragmentManager();
+    method public void addFragmentOnAttachListener(androidx.fragment.app.FragmentOnAttachListener);
+    method public void addOnBackStackChangedListener(androidx.fragment.app.FragmentManager.OnBackStackChangedListener);
+    method public androidx.fragment.app.FragmentTransaction beginTransaction();
+    method public void clearBackStack(String);
+    method public final void clearFragmentResult(String);
+    method public final void clearFragmentResultListener(String);
+    method public void dump(String, java.io.FileDescriptor?, java.io.PrintWriter, String![]?);
+    method @Deprecated public static void enableDebugLogging(boolean);
+    method public boolean executePendingTransactions();
+    method public static <F extends androidx.fragment.app.Fragment> F findFragment(android.view.View);
+    method public androidx.fragment.app.Fragment? findFragmentById(@IdRes int);
+    method public androidx.fragment.app.Fragment? findFragmentByTag(String?);
+    method public androidx.fragment.app.FragmentManager.BackStackEntry getBackStackEntryAt(int);
+    method public int getBackStackEntryCount();
+    method public androidx.fragment.app.Fragment? getFragment(android.os.Bundle, String);
+    method public androidx.fragment.app.FragmentFactory getFragmentFactory();
+    method public java.util.List<androidx.fragment.app.Fragment!> getFragments();
+    method public androidx.fragment.app.Fragment? getPrimaryNavigationFragment();
+    method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy? getStrictModePolicy();
+    method public boolean isDestroyed();
+    method public boolean isStateSaved();
+    method public void popBackStack();
+    method public void popBackStack(String?, int);
+    method public void popBackStack(int, int);
+    method public boolean popBackStackImmediate();
+    method public boolean popBackStackImmediate(String?, int);
+    method public boolean popBackStackImmediate(int, int);
+    method public void putFragment(android.os.Bundle, String, androidx.fragment.app.Fragment);
+    method public void registerFragmentLifecycleCallbacks(androidx.fragment.app.FragmentManager.FragmentLifecycleCallbacks, boolean);
+    method public void removeFragmentOnAttachListener(androidx.fragment.app.FragmentOnAttachListener);
+    method public void removeOnBackStackChangedListener(androidx.fragment.app.FragmentManager.OnBackStackChangedListener);
+    method public void restoreBackStack(String);
+    method public void saveBackStack(String);
+    method public androidx.fragment.app.Fragment.SavedState? saveFragmentInstanceState(androidx.fragment.app.Fragment);
+    method public void setFragmentFactory(androidx.fragment.app.FragmentFactory);
+    method public final void setFragmentResult(String, android.os.Bundle);
+    method public final void setFragmentResultListener(String, androidx.lifecycle.LifecycleOwner, androidx.fragment.app.FragmentResultListener);
+    method public void setStrictModePolicy(androidx.fragment.app.strictmode.FragmentStrictMode.Policy?);
+    method public void unregisterFragmentLifecycleCallbacks(androidx.fragment.app.FragmentManager.FragmentLifecycleCallbacks);
+    field public static final int POP_BACK_STACK_INCLUSIVE = 1; // 0x1
+  }
+
+  public static interface FragmentManager.BackStackEntry {
+    method @Deprecated public CharSequence? getBreadCrumbShortTitle();
+    method @Deprecated @StringRes public int getBreadCrumbShortTitleRes();
+    method @Deprecated public CharSequence? getBreadCrumbTitle();
+    method @Deprecated @StringRes public int getBreadCrumbTitleRes();
+    method public int getId();
+    method public String? getName();
+  }
+
+  public abstract static class FragmentManager.FragmentLifecycleCallbacks {
+    ctor public FragmentManager.FragmentLifecycleCallbacks();
+    method @Deprecated public void onFragmentActivityCreated(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment, android.os.Bundle?);
+    method public void onFragmentAttached(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment, android.content.Context);
+    method public void onFragmentCreated(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment, android.os.Bundle?);
+    method public void onFragmentDestroyed(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment);
+    method public void onFragmentDetached(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment);
+    method public void onFragmentPaused(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment);
+    method public void onFragmentPreAttached(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment, android.content.Context);
+    method public void onFragmentPreCreated(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment, android.os.Bundle?);
+    method public void onFragmentResumed(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment);
+    method public void onFragmentSaveInstanceState(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment, android.os.Bundle);
+    method public void onFragmentStarted(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment);
+    method public void onFragmentStopped(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment);
+    method public void onFragmentViewCreated(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment, android.view.View, android.os.Bundle?);
+    method public void onFragmentViewDestroyed(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment);
+  }
+
+  public static interface FragmentManager.OnBackStackChangedListener {
+    method @MainThread public void onBackStackChanged();
+  }
+
+  @Deprecated public class FragmentManagerNonConfig {
+  }
+
+  public interface FragmentOnAttachListener {
+    method @MainThread public void onAttachFragment(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment);
+  }
+
+  @Deprecated public abstract class FragmentPagerAdapter extends androidx.viewpager.widget.PagerAdapter {
+    ctor @Deprecated public FragmentPagerAdapter(androidx.fragment.app.FragmentManager);
+    ctor @Deprecated public FragmentPagerAdapter(androidx.fragment.app.FragmentManager, int);
+    method @Deprecated public abstract androidx.fragment.app.Fragment getItem(int);
+    method @Deprecated public long getItemId(int);
+    method @Deprecated public boolean isViewFromObject(android.view.View, Object);
+    field @Deprecated public static final int BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT = 1; // 0x1
+    field @Deprecated public static final int BEHAVIOR_SET_USER_VISIBLE_HINT = 0; // 0x0
+  }
+
+  public interface FragmentResultListener {
+    method public void onFragmentResult(String, android.os.Bundle);
+  }
+
+  public interface FragmentResultOwner {
+    method public void clearFragmentResult(String);
+    method public void clearFragmentResultListener(String);
+    method public void setFragmentResult(String, android.os.Bundle);
+    method public void setFragmentResultListener(String, androidx.lifecycle.LifecycleOwner, androidx.fragment.app.FragmentResultListener);
+  }
+
+  @Deprecated public abstract class FragmentStatePagerAdapter extends androidx.viewpager.widget.PagerAdapter {
+    ctor @Deprecated public FragmentStatePagerAdapter(androidx.fragment.app.FragmentManager);
+    ctor @Deprecated public FragmentStatePagerAdapter(androidx.fragment.app.FragmentManager, int);
+    method @Deprecated public abstract androidx.fragment.app.Fragment getItem(int);
+    method @Deprecated public boolean isViewFromObject(android.view.View, Object);
+    field @Deprecated public static final int BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT = 1; // 0x1
+    field @Deprecated public static final int BEHAVIOR_SET_USER_VISIBLE_HINT = 0; // 0x0
+  }
+
+  @Deprecated public class FragmentTabHost extends android.widget.TabHost implements android.widget.TabHost.OnTabChangeListener {
+    ctor @Deprecated public FragmentTabHost(android.content.Context);
+    ctor @Deprecated public FragmentTabHost(android.content.Context, android.util.AttributeSet?);
+    method @Deprecated public void addTab(android.widget.TabHost.TabSpec, Class<?>, android.os.Bundle?);
+    method @Deprecated public void onTabChanged(String?);
+    method @Deprecated public void setup(android.content.Context, androidx.fragment.app.FragmentManager);
+    method @Deprecated public void setup(android.content.Context, androidx.fragment.app.FragmentManager, int);
+  }
+
+  public abstract class FragmentTransaction {
+    ctor @Deprecated public FragmentTransaction();
+    method public final androidx.fragment.app.FragmentTransaction add(Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
+    method public androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.Fragment, String?);
+    method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?);
+    method public androidx.fragment.app.FragmentTransaction add(@IdRes int, androidx.fragment.app.Fragment);
+    method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
+    method public androidx.fragment.app.FragmentTransaction add(@IdRes int, androidx.fragment.app.Fragment, String?);
+    method public androidx.fragment.app.FragmentTransaction addSharedElement(android.view.View, String);
+    method public androidx.fragment.app.FragmentTransaction addToBackStack(String?);
+    method public androidx.fragment.app.FragmentTransaction attach(androidx.fragment.app.Fragment);
+    method public abstract int commit();
+    method public abstract int commitAllowingStateLoss();
+    method public abstract void commitNow();
+    method public abstract void commitNowAllowingStateLoss();
+    method public androidx.fragment.app.FragmentTransaction detach(androidx.fragment.app.Fragment);
+    method public androidx.fragment.app.FragmentTransaction disallowAddToBackStack();
+    method public androidx.fragment.app.FragmentTransaction hide(androidx.fragment.app.Fragment);
+    method public boolean isAddToBackStackAllowed();
+    method public boolean isEmpty();
+    method public androidx.fragment.app.FragmentTransaction remove(androidx.fragment.app.Fragment);
+    method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?);
+    method public androidx.fragment.app.FragmentTransaction replace(@IdRes int, androidx.fragment.app.Fragment);
+    method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
+    method public androidx.fragment.app.FragmentTransaction replace(@IdRes int, androidx.fragment.app.Fragment, String?);
+    method public androidx.fragment.app.FragmentTransaction runOnCommit(Runnable);
+    method @Deprecated public androidx.fragment.app.FragmentTransaction setAllowOptimization(boolean);
+    method @Deprecated public androidx.fragment.app.FragmentTransaction setBreadCrumbShortTitle(@StringRes int);
+    method @Deprecated public androidx.fragment.app.FragmentTransaction setBreadCrumbShortTitle(CharSequence?);
+    method @Deprecated public androidx.fragment.app.FragmentTransaction setBreadCrumbTitle(@StringRes int);
+    method @Deprecated public androidx.fragment.app.FragmentTransaction setBreadCrumbTitle(CharSequence?);
+    method public androidx.fragment.app.FragmentTransaction setCustomAnimations(@AnimRes @AnimatorRes int, @AnimRes @AnimatorRes int);
+    method public androidx.fragment.app.FragmentTransaction setCustomAnimations(@AnimRes @AnimatorRes int, @AnimRes @AnimatorRes int, @AnimRes @AnimatorRes int, @AnimRes @AnimatorRes int);
+    method public androidx.fragment.app.FragmentTransaction setMaxLifecycle(androidx.fragment.app.Fragment, androidx.lifecycle.Lifecycle.State);
+    method public androidx.fragment.app.FragmentTransaction setPrimaryNavigationFragment(androidx.fragment.app.Fragment?);
+    method public androidx.fragment.app.FragmentTransaction setReorderingAllowed(boolean);
+    method public androidx.fragment.app.FragmentTransaction setTransition(int);
+    method @Deprecated public androidx.fragment.app.FragmentTransaction setTransitionStyle(@StyleRes int);
+    method public androidx.fragment.app.FragmentTransaction show(androidx.fragment.app.Fragment);
+    field public static final int TRANSIT_ENTER_MASK = 4096; // 0x1000
+    field public static final int TRANSIT_EXIT_MASK = 8192; // 0x2000
+    field public static final int TRANSIT_FRAGMENT_CLOSE = 8194; // 0x2002
+    field public static final int TRANSIT_FRAGMENT_FADE = 4099; // 0x1003
+    field public static final int TRANSIT_FRAGMENT_MATCH_ACTIVITY_CLOSE = 8197; // 0x2005
+    field public static final int TRANSIT_FRAGMENT_MATCH_ACTIVITY_OPEN = 4100; // 0x1004
+    field public static final int TRANSIT_FRAGMENT_OPEN = 4097; // 0x1001
+    field public static final int TRANSIT_NONE = 0; // 0x0
+    field public static final int TRANSIT_UNSET = -1; // 0xffffffff
+  }
+
+  public class ListFragment extends androidx.fragment.app.Fragment {
+    ctor public ListFragment();
+    method public android.widget.ListAdapter? getListAdapter();
+    method public android.widget.ListView getListView();
+    method public long getSelectedItemId();
+    method public int getSelectedItemPosition();
+    method public void onListItemClick(android.widget.ListView, android.view.View, int, long);
+    method public final android.widget.ListAdapter requireListAdapter();
+    method public void setEmptyText(CharSequence?);
+    method public void setListAdapter(android.widget.ListAdapter?);
+    method public void setListShown(boolean);
+    method public void setListShownNoAnimation(boolean);
+    method public void setSelection(int);
+  }
+
+}
+
+package androidx.fragment.app.strictmode {
+
+  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 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 fun interface FragmentStrictMode.OnViolationListener {
+    method public void onViolation(androidx.fragment.app.strictmode.Violation violation);
+  }
+
+  public static final class FragmentStrictMode.Policy {
+    field public static final androidx.fragment.app.strictmode.FragmentStrictMode.Policy LAX;
+  }
+
+  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> 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();
+    method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder detectRetainInstanceUsage();
+    method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder detectSetUserVisibleHint();
+    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 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 {
+  }
+
+  public final class GetTargetFragmentRequestCodeUsageViolation extends androidx.fragment.app.strictmode.TargetFragmentUsageViolation {
+  }
+
+  public final class GetTargetFragmentUsageViolation extends androidx.fragment.app.strictmode.TargetFragmentUsageViolation {
+  }
+
+  public abstract class RetainInstanceUsageViolation extends androidx.fragment.app.strictmode.Violation {
+  }
+
+  public final class SetRetainInstanceUsageViolation extends androidx.fragment.app.strictmode.RetainInstanceUsageViolation {
+  }
+
+  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 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_1.4.0-beta02.txt b/fragment/fragment/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..d8d30ad
--- /dev/null
+++ b/fragment/fragment/api/public_plus_experimental_1.4.0-beta02.txt
@@ -0,0 +1,543 @@
+// Signature format: 4.0
+package androidx.fragment.app {
+
+  public class DialogFragment extends androidx.fragment.app.Fragment implements android.content.DialogInterface.OnCancelListener android.content.DialogInterface.OnDismissListener {
+    ctor public DialogFragment();
+    ctor public DialogFragment(@LayoutRes int);
+    method public void dismiss();
+    method public void dismissAllowingStateLoss();
+    method public android.app.Dialog? getDialog();
+    method public boolean getShowsDialog();
+    method @StyleRes public int getTheme();
+    method public boolean isCancelable();
+    method public void onCancel(android.content.DialogInterface);
+    method @MainThread public android.app.Dialog onCreateDialog(android.os.Bundle?);
+    method public void onDismiss(android.content.DialogInterface);
+    method public final android.app.Dialog requireDialog();
+    method public void setCancelable(boolean);
+    method public void setShowsDialog(boolean);
+    method public void setStyle(int, @StyleRes int);
+    method public void show(androidx.fragment.app.FragmentManager, String?);
+    method public int show(androidx.fragment.app.FragmentTransaction, String?);
+    method public void showNow(androidx.fragment.app.FragmentManager, String?);
+    field public static final int STYLE_NORMAL = 0; // 0x0
+    field public static final int STYLE_NO_FRAME = 2; // 0x2
+    field public static final int STYLE_NO_INPUT = 3; // 0x3
+    field public static final int STYLE_NO_TITLE = 1; // 0x1
+  }
+
+  public class Fragment implements androidx.activity.result.ActivityResultCaller android.content.ComponentCallbacks androidx.lifecycle.HasDefaultViewModelProviderFactory androidx.lifecycle.LifecycleOwner androidx.savedstate.SavedStateRegistryOwner android.view.View.OnCreateContextMenuListener androidx.lifecycle.ViewModelStoreOwner {
+    ctor public Fragment();
+    ctor @ContentView public Fragment(@LayoutRes int);
+    method public void dump(String, java.io.FileDescriptor?, java.io.PrintWriter, String![]?);
+    method public final boolean equals(Object?);
+    method public final androidx.fragment.app.FragmentActivity? getActivity();
+    method public boolean getAllowEnterTransitionOverlap();
+    method public boolean getAllowReturnTransitionOverlap();
+    method public final android.os.Bundle? getArguments();
+    method public final androidx.fragment.app.FragmentManager getChildFragmentManager();
+    method public android.content.Context? getContext();
+    method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
+    method public Object? getEnterTransition();
+    method public Object? getExitTransition();
+    method @Deprecated public final androidx.fragment.app.FragmentManager? getFragmentManager();
+    method public final Object? getHost();
+    method public final int getId();
+    method public final android.view.LayoutInflater getLayoutInflater();
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method @Deprecated public androidx.loader.app.LoaderManager getLoaderManager();
+    method public final androidx.fragment.app.Fragment? getParentFragment();
+    method public final androidx.fragment.app.FragmentManager getParentFragmentManager();
+    method public Object? getReenterTransition();
+    method public final android.content.res.Resources getResources();
+    method @Deprecated public final boolean getRetainInstance();
+    method public Object? getReturnTransition();
+    method public final androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+    method public Object? getSharedElementEnterTransition();
+    method public Object? getSharedElementReturnTransition();
+    method public final String getString(@StringRes int);
+    method public final String getString(@StringRes int, java.lang.Object!...);
+    method public final String? getTag();
+    method @Deprecated public final androidx.fragment.app.Fragment? getTargetFragment();
+    method @Deprecated public final int getTargetRequestCode();
+    method public final CharSequence getText(@StringRes int);
+    method @Deprecated public boolean getUserVisibleHint();
+    method public android.view.View? getView();
+    method @MainThread public androidx.lifecycle.LifecycleOwner getViewLifecycleOwner();
+    method public androidx.lifecycle.LiveData<androidx.lifecycle.LifecycleOwner!> getViewLifecycleOwnerLiveData();
+    method public androidx.lifecycle.ViewModelStore getViewModelStore();
+    method public final int hashCode();
+    method @Deprecated public static androidx.fragment.app.Fragment instantiate(android.content.Context, String);
+    method @Deprecated public static androidx.fragment.app.Fragment instantiate(android.content.Context, String, android.os.Bundle?);
+    method public final boolean isAdded();
+    method public final boolean isDetached();
+    method public final boolean isHidden();
+    method public final boolean isInLayout();
+    method public final boolean isRemoving();
+    method public final boolean isResumed();
+    method public final boolean isStateSaved();
+    method public final boolean isVisible();
+    method @Deprecated @CallSuper @MainThread public void onActivityCreated(android.os.Bundle?);
+    method @Deprecated public void onActivityResult(int, int, android.content.Intent?);
+    method @CallSuper @MainThread public void onAttach(android.content.Context);
+    method @Deprecated @CallSuper @MainThread public void onAttach(android.app.Activity);
+    method @Deprecated @MainThread public void onAttachFragment(androidx.fragment.app.Fragment);
+    method @CallSuper public void onConfigurationChanged(android.content.res.Configuration);
+    method @MainThread public boolean onContextItemSelected(android.view.MenuItem);
+    method @CallSuper @MainThread public void onCreate(android.os.Bundle?);
+    method @MainThread public android.view.animation.Animation? onCreateAnimation(int, boolean, int);
+    method @MainThread public android.animation.Animator? onCreateAnimator(int, boolean, int);
+    method @MainThread public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo?);
+    method @MainThread public void onCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
+    method @MainThread public android.view.View? onCreateView(android.view.LayoutInflater, android.view.ViewGroup?, android.os.Bundle?);
+    method @CallSuper @MainThread public void onDestroy();
+    method @MainThread public void onDestroyOptionsMenu();
+    method @CallSuper @MainThread public void onDestroyView();
+    method @CallSuper @MainThread public void onDetach();
+    method public android.view.LayoutInflater onGetLayoutInflater(android.os.Bundle?);
+    method @MainThread public void onHiddenChanged(boolean);
+    method @CallSuper @UiThread public void onInflate(android.content.Context, android.util.AttributeSet, android.os.Bundle?);
+    method @Deprecated @CallSuper @UiThread public void onInflate(android.app.Activity, android.util.AttributeSet, android.os.Bundle?);
+    method @CallSuper @MainThread public void onLowMemory();
+    method public void onMultiWindowModeChanged(boolean);
+    method @MainThread public boolean onOptionsItemSelected(android.view.MenuItem);
+    method @MainThread public void onOptionsMenuClosed(android.view.Menu);
+    method @CallSuper @MainThread public void onPause();
+    method public void onPictureInPictureModeChanged(boolean);
+    method @MainThread public void onPrepareOptionsMenu(android.view.Menu);
+    method @MainThread public void onPrimaryNavigationFragmentChanged(boolean);
+    method @Deprecated public void onRequestPermissionsResult(int, String![], int[]);
+    method @CallSuper @MainThread public void onResume();
+    method @MainThread public void onSaveInstanceState(android.os.Bundle);
+    method @CallSuper @MainThread public void onStart();
+    method @CallSuper @MainThread public void onStop();
+    method @MainThread public void onViewCreated(android.view.View, android.os.Bundle?);
+    method @CallSuper @MainThread public void onViewStateRestored(android.os.Bundle?);
+    method public void postponeEnterTransition();
+    method public final void postponeEnterTransition(long, java.util.concurrent.TimeUnit);
+    method @MainThread public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method @MainThread public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+    method public void registerForContextMenu(android.view.View);
+    method @Deprecated public final void requestPermissions(String![], int);
+    method public final androidx.fragment.app.FragmentActivity requireActivity();
+    method public final android.os.Bundle requireArguments();
+    method public final android.content.Context requireContext();
+    method @Deprecated public final androidx.fragment.app.FragmentManager requireFragmentManager();
+    method public final Object requireHost();
+    method public final androidx.fragment.app.Fragment requireParentFragment();
+    method public final android.view.View requireView();
+    method public void setAllowEnterTransitionOverlap(boolean);
+    method public void setAllowReturnTransitionOverlap(boolean);
+    method public void setArguments(android.os.Bundle?);
+    method public void setEnterSharedElementCallback(androidx.core.app.SharedElementCallback?);
+    method public void setEnterTransition(Object?);
+    method public void setExitSharedElementCallback(androidx.core.app.SharedElementCallback?);
+    method public void setExitTransition(Object?);
+    method public void setHasOptionsMenu(boolean);
+    method public void setInitialSavedState(androidx.fragment.app.Fragment.SavedState?);
+    method public void setMenuVisibility(boolean);
+    method public void setReenterTransition(Object?);
+    method @Deprecated public void setRetainInstance(boolean);
+    method public void setReturnTransition(Object?);
+    method public void setSharedElementEnterTransition(Object?);
+    method public void setSharedElementReturnTransition(Object?);
+    method @Deprecated public void setTargetFragment(androidx.fragment.app.Fragment?, int);
+    method @Deprecated public void setUserVisibleHint(boolean);
+    method public boolean shouldShowRequestPermissionRationale(String);
+    method public void startActivity(android.content.Intent!);
+    method public void startActivity(android.content.Intent!, android.os.Bundle?);
+    method @Deprecated public void startActivityForResult(android.content.Intent!, int);
+    method @Deprecated public void startActivityForResult(android.content.Intent!, int, android.os.Bundle?);
+    method @Deprecated public void startIntentSenderForResult(android.content.IntentSender!, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+    method public void startPostponedEnterTransition();
+    method public void unregisterForContextMenu(android.view.View);
+  }
+
+  public static class Fragment.InstantiationException extends java.lang.RuntimeException {
+    ctor public Fragment.InstantiationException(String, Exception?);
+  }
+
+  public static class Fragment.SavedState implements android.os.Parcelable {
+    method public int describeContents();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.fragment.app.Fragment.SavedState!> CREATOR;
+  }
+
+  public class FragmentActivity extends androidx.activity.ComponentActivity implements androidx.core.app.ActivityCompat.OnRequestPermissionsResultCallback androidx.lifecycle.LifecycleOwner {
+    ctor public FragmentActivity();
+    ctor @ContentView public FragmentActivity(@LayoutRes int);
+    method public androidx.fragment.app.FragmentManager getSupportFragmentManager();
+    method @Deprecated public androidx.loader.app.LoaderManager getSupportLoaderManager();
+    method @Deprecated @MainThread public void onAttachFragment(androidx.fragment.app.Fragment);
+    method @CallSuper public void onMultiWindowModeChanged(boolean);
+    method @CallSuper public void onPictureInPictureModeChanged(boolean);
+    method protected void onResumeFragments();
+    method public void onStateNotSaved();
+    method public void setEnterSharedElementCallback(androidx.core.app.SharedElementCallback?);
+    method public void setExitSharedElementCallback(androidx.core.app.SharedElementCallback?);
+    method public void startActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent!, int);
+    method public void startActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent!, int, android.os.Bundle?);
+    method @Deprecated public void startIntentSenderFromFragment(androidx.fragment.app.Fragment, android.content.IntentSender!, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+    method public void supportFinishAfterTransition();
+    method @Deprecated public void supportInvalidateOptionsMenu();
+    method public void supportPostponeEnterTransition();
+    method public void supportStartPostponedEnterTransition();
+    method @Deprecated public final void validateRequestPermissionsRequestCode(int);
+  }
+
+  public abstract class FragmentContainer {
+    ctor public FragmentContainer();
+    method @Deprecated public androidx.fragment.app.Fragment instantiate(android.content.Context, String, android.os.Bundle?);
+    method public abstract android.view.View? onFindViewById(@IdRes int);
+    method public abstract boolean onHasView();
+  }
+
+  public final class FragmentContainerView extends android.widget.FrameLayout {
+    ctor public FragmentContainerView(android.content.Context context);
+    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();
+  }
+
+  public class FragmentController {
+    method public void attachHost(androidx.fragment.app.Fragment?);
+    method public static androidx.fragment.app.FragmentController createController(androidx.fragment.app.FragmentHostCallback<?>);
+    method public void dispatchActivityCreated();
+    method public void dispatchConfigurationChanged(android.content.res.Configuration);
+    method public boolean dispatchContextItemSelected(android.view.MenuItem);
+    method public void dispatchCreate();
+    method public boolean dispatchCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
+    method public void dispatchDestroy();
+    method public void dispatchDestroyView();
+    method public void dispatchLowMemory();
+    method public void dispatchMultiWindowModeChanged(boolean);
+    method public boolean dispatchOptionsItemSelected(android.view.MenuItem);
+    method public void dispatchOptionsMenuClosed(android.view.Menu);
+    method public void dispatchPause();
+    method public void dispatchPictureInPictureModeChanged(boolean);
+    method public boolean dispatchPrepareOptionsMenu(android.view.Menu);
+    method @Deprecated public void dispatchReallyStop();
+    method public void dispatchResume();
+    method public void dispatchStart();
+    method public void dispatchStop();
+    method @Deprecated public void doLoaderDestroy();
+    method @Deprecated public void doLoaderRetain();
+    method @Deprecated public void doLoaderStart();
+    method @Deprecated public void doLoaderStop(boolean);
+    method @Deprecated public void dumpLoaders(String, java.io.FileDescriptor?, java.io.PrintWriter, String![]?);
+    method public boolean execPendingActions();
+    method public androidx.fragment.app.Fragment? findFragmentByWho(String);
+    method public java.util.List<androidx.fragment.app.Fragment!> getActiveFragments(java.util.List<androidx.fragment.app.Fragment!>!);
+    method public int getActiveFragmentsCount();
+    method public androidx.fragment.app.FragmentManager getSupportFragmentManager();
+    method @Deprecated public androidx.loader.app.LoaderManager! getSupportLoaderManager();
+    method public void noteStateNotSaved();
+    method public android.view.View? onCreateView(android.view.View?, String, android.content.Context, android.util.AttributeSet);
+    method @Deprecated public void reportLoaderStart();
+    method @Deprecated public void restoreAllState(android.os.Parcelable?, java.util.List<androidx.fragment.app.Fragment!>?);
+    method @Deprecated public void restoreAllState(android.os.Parcelable?, androidx.fragment.app.FragmentManagerNonConfig?);
+    method @Deprecated public void restoreLoaderNonConfig(androidx.collection.SimpleArrayMap<java.lang.String!,androidx.loader.app.LoaderManager!>!);
+    method @Deprecated public void restoreSaveState(android.os.Parcelable?);
+    method @Deprecated public androidx.collection.SimpleArrayMap<java.lang.String!,androidx.loader.app.LoaderManager!>? retainLoaderNonConfig();
+    method @Deprecated public androidx.fragment.app.FragmentManagerNonConfig? retainNestedNonConfig();
+    method @Deprecated public java.util.List<androidx.fragment.app.Fragment!>? retainNonConfig();
+    method @Deprecated public android.os.Parcelable? saveAllState();
+  }
+
+  public class FragmentFactory {
+    ctor public FragmentFactory();
+    method public androidx.fragment.app.Fragment instantiate(ClassLoader, String);
+    method public static Class<? extends androidx.fragment.app.Fragment> loadFragmentClass(ClassLoader, String);
+  }
+
+  public abstract class FragmentHostCallback<E> extends androidx.fragment.app.FragmentContainer {
+    ctor public FragmentHostCallback(android.content.Context, android.os.Handler, int);
+    method public void onDump(String, java.io.FileDescriptor?, java.io.PrintWriter, String![]?);
+    method public android.view.View? onFindViewById(int);
+    method public abstract E? onGetHost();
+    method public android.view.LayoutInflater onGetLayoutInflater();
+    method public int onGetWindowAnimations();
+    method public boolean onHasView();
+    method public boolean onHasWindowAnimations();
+    method @Deprecated public void onRequestPermissionsFromFragment(androidx.fragment.app.Fragment, String![], int);
+    method public boolean onShouldSaveFragmentState(androidx.fragment.app.Fragment);
+    method public boolean onShouldShowRequestPermissionRationale(String);
+    method public void onStartActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent!, int);
+    method public void onStartActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent!, int, android.os.Bundle?);
+    method @Deprecated public void onStartIntentSenderFromFragment(androidx.fragment.app.Fragment, android.content.IntentSender!, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+    method public void onSupportInvalidateOptionsMenu();
+  }
+
+  public abstract class FragmentManager implements androidx.fragment.app.FragmentResultOwner {
+    ctor public FragmentManager();
+    method public void addFragmentOnAttachListener(androidx.fragment.app.FragmentOnAttachListener);
+    method public void addOnBackStackChangedListener(androidx.fragment.app.FragmentManager.OnBackStackChangedListener);
+    method public androidx.fragment.app.FragmentTransaction beginTransaction();
+    method public void clearBackStack(String);
+    method public final void clearFragmentResult(String);
+    method public final void clearFragmentResultListener(String);
+    method public void dump(String, java.io.FileDescriptor?, java.io.PrintWriter, String![]?);
+    method @Deprecated public static void enableDebugLogging(boolean);
+    method public boolean executePendingTransactions();
+    method public static <F extends androidx.fragment.app.Fragment> F findFragment(android.view.View);
+    method public androidx.fragment.app.Fragment? findFragmentById(@IdRes int);
+    method public androidx.fragment.app.Fragment? findFragmentByTag(String?);
+    method public androidx.fragment.app.FragmentManager.BackStackEntry getBackStackEntryAt(int);
+    method public int getBackStackEntryCount();
+    method public androidx.fragment.app.Fragment? getFragment(android.os.Bundle, String);
+    method public androidx.fragment.app.FragmentFactory getFragmentFactory();
+    method public java.util.List<androidx.fragment.app.Fragment!> getFragments();
+    method public androidx.fragment.app.Fragment? getPrimaryNavigationFragment();
+    method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy? getStrictModePolicy();
+    method public boolean isDestroyed();
+    method public boolean isStateSaved();
+    method public void popBackStack();
+    method public void popBackStack(String?, int);
+    method public void popBackStack(int, int);
+    method public boolean popBackStackImmediate();
+    method public boolean popBackStackImmediate(String?, int);
+    method public boolean popBackStackImmediate(int, int);
+    method public void putFragment(android.os.Bundle, String, androidx.fragment.app.Fragment);
+    method public void registerFragmentLifecycleCallbacks(androidx.fragment.app.FragmentManager.FragmentLifecycleCallbacks, boolean);
+    method public void removeFragmentOnAttachListener(androidx.fragment.app.FragmentOnAttachListener);
+    method public void removeOnBackStackChangedListener(androidx.fragment.app.FragmentManager.OnBackStackChangedListener);
+    method public void restoreBackStack(String);
+    method public void saveBackStack(String);
+    method public androidx.fragment.app.Fragment.SavedState? saveFragmentInstanceState(androidx.fragment.app.Fragment);
+    method public void setFragmentFactory(androidx.fragment.app.FragmentFactory);
+    method public final void setFragmentResult(String, android.os.Bundle);
+    method public final void setFragmentResultListener(String, androidx.lifecycle.LifecycleOwner, androidx.fragment.app.FragmentResultListener);
+    method public void setStrictModePolicy(androidx.fragment.app.strictmode.FragmentStrictMode.Policy?);
+    method public void unregisterFragmentLifecycleCallbacks(androidx.fragment.app.FragmentManager.FragmentLifecycleCallbacks);
+    field public static final int POP_BACK_STACK_INCLUSIVE = 1; // 0x1
+  }
+
+  public static interface FragmentManager.BackStackEntry {
+    method @Deprecated public CharSequence? getBreadCrumbShortTitle();
+    method @Deprecated @StringRes public int getBreadCrumbShortTitleRes();
+    method @Deprecated public CharSequence? getBreadCrumbTitle();
+    method @Deprecated @StringRes public int getBreadCrumbTitleRes();
+    method public int getId();
+    method public String? getName();
+  }
+
+  public abstract static class FragmentManager.FragmentLifecycleCallbacks {
+    ctor public FragmentManager.FragmentLifecycleCallbacks();
+    method @Deprecated public void onFragmentActivityCreated(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment, android.os.Bundle?);
+    method public void onFragmentAttached(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment, android.content.Context);
+    method public void onFragmentCreated(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment, android.os.Bundle?);
+    method public void onFragmentDestroyed(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment);
+    method public void onFragmentDetached(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment);
+    method public void onFragmentPaused(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment);
+    method public void onFragmentPreAttached(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment, android.content.Context);
+    method public void onFragmentPreCreated(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment, android.os.Bundle?);
+    method public void onFragmentResumed(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment);
+    method public void onFragmentSaveInstanceState(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment, android.os.Bundle);
+    method public void onFragmentStarted(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment);
+    method public void onFragmentStopped(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment);
+    method public void onFragmentViewCreated(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment, android.view.View, android.os.Bundle?);
+    method public void onFragmentViewDestroyed(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment);
+  }
+
+  public static interface FragmentManager.OnBackStackChangedListener {
+    method @MainThread public void onBackStackChanged();
+  }
+
+  @Deprecated public class FragmentManagerNonConfig {
+  }
+
+  public interface FragmentOnAttachListener {
+    method @MainThread public void onAttachFragment(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment);
+  }
+
+  @Deprecated public abstract class FragmentPagerAdapter extends androidx.viewpager.widget.PagerAdapter {
+    ctor @Deprecated public FragmentPagerAdapter(androidx.fragment.app.FragmentManager);
+    ctor @Deprecated public FragmentPagerAdapter(androidx.fragment.app.FragmentManager, int);
+    method @Deprecated public abstract androidx.fragment.app.Fragment getItem(int);
+    method @Deprecated public long getItemId(int);
+    method @Deprecated public boolean isViewFromObject(android.view.View, Object);
+    field @Deprecated public static final int BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT = 1; // 0x1
+    field @Deprecated public static final int BEHAVIOR_SET_USER_VISIBLE_HINT = 0; // 0x0
+  }
+
+  public interface FragmentResultListener {
+    method public void onFragmentResult(String, android.os.Bundle);
+  }
+
+  public interface FragmentResultOwner {
+    method public void clearFragmentResult(String);
+    method public void clearFragmentResultListener(String);
+    method public void setFragmentResult(String, android.os.Bundle);
+    method public void setFragmentResultListener(String, androidx.lifecycle.LifecycleOwner, androidx.fragment.app.FragmentResultListener);
+  }
+
+  @Deprecated public abstract class FragmentStatePagerAdapter extends androidx.viewpager.widget.PagerAdapter {
+    ctor @Deprecated public FragmentStatePagerAdapter(androidx.fragment.app.FragmentManager);
+    ctor @Deprecated public FragmentStatePagerAdapter(androidx.fragment.app.FragmentManager, int);
+    method @Deprecated public abstract androidx.fragment.app.Fragment getItem(int);
+    method @Deprecated public boolean isViewFromObject(android.view.View, Object);
+    field @Deprecated public static final int BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT = 1; // 0x1
+    field @Deprecated public static final int BEHAVIOR_SET_USER_VISIBLE_HINT = 0; // 0x0
+  }
+
+  @Deprecated public class FragmentTabHost extends android.widget.TabHost implements android.widget.TabHost.OnTabChangeListener {
+    ctor @Deprecated public FragmentTabHost(android.content.Context);
+    ctor @Deprecated public FragmentTabHost(android.content.Context, android.util.AttributeSet?);
+    method @Deprecated public void addTab(android.widget.TabHost.TabSpec, Class<?>, android.os.Bundle?);
+    method @Deprecated public void onTabChanged(String?);
+    method @Deprecated public void setup(android.content.Context, androidx.fragment.app.FragmentManager);
+    method @Deprecated public void setup(android.content.Context, androidx.fragment.app.FragmentManager, int);
+  }
+
+  public abstract class FragmentTransaction {
+    ctor @Deprecated public FragmentTransaction();
+    method public final androidx.fragment.app.FragmentTransaction add(Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
+    method public androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.Fragment, String?);
+    method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?);
+    method public androidx.fragment.app.FragmentTransaction add(@IdRes int, androidx.fragment.app.Fragment);
+    method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
+    method public androidx.fragment.app.FragmentTransaction add(@IdRes int, androidx.fragment.app.Fragment, String?);
+    method public androidx.fragment.app.FragmentTransaction addSharedElement(android.view.View, String);
+    method public androidx.fragment.app.FragmentTransaction addToBackStack(String?);
+    method public androidx.fragment.app.FragmentTransaction attach(androidx.fragment.app.Fragment);
+    method public abstract int commit();
+    method public abstract int commitAllowingStateLoss();
+    method public abstract void commitNow();
+    method public abstract void commitNowAllowingStateLoss();
+    method public androidx.fragment.app.FragmentTransaction detach(androidx.fragment.app.Fragment);
+    method public androidx.fragment.app.FragmentTransaction disallowAddToBackStack();
+    method public androidx.fragment.app.FragmentTransaction hide(androidx.fragment.app.Fragment);
+    method public boolean isAddToBackStackAllowed();
+    method public boolean isEmpty();
+    method public androidx.fragment.app.FragmentTransaction remove(androidx.fragment.app.Fragment);
+    method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?);
+    method public androidx.fragment.app.FragmentTransaction replace(@IdRes int, androidx.fragment.app.Fragment);
+    method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
+    method public androidx.fragment.app.FragmentTransaction replace(@IdRes int, androidx.fragment.app.Fragment, String?);
+    method public androidx.fragment.app.FragmentTransaction runOnCommit(Runnable);
+    method @Deprecated public androidx.fragment.app.FragmentTransaction setAllowOptimization(boolean);
+    method @Deprecated public androidx.fragment.app.FragmentTransaction setBreadCrumbShortTitle(@StringRes int);
+    method @Deprecated public androidx.fragment.app.FragmentTransaction setBreadCrumbShortTitle(CharSequence?);
+    method @Deprecated public androidx.fragment.app.FragmentTransaction setBreadCrumbTitle(@StringRes int);
+    method @Deprecated public androidx.fragment.app.FragmentTransaction setBreadCrumbTitle(CharSequence?);
+    method public androidx.fragment.app.FragmentTransaction setCustomAnimations(@AnimRes @AnimatorRes int, @AnimRes @AnimatorRes int);
+    method public androidx.fragment.app.FragmentTransaction setCustomAnimations(@AnimRes @AnimatorRes int, @AnimRes @AnimatorRes int, @AnimRes @AnimatorRes int, @AnimRes @AnimatorRes int);
+    method public androidx.fragment.app.FragmentTransaction setMaxLifecycle(androidx.fragment.app.Fragment, androidx.lifecycle.Lifecycle.State);
+    method public androidx.fragment.app.FragmentTransaction setPrimaryNavigationFragment(androidx.fragment.app.Fragment?);
+    method public androidx.fragment.app.FragmentTransaction setReorderingAllowed(boolean);
+    method public androidx.fragment.app.FragmentTransaction setTransition(int);
+    method @Deprecated public androidx.fragment.app.FragmentTransaction setTransitionStyle(@StyleRes int);
+    method public androidx.fragment.app.FragmentTransaction show(androidx.fragment.app.Fragment);
+    field public static final int TRANSIT_ENTER_MASK = 4096; // 0x1000
+    field public static final int TRANSIT_EXIT_MASK = 8192; // 0x2000
+    field public static final int TRANSIT_FRAGMENT_CLOSE = 8194; // 0x2002
+    field public static final int TRANSIT_FRAGMENT_FADE = 4099; // 0x1003
+    field public static final int TRANSIT_FRAGMENT_MATCH_ACTIVITY_CLOSE = 8197; // 0x2005
+    field public static final int TRANSIT_FRAGMENT_MATCH_ACTIVITY_OPEN = 4100; // 0x1004
+    field public static final int TRANSIT_FRAGMENT_OPEN = 4097; // 0x1001
+    field public static final int TRANSIT_NONE = 0; // 0x0
+    field public static final int TRANSIT_UNSET = -1; // 0xffffffff
+  }
+
+  public class ListFragment extends androidx.fragment.app.Fragment {
+    ctor public ListFragment();
+    method public android.widget.ListAdapter? getListAdapter();
+    method public android.widget.ListView getListView();
+    method public long getSelectedItemId();
+    method public int getSelectedItemPosition();
+    method public void onListItemClick(android.widget.ListView, android.view.View, int, long);
+    method public final android.widget.ListAdapter requireListAdapter();
+    method public void setEmptyText(CharSequence?);
+    method public void setListAdapter(android.widget.ListAdapter?);
+    method public void setListShown(boolean);
+    method public void setListShownNoAnimation(boolean);
+    method public void setSelection(int);
+  }
+
+}
+
+package androidx.fragment.app.strictmode {
+
+  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 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 fun interface FragmentStrictMode.OnViolationListener {
+    method public void onViolation(androidx.fragment.app.strictmode.Violation violation);
+  }
+
+  public static final class FragmentStrictMode.Policy {
+    field public static final androidx.fragment.app.strictmode.FragmentStrictMode.Policy LAX;
+  }
+
+  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> 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();
+    method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder detectRetainInstanceUsage();
+    method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder detectSetUserVisibleHint();
+    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 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 {
+  }
+
+  public final class GetTargetFragmentRequestCodeUsageViolation extends androidx.fragment.app.strictmode.TargetFragmentUsageViolation {
+  }
+
+  public final class GetTargetFragmentUsageViolation extends androidx.fragment.app.strictmode.TargetFragmentUsageViolation {
+  }
+
+  public abstract class RetainInstanceUsageViolation extends androidx.fragment.app.strictmode.Violation {
+  }
+
+  public final class SetRetainInstanceUsageViolation extends androidx.fragment.app.strictmode.RetainInstanceUsageViolation {
+  }
+
+  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 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/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/fragment/fragment/api/res-1.4.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to fragment/fragment/api/res-1.4.0-beta02.txt
diff --git a/fragment/fragment/api/restricted_1.4.0-beta02.txt b/fragment/fragment/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..06de951
--- /dev/null
+++ b/fragment/fragment/api/restricted_1.4.0-beta02.txt
@@ -0,0 +1,573 @@
+// Signature format: 4.0
+package androidx.fragment.app {
+
+  public class DialogFragment extends androidx.fragment.app.Fragment implements android.content.DialogInterface.OnCancelListener android.content.DialogInterface.OnDismissListener {
+    ctor public DialogFragment();
+    ctor public DialogFragment(@LayoutRes int);
+    method public void dismiss();
+    method public void dismissAllowingStateLoss();
+    method public android.app.Dialog? getDialog();
+    method public boolean getShowsDialog();
+    method @StyleRes public int getTheme();
+    method public boolean isCancelable();
+    method public void onCancel(android.content.DialogInterface);
+    method @MainThread public android.app.Dialog onCreateDialog(android.os.Bundle?);
+    method public void onDismiss(android.content.DialogInterface);
+    method public final android.app.Dialog requireDialog();
+    method public void setCancelable(boolean);
+    method public void setShowsDialog(boolean);
+    method public void setStyle(int, @StyleRes int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setupDialog(android.app.Dialog, int);
+    method public void show(androidx.fragment.app.FragmentManager, String?);
+    method public int show(androidx.fragment.app.FragmentTransaction, String?);
+    method public void showNow(androidx.fragment.app.FragmentManager, String?);
+    field public static final int STYLE_NORMAL = 0; // 0x0
+    field public static final int STYLE_NO_FRAME = 2; // 0x2
+    field public static final int STYLE_NO_INPUT = 3; // 0x3
+    field public static final int STYLE_NO_TITLE = 1; // 0x1
+  }
+
+  public class Fragment implements androidx.activity.result.ActivityResultCaller android.content.ComponentCallbacks androidx.lifecycle.HasDefaultViewModelProviderFactory androidx.lifecycle.LifecycleOwner androidx.savedstate.SavedStateRegistryOwner android.view.View.OnCreateContextMenuListener androidx.lifecycle.ViewModelStoreOwner {
+    ctor public Fragment();
+    ctor @ContentView public Fragment(@LayoutRes int);
+    method public void dump(String, java.io.FileDescriptor?, java.io.PrintWriter, String![]?);
+    method public final boolean equals(Object?);
+    method public final androidx.fragment.app.FragmentActivity? getActivity();
+    method public boolean getAllowEnterTransitionOverlap();
+    method public boolean getAllowReturnTransitionOverlap();
+    method public final android.os.Bundle? getArguments();
+    method public final androidx.fragment.app.FragmentManager getChildFragmentManager();
+    method public android.content.Context? getContext();
+    method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
+    method public Object? getEnterTransition();
+    method public Object? getExitTransition();
+    method @Deprecated public final androidx.fragment.app.FragmentManager? getFragmentManager();
+    method public final Object? getHost();
+    method public final int getId();
+    method public final android.view.LayoutInflater getLayoutInflater();
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.view.LayoutInflater getLayoutInflater(android.os.Bundle?);
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method @Deprecated public androidx.loader.app.LoaderManager getLoaderManager();
+    method public final androidx.fragment.app.Fragment? getParentFragment();
+    method public final androidx.fragment.app.FragmentManager getParentFragmentManager();
+    method public Object? getReenterTransition();
+    method public final android.content.res.Resources getResources();
+    method @Deprecated public final boolean getRetainInstance();
+    method public Object? getReturnTransition();
+    method public final androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+    method public Object? getSharedElementEnterTransition();
+    method public Object? getSharedElementReturnTransition();
+    method public final String getString(@StringRes int);
+    method public final String getString(@StringRes int, java.lang.Object!...);
+    method public final String? getTag();
+    method @Deprecated public final androidx.fragment.app.Fragment? getTargetFragment();
+    method @Deprecated public final int getTargetRequestCode();
+    method public final CharSequence getText(@StringRes int);
+    method @Deprecated public boolean getUserVisibleHint();
+    method public android.view.View? getView();
+    method @MainThread public androidx.lifecycle.LifecycleOwner getViewLifecycleOwner();
+    method public androidx.lifecycle.LiveData<androidx.lifecycle.LifecycleOwner!> getViewLifecycleOwnerLiveData();
+    method public androidx.lifecycle.ViewModelStore getViewModelStore();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final boolean hasOptionsMenu();
+    method public final int hashCode();
+    method @Deprecated public static androidx.fragment.app.Fragment instantiate(android.content.Context, String);
+    method @Deprecated public static androidx.fragment.app.Fragment instantiate(android.content.Context, String, android.os.Bundle?);
+    method public final boolean isAdded();
+    method public final boolean isDetached();
+    method public final boolean isHidden();
+    method public final boolean isInLayout();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final boolean isMenuVisible();
+    method public final boolean isRemoving();
+    method public final boolean isResumed();
+    method public final boolean isStateSaved();
+    method public final boolean isVisible();
+    method @Deprecated @CallSuper @MainThread public void onActivityCreated(android.os.Bundle?);
+    method @Deprecated public void onActivityResult(int, int, android.content.Intent?);
+    method @CallSuper @MainThread public void onAttach(android.content.Context);
+    method @Deprecated @CallSuper @MainThread public void onAttach(android.app.Activity);
+    method @Deprecated @MainThread public void onAttachFragment(androidx.fragment.app.Fragment);
+    method @CallSuper public void onConfigurationChanged(android.content.res.Configuration);
+    method @MainThread public boolean onContextItemSelected(android.view.MenuItem);
+    method @CallSuper @MainThread public void onCreate(android.os.Bundle?);
+    method @MainThread public android.view.animation.Animation? onCreateAnimation(int, boolean, int);
+    method @MainThread public android.animation.Animator? onCreateAnimator(int, boolean, int);
+    method @MainThread public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo?);
+    method @MainThread public void onCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
+    method @MainThread public android.view.View? onCreateView(android.view.LayoutInflater, android.view.ViewGroup?, android.os.Bundle?);
+    method @CallSuper @MainThread public void onDestroy();
+    method @MainThread public void onDestroyOptionsMenu();
+    method @CallSuper @MainThread public void onDestroyView();
+    method @CallSuper @MainThread public void onDetach();
+    method public android.view.LayoutInflater onGetLayoutInflater(android.os.Bundle?);
+    method @MainThread public void onHiddenChanged(boolean);
+    method @CallSuper @UiThread public void onInflate(android.content.Context, android.util.AttributeSet, android.os.Bundle?);
+    method @Deprecated @CallSuper @UiThread public void onInflate(android.app.Activity, android.util.AttributeSet, android.os.Bundle?);
+    method @CallSuper @MainThread public void onLowMemory();
+    method public void onMultiWindowModeChanged(boolean);
+    method @MainThread public boolean onOptionsItemSelected(android.view.MenuItem);
+    method @MainThread public void onOptionsMenuClosed(android.view.Menu);
+    method @CallSuper @MainThread public void onPause();
+    method public void onPictureInPictureModeChanged(boolean);
+    method @MainThread public void onPrepareOptionsMenu(android.view.Menu);
+    method @MainThread public void onPrimaryNavigationFragmentChanged(boolean);
+    method @Deprecated public void onRequestPermissionsResult(int, String![], int[]);
+    method @CallSuper @MainThread public void onResume();
+    method @MainThread public void onSaveInstanceState(android.os.Bundle);
+    method @CallSuper @MainThread public void onStart();
+    method @CallSuper @MainThread public void onStop();
+    method @MainThread public void onViewCreated(android.view.View, android.os.Bundle?);
+    method @CallSuper @MainThread public void onViewStateRestored(android.os.Bundle?);
+    method public void postponeEnterTransition();
+    method public final void postponeEnterTransition(long, java.util.concurrent.TimeUnit);
+    method @MainThread public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+    method @MainThread public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+    method public void registerForContextMenu(android.view.View);
+    method @Deprecated public final void requestPermissions(String![], int);
+    method public final androidx.fragment.app.FragmentActivity requireActivity();
+    method public final android.os.Bundle requireArguments();
+    method public final android.content.Context requireContext();
+    method @Deprecated public final androidx.fragment.app.FragmentManager requireFragmentManager();
+    method public final Object requireHost();
+    method public final androidx.fragment.app.Fragment requireParentFragment();
+    method public final android.view.View requireView();
+    method public void setAllowEnterTransitionOverlap(boolean);
+    method public void setAllowReturnTransitionOverlap(boolean);
+    method public void setArguments(android.os.Bundle?);
+    method public void setEnterSharedElementCallback(androidx.core.app.SharedElementCallback?);
+    method public void setEnterTransition(Object?);
+    method public void setExitSharedElementCallback(androidx.core.app.SharedElementCallback?);
+    method public void setExitTransition(Object?);
+    method public void setHasOptionsMenu(boolean);
+    method public void setInitialSavedState(androidx.fragment.app.Fragment.SavedState?);
+    method public void setMenuVisibility(boolean);
+    method public void setReenterTransition(Object?);
+    method @Deprecated public void setRetainInstance(boolean);
+    method public void setReturnTransition(Object?);
+    method public void setSharedElementEnterTransition(Object?);
+    method public void setSharedElementReturnTransition(Object?);
+    method @Deprecated public void setTargetFragment(androidx.fragment.app.Fragment?, int);
+    method @Deprecated public void setUserVisibleHint(boolean);
+    method public boolean shouldShowRequestPermissionRationale(String);
+    method public void startActivity(android.content.Intent!);
+    method public void startActivity(android.content.Intent!, android.os.Bundle?);
+    method @Deprecated public void startActivityForResult(android.content.Intent!, int);
+    method @Deprecated public void startActivityForResult(android.content.Intent!, int, android.os.Bundle?);
+    method @Deprecated public void startIntentSenderForResult(android.content.IntentSender!, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+    method public void startPostponedEnterTransition();
+    method public void unregisterForContextMenu(android.view.View);
+  }
+
+  public static class Fragment.InstantiationException extends java.lang.RuntimeException {
+    ctor public Fragment.InstantiationException(String, Exception?);
+  }
+
+  public static class Fragment.SavedState implements android.os.Parcelable {
+    method public int describeContents();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.fragment.app.Fragment.SavedState!> CREATOR;
+  }
+
+  public class FragmentActivity extends androidx.activity.ComponentActivity implements androidx.core.app.ActivityCompat.OnRequestPermissionsResultCallback androidx.core.app.ActivityCompat.RequestPermissionsRequestCodeValidator {
+    ctor public FragmentActivity();
+    ctor @ContentView public FragmentActivity(@LayoutRes int);
+    method public androidx.fragment.app.FragmentManager getSupportFragmentManager();
+    method @Deprecated public androidx.loader.app.LoaderManager getSupportLoaderManager();
+    method @Deprecated @MainThread public void onAttachFragment(androidx.fragment.app.Fragment);
+    method @CallSuper public void onMultiWindowModeChanged(boolean);
+    method @CallSuper public void onPictureInPictureModeChanged(boolean);
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected boolean onPrepareOptionsPanel(android.view.View?, android.view.Menu);
+    method protected void onResumeFragments();
+    method public void onStateNotSaved();
+    method public void setEnterSharedElementCallback(androidx.core.app.SharedElementCallback?);
+    method public void setExitSharedElementCallback(androidx.core.app.SharedElementCallback?);
+    method public void startActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent!, int);
+    method public void startActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent!, int, android.os.Bundle?);
+    method @Deprecated public void startIntentSenderFromFragment(androidx.fragment.app.Fragment, android.content.IntentSender!, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+    method public void supportFinishAfterTransition();
+    method @Deprecated public void supportInvalidateOptionsMenu();
+    method public void supportPostponeEnterTransition();
+    method public void supportStartPostponedEnterTransition();
+    method @Deprecated public final void validateRequestPermissionsRequestCode(int);
+  }
+
+  public abstract class FragmentContainer {
+    ctor public FragmentContainer();
+    method @Deprecated public androidx.fragment.app.Fragment instantiate(android.content.Context, String, android.os.Bundle?);
+    method public abstract android.view.View? onFindViewById(@IdRes int);
+    method public abstract boolean onHasView();
+  }
+
+  public final class FragmentContainerView extends android.widget.FrameLayout {
+    ctor public FragmentContainerView(android.content.Context context);
+    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();
+  }
+
+  public class FragmentController {
+    method public void attachHost(androidx.fragment.app.Fragment?);
+    method public static androidx.fragment.app.FragmentController createController(androidx.fragment.app.FragmentHostCallback<?>);
+    method public void dispatchActivityCreated();
+    method public void dispatchConfigurationChanged(android.content.res.Configuration);
+    method public boolean dispatchContextItemSelected(android.view.MenuItem);
+    method public void dispatchCreate();
+    method public boolean dispatchCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
+    method public void dispatchDestroy();
+    method public void dispatchDestroyView();
+    method public void dispatchLowMemory();
+    method public void dispatchMultiWindowModeChanged(boolean);
+    method public boolean dispatchOptionsItemSelected(android.view.MenuItem);
+    method public void dispatchOptionsMenuClosed(android.view.Menu);
+    method public void dispatchPause();
+    method public void dispatchPictureInPictureModeChanged(boolean);
+    method public boolean dispatchPrepareOptionsMenu(android.view.Menu);
+    method @Deprecated public void dispatchReallyStop();
+    method public void dispatchResume();
+    method public void dispatchStart();
+    method public void dispatchStop();
+    method @Deprecated public void doLoaderDestroy();
+    method @Deprecated public void doLoaderRetain();
+    method @Deprecated public void doLoaderStart();
+    method @Deprecated public void doLoaderStop(boolean);
+    method @Deprecated public void dumpLoaders(String, java.io.FileDescriptor?, java.io.PrintWriter, String![]?);
+    method public boolean execPendingActions();
+    method public androidx.fragment.app.Fragment? findFragmentByWho(String);
+    method public java.util.List<androidx.fragment.app.Fragment!> getActiveFragments(java.util.List<androidx.fragment.app.Fragment!>!);
+    method public int getActiveFragmentsCount();
+    method public androidx.fragment.app.FragmentManager getSupportFragmentManager();
+    method @Deprecated public androidx.loader.app.LoaderManager! getSupportLoaderManager();
+    method public void noteStateNotSaved();
+    method public android.view.View? onCreateView(android.view.View?, String, android.content.Context, android.util.AttributeSet);
+    method @Deprecated public void reportLoaderStart();
+    method @Deprecated public void restoreAllState(android.os.Parcelable?, java.util.List<androidx.fragment.app.Fragment!>?);
+    method @Deprecated public void restoreAllState(android.os.Parcelable?, androidx.fragment.app.FragmentManagerNonConfig?);
+    method @Deprecated public void restoreLoaderNonConfig(androidx.collection.SimpleArrayMap<java.lang.String!,androidx.loader.app.LoaderManager!>!);
+    method @Deprecated public void restoreSaveState(android.os.Parcelable?);
+    method @Deprecated public androidx.collection.SimpleArrayMap<java.lang.String!,androidx.loader.app.LoaderManager!>? retainLoaderNonConfig();
+    method @Deprecated public androidx.fragment.app.FragmentManagerNonConfig? retainNestedNonConfig();
+    method @Deprecated public java.util.List<androidx.fragment.app.Fragment!>? retainNonConfig();
+    method @Deprecated public android.os.Parcelable? saveAllState();
+  }
+
+  public class FragmentFactory {
+    ctor public FragmentFactory();
+    method public androidx.fragment.app.Fragment instantiate(ClassLoader, String);
+    method public static Class<? extends androidx.fragment.app.Fragment> loadFragmentClass(ClassLoader, String);
+  }
+
+  public abstract class FragmentHostCallback<E> extends androidx.fragment.app.FragmentContainer {
+    ctor public FragmentHostCallback(android.content.Context, android.os.Handler, int);
+    method public void onDump(String, java.io.FileDescriptor?, java.io.PrintWriter, String![]?);
+    method public android.view.View? onFindViewById(int);
+    method public abstract E? onGetHost();
+    method public android.view.LayoutInflater onGetLayoutInflater();
+    method public int onGetWindowAnimations();
+    method public boolean onHasView();
+    method public boolean onHasWindowAnimations();
+    method @Deprecated public void onRequestPermissionsFromFragment(androidx.fragment.app.Fragment, String![], int);
+    method public boolean onShouldSaveFragmentState(androidx.fragment.app.Fragment);
+    method public boolean onShouldShowRequestPermissionRationale(String);
+    method public void onStartActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent!, int);
+    method public void onStartActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent!, int, android.os.Bundle?);
+    method @Deprecated public void onStartIntentSenderFromFragment(androidx.fragment.app.Fragment, android.content.IntentSender!, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+    method public void onSupportInvalidateOptionsMenu();
+  }
+
+  public abstract class FragmentManager implements androidx.fragment.app.FragmentResultOwner {
+    ctor public FragmentManager();
+    method public void addFragmentOnAttachListener(androidx.fragment.app.FragmentOnAttachListener);
+    method public void addOnBackStackChangedListener(androidx.fragment.app.FragmentManager.OnBackStackChangedListener);
+    method public androidx.fragment.app.FragmentTransaction beginTransaction();
+    method public void clearBackStack(String);
+    method public final void clearFragmentResult(String);
+    method public final void clearFragmentResultListener(String);
+    method public void dump(String, java.io.FileDescriptor?, java.io.PrintWriter, String![]?);
+    method @Deprecated public static void enableDebugLogging(boolean);
+    method public boolean executePendingTransactions();
+    method public static <F extends androidx.fragment.app.Fragment> F findFragment(android.view.View);
+    method public androidx.fragment.app.Fragment? findFragmentById(@IdRes int);
+    method public androidx.fragment.app.Fragment? findFragmentByTag(String?);
+    method public androidx.fragment.app.FragmentManager.BackStackEntry getBackStackEntryAt(int);
+    method public int getBackStackEntryCount();
+    method public androidx.fragment.app.Fragment? getFragment(android.os.Bundle, String);
+    method public androidx.fragment.app.FragmentFactory getFragmentFactory();
+    method public java.util.List<androidx.fragment.app.Fragment!> getFragments();
+    method public androidx.fragment.app.Fragment? getPrimaryNavigationFragment();
+    method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy? getStrictModePolicy();
+    method public boolean isDestroyed();
+    method public boolean isStateSaved();
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.fragment.app.FragmentTransaction openTransaction();
+    method public void popBackStack();
+    method public void popBackStack(String?, int);
+    method public void popBackStack(int, int);
+    method public boolean popBackStackImmediate();
+    method public boolean popBackStackImmediate(String?, int);
+    method public boolean popBackStackImmediate(int, int);
+    method public void putFragment(android.os.Bundle, String, androidx.fragment.app.Fragment);
+    method public void registerFragmentLifecycleCallbacks(androidx.fragment.app.FragmentManager.FragmentLifecycleCallbacks, boolean);
+    method public void removeFragmentOnAttachListener(androidx.fragment.app.FragmentOnAttachListener);
+    method public void removeOnBackStackChangedListener(androidx.fragment.app.FragmentManager.OnBackStackChangedListener);
+    method public void restoreBackStack(String);
+    method public void saveBackStack(String);
+    method public androidx.fragment.app.Fragment.SavedState? saveFragmentInstanceState(androidx.fragment.app.Fragment);
+    method public void setFragmentFactory(androidx.fragment.app.FragmentFactory);
+    method public final void setFragmentResult(String, android.os.Bundle);
+    method public final void setFragmentResultListener(String, androidx.lifecycle.LifecycleOwner, androidx.fragment.app.FragmentResultListener);
+    method public void setStrictModePolicy(androidx.fragment.app.strictmode.FragmentStrictMode.Policy?);
+    method public void unregisterFragmentLifecycleCallbacks(androidx.fragment.app.FragmentManager.FragmentLifecycleCallbacks);
+    field public static final int POP_BACK_STACK_INCLUSIVE = 1; // 0x1
+  }
+
+  public static interface FragmentManager.BackStackEntry {
+    method @Deprecated public CharSequence? getBreadCrumbShortTitle();
+    method @Deprecated @StringRes public int getBreadCrumbShortTitleRes();
+    method @Deprecated public CharSequence? getBreadCrumbTitle();
+    method @Deprecated @StringRes public int getBreadCrumbTitleRes();
+    method public int getId();
+    method public String? getName();
+  }
+
+  public abstract static class FragmentManager.FragmentLifecycleCallbacks {
+    ctor public FragmentManager.FragmentLifecycleCallbacks();
+    method @Deprecated public void onFragmentActivityCreated(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment, android.os.Bundle?);
+    method public void onFragmentAttached(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment, android.content.Context);
+    method public void onFragmentCreated(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment, android.os.Bundle?);
+    method public void onFragmentDestroyed(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment);
+    method public void onFragmentDetached(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment);
+    method public void onFragmentPaused(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment);
+    method public void onFragmentPreAttached(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment, android.content.Context);
+    method public void onFragmentPreCreated(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment, android.os.Bundle?);
+    method public void onFragmentResumed(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment);
+    method public void onFragmentSaveInstanceState(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment, android.os.Bundle);
+    method public void onFragmentStarted(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment);
+    method public void onFragmentStopped(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment);
+    method public void onFragmentViewCreated(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment, android.view.View, android.os.Bundle?);
+    method public void onFragmentViewDestroyed(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment);
+  }
+
+  public static interface FragmentManager.OnBackStackChangedListener {
+    method @MainThread public void onBackStackChanged();
+  }
+
+  @Deprecated public class FragmentManagerNonConfig {
+  }
+
+  public interface FragmentOnAttachListener {
+    method @MainThread public void onAttachFragment(androidx.fragment.app.FragmentManager, androidx.fragment.app.Fragment);
+  }
+
+  @Deprecated public abstract class FragmentPagerAdapter extends androidx.viewpager.widget.PagerAdapter {
+    ctor @Deprecated public FragmentPagerAdapter(androidx.fragment.app.FragmentManager);
+    ctor @Deprecated public FragmentPagerAdapter(androidx.fragment.app.FragmentManager, int);
+    method @Deprecated public abstract androidx.fragment.app.Fragment getItem(int);
+    method @Deprecated public long getItemId(int);
+    method @Deprecated public boolean isViewFromObject(android.view.View, Object);
+    field @Deprecated public static final int BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT = 1; // 0x1
+    field @Deprecated public static final int BEHAVIOR_SET_USER_VISIBLE_HINT = 0; // 0x0
+  }
+
+  public interface FragmentResultListener {
+    method public void onFragmentResult(String, android.os.Bundle);
+  }
+
+  public interface FragmentResultOwner {
+    method public void clearFragmentResult(String);
+    method public void clearFragmentResultListener(String);
+    method public void setFragmentResult(String, android.os.Bundle);
+    method public void setFragmentResultListener(String, androidx.lifecycle.LifecycleOwner, androidx.fragment.app.FragmentResultListener);
+  }
+
+  @Deprecated public abstract class FragmentStatePagerAdapter extends androidx.viewpager.widget.PagerAdapter {
+    ctor @Deprecated public FragmentStatePagerAdapter(androidx.fragment.app.FragmentManager);
+    ctor @Deprecated public FragmentStatePagerAdapter(androidx.fragment.app.FragmentManager, int);
+    method @Deprecated public abstract androidx.fragment.app.Fragment getItem(int);
+    method @Deprecated public boolean isViewFromObject(android.view.View, Object);
+    field @Deprecated public static final int BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT = 1; // 0x1
+    field @Deprecated public static final int BEHAVIOR_SET_USER_VISIBLE_HINT = 0; // 0x0
+  }
+
+  @Deprecated public class FragmentTabHost extends android.widget.TabHost implements android.widget.TabHost.OnTabChangeListener {
+    ctor @Deprecated public FragmentTabHost(android.content.Context);
+    ctor @Deprecated public FragmentTabHost(android.content.Context, android.util.AttributeSet?);
+    method @Deprecated public void addTab(android.widget.TabHost.TabSpec, Class<?>, android.os.Bundle?);
+    method @Deprecated public void onTabChanged(String?);
+    method @Deprecated public void setup(android.content.Context, androidx.fragment.app.FragmentManager);
+    method @Deprecated public void setup(android.content.Context, androidx.fragment.app.FragmentManager, int);
+  }
+
+  public abstract class FragmentTransaction {
+    ctor @Deprecated public FragmentTransaction();
+    method public final androidx.fragment.app.FragmentTransaction add(Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
+    method public androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.Fragment, String?);
+    method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?);
+    method public androidx.fragment.app.FragmentTransaction add(@IdRes int, androidx.fragment.app.Fragment);
+    method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
+    method public androidx.fragment.app.FragmentTransaction add(@IdRes int, androidx.fragment.app.Fragment, String?);
+    method public androidx.fragment.app.FragmentTransaction addSharedElement(android.view.View, String);
+    method public androidx.fragment.app.FragmentTransaction addToBackStack(String?);
+    method public androidx.fragment.app.FragmentTransaction attach(androidx.fragment.app.Fragment);
+    method public abstract int commit();
+    method public abstract int commitAllowingStateLoss();
+    method public abstract void commitNow();
+    method public abstract void commitNowAllowingStateLoss();
+    method public androidx.fragment.app.FragmentTransaction detach(androidx.fragment.app.Fragment);
+    method public androidx.fragment.app.FragmentTransaction disallowAddToBackStack();
+    method public androidx.fragment.app.FragmentTransaction hide(androidx.fragment.app.Fragment);
+    method public boolean isAddToBackStackAllowed();
+    method public boolean isEmpty();
+    method public androidx.fragment.app.FragmentTransaction remove(androidx.fragment.app.Fragment);
+    method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?);
+    method public androidx.fragment.app.FragmentTransaction replace(@IdRes int, androidx.fragment.app.Fragment);
+    method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
+    method public androidx.fragment.app.FragmentTransaction replace(@IdRes int, androidx.fragment.app.Fragment, String?);
+    method public androidx.fragment.app.FragmentTransaction runOnCommit(Runnable);
+    method @Deprecated public androidx.fragment.app.FragmentTransaction setAllowOptimization(boolean);
+    method @Deprecated public androidx.fragment.app.FragmentTransaction setBreadCrumbShortTitle(@StringRes int);
+    method @Deprecated public androidx.fragment.app.FragmentTransaction setBreadCrumbShortTitle(CharSequence?);
+    method @Deprecated public androidx.fragment.app.FragmentTransaction setBreadCrumbTitle(@StringRes int);
+    method @Deprecated public androidx.fragment.app.FragmentTransaction setBreadCrumbTitle(CharSequence?);
+    method public androidx.fragment.app.FragmentTransaction setCustomAnimations(@AnimRes @AnimatorRes int, @AnimRes @AnimatorRes int);
+    method public androidx.fragment.app.FragmentTransaction setCustomAnimations(@AnimRes @AnimatorRes int, @AnimRes @AnimatorRes int, @AnimRes @AnimatorRes int, @AnimRes @AnimatorRes int);
+    method public androidx.fragment.app.FragmentTransaction setMaxLifecycle(androidx.fragment.app.Fragment, androidx.lifecycle.Lifecycle.State);
+    method public androidx.fragment.app.FragmentTransaction setPrimaryNavigationFragment(androidx.fragment.app.Fragment?);
+    method public androidx.fragment.app.FragmentTransaction setReorderingAllowed(boolean);
+    method public androidx.fragment.app.FragmentTransaction setTransition(int);
+    method @Deprecated public androidx.fragment.app.FragmentTransaction setTransitionStyle(@StyleRes int);
+    method public androidx.fragment.app.FragmentTransaction show(androidx.fragment.app.Fragment);
+    field public static final int TRANSIT_ENTER_MASK = 4096; // 0x1000
+    field public static final int TRANSIT_EXIT_MASK = 8192; // 0x2000
+    field public static final int TRANSIT_FRAGMENT_CLOSE = 8194; // 0x2002
+    field public static final int TRANSIT_FRAGMENT_FADE = 4099; // 0x1003
+    field public static final int TRANSIT_FRAGMENT_MATCH_ACTIVITY_CLOSE = 8197; // 0x2005
+    field public static final int TRANSIT_FRAGMENT_MATCH_ACTIVITY_OPEN = 4100; // 0x1004
+    field public static final int TRANSIT_FRAGMENT_OPEN = 4097; // 0x1001
+    field public static final int TRANSIT_NONE = 0; // 0x0
+    field public static final int TRANSIT_UNSET = -1; // 0xffffffff
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class FragmentTransitionImpl {
+    ctor public FragmentTransitionImpl();
+    method public abstract void addTarget(Object!, android.view.View!);
+    method public abstract void addTargets(Object!, java.util.ArrayList<android.view.View!>!);
+    method public abstract void beginDelayedTransition(android.view.ViewGroup!, Object!);
+    method protected static void bfsAddViewChildren(java.util.List<android.view.View!>!, android.view.View!);
+    method public abstract boolean canHandle(Object!);
+    method public abstract Object! cloneTransition(Object!);
+    method protected void getBoundsOnScreen(android.view.View!, android.graphics.Rect!);
+    method protected static boolean isNullOrEmpty(java.util.List!);
+    method public abstract Object! mergeTransitionsInSequence(Object!, Object!, Object!);
+    method public abstract Object! mergeTransitionsTogether(Object!, Object!, Object!);
+    method public abstract void removeTarget(Object!, android.view.View!);
+    method public abstract void replaceTargets(Object!, java.util.ArrayList<android.view.View!>!, java.util.ArrayList<android.view.View!>!);
+    method public abstract void scheduleHideFragmentView(Object!, android.view.View!, java.util.ArrayList<android.view.View!>!);
+    method public abstract void scheduleRemoveTargets(Object!, Object!, java.util.ArrayList<android.view.View!>!, Object!, java.util.ArrayList<android.view.View!>!, Object!, java.util.ArrayList<android.view.View!>!);
+    method public abstract void setEpicenter(Object!, android.view.View!);
+    method public abstract void setEpicenter(Object!, android.graphics.Rect!);
+    method public void setListenerForTransitionEnd(androidx.fragment.app.Fragment, Object, androidx.core.os.CancellationSignal, Runnable);
+    method public abstract void setSharedElementTargets(Object!, android.view.View!, java.util.ArrayList<android.view.View!>!);
+    method public abstract void swapSharedElementTargets(Object!, java.util.ArrayList<android.view.View!>!, java.util.ArrayList<android.view.View!>!);
+    method public abstract Object! wrapTransitionInSet(Object!);
+  }
+
+  public class ListFragment extends androidx.fragment.app.Fragment {
+    ctor public ListFragment();
+    method public android.widget.ListAdapter? getListAdapter();
+    method public android.widget.ListView getListView();
+    method public long getSelectedItemId();
+    method public int getSelectedItemPosition();
+    method public void onListItemClick(android.widget.ListView, android.view.View, int, long);
+    method public final android.widget.ListAdapter requireListAdapter();
+    method public void setEmptyText(CharSequence?);
+    method public void setListAdapter(android.widget.ListAdapter?);
+    method public void setListShown(boolean);
+    method public void setListShownNoAnimation(boolean);
+    method public void setSelection(int);
+  }
+
+}
+
+package androidx.fragment.app.strictmode {
+
+  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 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 fun interface FragmentStrictMode.OnViolationListener {
+    method public void onViolation(androidx.fragment.app.strictmode.Violation violation);
+  }
+
+  public static final class FragmentStrictMode.Policy {
+    field public static final androidx.fragment.app.strictmode.FragmentStrictMode.Policy LAX;
+  }
+
+  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> 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();
+    method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder detectRetainInstanceUsage();
+    method public androidx.fragment.app.strictmode.FragmentStrictMode.Policy.Builder detectSetUserVisibleHint();
+    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 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 {
+  }
+
+  public final class GetTargetFragmentRequestCodeUsageViolation extends androidx.fragment.app.strictmode.TargetFragmentUsageViolation {
+  }
+
+  public final class GetTargetFragmentUsageViolation extends androidx.fragment.app.strictmode.TargetFragmentUsageViolation {
+  }
+
+  public abstract class RetainInstanceUsageViolation extends androidx.fragment.app.strictmode.Violation {
+  }
+
+  public final class SetRetainInstanceUsageViolation extends androidx.fragment.app.strictmode.RetainInstanceUsageViolation {
+  }
+
+  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 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/glance/glance-appwidget/api/current.txt b/glance/glance-appwidget/api/current.txt
index 093078b..6f4da1a 100644
--- a/glance/glance-appwidget/api/current.txt
+++ b/glance/glance-appwidget/api/current.txt
@@ -5,12 +5,14 @@
   }
 
   public final class BackgroundKt {
-    method public static androidx.glance.Modifier background(androidx.glance.Modifier, int day, int night);
+    method public static androidx.glance.GlanceModifier background(androidx.glance.GlanceModifier, long day, long night);
   }
 
   public final class CompositionLocalsKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<android.os.Bundle> getLocalAppWidgetOptions();
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.glance.appwidget.GlanceId> getLocalGlanceId();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.os.Bundle> LocalAppWidgetOptions;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.glance.appwidget.GlanceId> LocalGlanceId;
   }
 
   public final class CoroutineBroadcastReceiverKt {
@@ -53,10 +55,9 @@
   }
 
   public static final class SizeMode.Responsive implements androidx.glance.appwidget.SizeMode {
-    ctor public SizeMode.Responsive(java.util.Set<androidx.glance.unit.DpSize> sizes);
-    ctor public SizeMode.Responsive(androidx.glance.unit.DpSize... sizes);
-    method public java.util.Set<androidx.glance.unit.DpSize> getSizes();
-    property public final java.util.Set<androidx.glance.unit.DpSize> sizes;
+    ctor public SizeMode.Responsive(java.util.Set<androidx.compose.ui.unit.DpSize> sizes);
+    method public java.util.Set<androidx.compose.ui.unit.DpSize> getSizes();
+    property public final java.util.Set<androidx.compose.ui.unit.DpSize> sizes;
   }
 
   public static final class SizeMode.Single implements androidx.glance.appwidget.SizeMode {
@@ -71,7 +72,7 @@
 package androidx.glance.appwidget.action {
 
   public final class LaunchActivityIntentActionKt {
-    method public static androidx.glance.action.Action launchActivityAction(android.content.Intent intent);
+    method public static androidx.glance.action.Action actionLaunchActivity(android.content.Intent intent);
   }
 
 }
@@ -84,14 +85,14 @@
   }
 
   public final class CheckBoxKt {
-    method @androidx.compose.runtime.Composable public static void CheckBox(boolean checked, optional androidx.glance.Modifier modifier, optional String text, optional androidx.glance.text.TextStyle? textStyle);
+    method @androidx.compose.runtime.Composable public static void CheckBox(boolean checked, optional androidx.glance.GlanceModifier modifier, optional String text, optional androidx.glance.text.TextStyle? textStyle);
   }
 
   @androidx.glance.appwidget.layout.LazyScopeMarker public interface LazyItemScope {
   }
 
   public final class LazyListKt {
-    method @androidx.compose.runtime.Composable public static void LazyColumn(optional androidx.glance.Modifier modifier, optional int horizontalAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.appwidget.layout.LazyListScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void LazyColumn(optional androidx.glance.GlanceModifier modifier, optional int horizontalAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.appwidget.layout.LazyListScope,kotlin.Unit> content);
     method public static inline <T> void items(androidx.glance.appwidget.layout.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function1<? super T,java.lang.Long> itemId, kotlin.jvm.functions.Function2<? super androidx.glance.appwidget.layout.LazyItemScope,? super T,kotlin.Unit> itemContent);
     method public static inline <T> void items(androidx.glance.appwidget.layout.LazyListScope, T![] items, optional kotlin.jvm.functions.Function1<? super T,java.lang.Long> itemId, kotlin.jvm.functions.Function2<? super androidx.glance.appwidget.layout.LazyItemScope,? super T,kotlin.Unit> itemContent);
     method public static inline <T> void itemsIndexed(androidx.glance.appwidget.layout.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,java.lang.Long> itemId, kotlin.jvm.functions.Function3<? super androidx.glance.appwidget.layout.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
@@ -113,7 +114,7 @@
   }
 
   public final class SwitchKt {
-    method @androidx.compose.runtime.Composable public static void Switch(boolean checked, optional androidx.glance.Modifier modifier, optional String text, optional androidx.glance.text.TextStyle? textStyle);
+    method @androidx.compose.runtime.Composable public static void Switch(boolean checked, optional androidx.glance.GlanceModifier modifier, optional String text, optional androidx.glance.text.TextStyle? textStyle);
   }
 
 }
@@ -137,7 +138,7 @@
 package androidx.glance.appwidget.unit {
 
   public final class ColorProviderKt {
-    method public static androidx.glance.unit.ColorProvider ColorProvider(int day, int night);
+    method public static androidx.glance.unit.ColorProvider ColorProvider(long day, long night);
   }
 
 }
diff --git a/glance/glance-appwidget/api/public_plus_experimental_current.txt b/glance/glance-appwidget/api/public_plus_experimental_current.txt
index 093078b..6f4da1a 100644
--- a/glance/glance-appwidget/api/public_plus_experimental_current.txt
+++ b/glance/glance-appwidget/api/public_plus_experimental_current.txt
@@ -5,12 +5,14 @@
   }
 
   public final class BackgroundKt {
-    method public static androidx.glance.Modifier background(androidx.glance.Modifier, int day, int night);
+    method public static androidx.glance.GlanceModifier background(androidx.glance.GlanceModifier, long day, long night);
   }
 
   public final class CompositionLocalsKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<android.os.Bundle> getLocalAppWidgetOptions();
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.glance.appwidget.GlanceId> getLocalGlanceId();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.os.Bundle> LocalAppWidgetOptions;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.glance.appwidget.GlanceId> LocalGlanceId;
   }
 
   public final class CoroutineBroadcastReceiverKt {
@@ -53,10 +55,9 @@
   }
 
   public static final class SizeMode.Responsive implements androidx.glance.appwidget.SizeMode {
-    ctor public SizeMode.Responsive(java.util.Set<androidx.glance.unit.DpSize> sizes);
-    ctor public SizeMode.Responsive(androidx.glance.unit.DpSize... sizes);
-    method public java.util.Set<androidx.glance.unit.DpSize> getSizes();
-    property public final java.util.Set<androidx.glance.unit.DpSize> sizes;
+    ctor public SizeMode.Responsive(java.util.Set<androidx.compose.ui.unit.DpSize> sizes);
+    method public java.util.Set<androidx.compose.ui.unit.DpSize> getSizes();
+    property public final java.util.Set<androidx.compose.ui.unit.DpSize> sizes;
   }
 
   public static final class SizeMode.Single implements androidx.glance.appwidget.SizeMode {
@@ -71,7 +72,7 @@
 package androidx.glance.appwidget.action {
 
   public final class LaunchActivityIntentActionKt {
-    method public static androidx.glance.action.Action launchActivityAction(android.content.Intent intent);
+    method public static androidx.glance.action.Action actionLaunchActivity(android.content.Intent intent);
   }
 
 }
@@ -84,14 +85,14 @@
   }
 
   public final class CheckBoxKt {
-    method @androidx.compose.runtime.Composable public static void CheckBox(boolean checked, optional androidx.glance.Modifier modifier, optional String text, optional androidx.glance.text.TextStyle? textStyle);
+    method @androidx.compose.runtime.Composable public static void CheckBox(boolean checked, optional androidx.glance.GlanceModifier modifier, optional String text, optional androidx.glance.text.TextStyle? textStyle);
   }
 
   @androidx.glance.appwidget.layout.LazyScopeMarker public interface LazyItemScope {
   }
 
   public final class LazyListKt {
-    method @androidx.compose.runtime.Composable public static void LazyColumn(optional androidx.glance.Modifier modifier, optional int horizontalAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.appwidget.layout.LazyListScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void LazyColumn(optional androidx.glance.GlanceModifier modifier, optional int horizontalAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.appwidget.layout.LazyListScope,kotlin.Unit> content);
     method public static inline <T> void items(androidx.glance.appwidget.layout.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function1<? super T,java.lang.Long> itemId, kotlin.jvm.functions.Function2<? super androidx.glance.appwidget.layout.LazyItemScope,? super T,kotlin.Unit> itemContent);
     method public static inline <T> void items(androidx.glance.appwidget.layout.LazyListScope, T![] items, optional kotlin.jvm.functions.Function1<? super T,java.lang.Long> itemId, kotlin.jvm.functions.Function2<? super androidx.glance.appwidget.layout.LazyItemScope,? super T,kotlin.Unit> itemContent);
     method public static inline <T> void itemsIndexed(androidx.glance.appwidget.layout.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,java.lang.Long> itemId, kotlin.jvm.functions.Function3<? super androidx.glance.appwidget.layout.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
@@ -113,7 +114,7 @@
   }
 
   public final class SwitchKt {
-    method @androidx.compose.runtime.Composable public static void Switch(boolean checked, optional androidx.glance.Modifier modifier, optional String text, optional androidx.glance.text.TextStyle? textStyle);
+    method @androidx.compose.runtime.Composable public static void Switch(boolean checked, optional androidx.glance.GlanceModifier modifier, optional String text, optional androidx.glance.text.TextStyle? textStyle);
   }
 
 }
@@ -137,7 +138,7 @@
 package androidx.glance.appwidget.unit {
 
   public final class ColorProviderKt {
-    method public static androidx.glance.unit.ColorProvider ColorProvider(int day, int night);
+    method public static androidx.glance.unit.ColorProvider ColorProvider(long day, long night);
   }
 
 }
diff --git a/glance/glance-appwidget/api/restricted_current.txt b/glance/glance-appwidget/api/restricted_current.txt
index 093078b..6f4da1a 100644
--- a/glance/glance-appwidget/api/restricted_current.txt
+++ b/glance/glance-appwidget/api/restricted_current.txt
@@ -5,12 +5,14 @@
   }
 
   public final class BackgroundKt {
-    method public static androidx.glance.Modifier background(androidx.glance.Modifier, int day, int night);
+    method public static androidx.glance.GlanceModifier background(androidx.glance.GlanceModifier, long day, long night);
   }
 
   public final class CompositionLocalsKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<android.os.Bundle> getLocalAppWidgetOptions();
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.glance.appwidget.GlanceId> getLocalGlanceId();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.os.Bundle> LocalAppWidgetOptions;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.glance.appwidget.GlanceId> LocalGlanceId;
   }
 
   public final class CoroutineBroadcastReceiverKt {
@@ -53,10 +55,9 @@
   }
 
   public static final class SizeMode.Responsive implements androidx.glance.appwidget.SizeMode {
-    ctor public SizeMode.Responsive(java.util.Set<androidx.glance.unit.DpSize> sizes);
-    ctor public SizeMode.Responsive(androidx.glance.unit.DpSize... sizes);
-    method public java.util.Set<androidx.glance.unit.DpSize> getSizes();
-    property public final java.util.Set<androidx.glance.unit.DpSize> sizes;
+    ctor public SizeMode.Responsive(java.util.Set<androidx.compose.ui.unit.DpSize> sizes);
+    method public java.util.Set<androidx.compose.ui.unit.DpSize> getSizes();
+    property public final java.util.Set<androidx.compose.ui.unit.DpSize> sizes;
   }
 
   public static final class SizeMode.Single implements androidx.glance.appwidget.SizeMode {
@@ -71,7 +72,7 @@
 package androidx.glance.appwidget.action {
 
   public final class LaunchActivityIntentActionKt {
-    method public static androidx.glance.action.Action launchActivityAction(android.content.Intent intent);
+    method public static androidx.glance.action.Action actionLaunchActivity(android.content.Intent intent);
   }
 
 }
@@ -84,14 +85,14 @@
   }
 
   public final class CheckBoxKt {
-    method @androidx.compose.runtime.Composable public static void CheckBox(boolean checked, optional androidx.glance.Modifier modifier, optional String text, optional androidx.glance.text.TextStyle? textStyle);
+    method @androidx.compose.runtime.Composable public static void CheckBox(boolean checked, optional androidx.glance.GlanceModifier modifier, optional String text, optional androidx.glance.text.TextStyle? textStyle);
   }
 
   @androidx.glance.appwidget.layout.LazyScopeMarker public interface LazyItemScope {
   }
 
   public final class LazyListKt {
-    method @androidx.compose.runtime.Composable public static void LazyColumn(optional androidx.glance.Modifier modifier, optional int horizontalAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.appwidget.layout.LazyListScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void LazyColumn(optional androidx.glance.GlanceModifier modifier, optional int horizontalAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.appwidget.layout.LazyListScope,kotlin.Unit> content);
     method public static inline <T> void items(androidx.glance.appwidget.layout.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function1<? super T,java.lang.Long> itemId, kotlin.jvm.functions.Function2<? super androidx.glance.appwidget.layout.LazyItemScope,? super T,kotlin.Unit> itemContent);
     method public static inline <T> void items(androidx.glance.appwidget.layout.LazyListScope, T![] items, optional kotlin.jvm.functions.Function1<? super T,java.lang.Long> itemId, kotlin.jvm.functions.Function2<? super androidx.glance.appwidget.layout.LazyItemScope,? super T,kotlin.Unit> itemContent);
     method public static inline <T> void itemsIndexed(androidx.glance.appwidget.layout.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,java.lang.Long> itemId, kotlin.jvm.functions.Function3<? super androidx.glance.appwidget.layout.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
@@ -113,7 +114,7 @@
   }
 
   public final class SwitchKt {
-    method @androidx.compose.runtime.Composable public static void Switch(boolean checked, optional androidx.glance.Modifier modifier, optional String text, optional androidx.glance.text.TextStyle? textStyle);
+    method @androidx.compose.runtime.Composable public static void Switch(boolean checked, optional androidx.glance.GlanceModifier modifier, optional String text, optional androidx.glance.text.TextStyle? textStyle);
   }
 
 }
@@ -137,7 +138,7 @@
 package androidx.glance.appwidget.unit {
 
   public final class ColorProviderKt {
-    method public static androidx.glance.unit.ColorProvider ColorProvider(int day, int night);
+    method public static androidx.glance.unit.ColorProvider ColorProvider(long day, long night);
   }
 
 }
diff --git a/glance/glance-appwidget/build.gradle b/glance/glance-appwidget/build.gradle
index 80123313..1059568 100644
--- a/glance/glance-appwidget/build.gradle
+++ b/glance/glance-appwidget/build.gradle
@@ -35,7 +35,9 @@
 
     api(project(":glance:glance"))
     api("androidx.annotation:annotation:1.1.0")
-    api("androidx.compose.runtime:runtime:1.0.1")
+    api("androidx.compose.runtime:runtime:1.1.0-beta01")
+    api("androidx.compose.ui:ui-graphics:1.1.0-beta01")
+    api("androidx.compose.ui:ui-unit:1.1.0-beta01")
 
     implementation project(path: ':annotation:annotation')
     implementation project(path: ':core:core-remoteviews')
diff --git a/glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/ClearResources.kt b/glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/ClearResources.kt
index 86aa20f..4f0fb09 100644
--- a/glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/ClearResources.kt
+++ b/glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/ClearResources.kt
@@ -19,7 +19,11 @@
 import java.io.File
 
 fun cleanResources(resourcesFolder: File, generatedFiles: Set<File>) {
-    checkNotNull(resourcesFolder.listFiles())
-        .filter { it !in generatedFiles }
-        .forEach { it.delete() }
-}
\ No newline at end of file
+    checkNotNull(resourcesFolder.listFiles()).forEach {
+        if (it.isDirectory) {
+            cleanResources(it, generatedFiles)
+        } else if (it !in generatedFiles) {
+            it.delete()
+        }
+    }
+}
diff --git a/glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/GenerateRegistry.kt b/glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/GenerateRegistry.kt
index 2e01541..5d260e9 100644
--- a/glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/GenerateRegistry.kt
+++ b/glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/GenerateRegistry.kt
@@ -44,11 +44,21 @@
     val generatedLayouts = PropertySpec.builder(
         "generatedLayouts",
         LayoutsMap,
-        KModifier.INTERNAL
+        KModifier.INTERNAL,
     ).apply {
         initializer(buildInitializer(layouts))
     }.build()
     file.addProperty(generatedLayouts)
+
+    val generatedComplexLayouts = PropertySpec.builder(
+        "generatedComplexLayouts",
+        ComplexLayoutsMap,
+        KModifier.INTERNAL,
+    ).apply {
+        initializer(buildComplexInitializer())
+    }.build()
+    file.addProperty(generatedComplexLayouts)
+
     file.build().writeTo(outputSourceDir)
 }
 
@@ -69,28 +79,36 @@
     }
 }
 
+private fun buildComplexInitializer(): CodeBlock {
+    return buildCodeBlock {
+        addStatement("mapOf(")
+        withIndent {
+            forEachConfiguration { width, height ->
+                addStatement(
+                    "%T(width = %M, height = %M) to ",
+                    ComplexSelector,
+                    width.toValue(),
+                    height.toValue(),
+                )
+                withIndent {
+                    val resId = makeComplexResourceName(width, height)
+                    addStatement("%T(layoutId = R.layout.$resId),", LayoutInfo)
+                }
+            }
+        }
+        addStatement(")")
+    }
+}
+
 private fun createFileInitializer(layout: File, mainViewId: String): CodeBlock = buildCodeBlock {
     val viewType = layout.nameWithoutExtension.toLayoutType()
-    forEachConfiguration(layout) { width, height, childCount ->
+    forEachConfiguration { width, height ->
         addLayout(
-            resourceName = makeSimpleResourceName(layout, width, height, childCount),
+            resourceName = makeSimpleResourceName(layout, width, height),
             viewType = viewType,
             width = width,
             height = height,
-            canResize = false,
             mainViewId = "R.id.$mainViewId",
-            sizeViewId = null,
-            childCount = childCount
-        )
-        addLayout(
-            resourceName = makeComplexResourceName(layout, width, height, childCount),
-            viewType = viewType,
-            width = width,
-            height = height,
-            canResize = true,
-            mainViewId = "R.id.$mainViewId",
-            sizeViewId = "R.id.sizeView",
-            childCount = childCount
         )
     }
 }
@@ -100,43 +118,40 @@
     viewType: String,
     width: ValidSize,
     height: ValidSize,
-    canResize: Boolean,
     mainViewId: String,
-    sizeViewId: String?,
-    childCount: Int
 ) {
     addStatement(
-        "%T(type = %M, width = %M, height = %M, canResize = $canResize, childCount = %L) to ",
+        "%T(type = %M, width = %M, height = %M) to ",
         LayoutSelector,
         makeViewType(viewType),
         width.toValue(),
         height.toValue(),
-        childCount
     )
     withIndent {
-        addStatement("%T(", LayoutIds)
+        addStatement("%T(", LayoutInfo)
         withIndent {
             addStatement("layoutId = R.layout.$resourceName,")
             addStatement("mainViewId = $mainViewId,")
-            addStatement("sizeViewId = $sizeViewId,")
         }
         addStatement("),")
     }
 }
 
 private val LayoutSelector = ClassName("androidx.glance.appwidget", "LayoutSelector")
-private val LayoutIds = ClassName("androidx.glance.appwidget", "LayoutIds")
-private val LayoutsMap = Map::class.asTypeName().parameterizedBy(LayoutSelector, LayoutIds)
+private val ComplexSelector = ClassName("androidx.glance.appwidget", "ComplexSelector")
+private val LayoutInfo = ClassName("androidx.glance.appwidget", "LayoutInfo")
+private val LayoutsMap = Map::class.asTypeName().parameterizedBy(LayoutSelector, LayoutInfo)
 private const val LayoutSpecSize = "androidx.glance.appwidget.LayoutSelector.Size"
 private val WrapValue = MemberName("$LayoutSpecSize", "Wrap")
 private val FixedValue = MemberName("$LayoutSpecSize", "Fixed")
 private val MatchValue = MemberName("$LayoutSpecSize", "MatchParent")
 private val ExpandValue = MemberName("$LayoutSpecSize", "Expand")
+private val ComplexLayoutsMap = Map::class.asTypeName().parameterizedBy(ComplexSelector, LayoutInfo)
 
 private fun makeViewType(name: String) =
     MemberName("androidx.glance.appwidget.LayoutSelector.Type", name)
 
-private fun String.toLayoutType() =
+private fun String.toLayoutType(): String =
     snakeRegex.replace(this) {
         it.value.replace("_", "").uppercase()
     }.replaceFirstChar { it.uppercaseChar() }
@@ -150,36 +165,19 @@
     ValidSize.Match -> MatchValue
 }
 
-internal fun makeSimpleResourceName(
-    file: File,
-    width: ValidSize,
-    height: ValidSize,
-    childCount: Int
-) = makeResourceName(file, width, height, childCount, isSimple = true)
-
-internal fun makeComplexResourceName(
-    file: File,
-    width: ValidSize,
-    height: ValidSize,
-    childCount: Int
-) = makeResourceName(file, width, height, childCount, isSimple = false)
-
-private fun makeResourceName(
-    file: File,
-    width: ValidSize,
-    height: ValidSize,
-    childCount: Int,
-    isSimple: Boolean,
-): String {
-    return listOfNotNull(
+internal fun makeSimpleResourceName(file: File, width: ValidSize, height: ValidSize) =
+    listOf(
         file.nameWithoutExtension,
-        if (isSimple) "simple" else "complex",
         width.resourceName,
         height.resourceName,
-        if (childCount > 0) "${childCount}child" else null
-    )
-        .joinToString(separator = "_")
-}
+    ).joinToString(separator = "_")
+
+internal fun makeComplexResourceName(width: ValidSize, height: ValidSize) =
+    listOf(
+        "complex",
+        width.resourceName,
+        height.resourceName,
+    ).joinToString(separator = "_")
 
 fun CodeBlock.Builder.withIndent(builderAction: CodeBlock.Builder.() -> Unit): CodeBlock.Builder {
     indent()
@@ -188,24 +186,29 @@
     return this
 }
 
-/**
- * The list of layout templates corresponding to collections that should have view stub children.
- */
-private val CollectionFiles = listOf("box", "column", "row")
-
-/**
- * Returns whether the [File] is for a collection layout that should have generated view stub
- * children.
- */
-internal fun File.isCollectionLayout() = nameWithoutExtension in CollectionFiles
-
-internal fun File.allChildCounts(): List<Int> {
-    return if (isCollectionLayout()) {
-        (0..MaxChildren).toList()
-    } else {
-        listOf(0)
+private val listConfigurations =
+    ValidSize.values().flatMap { width ->
+        ValidSize.values().map { height ->
+            width to height
+        }
     }
+
+internal inline fun mapConfiguration(
+    function: (width: ValidSize, height: ValidSize) -> File
+): List<File> =
+    listConfigurations.map { (a, b) -> function(a, b) }
+
+internal inline fun forEachConfiguration(function: (width: ValidSize, height: ValidSize) -> Unit) {
+    listConfigurations.forEach { (a, b) -> function(a, b) }
 }
 
-/** The maximum number of direct children that a collection layout can have. */
-internal const val MaxChildren = 10
+internal inline fun <A, B, T> mapInCrossProduct(
+    first: Iterable<A>,
+    second: Iterable<B>,
+    consumer: (A, B) -> T
+): List<T> =
+    first.flatMap { a ->
+        second.map { b ->
+            consumer(a, b)
+        }
+    }
diff --git a/glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/LayoutGenerator.kt b/glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/LayoutGenerator.kt
index ab7c834..2b59f0f 100644
--- a/glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/LayoutGenerator.kt
+++ b/glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/LayoutGenerator.kt
@@ -75,40 +75,147 @@
      * Generate files and return a mapping from File object to a structure defining useful
      * information extracted from the input.
      */
-    fun generateAllFiles(files: List<File>, outputResourcesDir: File): Map<File, LayoutProperties> {
+    fun generateAllFiles(files: List<File>, outputResourcesDir: File): GeneratedFiles {
         val outputLayoutDir = outputResourcesDir.resolve("layout")
         outputLayoutDir.mkdirs()
-        return files.associateWith { generateForFile(it, outputLayoutDir) }
+        val generatedFiles = generateSizeLayouts(outputLayoutDir) +
+            generateComplexLayouts(outputLayoutDir)
+        return GeneratedFiles(
+            generatedLayouts = files.associateWith { generateForFile(it, outputLayoutDir) },
+            extraFiles = generatedFiles,
+        )
     }
 
+    private fun generateSizeLayouts(outputLayoutDir: File): Set<File> {
+        val stubSizes = listOf(ValidSize.Wrap, ValidSize.Match)
+        return mapInCrossProduct(stubSizes, stubSizes) { width, height ->
+            val fileName = "size_${width.resourceName}_${height.resourceName}.xml"
+            generateFile(outputLayoutDir, fileName) {
+                val root = createElement("TextView")
+                appendChild(root)
+                root.attributes.apply {
+                    setNamedItem(androidNamespace)
+                    setNamedItemNS(androidWidth(width))
+                    setNamedItemNS(androidHeight(height))
+                }
+            }
+        }.toSet()
+    }
+
+    /**
+     * Generate the various layouts needed for complex layouts.
+     *
+     * These layouts can be used with any view when it is not enough to have the naked view.
+     * Currently, it only creates layouts to allow resizing views on API 30-. In the generated
+     * layout, there is always a `ViewStub` with id `@id/glanceViewStub`, which needs to be replaced
+     * with the actual view.
+     *
+     * The skeleton is:
+     *
+     * <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+     *      android:id="@id/relativeLayout"
+     *      android:layout_height="wrap_content"
+     *      android:layout_width="wrap_content">
+     *   <FrameLayout
+     *       android:id="@id/sizeView"
+     *       android:layout_height="wrap_content"
+     *       android:layout_width="wrap_content">
+     *     <ViewStub
+     *         android:id="@id/sizeViewStub"
+     *         android:layout_height="wrap_content"
+     *         android:layout_width="wrap_content"/>
+     *   </FrameLayout>
+     *   <ViewStub android:id="@id/glanceViewStub"
+     *       android:layout_height="wrap_content"
+     *       android:layout_width="wrap_content"/>
+     * </RelativeLayout>
+     *
+     * With the `sizeView` frame layout only present if either dimension needs to be fixed.
+     */
+    private fun generateComplexLayouts(outputLayoutDir: File): Set<File> =
+        mapConfiguration { width, height ->
+            val fileName = makeComplexResourceName(width, height) + ".xml"
+            generateFile(outputLayoutDir, fileName) {
+                val root = createElement("RelativeLayout")
+                appendChild(root)
+                root.attributes.apply {
+                    setNamedItemNS(androidId("@id/relativeLayout"))
+                    setNamedItemNS(androidWidth(width))
+                    setNamedItemNS(androidHeight(height))
+                    if (width == ValidSize.Expand || height == ValidSize.Expand) {
+                        setNamedItemNS(androidWeight(1))
+                    }
+                }
+
+                if (width == ValidSize.Fixed || height == ValidSize.Fixed) {
+                    // A sizing view is only required if the width or height are fixed.
+                    val sizeView = createElement("FrameLayout")
+                    root.appendChild(sizeView)
+                    sizeView.attributes.apply {
+                        setNamedItemNS(androidId("@id/sizeView"))
+                        setNamedItemNS(androidWidth(ValidSize.Wrap))
+                        setNamedItemNS(androidHeight(ValidSize.Wrap))
+                    }
+                    val sizeViewStub = createElement("ViewStub")
+                    sizeView.appendChild(sizeViewStub)
+                    sizeViewStub.attributes.apply {
+                        setNamedItemNS(androidId("@id/sizeViewStub"))
+                        setNamedItemNS(androidWidth(ValidSize.Wrap))
+                        setNamedItemNS(androidHeight(ValidSize.Wrap))
+                    }
+                }
+
+                val glanceViewStub = createElement("ViewStub")
+                root.appendChild(glanceViewStub)
+                glanceViewStub.attributes.apply {
+                    setNamedItemNS(androidId("@id/glanceViewStub"))
+                    when (width) {
+                        ValidSize.Wrap -> setNamedItemNS(androidWidth(ValidSize.Wrap))
+                        ValidSize.Match, ValidSize.Expand -> {
+                            setNamedItemNS(androidWidth(ValidSize.Match))
+                        }
+                        ValidSize.Fixed -> {
+                            // If the view's height is fixed, its height is determined by sizeView.
+                            // Use 0dp width for efficiency.
+                            setNamedItemNS(androidWidth(ValidSize.Expand))
+                            setNamedItemNS(androidAttr("layout_alignLeft", "@id/sizeView"))
+                            setNamedItemNS(androidAttr("layout_alignRight", "@id/sizeView"))
+                        }
+                    }
+                    when (height) {
+                        ValidSize.Wrap -> setNamedItemNS(androidHeight(ValidSize.Wrap))
+                        ValidSize.Match, ValidSize.Expand -> {
+                            setNamedItemNS(androidHeight(ValidSize.Match))
+                        }
+                        ValidSize.Fixed -> {
+                            // If the view's height is fixed, its height is determined by sizeView.
+                            // Use 0dp width for efficiency.
+                            setNamedItemNS(androidHeight(ValidSize.Expand))
+                            setNamedItemNS(androidAttr("layout_alignTop", "@id/sizeView"))
+                            setNamedItemNS(androidAttr("layout_alignBottom", "@id/sizeView"))
+                        }
+                    }
+                    if (width == ValidSize.Fixed) {
+                        setNamedItemNS(androidAttr("layout_alignLeft", "@id/sizeView"))
+                        setNamedItemNS(androidAttr("layout_alignRight", "@id/sizeView"))
+                    }
+                }
+            }
+        }.toSet()
+
     private fun generateForFile(file: File, outputLayoutDir: File): LayoutProperties {
         val document = parseLayoutTemplate(file)
-        forEachConfiguration(file) { width, height, childCount ->
-            writeGeneratedLayout(
-                generateSimpleLayout(document, width, height, childCount),
-                outputLayoutDir.resolve(
-                    makeSimpleResourceName(
-                        file,
-                        width,
-                        height,
-                        childCount
-                    ) + ".xml"
-                )
-            )
-            writeGeneratedLayout(
-                generateComplexLayout(document, width, height, childCount),
-                outputLayoutDir.resolve(
-                    makeComplexResourceName(
-                        file,
-                        width,
-                        height,
-                        childCount
-                    ) + ".xml"
-
-                )
-            )
+        val generatedFiles = mapConfiguration { width, height ->
+            outputLayoutDir.resolve(
+                makeSimpleResourceName(file, width, height) + ".xml"
+            ).also {
+                writeGeneratedLayout(generateSimpleLayout(document, width, height), it)
+            }
         }
-        return LayoutProperties(mainViewId = extractMainViewId(document))
+        return LayoutProperties(
+            mainViewId = extractMainViewId(document),
+            generatedFiles = generatedFiles
+        )
     }
 
     /**
@@ -117,11 +224,10 @@
      * A simple layout only contains the view itself, set up for a given width and height.
      * On Android R-, simple layouts are non-resizable.
      */
-    fun generateSimpleLayout(
+    private fun generateSimpleLayout(
         document: Document,
         width: ValidSize,
         height: ValidSize,
-        childCount: Int
     ): Document {
         val generated = documentBuilder.newDocument()
         val root = generated.importNode(document.documentElement, true)
@@ -134,140 +240,45 @@
             setNamedItemNS(generated.androidWidth(width))
             setNamedItemNS(generated.androidHeight(height))
             if (width == ValidSize.Expand || height == ValidSize.Expand) {
-                setNamedItemNS(generated.androidWeight("1"))
+                setNamedItemNS(generated.androidWeight(1))
             }
             setNamedItemNS(generated.androidLayoutDirection("locale"))
         }
-        generated.appendViewStubs(root, childCount)
         return generated
     }
 
-    /**
-     * Generate a complex layout.
-     *
-     * A complex layout contains a RelativeLayout containing the target view and a TextView,
-     * which will be used to resize the target view.
-     *
-     * Complex layouts are always resizable.
-     *
-     * The complex layouts follow the following pattern:
-     *
-     * ```
-     * <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-     *     android:id="@id/relativeLayout"
-     *     android:layout_height="match_parent"
-     *     android:layout_width="wrap_content">
-     *
-     *   <TextView
-     *       android:id="@id/sizeView"
-     *       android:layout_height="match_parent"
-     *       android:layout_width="wrap_content"/>
-     *
-     *   <TargetView
-     *       android:id="@id/glanceView"
-     *       android:layout_height="wrap_content"
-     *       android:layout_width="wrap_content"
-     *       android:layout_alignBottom="@id/sizeView"
-     *       android:layout_alignLeft="@id/sizeView"
-     *       android:layout_alignRight="@id/sizeView"
-     *       android:layout_alignTop="@id/sizeView" />
-     * </RelativeLayout>
-     * ```
-     *
-     * The width and height of the target view are always set to `wrap_content`, so
-     * `wrap_content` on the `TextView` works properly.
-     *
-     * The width and height on the `RelativeLayout` are set to be what we want to achieve. If the
-     * desired dimension is `Expand`, a weight of 1 is specified. This implies we cannot let the
-     * developer control the proportion of the space used by a particular view, but there is no
-     * way to control this programmatically, and allowing even a few standard values would
-     * increase drastically the number of generated layouts.
-     *
-     * The width and height of the `TextView` are `match_parent` by default, unless the desired
-     * dimension is `wrap_content`, in which case it is also set to `wrap_content`.
-     */
-    fun generateComplexLayout(
-        document: Document,
-        width: ValidSize,
-        height: ValidSize,
-        childCount: Int
-    ): Document {
-        val generated = documentBuilder.newDocument()
-        val root = generated.createElement("RelativeLayout")
-        generated.appendChild(root)
-        root.attributes.apply {
-            setNamedItemNS(generated.androidId("@id/relativeLayout"))
-            setNamedItemNS(generated.androidWidth(width))
-            setNamedItemNS(generated.androidHeight(height))
-            if (width == ValidSize.Expand || height == ValidSize.Expand) {
-                setNamedItemNS(generated.androidWeight("1"))
-            }
-        }
-        val sizeView = generated.createElement("TextView")
-        root.appendChild(sizeView)
-        sizeView.attributes.apply {
-            setNamedItemNS(generated.androidId("@id/sizeView"))
-            setNamedItemNS(generated.androidWidth(width.toSizeViewDimension()))
-            setNamedItemNS(generated.androidHeight(height.toSizeViewDimension()))
-        }
-        val mainNode = generated.importNode(document.documentElement, true)
-        root.appendChild(mainNode)
-        mainNode.attributes.apply {
-            if (mainNode.androidId == null) {
-                setNamedItemNS(generated.androidId("@id/glanceView"))
-            }
-
-            if (width == ValidSize.Wrap) {
-                setNamedItemNS(generated.androidWidth(ValidSize.Wrap))
-            } else {
-                // If the view's width isn't wrap_content, its width is determined by sizeView. Use
-                // 0dp width for efficiency.
-                setNamedItemNS(generated.androidWidth(ValidSize.Expand))
-                setNamedItemNS(generated.androidAttr("layout_alignLeft", "@id/sizeView"))
-                setNamedItemNS(generated.androidAttr("layout_alignRight", "@id/sizeView"))
-            }
-
-            if (height == ValidSize.Wrap) {
-                setNamedItemNS(generated.androidHeight(ValidSize.Wrap))
-            } else {
-                // If the view's height isn't wrap_content, its height is determined by sizeView.
-                // Use 0dp height for efficiency.
-                setNamedItemNS(generated.androidHeight(ValidSize.Expand))
-                setNamedItemNS(generated.androidAttr("layout_alignTop", "@id/sizeView"))
-                setNamedItemNS(generated.androidAttr("layout_alignBottom", "@id/sizeView"))
-            }
-            setNamedItemNS(generated.androidLayoutDirection("locale"))
-        }
-        generated.appendViewStubs(mainNode, childCount)
-        return generated
+    private inline fun generateFile(
+        outputLayoutDir: File,
+        filename: String,
+        builder: Document.() -> Unit
+    ): File {
+        val document = documentBuilder.newDocument()
+        val file = outputLayoutDir.resolve(filename)
+        builder(document)
+        writeGeneratedLayout(document, file)
+        return file
     }
 }
 
-internal fun Document.appendViewStubs(node: Node, childCount: Int) {
-    repeat(childCount) { node.appendChild(createViewStub(index = it)) }
-}
-
-internal fun Document.createViewStub(index: Int): Node {
-    val stub = createElement("ViewStub")
-    stub.attributes.apply {
-        setNamedItemNS(androidId("@id/stub$index"))
-        setNamedItemNS(androidWidth(ValidSize.Wrap))
-        setNamedItemNS(androidHeight(ValidSize.Wrap))
-    }
-    return stub
-}
+internal data class GeneratedFiles(
+    val generatedLayouts: Map<File, LayoutProperties>,
+    val extraFiles: Set<File>
+)
 
 internal data class LayoutProperties(
-    val mainViewId: String
+    val mainViewId: String,
+    val generatedFiles: List<File>
 )
 
 internal enum class ValidSize(val androidValue: String, val resourceName: String) {
     Wrap("wrap_content", "wrap"),
     Fixed("wrap_content", "fixed"),
     Match("match_parent", "match"),
-    Expand("0dp", "expand")
+    Expand("0dp", "expand"),
 }
 
+internal fun getChildMergeFilenameWithoutExtension(childCount: Int) = "merge_${childCount}child"
+
 private val AndroidNS = "http://schemas.android.com/apk/res/android"
 
 internal fun Document.androidAttr(name: String, value: String) =
@@ -289,34 +300,17 @@
 internal fun Document.androidHeight(value: ValidSize) =
     androidAttr("layout_height", value.androidValue)
 
-internal fun Document.androidWeight(value: String) = androidAttr("layout_weight", value)
+internal fun Document.androidWeight(value: Int) = androidAttr("layout_weight", value.toString())
 
 internal fun Document.androidLayoutDirection(value: String) =
     androidAttr("layoutDirection", value)
 
+internal fun Document.include(layout: String) =
+    createAttribute("layout").apply {
+        textContent = layout
+    }
+
 internal val Document.androidNamespace
     get() = createAttribute("xmlns:android").apply {
         textContent = AndroidNS
     }
-
-/**
- * Returns the [ValidSize] to be used for the sizing TextView given the [ValidSize] for the main
- * view.
- */
-internal fun ValidSize.toSizeViewDimension() = when (this) {
-    ValidSize.Wrap, ValidSize.Fixed -> ValidSize.Wrap
-    ValidSize.Match, ValidSize.Expand -> ValidSize.Match
-}
-
-internal inline fun forEachConfiguration(
-    file: File,
-    function: (width: ValidSize, height: ValidSize, childCount: Int) -> Unit
-) {
-    ValidSize.values().forEach { width ->
-        ValidSize.values().forEach { height ->
-            file.allChildCounts().forEach { childCount ->
-                function(width, height, childCount)
-            }
-        }
-    }
-}
diff --git a/glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/gradle/LayoutGeneratorTask.kt b/glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/gradle/LayoutGeneratorTask.kt
index f2e73cb..5c44697 100644
--- a/glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/gradle/LayoutGeneratorTask.kt
+++ b/glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/gradle/LayoutGeneratorTask.kt
@@ -54,8 +54,16 @@
             checkNotNull(layoutDirectory.get().asFile.listFiles()).asList(),
             outputResourcesDir.get().asFile
         )
-        generateRegistry(outputModule, generatedFiles, outputSourceDir.get().asFile)
-        cleanResources(outputResourcesDir.get().asFile, generatedFiles.keys)
+        generateRegistry(
+            outputModule,
+            generatedFiles.generatedLayouts,
+            outputSourceDir.get().asFile
+        )
+        cleanResources(
+            outputResourcesDir.get().asFile,
+            generatedFiles.generatedLayouts.values.flatMap { it.generatedFiles }
+                .toSet() + generatedFiles.extraFiles
+        )
     }
 
     companion object {
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/AndroidManifest.xml b/glance/glance-appwidget/integration-tests/demos/src/main/AndroidManifest.xml
index adaaef7..6d60312 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/AndroidManifest.xml
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/AndroidManifest.xml
@@ -72,5 +72,17 @@
                 android:name="android.appwidget.provider"
                 android:resource="@xml/compound_button_app_widget_info" />
         </receiver>
+        <receiver
+            android:name="androidx.glance.appwidget.demos.UpdatingAppWidgetReceiver"
+            android:label="@string/updating_widget_name"
+            android:exported="true">
+            <intent-filter>
+                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
+                <action android:name="android.intent.action.LOCALE_CHANGED" />
+            </intent-filter>
+            <meta-data
+                android:name="android.appwidget.provider"
+                android:resource="@xml/updating_app_widget_info" />
+        </receiver>
     </application>
 </manifest>
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/CompoundButtonAppWidget.kt b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/CompoundButtonAppWidget.kt
index 51d4762..0259948 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/CompoundButtonAppWidget.kt
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/CompoundButtonAppWidget.kt
@@ -17,8 +17,10 @@
 package androidx.glance.appwidget.demos
 
 import androidx.compose.runtime.Composable
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
 import androidx.glance.LocalSize
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.appwidget.GlanceAppWidget
 import androidx.glance.appwidget.GlanceAppWidgetReceiver
 import androidx.glance.appwidget.SizeMode
@@ -33,9 +35,7 @@
 import androidx.glance.text.FontStyle
 import androidx.glance.text.FontWeight
 import androidx.glance.text.TextStyle
-import androidx.glance.unit.Color
-import androidx.glance.unit.dp
-import androidx.glance.unit.sp
+import androidx.compose.ui.graphics.Color
 
 class CompoundButtonAppWidget : GlanceAppWidget() {
 
@@ -46,7 +46,7 @@
         val size = LocalSize.current
         val toggled = size.width >= 100.dp
         Column(
-            modifier = Modifier.fillMaxSize().background(Color.LightGray).padding(8.dp),
+            modifier = GlanceModifier.fillMaxSize().background(Color.LightGray).padding(8.dp),
             verticalAlignment = Alignment.Vertical.CenterVertically,
             horizontalAlignment = Alignment.Horizontal.CenterHorizontally
         ) {
@@ -55,7 +55,7 @@
                 fontWeight = FontWeight.Bold,
                 fontStyle = FontStyle.Italic
             )
-            val fillModifier = Modifier.fillMaxWidth()
+            val fillModifier = GlanceModifier.fillMaxWidth()
 
             CheckBox(checked = toggled, text = "Checkbox 1")
             CheckBox(
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ExactAppWidget.kt b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ExactAppWidget.kt
index c323a589..ca53325 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ExactAppWidget.kt
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ExactAppWidget.kt
@@ -17,9 +17,10 @@
 package androidx.glance.appwidget.demos
 
 import androidx.compose.runtime.Composable
+import androidx.compose.ui.unit.dp
 import androidx.glance.LocalContext
 import androidx.glance.LocalSize
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.appwidget.GlanceAppWidget
 import androidx.glance.appwidget.GlanceAppWidgetReceiver
 import androidx.glance.appwidget.SizeMode
@@ -31,8 +32,7 @@
 import androidx.glance.text.FontWeight
 import androidx.glance.text.TextDecoration
 import androidx.glance.text.TextStyle
-import androidx.glance.unit.Color
-import androidx.glance.unit.dp
+import androidx.compose.ui.graphics.Color
 import java.text.DecimalFormat
 
 class ExactAppWidget : GlanceAppWidget() {
@@ -42,7 +42,7 @@
     override fun Content() {
         val context = LocalContext.current
         Column(
-            modifier = Modifier
+            modifier = GlanceModifier
                 .fillMaxSize()
                 .background(day = Color.LightGray, night = Color.DarkGray)
                 .padding(8.dp)
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ResizingAppWidget.kt b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ResizingAppWidget.kt
index a8e55e5..07bf062 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ResizingAppWidget.kt
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ResizingAppWidget.kt
@@ -17,7 +17,8 @@
 package androidx.glance.appwidget.demos
 
 import androidx.compose.runtime.Composable
-import androidx.glance.Modifier
+import androidx.compose.ui.unit.dp
+import androidx.glance.GlanceModifier
 import androidx.glance.appwidget.GlanceAppWidget
 import androidx.glance.appwidget.GlanceAppWidgetReceiver
 import androidx.glance.appwidget.SizeMode
@@ -29,12 +30,10 @@
 import androidx.glance.layout.fillMaxWidth
 import androidx.glance.layout.height
 import androidx.glance.layout.padding
-import androidx.glance.layout.width
 import androidx.glance.text.TextAlign
 import androidx.glance.text.TextDecoration
 import androidx.glance.text.TextStyle
-import androidx.glance.unit.Color
-import androidx.glance.unit.dp
+import androidx.compose.ui.graphics.Color
 
 class ResizingAppWidget : GlanceAppWidget() {
 
@@ -42,8 +41,8 @@
 
     @Composable
     override fun Content() {
-        Column(modifier = Modifier.fillMaxSize().padding(16.dp).background(Color.LightGray)) {
-            Row(modifier = Modifier.fillMaxWidth()) {
+        Column(modifier = GlanceModifier.fillMaxSize().padding(16.dp).background(Color.LightGray)) {
+            Row(modifier = GlanceModifier.fillMaxWidth()) {
                 Text("first")
                 Text(
                     "second",
@@ -51,38 +50,42 @@
                         textDecoration = TextDecoration.LineThrough,
                         textAlign = TextAlign.Center,
                     ),
-                    modifier = Modifier.defaultWeight().height(50.dp)
+                    modifier = GlanceModifier.defaultWeight().height(50.dp)
                 )
                 Text("third")
             }
-            Text("middle", modifier = Modifier.defaultWeight().width(50.dp))
-            Row(modifier = Modifier.fillMaxWidth()) {
-                Text("", modifier = Modifier.defaultWeight())
-                Text("bottom center")
-                Text("", modifier = Modifier.defaultWeight())
-            }
-            Column(modifier = Modifier.fillMaxWidth()) {
+            Text(
+                "middle",
+                modifier = GlanceModifier.defaultWeight().fillMaxWidth(),
+                style = TextStyle(textAlign = TextAlign.Center)
+            )
+            Column(modifier = GlanceModifier.fillMaxWidth().background(Color.LightGray)) {
                 Text(
                     "left",
                     style = TextStyle(textAlign = TextAlign.Left),
-                    modifier = Modifier.fillMaxWidth()
+                    modifier = GlanceModifier.fillMaxWidth()
                 )
                 Text(
                     "right",
                     style = TextStyle(textAlign = TextAlign.Right),
-                    modifier = Modifier.fillMaxWidth()
+                    modifier = GlanceModifier.fillMaxWidth()
                 )
                 Text(
                     "start",
                     style = TextStyle(textAlign = TextAlign.Start),
-                    modifier = Modifier.fillMaxWidth()
+                    modifier = GlanceModifier.fillMaxWidth()
                 )
                 Text(
                     "end",
                     style = TextStyle(textAlign = TextAlign.End),
-                    modifier = Modifier.fillMaxWidth()
+                    modifier = GlanceModifier.fillMaxWidth()
                 )
             }
+            Row(modifier = GlanceModifier.fillMaxWidth()) {
+                Text("", modifier = GlanceModifier.defaultWeight())
+                Text("bottom center")
+                Text("", modifier = GlanceModifier.defaultWeight())
+            }
         }
     }
 }
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ResponsiveAppWidget.kt b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ResponsiveAppWidget.kt
index 3cfee01..6821011 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ResponsiveAppWidget.kt
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ResponsiveAppWidget.kt
@@ -16,60 +16,138 @@
 
 package androidx.glance.appwidget.demos
 
-import android.app.Activity
+import android.content.Context
+import android.os.Handler
+import android.widget.Toast
 import androidx.compose.runtime.Composable
-import androidx.glance.LocalContext
+import androidx.compose.ui.unit.DpSize
+import androidx.compose.ui.unit.dp
+import androidx.glance.GlanceModifier
 import androidx.glance.LocalSize
-import androidx.glance.Modifier
-import androidx.glance.action.actionLaunchActivity
+import androidx.glance.action.ActionParameters
+import androidx.glance.action.ActionRunnable
+import androidx.glance.action.actionParametersOf
+import androidx.glance.action.actionUpdateContent
 import androidx.glance.appwidget.GlanceAppWidget
 import androidx.glance.appwidget.GlanceAppWidgetReceiver
 import androidx.glance.appwidget.SizeMode
+import androidx.glance.appwidget.demos.ResponsiveAppWidget.Companion.KEY_ITEM_CLICKED
 import androidx.glance.background
+import androidx.glance.layout.Alignment
+import androidx.glance.layout.Box
 import androidx.glance.layout.Button
 import androidx.glance.layout.Column
-import androidx.glance.layout.Text
+import androidx.glance.layout.Row
+import androidx.glance.layout.fillMaxSize
 import androidx.glance.layout.padding
-import androidx.glance.text.FontWeight
-import androidx.glance.text.TextDecoration
+import androidx.glance.layout.size
+import androidx.glance.text.TextAlign
 import androidx.glance.text.TextStyle
-import androidx.glance.unit.DpSize
-import androidx.glance.unit.dp
-import androidx.glance.unit.sp
+import androidx.compose.ui.graphics.Color
 
+/**
+ * Sample AppWidget that showcase the Responsive SizeMode changing its content to Row, Column or Box
+ * based on the available space. In addition to shows how alignment and default weight works
+ * on these components.
+ */
 class ResponsiveAppWidget : GlanceAppWidget() {
+
+    companion object {
+        private val SMALL_BOX = DpSize(90.dp, 90.dp)
+        private val BIG_BOX = DpSize(180.dp, 180.dp)
+        private val ROW = DpSize(180.dp, 48.dp)
+        private val COLUMN = DpSize(48.dp, 180.dp)
+
+        val KEY_ITEM_CLICKED = ActionParameters.Key<String>("name")
+
+        private val parentModifier = GlanceModifier
+            .fillMaxSize()
+            .padding(8.dp)
+            .background(R.color.default_widget_background)
+    }
+
     override val sizeMode = SizeMode.Responsive(
-        DpSize(90.dp, 90.dp),
-        DpSize(100.dp, 100.dp),
-        DpSize(250.dp, 100.dp),
-        DpSize(250.dp, 250.dp),
+        setOf(SMALL_BOX, BIG_BOX, ROW, COLUMN)
     )
 
     @Composable
     override fun Content() {
+        // Content will be called for each of the provided sizes
+        when (LocalSize.current) {
+            COLUMN -> ParentColumn()
+            ROW -> ParentRow()
+            SMALL_BOX -> ParentBox(isSmall = true)
+            BIG_BOX -> ParentBox(isSmall = false)
+            else -> throw IllegalArgumentException("Invalid size not matching the provided ones")
+        }
+    }
+
+    /**
+     * Displays a column with three items that share evenly the available space
+     */
+    @Composable
+    private fun ParentColumn() {
+        Column(parentModifier) {
+            val modifier = GlanceModifier.fillMaxSize().padding(4.dp).defaultWeight()
+            ContentItem("1", Color(0xffB2E5BF), modifier)
+            ContentItem("2", Color(0xff70D689), modifier)
+            ContentItem("3", Color(0xffB2E5BF), modifier)
+        }
+    }
+
+    /**
+     * Displays a row with three items that share evenly the available space
+     */
+    @Composable
+    private fun ParentRow() {
+        Row(parentModifier) {
+            val modifier = GlanceModifier.fillMaxSize().padding(4.dp).defaultWeight()
+            ContentItem("1", Color(0xffA2BDF2), modifier)
+            ContentItem("2", Color(0xff5087EF), modifier)
+            ContentItem("3", Color(0xffA2BDF2), modifier)
+        }
+    }
+
+    /**
+     * Displays a Box with three items on top of each other
+     */
+    @Composable
+    private fun ParentBox(isSmall: Boolean) {
         val size = LocalSize.current
-        val context = LocalContext.current
-        Column(
-            modifier = Modifier
-                .padding(8.dp)
-                .background(R.color.responsive_widget_background)
-        ) {
-            val content = if (size.width < 100.dp) {
-                "${size.width.value}dp x ${size.height.value}dp"
-            } else {
-                "Current layout: ${size.width.value}dp x ${size.height.value}dp"
+        Box(modifier = parentModifier, contentAlignment = Alignment.Center) {
+            ContentItem("1", Color(0xffF7A998), GlanceModifier.size(size.width))
+            if (!isSmall) {
+                ContentItem("2", Color(0xffFA5F3D), GlanceModifier.size(size.width / 2))
+                ContentItem("3", Color(0xffF7A998), GlanceModifier.size(size.width / 4))
             }
-            if (size.height >= 100.dp) {
-                Text(
-                    context.getString(R.string.responsive_widget_title),
-                    style = TextStyle(
-                        fontSize = 15.sp, fontWeight = FontWeight.Bold,
-                        textDecoration = TextDecoration.Underline
+        }
+    }
+
+    @Composable
+    private fun ContentItem(text: String, color: Color, modifier: GlanceModifier) {
+        Box(modifier = modifier) {
+            Button(
+                text = text,
+                modifier = GlanceModifier.fillMaxSize().padding(4.dp).background(color),
+                style = TextStyle(textAlign = TextAlign.Center),
+                onClick = actionUpdateContent<ResponsiveAction>(
+                    actionParametersOf(
+                        KEY_ITEM_CLICKED to text
                     )
                 )
-            }
-            Text(content)
-            Button("Button", onClick = actionLaunchActivity<Activity>())
+            )
+        }
+    }
+}
+
+class ResponsiveAction : ActionRunnable {
+    override suspend fun run(context: Context, parameters: ActionParameters) {
+        Handler(context.mainLooper).post {
+            Toast.makeText(
+                context,
+                "Item clicked: ${parameters[KEY_ITEM_CLICKED]}",
+                Toast.LENGTH_SHORT
+            ).show()
         }
     }
 }
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/UpdatingAppWidget.kt b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/UpdatingAppWidget.kt
new file mode 100644
index 0000000..e142331
--- /dev/null
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/UpdatingAppWidget.kt
@@ -0,0 +1,71 @@
+/*
+ * 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.appwidget.demos
+
+import android.content.Context
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.glance.GlanceModifier
+import androidx.glance.LocalContext
+import androidx.glance.action.ActionParameters
+import androidx.glance.action.ActionRunnable
+import androidx.glance.action.actionUpdateContent
+import androidx.glance.appwidget.GlanceAppWidget
+import androidx.glance.appwidget.GlanceAppWidgetReceiver
+import androidx.glance.appwidget.SizeMode
+import androidx.glance.layout.Button
+import androidx.glance.layout.Column
+import androidx.glance.layout.Text
+import androidx.glance.layout.padding
+import androidx.glance.text.FontWeight
+import androidx.glance.text.TextDecoration
+import androidx.glance.text.TextStyle
+
+class UpdatingAppWidget : GlanceAppWidget() {
+    override val sizeMode: SizeMode = SizeMode.Exact
+
+    @Composable
+    override fun Content() {
+        Column(modifier = GlanceModifier.padding(8.dp)) {
+            Text(
+                LocalContext.current.getString(widgetTitleRes),
+                style = TextStyle(
+                    fontSize = 15.sp, fontWeight = FontWeight.Bold,
+                    textDecoration = TextDecoration.Underline
+                )
+            )
+            Button("Toggle title", onClick = actionUpdateContent<UpdateTitleAction>())
+        }
+    }
+}
+
+class UpdatingAppWidgetReceiver : GlanceAppWidgetReceiver() {
+    override val glanceAppWidget: GlanceAppWidget = UpdatingAppWidget()
+}
+
+private var widgetTitleRes: Int = R.string.updating_title_a
+
+class UpdateTitleAction : ActionRunnable {
+    override suspend fun run(context: Context, parameters: ActionParameters) {
+        widgetTitleRes = if (widgetTitleRes == R.string.updating_title_a) {
+            R.string.updating_title_b
+        } else {
+            R.string.updating_title_a
+        }
+    }
+}
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/res/drawable/responsive_preview_image.png b/glance/glance-appwidget/integration-tests/demos/src/main/res/drawable/responsive_preview_image.png
index 58d7d8e..dd6c8fa 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/res/drawable/responsive_preview_image.png
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/res/drawable/responsive_preview_image.png
Binary files differ
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/res/layout/exact_preview_layout.xml b/glance/glance-appwidget/integration-tests/demos/src/main/res/layout/exact_preview_layout.xml
index 3214aab..daaca02 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/res/layout/exact_preview_layout.xml
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/res/layout/exact_preview_layout.xml
@@ -20,7 +20,7 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:padding="8dp"
-    android:background="@color/exact_widget_background"
+    android:background="@color/default_widget_background"
     android:gravity="center_vertical">
     <TextView
         android:layout_width="wrap_content"
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/res/layout/responsive_preview_layout.xml b/glance/glance-appwidget/integration-tests/demos/src/main/res/layout/updating_widget_preview.xml
similarity index 79%
rename from glance/glance-appwidget/integration-tests/demos/src/main/res/layout/responsive_preview_layout.xml
rename to glance/glance-appwidget/integration-tests/demos/src/main/res/layout/updating_widget_preview.xml
index 81a4a56..9eeb04e 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/res/layout/responsive_preview_layout.xml
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/res/layout/updating_widget_preview.xml
@@ -20,19 +20,15 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:padding="8dp"
-    android:background="@color/responsive_widget_background"
+    android:background="@color/default_widget_background"
     android:gravity="center_vertical">
     <TextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:text="@string/responsive_widget_title"
+        android:text="@string/updating_title_a"
         android:textAppearance="@style/TextAppearance.Title"/>
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="Current layout: 100dp x 100dp" />
     <Button
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:text = "Button" />
+        android:text = "Toggle title" />
 </LinearLayout>
\ No newline at end of file
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/res/values-night/colors.xml b/glance/glance-appwidget/integration-tests/demos/src/main/res/values-night/colors.xml
index ffb1de0..4b35186 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/res/values-night/colors.xml
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/res/values-night/colors.xml
@@ -15,6 +15,5 @@
   -->
 
 <resources>
-    <color name="responsive_widget_background">#FF444444</color>
-    <color name="exact_widget_background">@color/dark_gray</color>
+    <color name="default_widget_background">@color/dark_gray</color>
 </resources>
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/res/values/colors.xml b/glance/glance-appwidget/integration-tests/demos/src/main/res/values/colors.xml
index 40dea12..4de205e 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/res/values/colors.xml
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/res/values/colors.xml
@@ -17,6 +17,5 @@
 <resources>
     <color name="light_gray">#FFCCCCCC</color>
     <color name="dark_gray">#FF444444</color>
-    <color name="responsive_widget_background">#FFCCCCCC</color>
-    <color name="exact_widget_background">@color/light_gray</color>
+    <color name="default_widget_background">@color/light_gray</color>
 </resources>
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/res/values/strings.xml b/glance/glance-appwidget/integration-tests/demos/src/main/res/values/strings.xml
index 3054240..b22b08b 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/res/values/strings.xml
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/res/values/strings.xml
@@ -21,6 +21,9 @@
     <string name="responsive_widget_name">Responsive Widget</string>
     <string name="exact_widget_name">Exact Widget</string>
     <string name="responsive_widget_title"><u>Responsive layout</u></string>
+    <string name="updating_widget_name"><u>Updating widget</u></string>
+    <string name="updating_title_a"><u>Widget title A</u></string>
+    <string name="updating_title_b"><u>Widget title B</u></string>
     <string name="exact_widget_title"><u>Exact layout</u></string>
     <string name="resizing_widget_name">Resizing Widget</string>
     <string name="compound_button_widget_name">CheckBox Widget</string>
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/res/values/styles.xml b/glance/glance-appwidget/integration-tests/demos/src/main/res/values/styles.xml
index 96bcbb3..02c127a 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/res/values/styles.xml
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/res/values/styles.xml
@@ -19,4 +19,7 @@
         <item name="android:textSize">15sp</item>
         <item name="android:textStyle">bold</item>
     </style>
+    <style name="Glance.AppWidget.Column" parent="">
+        <item name="android:background">@color/default_widget_background</item>
+    </style>
 </resources>
\ No newline at end of file
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/res/xml/responsive_app_widget_info.xml b/glance/glance-appwidget/integration-tests/demos/src/main/res/xml/responsive_app_widget_info.xml
index 8f4cedb1..c75846b 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/res/xml/responsive_app_widget_info.xml
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/res/xml/responsive_app_widget_info.xml
@@ -20,7 +20,6 @@
     android:minResizeWidth="40dp"
     android:minResizeHeight="40dp"
     android:initialLayout="@layout/empty_layout"
-    android:previewLayout="@layout/responsive_preview_layout"
     android:previewImage="@drawable/responsive_preview_image"
     android:resizeMode="horizontal|vertical"
     android:widgetCategory="home_screen">
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/res/xml/updating_app_widget_info.xml b/glance/glance-appwidget/integration-tests/demos/src/main/res/xml/updating_app_widget_info.xml
new file mode 100644
index 0000000..746e172
--- /dev/null
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/res/xml/updating_app_widget_info.xml
@@ -0,0 +1,26 @@
+<?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.
+  -->
+
+<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
+    android:minWidth="100dp"
+    android:minHeight="100dp"
+    android:minResizeWidth="40dp"
+    android:minResizeHeight="40dp"
+    android:initialLayout="@layout/empty_layout"
+    android:previewLayout="@layout/updating_widget_preview"
+    android:resizeMode="horizontal|vertical"
+    android:widgetCategory="home_screen">
+</appwidget-provider>
diff --git a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AndroidTestUtils.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AndroidTestUtils.kt
index 2eee9fd..a8333b4 100644
--- a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AndroidTestUtils.kt
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AndroidTestUtils.kt
@@ -23,10 +23,9 @@
 import android.view.View
 import android.view.ViewGroup
 import androidx.core.view.children
-import androidx.glance.unit.DpSize
-import androidx.glance.unit.max
-import androidx.glance.unit.min
-import androidx.glance.unit.toSizeF
+import androidx.compose.ui.unit.DpSize
+import androidx.compose.ui.unit.max
+import androidx.compose.ui.unit.min
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.platform.app.InstrumentationRegistry
 import java.io.FileInputStream
@@ -37,6 +36,8 @@
 inline fun <reified T : View> View.findChildByType() =
     findChild({ true }, T::class.java)
 
+internal inline fun <reified T> Collection<T>.toArrayList() = ArrayList<T>(this)
+
 fun <T : View> View.findChild(predicate: (T) -> Boolean, klass: Class<T>): T? {
     try {
         val castView = klass.cast(this)!!
@@ -52,10 +53,6 @@
     return children.mapNotNull { it.findChild(predicate, klass) }.firstOrNull()
 }
 
-internal inline fun <reified T> Collection<T>.toArrayList() = ArrayList<T>(this)
-
-internal fun optionsBundleOf(vararg sizes: DpSize) = optionsBundleOf(sizes.toList())
-
 internal fun optionsBundleOf(sizes: List<DpSize>): Bundle {
     require(sizes.isNotEmpty()) { "There must be at least one size" }
     val (minSize, maxSize) = sizes.fold(sizes[0] to sizes[0]) { acc, s ->
diff --git a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostRule.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostRule.kt
index bdcb084..6bd967e 100644
--- a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostRule.kt
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostRule.kt
@@ -25,8 +25,8 @@
 import android.os.Build
 import android.view.View
 import android.view.ViewTreeObserver
-import androidx.glance.unit.DpSize
-import androidx.glance.unit.dp
+import androidx.compose.ui.unit.DpSize
+import androidx.compose.ui.unit.dp
 import androidx.test.core.app.ActivityScenario
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.espresso.Espresso.onView
@@ -153,7 +153,7 @@
                 mHostView.resetRemoteViewsLatch()
                 AppWidgetManager.getInstance(mContext).updateAppWidgetOptions(
                     mAppWidgetId,
-                    optionsBundleOf(portraitSize, landscapeSize)
+                    optionsBundleOf(listOf(portraitSize, landscapeSize))
                 )
                 mHostView.waitForRemoteViews()
             }
diff --git a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostTestActivity.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostTestActivity.kt
index 563c3da..a5b1fab 100644
--- a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostTestActivity.kt
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostTestActivity.kt
@@ -35,7 +35,8 @@
 import android.widget.RemoteViews
 import androidx.annotation.RequiresApi
 import androidx.glance.appwidget.test.R
-import androidx.glance.unit.DpSize
+import androidx.compose.ui.unit.DpSize
+import androidx.compose.ui.unit.dp
 import org.junit.Assert.fail
 import java.util.Locale
 import java.util.concurrent.CountDownLatch
@@ -77,7 +78,7 @@
         val wasBound = appWidgetManager.bindAppWidgetIdIfAllowed(
             appWidgetId,
             componentName,
-            optionsBundleOf(portraitSize, landscapeSize)
+            optionsBundleOf(listOf(portraitSize, landscapeSize))
         )
         if (!wasBound) {
             fail("Failed to bind the app widget")
@@ -135,8 +136,8 @@
 
     private var mLatch: CountDownLatch? = null
     private var mRemoteViews: RemoteViews? = null
-    private lateinit var mPortraitSize: DpSize
-    private lateinit var mLandscapeSize: DpSize
+    private var mPortraitSize: DpSize = DpSize(0.dp, 0.dp)
+    private var mLandscapeSize: DpSize = DpSize(0.dp, 0.dp)
 
     /**
      * Wait for the new remote views to be received. If a remote views was already received, return
diff --git a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/CheckBoxTest.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/CheckBoxTest.kt
index 96a90a1..9b9c42f 100644
--- a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/CheckBoxTest.kt
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/CheckBoxTest.kt
@@ -21,12 +21,12 @@
 import android.widget.ImageView
 import android.widget.TextView
 import androidx.compose.runtime.Composable
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.appwidget.layout.CheckBox
 import androidx.glance.layout.Box
 import androidx.glance.layout.padding
-import androidx.glance.unit.Dp
-import androidx.glance.unit.dp
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.filters.MediumTest
 import androidx.test.filters.SdkSuppress
@@ -129,7 +129,7 @@
     fun check_box_modifiers() {
         TestGlanceAppWidget.uiDefinition = {
             Box {
-                CheckBox(checked = true, modifier = Modifier.padding(5.dp, 6.dp, 7.dp, 8.dp))
+                CheckBox(checked = true, modifier = GlanceModifier.padding(5.dp, 6.dp, 7.dp, 8.dp))
             }
         }
 
diff --git a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/CoroutineBroadcastReceiverTest.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/CoroutineBroadcastReceiverTest.kt
index d9ca901..40ad5f8 100644
--- a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/CoroutineBroadcastReceiverTest.kt
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/CoroutineBroadcastReceiverTest.kt
@@ -22,6 +22,7 @@
 import android.content.IntentFilter
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
 import androidx.test.platform.app.InstrumentationRegistry
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
@@ -30,10 +31,14 @@
 import org.junit.Test
 import java.io.FileInputStream
 import java.nio.charset.StandardCharsets
+import java.time.Duration
+import java.time.Instant
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.TimeUnit
 import java.util.concurrent.atomic.AtomicReference
+import kotlin.math.min
 
+@SdkSuppress(minSdkVersion = 26)
 class CoroutineBroadcastReceiverTest {
 
     private val context = ApplicationProvider.getApplicationContext<Context>()
@@ -72,12 +77,24 @@
         assertWithMessage("Broadcast receiver did not execute")
             .that(broadcastReceiver.broadcastExecuted.await(5, TimeUnit.SECONDS))
             .isTrue()
+        waitFor(Duration.ofSeconds(5)) {
+            !broadcastReceiver.coroutineScopeUsed.get().isActive
+        }
         assertWithMessage("Coroutine scope did not get cancelled")
             .that(broadcastReceiver.coroutineScopeUsed.get().isActive)
             .isFalse()
         assertThat(broadcastReceiver.extraValue.get()).isEqualTo(value)
     }
 
+    private fun waitFor(timeout: Duration, condition: () -> Boolean) {
+        val start = Instant.now()
+        val sleepMs = min(500, timeout.toMillis() / 10)
+        while (Duration.between(start, Instant.now()) < timeout) {
+            if (condition()) return
+            Thread.sleep(sleepMs)
+        }
+    }
+
     private fun waitForBroadcastIdle() {
         val uiAutomation = InstrumentationRegistry.getInstrumentation().uiAutomation
         val outputFd = uiAutomation.executeShellCommand("am wait-for-broadcast-idle")
diff --git a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiverScreenshotTest.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiverScreenshotTest.kt
index fbb5e79..66f1002 100644
--- a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiverScreenshotTest.kt
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiverScreenshotTest.kt
@@ -17,7 +17,7 @@
 package androidx.glance.appwidget
 
 import androidx.compose.runtime.Composable
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.background
 import androidx.glance.appwidget.layout.CheckBox
 import androidx.glance.appwidget.layout.Switch
@@ -35,8 +35,8 @@
 import androidx.glance.text.TextAlign
 import androidx.glance.text.TextDecoration
 import androidx.glance.text.TextStyle
-import androidx.glance.unit.Color
-import androidx.glance.unit.dp
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.unit.dp
 import androidx.test.filters.MediumTest
 import androidx.test.filters.SdkSuppress
 import org.junit.Rule
@@ -194,85 +194,87 @@
 
 @Composable
 private fun TextAlignmentTest() {
-    Column(modifier = Modifier.fillMaxWidth()) {
+    Column(modifier = GlanceModifier.fillMaxWidth()) {
         Text(
             "Center",
             style = TextStyle(textAlign = TextAlign.Center),
-            modifier = Modifier.fillMaxWidth()
+            modifier = GlanceModifier.fillMaxWidth()
         )
         Text(
             "Left",
             style = TextStyle(textAlign = TextAlign.Left),
-            modifier = Modifier.fillMaxWidth()
+            modifier = GlanceModifier.fillMaxWidth()
         )
         Text(
             "Right",
             style = TextStyle(textAlign = TextAlign.Right),
-            modifier = Modifier.fillMaxWidth()
+            modifier = GlanceModifier.fillMaxWidth()
         )
         Text(
             "Start",
             style = TextStyle(textAlign = TextAlign.Start),
-            modifier = Modifier.fillMaxWidth()
+            modifier = GlanceModifier.fillMaxWidth()
         )
         Text(
             "End",
             style = TextStyle(textAlign = TextAlign.End),
-            modifier = Modifier.fillMaxWidth()
+            modifier = GlanceModifier.fillMaxWidth()
         )
     }
 }
 
 @Composable
 private fun RowTest() {
-    Row(modifier = Modifier.fillMaxWidth()) {
+    Row(modifier = GlanceModifier.fillMaxWidth()) {
         Text(
             "Start",
             style = TextStyle(textAlign = TextAlign.Start),
-            modifier = Modifier.defaultWeight()
+            modifier = GlanceModifier.defaultWeight()
         )
         Text(
             "Center",
             style = TextStyle(textAlign = TextAlign.Center),
-            modifier = Modifier.defaultWeight()
+            modifier = GlanceModifier.defaultWeight()
         )
         Text(
             "End",
             style = TextStyle(textAlign = TextAlign.End),
-            modifier = Modifier.defaultWeight()
+            modifier = GlanceModifier.defaultWeight()
         )
     }
 }
 
 @Composable
 private fun BackgroundTest() {
-    Column(modifier = Modifier.background(R.color.background_color)) {
+    Column(modifier = GlanceModifier.background(R.color.background_color)) {
         Text(
             "100x50 and cyan",
-            modifier = Modifier.width(100.dp).height(50.dp).background(Color.Cyan)
+            modifier = GlanceModifier.width(100.dp).height(50.dp).background(Color.Cyan)
         )
         Text(
             "Transparent background",
-            modifier = Modifier.height(50.dp).background(Color.Transparent)
+            modifier = GlanceModifier.height(50.dp).background(Color.Transparent)
         )
         Text(
             "wrapx30 and red (light), yellow (dark)",
-            modifier = Modifier.height(30.dp).background(day = Color.Red, night = Color.Yellow)
+            modifier = GlanceModifier
+                .height(30.dp)
+                .background(day = Color.Red, night = Color.Yellow)
         )
         Text("Below this should be 4 color boxes")
-        Row(modifier = Modifier.padding(8.dp)) {
+        Row(modifier = GlanceModifier.padding(8.dp)) {
             Box(
                 modifier =
-                Modifier
+                GlanceModifier
                     .width(32.dp)
                     .height(32.dp)
                     .background(day = Color.Black, night = Color.White)
             ) {}
             val colors = listOf(Color.Red, Color.Green, Color.Blue)
             repeat(3) {
-                Box(modifier = Modifier.width(8.dp).height(1.dp)) {}
+                Box(modifier = GlanceModifier.width(8.dp).height(1.dp)) {}
                 Box(
-                    modifier = Modifier.width(32.dp).height(32.dp).background(colors[it])
+                    modifier = GlanceModifier.width(32.dp).height(32.dp).background(colors[it])
                 ) {}
             }
         }
diff --git a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiverTest.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiverTest.kt
index e6c8408..2aaac51 100644
--- a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiverTest.kt
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiverTest.kt
@@ -30,7 +30,7 @@
 import android.widget.TextView
 import androidx.glance.LocalContext
 import androidx.glance.LocalSize
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.action.actionLaunchActivity
 import androidx.glance.layout.Box
 import androidx.glance.layout.Button
@@ -46,9 +46,9 @@
 import androidx.glance.text.FontWeight
 import androidx.glance.text.TextDecoration
 import androidx.glance.text.TextStyle
-import androidx.glance.unit.Dp
-import androidx.glance.unit.DpSize
-import androidx.glance.unit.dp
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.DpSize
+import androidx.compose.ui.unit.dp
 import androidx.test.filters.MediumTest
 import androidx.test.filters.SdkSuppress
 import com.google.common.truth.Truth.assertThat
@@ -131,7 +131,7 @@
     @Test
     fun createResponsiveAppWidget() {
         TestGlanceAppWidget.sizeMode =
-            SizeMode.Responsive(DpSize(100.dp, 150.dp), DpSize(250.dp, 150.dp))
+            SizeMode.Responsive(setOf(DpSize(100.dp, 150.dp), DpSize(250.dp, 150.dp)))
 
         TestGlanceAppWidget.uiDefinition = {
             val size = LocalSize.current
@@ -176,7 +176,7 @@
     @Test
     fun createTextWithFillMaxDimensions() {
         TestGlanceAppWidget.uiDefinition = {
-            Text("expanded text", modifier = Modifier.fillMaxWidth().fillMaxHeight())
+            Text("expanded text", modifier = GlanceModifier.fillMaxWidth().fillMaxHeight())
         }
 
         mHostRule.startHost()
@@ -191,7 +191,7 @@
     @Test
     fun createTextViewWithExactDimensions() {
         TestGlanceAppWidget.uiDefinition = {
-            Text("expanded text", modifier = Modifier.width(150.dp).height(100.dp))
+            Text("expanded text", modifier = GlanceModifier.width(150.dp).height(100.dp))
         }
 
         mHostRule.startHost()
@@ -206,7 +206,7 @@
     @Test
     fun createTextViewWithMixedDimensions() {
         TestGlanceAppWidget.uiDefinition = {
-            Text("expanded text", modifier = Modifier.fillMaxWidth().height(110.dp))
+            Text("expanded text", modifier = GlanceModifier.fillMaxWidth().height(110.dp))
         }
 
         mHostRule.startHost()
@@ -221,7 +221,7 @@
     @Test
     fun createBoxWithExactDimensions() {
         TestGlanceAppWidget.uiDefinition = {
-            Box(modifier = Modifier.width(150.dp).height(180.dp)) {
+            Box(modifier = GlanceModifier.width(150.dp).height(180.dp)) {
                 Text("Inside")
             }
         }
@@ -232,7 +232,7 @@
             assertThat(hostView.childCount).isEqualTo(1)
             val child = assertNotNull(
                 hostView.findChild<RelativeLayout> {
-                    it.id == R.id.glanceView
+                    it.id != R.id.relativeLayout
                 }
             )
             assertViewSize(child, DpSize(150.dp, 180.dp))
@@ -242,7 +242,7 @@
     @Test
     fun createBoxWithMixedDimensions() {
         TestGlanceAppWidget.uiDefinition = {
-            Box(modifier = Modifier.width(150.dp).wrapContentHeight()) {
+            Box(modifier = GlanceModifier.width(150.dp).wrapContentHeight()) {
                 Text("Inside")
             }
         }
@@ -261,7 +261,7 @@
     @Test
     fun createColumnWithMixedDimensions() {
         TestGlanceAppWidget.uiDefinition = {
-            Column(modifier = Modifier.width(150.dp).fillMaxHeight()) {
+            Column(modifier = GlanceModifier.width(150.dp).fillMaxHeight()) {
                 Text("Inside 1")
                 Text("Inside 2")
                 Text("Inside 3")
@@ -284,7 +284,7 @@
     @Test
     fun createRowWithMixedDimensions() {
         TestGlanceAppWidget.uiDefinition = {
-            Row(modifier = Modifier.fillMaxWidth().height(200.dp)) {
+            Row(modifier = GlanceModifier.fillMaxWidth().height(200.dp)) {
                 Text("Inside 1")
                 Text("Inside 2")
                 Text("Inside 3")
@@ -307,9 +307,9 @@
     @Test
     fun createRowWithTwoTexts() {
         TestGlanceAppWidget.uiDefinition = {
-            Row(modifier = Modifier.fillMaxWidth().fillMaxHeight()) {
-                Text("Inside 1", modifier = Modifier.defaultWeight().height(100.dp))
-                Text("Inside 2", modifier = Modifier.defaultWeight().fillMaxHeight())
+            Row(modifier = GlanceModifier.fillMaxWidth().fillMaxHeight()) {
+                Text("Inside 1", modifier = GlanceModifier.defaultWeight().height(100.dp))
+                Text("Inside 2", modifier = GlanceModifier.defaultWeight().fillMaxHeight())
             }
         }
 
@@ -333,9 +333,9 @@
     @Test
     fun createColumnWithTwoTexts() {
         TestGlanceAppWidget.uiDefinition = {
-            Column(modifier = Modifier.fillMaxWidth().fillMaxHeight()) {
-                Text("Inside 1", modifier = Modifier.fillMaxWidth().defaultWeight())
-                Text("Inside 2", modifier = Modifier.width(100.dp).defaultWeight())
+            Column(modifier = GlanceModifier.fillMaxWidth().fillMaxHeight()) {
+                Text("Inside 1", modifier = GlanceModifier.fillMaxWidth().defaultWeight())
+                Text("Inside 2", modifier = GlanceModifier.width(100.dp).defaultWeight())
             }
         }
 
@@ -359,9 +359,9 @@
     @Test
     fun createColumnWithTwoTexts2() {
         TestGlanceAppWidget.uiDefinition = {
-            Column(modifier = Modifier.fillMaxWidth().fillMaxHeight()) {
-                Text("Inside 1", modifier = Modifier.fillMaxWidth().defaultWeight())
-                Text("Inside 2", modifier = Modifier.width(100.dp).fillMaxHeight())
+            Column(modifier = GlanceModifier.fillMaxWidth().fillMaxHeight()) {
+                Text("Inside 1", modifier = GlanceModifier.fillMaxWidth().defaultWeight())
+                Text("Inside 2", modifier = GlanceModifier.width(100.dp).fillMaxHeight())
             }
         }
 
diff --git a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/LazyColumnTest.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/LazyColumnTest.kt
index 6aae34f..6354086 100644
--- a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/LazyColumnTest.kt
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/LazyColumnTest.kt
@@ -22,14 +22,14 @@
 import android.widget.ListView
 import android.widget.RelativeLayout
 import android.widget.TextView
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.appwidget.layout.LazyColumn
 import androidx.glance.appwidget.layout.ReservedItemIdRangeEnd
 import androidx.glance.layout.Alignment
 import androidx.glance.layout.Text
 import androidx.glance.layout.padding
-import androidx.glance.unit.Dp
-import androidx.glance.unit.dp
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
 import androidx.test.filters.MediumTest
 import androidx.test.filters.SdkSuppress
 import com.google.common.truth.Truth.assertThat
@@ -46,7 +46,7 @@
     @Test
     fun modifier_modifiesColumn() {
         TestGlanceAppWidget.uiDefinition = {
-            LazyColumn(modifier = Modifier.padding(5.dp, 6.dp, 7.dp, 8.dp)) {
+            LazyColumn(modifier = GlanceModifier.padding(5.dp, 6.dp, 7.dp, 8.dp)) {
                 item { Text("1") }
                 item { Text("2") }
             }
diff --git a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/ResourceResolutionTest.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/ResourceResolutionTest.kt
index d0385bb..1f841d3 100644
--- a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/ResourceResolutionTest.kt
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/ResourceResolutionTest.kt
@@ -17,14 +17,14 @@
 package androidx.glance.appwidget
 
 import android.widget.TextView
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.appwidget.test.R
 import androidx.glance.layout.Column
 import androidx.glance.layout.Text
 import androidx.glance.layout.fillMaxSize
 import androidx.glance.layout.padding
 import androidx.glance.layout.width
-import androidx.glance.unit.dp
+import androidx.compose.ui.unit.dp
 import androidx.test.filters.MediumTest
 import androidx.test.filters.SdkSuppress
 import com.google.common.truth.Truth.assertThat
@@ -42,10 +42,10 @@
     @Test
     fun resolveFromResources() {
         TestGlanceAppWidget.uiDefinition = {
-            Column(modifier = Modifier.fillMaxSize()) {
+            Column(modifier = GlanceModifier.fillMaxSize()) {
                 Text(
                     "dimension",
-                    modifier = Modifier.width(R.dimen.testDimension)
+                    modifier = GlanceModifier.width(R.dimen.testDimension)
                 )
             }
         }
@@ -66,10 +66,10 @@
     @Test
     fun resolvePadding() {
         TestGlanceAppWidget.uiDefinition = {
-            Column(modifier = Modifier.fillMaxSize()) {
+            Column(modifier = GlanceModifier.fillMaxSize()) {
                 Text(
                     "dimension",
-                    modifier = Modifier.fillMaxSize()
+                    modifier = GlanceModifier.fillMaxSize()
                         .padding(horizontal = 15.dp)
                         .padding(vertical = R.dimen.testDimension)
                 )
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/ActionRunnableBroadcastReceiver.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/ActionRunnableBroadcastReceiver.kt
index 8c0e3ab..ee09691 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/ActionRunnableBroadcastReceiver.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/ActionRunnableBroadcastReceiver.kt
@@ -21,8 +21,12 @@
 import android.content.Context
 import android.content.Intent
 import android.net.Uri
+import androidx.core.os.bundleOf
+import androidx.glance.action.ActionParameters
 import androidx.glance.action.ActionRunnable
 import androidx.glance.action.UpdateContentAction
+import androidx.glance.action.mutableActionParametersOf
+import java.util.UUID
 
 /**
  * Responds to broadcasts from [UpdateContentAction] clicks by executing the associated action.
@@ -35,33 +39,88 @@
         }
 
         goAsync {
-            val className = requireNotNull(intent.getStringExtra(ExtraClassName)) {
-                "The custom work intent must contain a work class name string using extra: " +
-                    ExtraClassName
+            val extras = requireNotNull(intent.extras) {
+                "The intent must have action parameters extras."
             }
-            UpdateContentAction.run(context, className)
+            val paramsBundle = requireNotNull(extras.getBundle(ExtraParameters)) {
+                "The intent must contain a parameters bundle using extra: $ExtraParameters"
+            }
+
+            val parameters = mutableActionParametersOf().apply {
+                paramsBundle.keySet().forEach { key ->
+                    set(ActionParameters.Key(key), paramsBundle[key])
+                }
+            }
+
+            runActionWork(context, intent, parameters)
+            updateWidget(context, intent)
         }
     }
 
     companion object {
-        private const val ExtraClassName = "CustomWorkBroadcastReceiver:className"
+        private const val ExtraRunnableClassName = "ActionRunnableBroadcastReceiver:runnableClass"
+        private const val ExtraWidgetClassName = "ActionRunnableBroadcastReceiver:appWidgetClass"
+        private const val AppWidgetId = "ActionRunnableBroadcastReceiver:appWidgetId"
+        private const val ExtraParameters = "ActionRunnableBroadcastReceiver:parameters"
+        private const val ExtraParametersUUID = "ActionRunnableBroadcastReceiver:uuid"
 
         fun createPendingIntent(
             context: Context,
-            runnableClass: Class<out ActionRunnable>
-        ): PendingIntent {
-            return PendingIntent.getBroadcast(
+            runnableClass: Class<out ActionRunnable>,
+            appWidgetClass: Class<out GlanceAppWidget>,
+            appWidgetId: Int,
+            parameters: ActionParameters
+        ): PendingIntent =
+            PendingIntent.getBroadcast(
                 context,
                 0,
                 Intent(context, ActionRunnableBroadcastReceiver::class.java)
                     .setPackage(context.packageName)
-                    .putExtra(ExtraClassName, runnableClass.canonicalName)
-                    .setData(Uri.Builder()
-                        .scheme("remoteAction")
-                        .appendQueryParameter("className", runnableClass.canonicalName)
-                        .build()),
+                    .putExtra(ExtraRunnableClassName, runnableClass.canonicalName)
+                    .putExtra(ExtraWidgetClassName, appWidgetClass.canonicalName)
+                    .putExtra(ExtraParametersUUID, UUID.randomUUID().leastSignificantBits)
+                    .putExtra(AppWidgetId, appWidgetId)
+                    .putParameterExtras(parameters).apply {
+                        data = Uri.parse(toUri(0))
+                            .buildUpon()
+                            .scheme("remoteAction")
+                            .build()
+                    },
                 PendingIntent.FLAG_MUTABLE
             )
+
+        private fun Intent.putParameterExtras(parameters: ActionParameters): Intent {
+            val parametersPairs = parameters.asMap().map { (key, value) ->
+                key.name to value
+            }.toTypedArray()
+            putExtra(ExtraParameters, bundleOf(*parametersPairs))
+            return this
         }
     }
+
+    private suspend fun runActionWork(
+        context: Context,
+        intent: Intent,
+        parameters: ActionParameters
+    ) {
+        val className = requireNotNull(intent.getStringExtra(ExtraRunnableClassName)) {
+            "The intent must contain a work class name string using extra: " +
+                "$ExtraRunnableClassName"
+        }
+        UpdateContentAction.run(context, className, parameters)
+    }
+
+    private suspend fun updateWidget(context: Context, intent: Intent) {
+        val widgetClassName = requireNotNull(intent.getStringExtra(ExtraWidgetClassName)) {
+            "The intent must contain a widget class name string using extra: " +
+                "$ExtraWidgetClassName"
+        }
+        require(intent.hasExtra(AppWidgetId)) {
+            "To update the widget, the intent must contain the AppWidgetId integer using extra: " +
+                "$AppWidgetId"
+        }
+
+        (Class.forName(widgetClassName).newInstance() as GlanceAppWidget)
+            .update(context, AppWidgetId(intent.getIntExtra(AppWidgetId, -1)))
+    }
 }
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 ff6afb9..765110b 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
@@ -21,8 +21,10 @@
 import android.content.Intent
 import android.os.Build
 import android.util.Log
-import android.util.TypedValue
-import android.view.ViewGroup
+import android.util.TypedValue.COMPLEX_UNIT_DIP
+import android.util.TypedValue.COMPLEX_UNIT_PX
+import android.view.ViewGroup.LayoutParams.MATCH_PARENT
+import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
 import android.widget.RemoteViews
 import androidx.annotation.ColorInt
 import androidx.annotation.DoNotInline
@@ -33,7 +35,7 @@
 import androidx.core.widget.setViewBackgroundColor
 import androidx.core.widget.setViewBackgroundColorResource
 import androidx.glance.BackgroundModifier
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.action.Action
 import androidx.glance.action.ActionModifier
 import androidx.glance.action.LaunchActivityAction
@@ -47,34 +49,26 @@
 import androidx.glance.layout.PaddingModifier
 import androidx.glance.layout.WidthModifier
 import androidx.glance.layout.collectPaddingInDp
-import androidx.glance.unit.Color
+import androidx.compose.ui.graphics.Color
 import androidx.glance.unit.FixedColorProvider
 import androidx.glance.unit.ResourceColorProvider
-import androidx.glance.unit.dp
 import kotlin.math.roundToInt
 
 internal fun applyModifiers(
     translationContext: TranslationContext,
     rv: RemoteViews,
-    modifiers: Modifier,
-    layoutDef: LayoutIds
+    modifiers: GlanceModifier,
+    layoutDef: RemoteViewsInfo
 ) {
     val context = translationContext.context
+    var widthModifier: WidthModifier? = null
+    var heightModifier: HeightModifier? = null
     modifiers.foldIn(Unit) { _, modifier ->
         when (modifier) {
-            is ActionModifier -> applyAction(rv, modifier.action, context, layoutDef.mainViewId)
-            is WidthModifier -> applyWidthModifier(
-                rv,
-                modifier,
-                context,
-                layoutDef
-            )
-            is HeightModifier -> applyHeightModifier(
-                rv,
-                modifier,
-                context,
-                layoutDef
-            )
+            is ActionModifier ->
+                applyAction(rv, modifier.action, translationContext, layoutDef.mainViewId)
+            is WidthModifier -> widthModifier = modifier
+            is HeightModifier -> heightModifier = modifier
             is BackgroundModifier -> applyBackgroundModifier(
                 rv,
                 modifier,
@@ -88,6 +82,7 @@
             }
         }
     }
+    applySizeModifiers(rv, widthModifier, heightModifier, translationContext, layoutDef)
     modifiers.collectPaddingInDp(context.resources)
         ?.toAbsolute(translationContext.isRtl)
         ?.let {
@@ -105,21 +100,22 @@
 private fun applyAction(
     rv: RemoteViews,
     action: Action,
-    context: Context,
+    translationContext: TranslationContext,
     @IdRes viewId: Int
 ) {
     when (action) {
         is LaunchActivityAction -> {
             val intent = when (action) {
                 is LaunchActivityComponentAction -> Intent().setComponent(action.componentName)
-                is LaunchActivityClassAction -> Intent(context, action.activityClass)
+                is LaunchActivityClassAction ->
+                    Intent(translationContext.context, action.activityClass)
                 is LaunchActivityIntentAction -> action.intent
                 else -> error("Action type not defined in app widget package: $action")
             }
 
             val pendingIntent: PendingIntent =
                 PendingIntent.getActivity(
-                    context,
+                    translationContext.context,
                     0,
                     intent,
                     PendingIntent.FLAG_MUTABLE
@@ -128,77 +124,117 @@
         }
         is UpdateContentAction -> {
             val pendingIntent =
-                ActionRunnableBroadcastReceiver.createPendingIntent(context, action.runnableClass)
+                ActionRunnableBroadcastReceiver.createPendingIntent(
+                    translationContext.context,
+                    action.runnableClass,
+                    translationContext.appWidgetClass,
+                    translationContext.appWidgetId,
+                    action.parameters
+                )
             rv.setOnClickPendingIntent(viewId, pendingIntent)
         }
         else -> throw IllegalArgumentException("Unrecognized action type.")
     }
 }
 
-private fun applyWidthModifier(
+private fun applySizeModifiers(
+    rv: RemoteViews,
+    widthModifier: WidthModifier?,
+    heightModifier: HeightModifier?,
+    translationContext: TranslationContext,
+    layoutDef: RemoteViewsInfo
+) {
+    val context = translationContext.context
+    if (layoutDef.isSimple) {
+        widthModifier?.let { applySimpleWidthModifier(rv, it, context, layoutDef) }
+        heightModifier?.let { applySimpleHeightModifier(rv, it, context, layoutDef) }
+        return
+    }
+
+    val width = widthModifier?.width
+    val height = heightModifier?.height
+
+    if (!(width.isFixed || height.isFixed)) {
+        // The sizing view is only present and needed for setting fixed dimensions.
+        return
+    }
+
+    val useMatchSizeWidth = width is Dimension.Fill || width is Dimension.Expand
+    val useMatchSizeHeight = height is Dimension.Fill || height is Dimension.Expand
+    val sizeViewLayout = when {
+        useMatchSizeWidth && useMatchSizeHeight -> R.layout.size_match_match
+        useMatchSizeWidth -> R.layout.size_match_wrap
+        useMatchSizeHeight -> R.layout.size_wrap_match
+        else -> R.layout.size_wrap_wrap
+    }
+
+    val sizeTargetViewId = rv.inflateViewStub(translationContext, R.id.sizeViewStub, sizeViewLayout)
+
+    fun Dimension.Dp.toPixels() = dp.toPixels(context)
+    fun Dimension.Resource.toPixels() = context.resources.getDimensionPixelSize(res)
+    when (width) {
+        is Dimension.Dp -> rv.setTextViewWidth(sizeTargetViewId, width.toPixels())
+        is Dimension.Resource -> rv.setTextViewWidth(sizeTargetViewId, width.toPixels())
+        Dimension.Expand, Dimension.Fill, Dimension.Wrap, null -> {}
+    }.let {}
+    when (height) {
+        is Dimension.Dp -> rv.setTextViewHeight(sizeTargetViewId, height.toPixels())
+        is Dimension.Resource -> rv.setTextViewHeight(sizeTargetViewId, height.toPixels())
+        Dimension.Expand, Dimension.Fill, Dimension.Wrap, null -> {}
+    }.let {}
+}
+
+private fun applySimpleWidthModifier(
     rv: RemoteViews,
     modifier: WidthModifier,
     context: Context,
-    layoutDef: LayoutIds?,
+    layoutDef: RemoteViewsInfo,
 ) {
-    checkNotNull(layoutDef) { "No layout spec, cannot change size" }
-    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
-        if (modifier.width is Dimension.Expand) {
-            ApplyModifiersApi31Impl.setViewWidth(rv, layoutDef.mainViewId, Dimension.Dp(0.dp))
-        } else {
-            ApplyModifiersApi31Impl.setViewWidth(rv, layoutDef.mainViewId, modifier.width)
-        }
+    // These layouts already have the appropriate attribute in the xml, so no action is needed.
+    val width = modifier.width
+    if (
+        width.resolveDimension(context) in listOf(Dimension.Wrap, Dimension.Fill, Dimension.Expand)
+    ) {
         return
     }
-    val widthPx = modifier.width.toPixels(context)
-    // Sizes in pixel must be >= 0 to be valid
-    if (widthPx < 0) return
-    checkNotNull(layoutDef.sizeViewId) { "The layout specified does not allow specifying the size" }
-    rv.setTextViewWidth(layoutDef.sizeViewId, widthPx)
-}
 
-/**
- * Returns the dimension, in pixels, from the given context or a negative value if the Dimension is
- * not in Pixels (i.e. Wrap, Fill or Expand).
- *
- * @return the size in Pixel, or a negative number if the dimension cannot be computed (e.g.
- * set by choosing the correct layout).
- */
-private fun Dimension.toPixels(context: Context): Int {
-    val resources = context.resources
-    return when (this) {
-        is Dimension.Dp -> dp.toPixels(resources.displayMetrics)
-        is Dimension.Resource -> resources.getDimensionPixelSize(res)
-        else -> -1
+    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
+        throw IllegalArgumentException(
+            "Using a width of $width requires a complex layout before API 31, but used $layoutDef"
+        )
     }
+
+    ApplyModifiersApi31Impl.setViewWidth(rv, layoutDef.mainViewId, width)
 }
 
-private fun applyHeightModifier(
+private fun applySimpleHeightModifier(
     rv: RemoteViews,
     modifier: HeightModifier,
     context: Context,
-    layoutDef: LayoutIds?,
+    layoutDef: RemoteViewsInfo,
 ) {
-    checkNotNull(layoutDef) { "No layout spec, cannot change size" }
-    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
-        if (modifier.height is Dimension.Expand) {
-            ApplyModifiersApi31Impl.setViewHeight(rv, layoutDef.mainViewId, Dimension.Dp(0.dp))
-        } else {
-            ApplyModifiersApi31Impl.setViewHeight(rv, layoutDef.mainViewId, modifier.height)
-        }
+    // These layouts already have the appropriate attribute in the xml, so no action is needed.
+    val height = modifier.height
+    if (
+        height.resolveDimension(context) in listOf(Dimension.Wrap, Dimension.Fill, Dimension.Expand)
+    ) {
         return
     }
-    val heightPx = modifier.height.toPixels(context)
-    if (heightPx < 0) return
-    checkNotNull(layoutDef.sizeViewId) { "The layout specified does not allow specifying the size" }
-    rv.setTextViewHeight(layoutDef.sizeViewId, heightPx)
+
+    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
+        throw IllegalArgumentException(
+            "Using a height of $height requires a complex layout before API 31, but used $layoutDef"
+        )
+    }
+
+    ApplyModifiersApi31Impl.setViewHeight(rv, layoutDef.mainViewId, height)
 }
 
 private fun applyBackgroundModifier(
     rv: RemoteViews,
     modifier: BackgroundModifier,
     context: Context,
-    layoutDef: LayoutIds
+    layoutDef: RemoteViewsInfo
 ) {
     val viewId = layoutDef.mainViewId
     when (val colorProvider = modifier.colorProvider) {
@@ -238,47 +274,33 @@
     fun setViewWidth(rv: RemoteViews, viewId: Int, width: Dimension) {
         when (width) {
             is Dimension.Wrap -> {
-                rv.setViewLayoutWidth(
-                    viewId,
-                    ViewGroup.LayoutParams.WRAP_CONTENT.toFloat(),
-                    TypedValue.COMPLEX_UNIT_PX
-                )
+                rv.setViewLayoutWidth(viewId, WRAP_CONTENT.toFloat(), COMPLEX_UNIT_PX)
             }
-            is Dimension.Expand -> {
-                rv.setViewLayoutWidth(
-                    viewId,
-                    ViewGroup.LayoutParams.MATCH_PARENT.toFloat(),
-                    TypedValue.COMPLEX_UNIT_PX
-                )
-            }
-            is Dimension.Dp -> {
-                rv.setViewLayoutWidth(viewId, width.dp.value, TypedValue.COMPLEX_UNIT_DIP)
-            }
+            is Dimension.Expand -> rv.setViewLayoutWidth(viewId, 0f, COMPLEX_UNIT_PX)
+            is Dimension.Dp -> rv.setViewLayoutWidth(viewId, width.dp.value, COMPLEX_UNIT_DIP)
             is Dimension.Resource -> rv.setViewLayoutWidthDimen(viewId, width.res)
-        }
+            Dimension.Fill -> rv.setViewLayoutWidth(viewId, MATCH_PARENT.toFloat(), COMPLEX_UNIT_PX)
+        }.let {}
     }
 
     @DoNotInline
     fun setViewHeight(rv: RemoteViews, viewId: Int, height: Dimension) {
         when (height) {
             is Dimension.Wrap -> {
-                rv.setViewLayoutHeight(
-                    viewId,
-                    ViewGroup.LayoutParams.WRAP_CONTENT.toFloat(),
-                    TypedValue.COMPLEX_UNIT_PX
-                )
+                rv.setViewLayoutHeight(viewId, WRAP_CONTENT.toFloat(), COMPLEX_UNIT_PX)
             }
-            is Dimension.Expand -> {
-                rv.setViewLayoutHeight(
-                    viewId,
-                    ViewGroup.LayoutParams.MATCH_PARENT.toFloat(),
-                    TypedValue.COMPLEX_UNIT_PX
-                )
-            }
-            is Dimension.Dp -> {
-                rv.setViewLayoutHeight(viewId, height.dp.value, TypedValue.COMPLEX_UNIT_DIP)
-            }
+            is Dimension.Expand -> rv.setViewLayoutHeight(viewId, 0f, COMPLEX_UNIT_PX)
+            is Dimension.Dp -> rv.setViewLayoutHeight(viewId, height.dp.value, COMPLEX_UNIT_DIP)
             is Dimension.Resource -> rv.setViewLayoutHeightDimen(viewId, height.res)
-        }
+            Dimension.Fill -> {
+                rv.setViewLayoutHeight(viewId, MATCH_PARENT.toFloat(), COMPLEX_UNIT_PX)
+            }
+        }.let {}
     }
-}
\ No newline at end of file
+}
+
+private val Dimension?.isFixed: Boolean
+    get() = when (this) {
+        is Dimension.Dp, is Dimension.Resource -> true
+        Dimension.Expand, Dimension.Fill, Dimension.Wrap, null -> false
+    }
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/Background.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/Background.kt
index 0553921..7770207 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/Background.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/Background.kt
@@ -16,15 +16,15 @@
 
 package androidx.glance.appwidget
 
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.appwidget.unit.ColorProvider
 import androidx.glance.background
-import androidx.glance.unit.Color
+import androidx.compose.ui.graphics.Color
 
 /**
  * Apply a background color to the element this modifier is attached to. This will cause the
  * element to paint the specified [Color] as its background, choosing [day] or [night]
  * depending on the device configuration, which will fill the bounds of the element.
  */
-public fun Modifier.background(day: Color, night: Color): Modifier =
+public fun GlanceModifier.background(day: Color, night: Color): GlanceModifier =
     background(ColorProvider(day, night))
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/CoroutineBroadcastReceiver.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/CoroutineBroadcastReceiver.kt
index 627d532..a5f3dde 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/CoroutineBroadcastReceiver.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/CoroutineBroadcastReceiver.kt
@@ -17,6 +17,8 @@
 package androidx.glance.appwidget
 
 import android.content.BroadcastReceiver
+import android.util.Log
+import kotlinx.coroutines.CancellationException
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.SupervisorJob
@@ -41,6 +43,10 @@
         try {
             try {
                 block()
+            } catch (e: CancellationException) {
+                throw e
+            } catch (t: Throwable) {
+                Log.e(GlanceAppWidgetTag, "BroadcastReceiver execution failed", t)
             } finally {
                 // Nothing can be in the `finally` block after this, as this throws a
                 // `CancellationException`
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidget.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidget.kt
index c12cc96..b83855c 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidget.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidget.kt
@@ -35,9 +35,8 @@
 import androidx.glance.Applier
 import androidx.glance.LocalContext
 import androidx.glance.LocalSize
-import androidx.glance.unit.DpSize
-import androidx.glance.unit.dp
-import androidx.glance.unit.toSizeF
+import androidx.compose.ui.unit.DpSize
+import androidx.compose.ui.unit.dp
 import kotlinx.coroutines.async
 import kotlinx.coroutines.awaitAll
 import kotlinx.coroutines.coroutineScope
@@ -274,7 +273,7 @@
         recomposer.close()
         recomposer.join()
 
-        translateComposition(context, appWidgetId, root)
+        translateComposition(context, appWidgetId, this@GlanceAppWidget.javaClass, root)
     }
 
     private companion object {
@@ -313,7 +312,7 @@
     }
 }
 
-private data class AppWidgetId(val appWidgetId: Int) : GlanceId
+internal data class AppWidgetId(val appWidgetId: Int) : GlanceId
 
 // Extract the sizes from the bundle
 private fun Bundle.extractAllSizes(minSize: () -> DpSize): List<DpSize> =
@@ -358,6 +357,8 @@
     (ceil(other.width.value) + 1 > width.value) &&
         (ceil(other.height.value) + 1 > height.value)
 
+@VisibleForTesting internal fun DpSize.toSizeF(): SizeF = SizeF(width.value, height.value)
+
 private fun squareDistance(widgetSize: DpSize, layoutSize: DpSize): Float {
     val dw = widgetSize.width.value - layoutSize.width.value
     val dh = widgetSize.height.value - layoutSize.height.value
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/LayoutIds.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/LayoutIds.kt
index 9e9539e..8e3d688 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/LayoutIds.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/LayoutIds.kt
@@ -19,26 +19,37 @@
 import android.content.Context
 import android.os.Build
 import android.view.ViewGroup
-import androidx.glance.Modifier
+import android.widget.RemoteViews
+import androidx.annotation.LayoutRes
+import androidx.glance.GlanceModifier
 import androidx.glance.findModifier
 import androidx.glance.layout.Dimension
 import androidx.glance.layout.HeightModifier
 import androidx.glance.layout.WidthModifier
-import androidx.glance.unit.dp
+import androidx.compose.ui.unit.dp
 
 /**
- * Set of ids defining a layout.
- *
- * It contains the id of the layout itself, and the ids of the elements within the layout that
- * the code may need to access.
+ * Information about a generated layout, including the layout id, ids of elements within, and other
+ * details about the layout contents.
  */
-internal data class LayoutIds(
-    val layoutId: Int,
+internal data class LayoutInfo(
+    @LayoutRes val layoutId: Int,
     val mainViewId: Int = R.id.glanceView,
-    val sizeViewId: Int? = null,
 )
 
 /**
+ * Information about a [RemoteViews] created from generated layouts, including the layout id, ids
+ * of elements within, and other details about the layout contents.
+ */
+internal data class RemoteViewsInfo(
+    val remoteViews: RemoteViews,
+    val mainViewId: Int = R.id.glanceView,
+    val isComplex: Boolean
+)
+
+internal val RemoteViewsInfo.isSimple get() = !isComplex
+
+/**
  * The total number of generated layouts.
  */
 internal val GeneratedLayoutCount = generatedLayouts.size
@@ -52,8 +63,6 @@
     val type: Type,
     val width: Size,
     val height: Size,
-    val canResize: Boolean,
-    val childCount: Int
 ) {
 
     internal enum class Size {
@@ -68,65 +77,84 @@
         Column,
         Box,
         Text,
-        List1,
-        List2,
-        List3,
+        List,
         ListItem,
         CheckBox,
         CheckBoxBackport,
         Button,
+
         // Note: Java keywords, such as 'switch', can't be used for layout ids.
         Swtch,
         SwtchBackport
     }
 }
 
-/**
- * Select the layout based on the specification.
- *
- * @param type Type of layout
- * @param modifier Modifier applied to the layout. Modifiers of interest will be extracted to get
- * the layout they can be applied on.
- */
-internal fun selectLayout(
+internal data class ComplexSelector(
+    val width: LayoutSelector.Size,
+    val height: LayoutSelector.Size,
+)
+
+internal fun createRemoteViews(
     translationContext: TranslationContext,
     type: LayoutSelector.Type,
-    modifier: Modifier
-): LayoutIds {
-    val context = translationContext.context
+    modifier: GlanceModifier
+): RemoteViewsInfo {
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
-        return selectApi31Layout(type, modifier)
+        val layout = selectApi31Layout(type, modifier)
+        return RemoteViewsInfo(
+            remoteViews(translationContext, layout.layoutId),
+            mainViewId = layout.mainViewId,
+            isComplex = false,
+        )
     }
+    val context = translationContext.context
     val widthMod = modifier.findModifier<WidthModifier>()?.width ?: Dimension.Wrap
     val heightMod = modifier.findModifier<HeightModifier>()?.height ?: Dimension.Wrap
     val width = widthMod.resolveDimension(context).toSpecSize()
     val height = heightMod.resolveDimension(context).toSpecSize()
     val needResize = width == LayoutSelector.Size.Fixed || height == LayoutSelector.Size.Fixed
-    // TODO(b/202868171): Add the real child count.
-    return generatedLayouts[LayoutSelector(type, width, height, needResize, childCount = 0)]
-        ?: (if (!needResize) generatedLayouts[LayoutSelector(
+    if (needResize) {
+        val complexLayout = generatedComplexLayouts[ComplexSelector(width, height)]
+            ?: throw IllegalArgumentException(
+                "Could not find complex layout for width=$width, height=$height"
+            )
+        val childLayout = generatedLayouts[LayoutSelector(
             type,
-            width,
-            height,
-            true,
-            // TODO(b/202868171): Add the real child count.
-            childCount = 0
-        )] else null)
-        ?: throw IllegalArgumentException(
-            "Could not find layout for $type, width=$width, height=$height, canResize=$needResize"
+            LayoutSelector.Size.MatchParent,
+            LayoutSelector.Size.MatchParent
+        )]
+            ?: throw IllegalArgumentException(
+                "Could not find layout for $type, width=${LayoutSelector.Size.MatchParent}, " +
+                    "height=${LayoutSelector.Size.MatchParent}"
+            )
+        val rv = remoteViews(translationContext, complexLayout.layoutId)
+        val viewId = rv.inflateViewStub(
+            translationContext,
+            R.id.glanceViewStub,
+            childLayout.layoutId
         )
+
+        fun layoutName(id: Int) =
+            context.resources.getResourceEntryName(id)!!
+        return RemoteViewsInfo(rv, mainViewId = viewId, isComplex = true)
+    }
+    val layout = generatedLayouts[LayoutSelector(type, width, height)]
+        ?: throw IllegalArgumentException(
+            "Could not find layout for $type, width=$width, height=$height"
+        )
+    val rv = remoteViews(translationContext, layout.layoutId)
+    return RemoteViewsInfo(rv, mainViewId = layout.mainViewId, isComplex = false)
 }
 
 private fun Dimension.toSpecSize(): LayoutSelector.Size =
     when (this) {
-        is Dimension.Dp -> LayoutSelector.Size.Fixed
         is Dimension.Wrap -> LayoutSelector.Size.Wrap
         is Dimension.Expand -> LayoutSelector.Size.Expand
         is Dimension.Fill -> LayoutSelector.Size.MatchParent
-        else -> LayoutSelector.Size.Fixed
+        is Dimension.Dp, is Dimension.Resource -> LayoutSelector.Size.Fixed
     }
 
-private fun Dimension.resolveDimension(context: Context): Dimension {
+internal fun Dimension.resolveDimension(context: Context): Dimension {
     if (this !is Dimension.Resource) return this
     val sizePx = context.resources.getDimension(res)
     return when (sizePx.toInt()) {
@@ -142,8 +170,8 @@
  */
 private fun selectApi31Layout(
     type: LayoutSelector.Type,
-    modifier: Modifier
-): LayoutIds {
+    modifier: GlanceModifier
+): LayoutInfo {
     val widthMod = modifier.findModifier<WidthModifier>()?.width ?: Dimension.Wrap
     val heightMod = modifier.findModifier<HeightModifier>()?.height ?: Dimension.Wrap
     val width = widthMod.toSpecSize()
@@ -152,9 +180,6 @@
         type,
         width,
         height,
-        canResize = false,
-        // TODO(b/202868171): Add the real child count.
-        childCount = 0
     )]
         ?: throw IllegalArgumentException(
             "Could not find layout for $type, width=$width, height=$height, canResize=false"
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/RemoteViewsRoot.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/RemoteViewsRoot.kt
index 2a76fd5..43788fc 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/RemoteViewsRoot.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/RemoteViewsRoot.kt
@@ -17,12 +17,12 @@
 package androidx.glance.appwidget
 
 import androidx.glance.EmittableWithChildren
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 
 /**
  * Root view, with a maximum depth. No default value is specified, as the exact value depends on
  * specific circumstances.
  */
 internal class RemoteViewsRoot(maxDepth: Int) : EmittableWithChildren(maxDepth) {
-    override var modifier: Modifier = Modifier
+    override var modifier: GlanceModifier = GlanceModifier
 }
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/RemoteViewsTranslator.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/RemoteViewsTranslator.kt
index 70da732..312f96d 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/RemoteViewsTranslator.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/RemoteViewsTranslator.kt
@@ -47,9 +47,14 @@
 import androidx.glance.layout.EmittableText
 import java.util.concurrent.atomic.AtomicInteger
 
-internal fun translateComposition(context: Context, appWidgetId: Int, element: RemoteViewsRoot) =
+internal fun translateComposition(
+    context: Context,
+    appWidgetId: Int,
+    appWidgetClass: Class<out GlanceAppWidget>,
+    element: RemoteViewsRoot
+) =
     translateComposition(
-        TranslationContext(context, appWidgetId, context.isRtl),
+        TranslationContext(context, appWidgetId, appWidgetClass, context.isRtl),
         element
     )
 
@@ -76,10 +81,13 @@
 internal data class TranslationContext(
     val context: Context,
     val appWidgetId: Int,
+    val appWidgetClass: Class<out GlanceAppWidget>,
     val isRtl: Boolean,
-    val listCount: AtomicInteger = AtomicInteger(0),
-    val areLazyCollectionsAllowed: Boolean = true
-)
+    val areLazyCollectionsAllowed: Boolean = true,
+    val lastViewId: AtomicInteger = AtomicInteger(0),
+) {
+    fun nextViewId() = lastViewId.incrementAndGet()
+}
 
 internal fun translateChild(
     translationContext: TranslationContext,
@@ -127,72 +135,71 @@
     translationContext: TranslationContext,
     element: EmittableBox
 ): RemoteViews {
-    val layoutDef = selectLayout(translationContext, LayoutSelector.Type.Box, element.modifier)
-    return remoteViews(translationContext, layoutDef.layoutId)
-        .also { rv ->
-            rv.setRelativeLayoutGravity(layoutDef.mainViewId, element.contentAlignment.toGravity())
-            applyModifiers(
-                translationContext,
-                rv,
-                element.modifier,
-                layoutDef
-            )
-            rv.setChildren(
-                translationContext,
-                layoutDef.mainViewId,
-                element.children
-            )
-        }
+    val layoutDef = createRemoteViews(translationContext, LayoutSelector.Type.Box, element.modifier)
+    val rv = layoutDef.remoteViews
+    rv.setRelativeLayoutGravity(layoutDef.mainViewId, element.contentAlignment.toGravity())
+    applyModifiers(
+        translationContext,
+        rv,
+        element.modifier,
+        layoutDef
+    )
+    rv.setChildren(
+        translationContext,
+        layoutDef.mainViewId,
+        element.children
+    )
+    return rv
 }
 
 private fun translateEmittableRow(
     translationContext: TranslationContext,
     element: EmittableRow
 ): RemoteViews {
-    val layoutDef = selectLayout(translationContext, LayoutSelector.Type.Row, element.modifier)
-    return remoteViews(translationContext, layoutDef.layoutId)
-        .also { rv ->
-            rv.setLinearLayoutGravity(
-                layoutDef.mainViewId,
-                element.horizontalAlignment.toGravity() or element.verticalAlignment.toGravity()
-            )
-            applyModifiers(
-                translationContext,
-                rv,
-                element.modifier,
-                layoutDef
-            )
-            rv.setChildren(
-                translationContext,
-                layoutDef.mainViewId,
-                element.children
-            )
-        }
+    val layoutDef =
+        createRemoteViews(translationContext, LayoutSelector.Type.Row, element.modifier)
+    val rv = layoutDef.remoteViews
+    rv.setLinearLayoutGravity(
+        layoutDef.mainViewId,
+        element.horizontalAlignment.toGravity() or element.verticalAlignment.toGravity()
+    )
+    applyModifiers(
+        translationContext,
+        rv,
+        element.modifier,
+        layoutDef
+    )
+    rv.setChildren(
+        translationContext,
+        layoutDef.mainViewId,
+        element.children
+    )
+    return rv
 }
 
 private fun translateEmittableColumn(
     translationContext: TranslationContext,
     element: EmittableColumn
 ): RemoteViews {
-    val layoutDef = selectLayout(translationContext, LayoutSelector.Type.Column, element.modifier)
-    return remoteViews(translationContext, layoutDef.layoutId)
-        .also { rv ->
-            rv.setLinearLayoutGravity(
-                layoutDef.mainViewId,
-                element.horizontalAlignment.toGravity() or element.verticalAlignment.toGravity()
-            )
-            applyModifiers(
-                translationContext,
-                rv,
-                element.modifier,
-                layoutDef
-            )
-            rv.setChildren(
-                translationContext,
-                layoutDef.mainViewId,
-                element.children
-            )
-        }
+    val layoutDef =
+        createRemoteViews(translationContext, LayoutSelector.Type.Column, element.modifier)
+    val rv = layoutDef.remoteViews
+    rv.setLinearLayoutGravity(
+        layoutDef.mainViewId,
+        element.horizontalAlignment.toGravity() or element.verticalAlignment.toGravity()
+    )
+    applyModifiers(
+        translationContext,
+        rv,
+        element.modifier,
+        layoutDef
+    )
+    rv.setChildren(
+        translationContext,
+        layoutDef.mainViewId,
+        element.children
+    )
+    return rv
 }
 
 private fun translateEmittableAndroidRemoteViews(
@@ -219,18 +226,17 @@
     element: EmittableButton
 ): RemoteViews {
     val layoutDef =
-        selectLayout(translationContext, LayoutSelector.Type.Button, element.modifier)
-    return remoteViews(translationContext, layoutDef.layoutId)
-        .also { rv ->
-            rv.setText(
-                translationContext,
-                layoutDef.mainViewId,
-                element.text,
-                element.style
-            )
-            rv.setBoolean(layoutDef.mainViewId, "setEnabled", element.enabled)
-            applyModifiers(translationContext, rv, element.modifier, layoutDef)
-        }
+        createRemoteViews(translationContext, LayoutSelector.Type.Button, element.modifier)
+    val rv = layoutDef.remoteViews
+    rv.setText(
+        translationContext,
+        layoutDef.mainViewId,
+        element.text,
+        element.style
+    )
+    rv.setBoolean(layoutDef.mainViewId, "setEnabled", element.enabled)
+    applyModifiers(translationContext, rv, element.modifier, layoutDef)
+    return rv
 }
 
 // Sets the emittables as children to the view. This first remove any previously added view, the
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/SizeMode.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/SizeMode.kt
index 570a78e..4c8799a 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/SizeMode.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/SizeMode.kt
@@ -16,7 +16,7 @@
 
 package androidx.glance.appwidget
 
-import androidx.glance.unit.DpSize
+import androidx.compose.ui.unit.DpSize
 import androidx.glance.LocalSize
 
 /**
@@ -61,11 +61,6 @@
      */
     public class Responsive(val sizes: Set<DpSize>) : SizeMode {
 
-        /**
-         * Helper constructor using `vararg` rather than a set.
-         */
-        public constructor(vararg sizes: DpSize) : this(sizes.toSet())
-
         init {
             require(sizes.isNotEmpty()) { "The set of sizes cannot be empty" }
         }
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/Utils.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/Utils.kt
index d9f17fa..34458e1 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/Utils.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/Utils.kt
@@ -16,11 +16,19 @@
 
 package androidx.glance.appwidget
 
+import android.content.Context
 import android.util.DisplayMetrics
 import android.util.TypedValue
+import android.view.View
 import android.widget.RemoteViews
-import androidx.glance.unit.Dp
-import androidx.glance.unit.dp
+import androidx.annotation.IdRes
+import androidx.annotation.LayoutRes
+import androidx.core.widget.setViewStubInflatedId
+import androidx.core.widget.setViewStubLayoutResource
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+
+internal fun Dp.toPixels(context: Context) = toPixels(context.resources.displayMetrics)
 
 internal fun Dp.toPixels(displayMetrics: DisplayMetrics) =
     TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, displayMetrics).toInt()
@@ -36,4 +44,22 @@
     setBoolean(viewId, "setEnabled", enabled)
 }
 
+/**
+ * Inflates a ViewStub with [viewStubId] using [layoutId] and returns the new view id. [inflatedId]
+ * is used for the inflated view, if unspecified a new view id will be generated.
+ */
+@IdRes
+internal fun RemoteViews.inflateViewStub(
+    translationContext: TranslationContext,
+    @IdRes viewStubId: Int,
+    @LayoutRes layoutId: Int,
+    @IdRes inflatedId: Int? = null
+): Int {
+    val viewId = inflatedId ?: translationContext.nextViewId()
+    setViewStubInflatedId(viewStubId, viewId)
+    setViewStubLayoutResource(viewStubId, layoutId)
+    setViewVisibility(viewStubId, View.VISIBLE)
+    return viewId
+}
+
 internal const val GlanceAppWidgetTag = "GlanceAppWidget"
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/action/LaunchActivityIntentAction.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/action/LaunchActivityIntentAction.kt
index e9565177..5ce93e9 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/action/LaunchActivityIntentAction.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/action/LaunchActivityIntentAction.kt
@@ -28,5 +28,7 @@
  * intent should specify a component with [Intent.setClass] or [Intent.setComponent].
  *
  * This action is supported by app widgets only.
+ *
+ * @param intent the intent used to launch the activity
  */
-public fun launchActivityAction(intent: Intent): Action = LaunchActivityIntentAction(intent)
+public fun actionLaunchActivity(intent: Intent): Action = LaunchActivityIntentAction(intent)
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/layout/AndroidRemoteViews.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/layout/AndroidRemoteViews.kt
index 467e9be..7a66c86 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/layout/AndroidRemoteViews.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/layout/AndroidRemoteViews.kt
@@ -23,7 +23,7 @@
 import androidx.compose.runtime.ComposeNode
 import androidx.glance.Applier
 import androidx.glance.EmittableWithChildren
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 
 /**
  * Add [RemoteViews] into a glance composition.
@@ -61,7 +61,7 @@
 }
 
 internal class EmittableAndroidRemoteViews : EmittableWithChildren() {
-    override var modifier: Modifier = Modifier
+    override var modifier: GlanceModifier = GlanceModifier
 
     lateinit var remoteViews: RemoteViews
 
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/layout/CheckBox.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/layout/CheckBox.kt
index f0c4d6a..2ea2051 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/layout/CheckBox.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/layout/CheckBox.kt
@@ -20,7 +20,7 @@
 import androidx.compose.runtime.ComposeNode
 import androidx.glance.Applier
 import androidx.glance.Emittable
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.text.TextStyle
 
 /**
@@ -34,7 +34,7 @@
 @Composable
 public fun CheckBox(
     checked: Boolean,
-    modifier: Modifier = Modifier,
+    modifier: GlanceModifier = GlanceModifier,
     text: String = "",
     textStyle: TextStyle? = null
 ) {
@@ -50,7 +50,7 @@
 }
 
 internal class EmittableCheckBox : Emittable {
-    override var modifier: Modifier = Modifier
+    override var modifier: GlanceModifier = GlanceModifier
     var checked: Boolean = false
     var text: String = ""
     var textStyle: TextStyle? = null
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/layout/LazyList.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/layout/LazyList.kt
index 379eee8..f6bdf59 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/layout/LazyList.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/layout/LazyList.kt
@@ -21,7 +21,7 @@
 import androidx.compose.runtime.ComposeNode
 import androidx.glance.Applier
 import androidx.glance.EmittableWithChildren
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.layout.Alignment
 
 /**
@@ -36,7 +36,7 @@
 // TODO(b/198618359): interaction handling
 @Composable
 public fun LazyColumn(
-    modifier: Modifier = Modifier,
+    modifier: GlanceModifier = GlanceModifier,
     horizontalAlignment: Alignment.Horizontal = Alignment.Start,
     content: LazyListScope.() -> Unit
 ) {
@@ -235,7 +235,7 @@
 }
 
 internal abstract class EmittableLazyList : EmittableWithChildren(resetsDepthForChildren = true) {
-    override var modifier: Modifier = Modifier
+    override var modifier: GlanceModifier = GlanceModifier
     public var horizontalAlignment: Alignment.Horizontal = Alignment.Start
 
     override fun toString() =
@@ -244,7 +244,7 @@
 }
 
 internal class EmittableLazyListItem : EmittableWithChildren() {
-    override var modifier: Modifier = Modifier
+    override var modifier: GlanceModifier = GlanceModifier
     var itemId: Long = 0
     var alignment: Alignment = Alignment.CenterStart
 
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/layout/Switch.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/layout/Switch.kt
index 8a7a493..6aedbc4 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/layout/Switch.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/layout/Switch.kt
@@ -20,7 +20,7 @@
 import androidx.compose.runtime.ComposeNode
 import androidx.glance.Applier
 import androidx.glance.Emittable
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.text.TextStyle
 
 /**
@@ -34,7 +34,7 @@
 @Composable
 fun Switch(
     checked: Boolean,
-    modifier: Modifier = Modifier,
+    modifier: GlanceModifier = GlanceModifier,
     text: String = "",
     textStyle: TextStyle? = null
 ) {
@@ -50,7 +50,7 @@
 }
 
 internal class EmittableSwitch : Emittable {
-    override var modifier: Modifier = Modifier
+    override var modifier: GlanceModifier = GlanceModifier
     var checked: Boolean = false
     var text: String = ""
     var textStyle: TextStyle? = null
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/translators/CheckBoxTranslator.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/translators/CheckBoxTranslator.kt
index fe66d44..24ff00c 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/translators/CheckBoxTranslator.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/translators/CheckBoxTranslator.kt
@@ -22,9 +22,8 @@
 import androidx.glance.appwidget.R
 import androidx.glance.appwidget.TranslationContext
 import androidx.glance.appwidget.applyModifiers
+import androidx.glance.appwidget.createRemoteViews
 import androidx.glance.appwidget.layout.EmittableCheckBox
-import androidx.glance.appwidget.remoteViews
-import androidx.glance.appwidget.selectLayout
 import androidx.glance.appwidget.setViewEnabled
 
 internal fun translateEmittableCheckBox(
@@ -38,8 +37,9 @@
         LayoutSelector.Type.CheckBoxBackport
     }
 
-    val layoutDef = selectLayout(translationContext, layoutType, element.modifier)
-    val rv = remoteViews(translationContext, layoutDef.layoutId)
+    val layoutDef =
+        createRemoteViews(translationContext, layoutType, element.modifier)
+    val rv = layoutDef.remoteViews
     val textViewId: Int
 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/translators/LazyListTranslator.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/translators/LazyListTranslator.kt
index 612346f..6a4c2f5 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/translators/LazyListTranslator.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/translators/LazyListTranslator.kt
@@ -19,16 +19,15 @@
 import android.widget.RemoteViews
 import androidx.core.widget.RemoteViewsCompat
 import androidx.glance.appwidget.GeneratedLayoutCount
-import androidx.glance.appwidget.LayoutIds
 import androidx.glance.appwidget.LayoutSelector
+import androidx.glance.appwidget.RemoteViewsInfo
 import androidx.glance.appwidget.TranslationContext
 import androidx.glance.appwidget.applyModifiers
+import androidx.glance.appwidget.createRemoteViews
 import androidx.glance.appwidget.layout.EmittableLazyColumn
 import androidx.glance.appwidget.layout.EmittableLazyList
 import androidx.glance.appwidget.layout.EmittableLazyListItem
 import androidx.glance.appwidget.layout.ReservedItemIdRangeEnd
-import androidx.glance.appwidget.remoteViews
-import androidx.glance.appwidget.selectLayout
 import androidx.glance.appwidget.translateChild
 import androidx.glance.layout.Alignment
 import androidx.glance.layout.EmittableBox
@@ -38,50 +37,44 @@
     translationContext: TranslationContext,
     element: EmittableLazyColumn,
 ): RemoteViews {
-    val listLayoutType =
-        requireNotNull(listLayouts.getOrNull(translationContext.listCount.getAndIncrement())) {
-            """
-            Glance widgets only support ${listLayouts.size} lazy lists per widget. If you need more
-            lists provide a non-composable [RemoteViews].
-            """.trimIndent()
-        }
-    val listLayout = selectLayout(translationContext, listLayoutType, element.modifier)
+    val layoutDef =
+        createRemoteViews(translationContext, LayoutSelector.Type.List, element.modifier)
     return translateEmittableLazyList(
         translationContext,
         element,
-        listLayout,
+        layoutDef,
     )
 }
 
 private fun translateEmittableLazyList(
     translationContext: TranslationContext,
     element: EmittableLazyList,
-    layoutDef: LayoutIds,
-): RemoteViews =
-    remoteViews(translationContext, layoutDef.layoutId)
-        .also { rv ->
-            check(translationContext.areLazyCollectionsAllowed) {
-                "Glance does not support nested list views."
-            }
-            val items = RemoteViewsCompat.RemoteCollectionItems.Builder().apply {
-                val childContext = translationContext.copy(areLazyCollectionsAllowed = false)
-                element.children.fold(false) { previous, itemEmittable ->
-                    val itemId = (itemEmittable as EmittableLazyListItem).itemId
-                    addItem(itemId, translateChild(childContext, itemEmittable))
-                    // If the user specifies any explicit ids, we assume the list to be stable
-                    previous || (itemId > ReservedItemIdRangeEnd)
-                }.let { setHasStableIds(it) }
-                setViewTypeCount(GeneratedLayoutCount)
-            }.build()
-            RemoteViewsCompat.setRemoteAdapter(
-                translationContext.context,
-                rv,
-                translationContext.appWidgetId,
-                layoutDef.mainViewId,
-                items
-            )
-            applyModifiers(translationContext, rv, element.modifier, layoutDef)
-        }
+    layoutDef: RemoteViewsInfo,
+): RemoteViews {
+    val rv = layoutDef.remoteViews
+    check(translationContext.areLazyCollectionsAllowed) {
+        "Glance does not support nested list views."
+    }
+    val items = RemoteViewsCompat.RemoteCollectionItems.Builder().apply {
+        val childContext = translationContext.copy(areLazyCollectionsAllowed = false)
+        element.children.fold(false) { previous, itemEmittable ->
+            val itemId = (itemEmittable as EmittableLazyListItem).itemId
+            addItem(itemId, translateChild(childContext, itemEmittable))
+            // If the user specifies any explicit ids, we assume the list to be stable
+            previous || (itemId > ReservedItemIdRangeEnd)
+        }.let { setHasStableIds(it) }
+        setViewTypeCount(GeneratedLayoutCount)
+    }.build()
+    RemoteViewsCompat.setRemoteAdapter(
+        translationContext.context,
+        rv,
+        translationContext.appWidgetId,
+        layoutDef.mainViewId,
+        items
+    )
+    applyModifiers(translationContext, rv, element.modifier, layoutDef)
+    return rv
+}
 
 /**
  * Translates a list item either to its immediate only child, or a column layout wrapping all its
@@ -104,9 +97,3 @@
     }
     return translateChild(translationContext, child)
 }
-
-private val listLayouts: List<LayoutSelector.Type> = listOf(
-    LayoutSelector.Type.List1,
-    LayoutSelector.Type.List2,
-    LayoutSelector.Type.List3,
-)
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/translators/SwitchTranslator.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/translators/SwitchTranslator.kt
index 58b5c12..6c3dd2e 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/translators/SwitchTranslator.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/translators/SwitchTranslator.kt
@@ -22,9 +22,8 @@
 import androidx.glance.appwidget.R
 import androidx.glance.appwidget.TranslationContext
 import androidx.glance.appwidget.applyModifiers
+import androidx.glance.appwidget.createRemoteViews
 import androidx.glance.appwidget.layout.EmittableSwitch
-import androidx.glance.appwidget.remoteViews
-import androidx.glance.appwidget.selectLayout
 import androidx.glance.appwidget.setViewEnabled
 
 internal fun translateEmittableSwitch(
@@ -38,8 +37,8 @@
         LayoutSelector.Type.SwtchBackport
     }
 
-    val layoutDef = selectLayout(translationContext, layoutType, element.modifier)
-    val rv = remoteViews(translationContext, layoutDef.layoutId)
+    val layoutDef = createRemoteViews(translationContext, layoutType, element.modifier)
+    val rv = layoutDef.remoteViews
     val textViewId: Int
 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/translators/TextTranslator.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/translators/TextTranslator.kt
index 1b48778..618971f 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/translators/TextTranslator.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/translators/TextTranslator.kt
@@ -37,8 +37,7 @@
 import androidx.glance.appwidget.R
 import androidx.glance.appwidget.TranslationContext
 import androidx.glance.appwidget.applyModifiers
-import androidx.glance.appwidget.remoteViews
-import androidx.glance.appwidget.selectLayout
+import androidx.glance.appwidget.createRemoteViews
 import androidx.glance.layout.EmittableText
 import androidx.glance.text.FontStyle
 import androidx.glance.text.FontWeight
@@ -50,23 +49,23 @@
     translationContext: TranslationContext,
     element: EmittableText
 ): RemoteViews {
-    val layoutDef = selectLayout(translationContext, LayoutSelector.Type.Text, element.modifier)
-    return remoteViews(translationContext, layoutDef.layoutId)
-        .also { rv ->
-            rv.setText(
-                translationContext,
-                layoutDef.mainViewId,
-                element.text,
-                element.style
-            )
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
-                element.style?.textAlign?.let { align ->
-                    TextTranslatorApi31Impl
-                        .setTextViewGravity(rv, layoutDef.mainViewId, align.toGravity())
-                }
-            }
-            applyModifiers(translationContext, rv, element.modifier, layoutDef)
+    val layoutDef =
+        createRemoteViews(translationContext, LayoutSelector.Type.Text, element.modifier)
+    val rv = layoutDef.remoteViews
+    rv.setText(
+        translationContext,
+        layoutDef.mainViewId,
+        element.text,
+        element.style
+    )
+    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+        element.style?.textAlign?.let { align ->
+            TextTranslatorApi31Impl
+                .setTextViewGravity(rv, layoutDef.mainViewId, align.toGravity())
         }
+    }
+    applyModifiers(translationContext, rv, element.modifier, layoutDef)
+    return rv
 }
 
 internal fun RemoteViews.setText(
@@ -81,7 +80,12 @@
     }
     val content = SpannableString(text)
     val length = content.length
+
+    // TODO(b/203656358): Can we support Em here too?
     style.fontSize?.let {
+        if (!it.isSp) {
+            throw IllegalArgumentException("Only Sp is currently supported for font sizes")
+        }
         setTextViewTextSize(resId, TypedValue.COMPLEX_UNIT_SP, it.value)
     }
     val spans = mutableListOf<ParcelableSpan>()
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/unit/ColorProvider.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/unit/ColorProvider.kt
index eaa02d5..5fd91f8 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/unit/ColorProvider.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/unit/ColorProvider.kt
@@ -18,7 +18,7 @@
 
 import android.content.Context
 import android.content.res.Configuration
-import androidx.glance.unit.Color
+import androidx.compose.ui.graphics.Color
 import androidx.glance.unit.ColorProvider
 
 /**
diff --git a/glance/glance-appwidget/src/androidMain/layoutTemplates/box.xml b/glance/glance-appwidget/src/androidMain/layoutTemplates/box.xml
index 80c4152..17141ed 100644
--- a/glance/glance-appwidget/src/androidMain/layoutTemplates/box.xml
+++ b/glance/glance-appwidget/src/androidMain/layoutTemplates/box.xml
@@ -14,4 +14,5 @@
   limitations under the License.
   -->
 
-<RelativeLayout />
+<RelativeLayout
+    style="@style/Glance.AppWidget.Box"/>
diff --git a/glance/glance-appwidget/src/androidMain/layoutTemplates/button.xml b/glance/glance-appwidget/src/androidMain/layoutTemplates/button.xml
index 9801e42..e43c978 100644
--- a/glance/glance-appwidget/src/androidMain/layoutTemplates/button.xml
+++ b/glance/glance-appwidget/src/androidMain/layoutTemplates/button.xml
@@ -14,4 +14,5 @@
   limitations under the License.
   -->
 
-<Button />
\ No newline at end of file
+<Button
+    style="@style/Glance.AppWidget.Button"/>
diff --git a/glance/glance-appwidget/src/androidMain/layoutTemplates/check_box.xml b/glance/glance-appwidget/src/androidMain/layoutTemplates/check_box.xml
index 47c3a39..187fa12 100644
--- a/glance/glance-appwidget/src/androidMain/layoutTemplates/check_box.xml
+++ b/glance/glance-appwidget/src/androidMain/layoutTemplates/check_box.xml
@@ -15,5 +15,5 @@
   -->
 
 <CheckBox xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@id/glanceView"
-    android:textDirection="locale" />
\ No newline at end of file
+    android:textDirection="locale"
+    style="@style/Glance.AppWidget.CheckBox"/>
diff --git a/glance/glance-appwidget/src/androidMain/layoutTemplates/check_box_backport.xml b/glance/glance-appwidget/src/androidMain/layoutTemplates/check_box_backport.xml
index 41c6966..9404871 100644
--- a/glance/glance-appwidget/src/androidMain/layoutTemplates/check_box_backport.xml
+++ b/glance/glance-appwidget/src/androidMain/layoutTemplates/check_box_backport.xml
@@ -15,9 +15,9 @@
   -->
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@id/glanceView"
     android:orientation="horizontal"
-    android:gravity="center_vertical">
+    android:gravity="center_vertical"
+    style="@style/Glance.AppWidget.CheckBoxBackport">
     <!-- Note: A separate ImageView is used for the icon rather than using the drawable of the
      TextView as TextView.setEnabled is only remotable since API 24, whereas View.setEnabled is
      remotable on all APIs. -->
@@ -27,10 +27,12 @@
         android:layout_height="32dp"
         android:src="@drawable/abc_btn_check_material_anim_enabled"
         android:layout_centerVertical="true"
-        android:tint="?android:attr/colorAccent"/>
+        android:tint="?android:attr/colorAccent"
+        style="@style/Glance.AppWidget.CheckBoxIcon"/>
     <TextView
         android:id="@id/checkBoxText"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:textDirection="locale" />
-</LinearLayout>
\ No newline at end of file
+        android:textDirection="locale"
+        style="@style/Glance.AppWidget.CheckBoxText"/>
+</LinearLayout>
diff --git a/glance/glance-appwidget/src/androidMain/layoutTemplates/column.xml b/glance/glance-appwidget/src/androidMain/layoutTemplates/column.xml
index 0757ba7..13f28f6 100644
--- a/glance/glance-appwidget/src/androidMain/layoutTemplates/column.xml
+++ b/glance/glance-appwidget/src/androidMain/layoutTemplates/column.xml
@@ -15,4 +15,5 @@
   -->
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical" />
\ No newline at end of file
+    android:orientation="vertical"
+    style="@style/Glance.AppWidget.Column"/>
diff --git a/glance/glance-appwidget/src/androidMain/layoutTemplates/list1.xml b/glance/glance-appwidget/src/androidMain/layoutTemplates/list.xml
similarity index 90%
rename from glance/glance-appwidget/src/androidMain/layoutTemplates/list1.xml
rename to glance/glance-appwidget/src/androidMain/layoutTemplates/list.xml
index d228e836..9d6d7bc 100644
--- a/glance/glance-appwidget/src/androidMain/layoutTemplates/list1.xml
+++ b/glance/glance-appwidget/src/androidMain/layoutTemplates/list.xml
@@ -15,5 +15,5 @@
   -->
 
 <ListView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@id/glanceListView1"
-    android:divider="@null" />
+    android:divider="@null"
+    style="@style/Glance.AppWidget.List"/>
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/layoutTemplates/list2.xml b/glance/glance-appwidget/src/androidMain/layoutTemplates/list2.xml
deleted file mode 100644
index 7145e1f..0000000
--- a/glance/glance-appwidget/src/androidMain/layoutTemplates/list2.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?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.
-  -->
-
-<ListView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@id/glanceListView2"
-    android:divider="@null"  />
diff --git a/glance/glance-appwidget/src/androidMain/layoutTemplates/list3.xml b/glance/glance-appwidget/src/androidMain/layoutTemplates/list3.xml
deleted file mode 100644
index ef92d67..0000000
--- a/glance/glance-appwidget/src/androidMain/layoutTemplates/list3.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?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.
-  -->
-
-<ListView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@id/glanceListView3"
-    android:divider="@null"  />
diff --git a/glance/glance-appwidget/src/androidMain/layoutTemplates/row.xml b/glance/glance-appwidget/src/androidMain/layoutTemplates/row.xml
index 573ee98..16dfa10 100644
--- a/glance/glance-appwidget/src/androidMain/layoutTemplates/row.xml
+++ b/glance/glance-appwidget/src/androidMain/layoutTemplates/row.xml
@@ -15,4 +15,5 @@
   -->
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="horizontal" />
\ No newline at end of file
+    android:orientation="horizontal"
+    style="@style/Glance.AppWidget.Row"/>
diff --git a/glance/glance-appwidget/src/androidMain/layoutTemplates/swtch.xml b/glance/glance-appwidget/src/androidMain/layoutTemplates/swtch.xml
index b4e199b..b883c54 100644
--- a/glance/glance-appwidget/src/androidMain/layoutTemplates/swtch.xml
+++ b/glance/glance-appwidget/src/androidMain/layoutTemplates/swtch.xml
@@ -15,4 +15,5 @@
   -->
 
 <Switch xmlns:android="http://schemas.android.com/apk/res/android"
-    android:textDirection="locale" />
\ No newline at end of file
+    android:textDirection="locale"
+    style="@style/Glance.AppWidget.Switch"/>
diff --git a/glance/glance-appwidget/src/androidMain/layoutTemplates/swtch_backport.xml b/glance/glance-appwidget/src/androidMain/layoutTemplates/swtch_backport.xml
index 46d43e4..bf57894 100644
--- a/glance/glance-appwidget/src/androidMain/layoutTemplates/swtch_backport.xml
+++ b/glance/glance-appwidget/src/androidMain/layoutTemplates/swtch_backport.xml
@@ -16,21 +16,25 @@
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="horizontal"
-    android:gravity="center">
+    android:gravity="center"
+    style="@style/Glance.AppWidget.SwitchBackport">
     <TextView
         android:id="@id/switchText"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:layout_weight="1"
-        android:textDirection="locale"/>
+        android:textDirection="locale"
+        style="@style/Glance.AppWidget.SwitchText"/>
     <FrameLayout
         android:layout_width="wrap_content"
-        android:layout_height="wrap_content">
+        android:layout_height="wrap_content"
+        style="@style/Glance.AppWidget.SwitchBackport">
         <ImageView
             android:id="@id/switchTrack"
             android:layout_width="42dp"
             android:layout_height="28dp"
-            android:src="@drawable/switch_track_material"/>
+            android:src="@drawable/switch_track_material"
+            style="@style/Glance.AppWidget.SwitchTrack"/>
 
         <ImageView
             android:id="@id/switchThumb"
@@ -38,6 +42,7 @@
             android:layout_height="wrap_content"
             android:layout_gravity="center_vertical|start"
             android:src="@drawable/switch_thumb_material"
-            android:tint="@color/switch_thumb_material"/>
+            android:tint="@color/switch_thumb_material"
+            style="@style/Glance.AppWidget.SwitchThumb"/>
     </FrameLayout>
-</LinearLayout>
\ No newline at end of file
+</LinearLayout>
diff --git a/glance/glance-appwidget/src/androidMain/layoutTemplates/text.xml b/glance/glance-appwidget/src/androidMain/layoutTemplates/text.xml
index 4fb65a6..11f43dd 100644
--- a/glance/glance-appwidget/src/androidMain/layoutTemplates/text.xml
+++ b/glance/glance-appwidget/src/androidMain/layoutTemplates/text.xml
@@ -15,4 +15,5 @@
   -->
 
 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:textDirection="locale"/>
\ No newline at end of file
+    android:textDirection="locale"
+    style="@style/Glance.AppWidget.Text"/>
diff --git a/glance/glance-appwidget/src/androidMain/res/values/ids.xml b/glance/glance-appwidget/src/androidMain/res/values/ids.xml
index 2b3520d..43ab4b5 100644
--- a/glance/glance-appwidget/src/androidMain/res/values/ids.xml
+++ b/glance/glance-appwidget/src/androidMain/res/values/ids.xml
@@ -15,26 +15,14 @@
   -->
 
 <resources>
-    <id name="checkBoxIcon"/>
-    <id name="checkBoxText"/>
-    <id name="glanceView"/>
-    <id name="glanceListView1"/>
-    <id name="glanceListView2"/>
-    <id name="glanceListView3"/>
-    <id name="relativeLayout"/>
-    <id name="sizeView"/>
-    <id name="switchText"/>
-    <id name="switchTrack"/>
-    <id name="switchThumb"/>
-
-    <id name="stub0"/>
-    <id name="stub1"/>
-    <id name="stub2"/>
-    <id name="stub3"/>
-    <id name="stub4"/>
-    <id name="stub5"/>
-    <id name="stub6"/>
-    <id name="stub7"/>
-    <id name="stub8"/>
-    <id name="stub9"/>
+    <id name="checkBoxIcon" />
+    <id name="checkBoxText" />
+    <id name="glanceView" />
+    <id name="glanceViewStub" />
+    <id name="relativeLayout" />
+    <id name="sizeView" />
+    <id name="sizeViewStub" />
+    <id name="switchText" />
+    <id name="switchTrack" />
+    <id name="switchThumb" />
 </resources>
diff --git a/glance/glance-appwidget/src/main/res/values/styles.xml b/glance/glance-appwidget/src/main/res/values/styles.xml
new file mode 100644
index 0000000..42fb090
--- /dev/null
+++ b/glance/glance-appwidget/src/main/res/values/styles.xml
@@ -0,0 +1,33 @@
+<?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.
+  -->
+
+<resources>
+    <style name="Glance.AppWidget.Box" parent=""/>
+    <style name="Glance.AppWidget.Button" parent=""/>
+    <style name="Glance.AppWidget.CheckBox" parent=""/>
+    <style name="Glance.AppWidget.CheckBoxBackport" parent=""/>
+    <style name="Glance.AppWidget.CheckBoxIcon" parent=""/>
+    <style name="Glance.AppWidget.CheckBoxText" parent=""/>
+    <style name="Glance.AppWidget.Column" parent=""/>
+    <style name="Glance.AppWidget.List" parent=""/>
+    <style name="Glance.AppWidget.Row" parent=""/>
+    <style name="Glance.AppWidget.Switch" parent=""/>
+    <style name="Glance.AppWidget.SwitchBackport" parent=""/>
+    <style name="Glance.AppWidget.SwitchText" parent=""/>
+    <style name="Glance.AppWidget.SwitchThumb" parent=""/>
+    <style name="Glance.AppWidget.SwitchTrack" parent=""/>
+    <style name="Glance.AppWidget.Text" parent=""/>
+</resources>
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/ActionRunnableBroadcastReceiverTest.kt b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/ActionRunnableBroadcastReceiverTest.kt
new file mode 100644
index 0000000..1eb8dc8
--- /dev/null
+++ b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/ActionRunnableBroadcastReceiverTest.kt
@@ -0,0 +1,84 @@
+/*
+ * 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.appwidget
+
+import android.app.PendingIntent
+import android.content.Context
+import androidx.glance.action.ActionParameters
+import androidx.glance.action.ActionRunnable
+import androidx.glance.action.actionParametersOf
+import androidx.glance.action.mutableActionParametersOf
+import androidx.test.core.app.ApplicationProvider
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import java.io.Serializable
+import kotlin.test.assertNotEquals
+
+@RunWith(RobolectricTestRunner::class)
+class ActionRunnableBroadcastReceiverTest {
+
+    private val context = ApplicationProvider.getApplicationContext<Context>()
+
+    @Test
+    fun createDifferentPendingIntentsWhenDifferentParameters() {
+        val key = ActionParameters.Key<Boolean>("test")
+        val firstIntent = createPendingIntent(actionParametersOf(key to false))
+        val secondIntent = createPendingIntent(actionParametersOf(key to true))
+
+        assertNotEquals(firstIntent, secondIntent)
+    }
+
+    @Test
+    fun createDifferentPendingIntentsWithSameParameterInstanceButDifferentValue() {
+        val key = ActionParameters.Key<Boolean>("test")
+        val params = mutableActionParametersOf(key to false)
+        val firstIntent = createPendingIntent(params)
+
+        // Changing key value should create a different PI
+        params[key] = true
+        val secondIntent = createPendingIntent(params)
+
+        assertNotEquals(firstIntent, secondIntent)
+    }
+
+    @Test
+    fun createDifferentPendingIntentsWithSameMutableClassButDifferentValue() {
+        val key = ActionParameters.Key<PlaceholderMutableClass>("test")
+        val placeholder = PlaceholderMutableClass(false)
+        val firstIntent = createPendingIntent(actionParametersOf(key to placeholder))
+
+        // Changing the value of the class should create a different PI
+        placeholder.value = true
+        val secondIntent = createPendingIntent(actionParametersOf(key to placeholder))
+
+        assertNotEquals(firstIntent, secondIntent)
+    }
+
+    private fun createPendingIntent(parameters: ActionParameters): PendingIntent {
+        return ActionRunnableBroadcastReceiver.createPendingIntent(
+            context = context,
+            runnableClass = ActionRunnable::class.java,
+            appWidgetClass = GlanceAppWidget::class.java,
+            appWidgetId = 1,
+            parameters = parameters
+        )
+    }
+
+    // Placeholder mutable class that does not implement toString()
+    private class PlaceholderMutableClass(var value: Boolean) : Serializable
+}
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/ApplyDimensionModifierTest.kt b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/ApplyDimensionModifierTest.kt
index cfb3b36..3c5238d 100644
--- a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/ApplyDimensionModifierTest.kt
+++ b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/ApplyDimensionModifierTest.kt
@@ -18,10 +18,12 @@
 
 import android.content.Context
 import android.os.Build
+import android.view.View
 import android.view.ViewGroup
 import android.widget.LinearLayout
 import android.widget.TextView
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
+import androidx.glance.appwidget.ViewSubject.Companion.assertThat
 import androidx.glance.appwidget.test.R
 import androidx.glance.layout.Column
 import androidx.glance.layout.Row
@@ -32,6 +34,7 @@
 import androidx.glance.layout.width
 import androidx.glance.layout.wrapContentHeight
 import androidx.glance.layout.wrapContentWidth
+import androidx.compose.ui.unit.dp
 import androidx.test.core.app.ApplicationProvider
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -61,7 +64,7 @@
         val rv = context.runAndTranslate {
             Text(
                 "content",
-                modifier = Modifier.width(R.dimen.standard_dimension)
+                modifier = GlanceModifier.width(R.dimen.standard_dimension)
             )
         }
         val view = context.applyRemoteViews(rv)
@@ -71,8 +74,9 @@
             assertThat(view.layoutParams.width)
                 .isEqualTo(context.resources.getDimensionPixelSize(R.dimen.standard_dimension))
         } else {
-            val textView = view.findView<TextView> { it.id == R.id.sizeView }
+            val textView = view.findView<ViewGroup> { it.id == R.id.sizeView }?.getChildAt(0)
             assertNotNull(textView)
+            assertIs<TextView>(textView)
             val targetWidth = context.resources.getDimensionPixelSize(R.dimen.standard_dimension)
             assertThat(textView.minWidth).isEqualTo(targetWidth)
             assertThat(textView.maxWidth).isEqualTo(targetWidth)
@@ -82,7 +86,7 @@
     @Test
     fun fillWidth() = fakeCoroutineScope.runBlockingTest {
         val rv = context.runAndTranslate {
-            Text("content", modifier = Modifier.fillMaxWidth())
+            Text("content", modifier = GlanceModifier.fillMaxWidth())
         }
         val view = context.applyRemoteViews(rv)
         assertIs<TextView>(view)
@@ -92,7 +96,7 @@
     @Test
     fun wrapWidth() = fakeCoroutineScope.runBlockingTest {
         val rv = context.runAndTranslate {
-            Text("content", modifier = Modifier.wrapContentWidth())
+            Text("content", modifier = GlanceModifier.wrapContentWidth())
         }
         val view = context.applyRemoteViews(rv)
         assertIs<TextView>(view)
@@ -103,7 +107,7 @@
     fun expandWidth() = fakeCoroutineScope.runBlockingTest {
         val rv = context.runAndTranslate {
             Row {
-                Text("content", modifier = Modifier.defaultWeight())
+                Text("content", modifier = GlanceModifier.defaultWeight())
             }
         }
         val view = context.applyRemoteViews(rv)
@@ -117,7 +121,7 @@
     @Test
     fun fillResourceWidth() = fakeCoroutineScope.runBlockingTest {
         val rv = context.runAndTranslate {
-            Text("content", modifier = Modifier.width(R.dimen.fill_dimension))
+            Text("content", modifier = GlanceModifier.width(R.dimen.fill_dimension))
         }
         val view = context.applyRemoteViews(rv)
         assertIs<TextView>(view)
@@ -127,7 +131,7 @@
     @Test
     fun wrapResourceWidth() = fakeCoroutineScope.runBlockingTest {
         val rv = context.runAndTranslate {
-            Text("content", modifier = Modifier.width(R.dimen.wrap_dimension))
+            Text("content", modifier = GlanceModifier.width(R.dimen.wrap_dimension))
         }
         val view = context.applyRemoteViews(rv)
         assertIs<TextView>(view)
@@ -139,7 +143,7 @@
         val rv = context.runAndTranslate {
             Text(
                 "content",
-                modifier = Modifier.height(R.dimen.standard_dimension)
+                modifier = GlanceModifier.height(R.dimen.standard_dimension)
             )
         }
         val view = context.applyRemoteViews(rv)
@@ -149,8 +153,9 @@
             assertThat(view.layoutParams.height)
                 .isEqualTo(context.resources.getDimensionPixelSize(R.dimen.standard_dimension))
         } else {
-            val textView = view.findView<TextView> { it.id == R.id.sizeView }
+            val textView = view.findView<ViewGroup> { it.id == R.id.sizeView }?.getChildAt(0)
             assertNotNull(textView)
+            assertIs<TextView>(textView)
             val targetHeight = context.resources.getDimensionPixelSize(R.dimen.standard_dimension)
             assertThat(textView.minHeight).isEqualTo(targetHeight)
             assertThat(textView.maxHeight).isEqualTo(targetHeight)
@@ -160,7 +165,7 @@
     @Test
     fun fillHeight() = fakeCoroutineScope.runBlockingTest {
         val rv = context.runAndTranslate {
-            Text("content", modifier = Modifier.fillMaxHeight())
+            Text("content", modifier = GlanceModifier.fillMaxHeight())
         }
         val view = context.applyRemoteViews(rv)
         assertIs<TextView>(view)
@@ -170,7 +175,7 @@
     @Test
     fun wrapHeight() = fakeCoroutineScope.runBlockingTest {
         val rv = context.runAndTranslate {
-            Text("content", modifier = Modifier.wrapContentHeight())
+            Text("content", modifier = GlanceModifier.wrapContentHeight())
         }
         val view = context.applyRemoteViews(rv)
         assertIs<TextView>(view)
@@ -181,7 +186,7 @@
     fun expandHeight() = fakeCoroutineScope.runBlockingTest {
         val rv = context.runAndTranslate {
             Column {
-                Text("content", modifier = Modifier.defaultWeight())
+                Text("content", modifier = GlanceModifier.defaultWeight())
             }
         }
         val view = context.applyRemoteViews(rv)
@@ -195,20 +200,71 @@
     @Test
     fun fillResourceHeight() = fakeCoroutineScope.runBlockingTest {
         val rv = context.runAndTranslate {
-            Text("content", modifier = Modifier.height(R.dimen.fill_dimension))
+            Text("content", modifier = GlanceModifier.height(R.dimen.fill_dimension))
         }
         val view = context.applyRemoteViews(rv)
         assertIs<TextView>(view)
-        assertThat(view.layoutParams.height).isEqualTo(ViewGroup.LayoutParams.MATCH_PARENT)
+        assertThat(view).hasLayoutParamsHeight(ViewGroup.LayoutParams.MATCH_PARENT)
     }
 
     @Test
     fun wrapResourceHeight() = fakeCoroutineScope.runBlockingTest {
         val rv = context.runAndTranslate {
-            Text("content", modifier = Modifier.height(R.dimen.wrap_dimension))
+            Text("content", modifier = GlanceModifier.height(R.dimen.wrap_dimension))
         }
         val view = context.applyRemoteViews(rv)
         assertIs<TextView>(view)
-        assertThat(view.layoutParams.height).isEqualTo(ViewGroup.LayoutParams.WRAP_CONTENT)
+        assertThat(view).hasLayoutParamsHeight(ViewGroup.LayoutParams.WRAP_CONTENT)
+    }
+
+    @Test
+    fun wrapWidth_fillHeight() = fakeCoroutineScope.runBlockingTest {
+        val rv = context.runAndTranslate {
+            Text("content", modifier = GlanceModifier.wrapContentWidth().fillMaxHeight())
+        }
+
+        val view = context.applyRemoteViews(rv)
+        assertIs<TextView>(view)
+        assertThat(view).hasLayoutParamsWidth(ViewGroup.LayoutParams.WRAP_CONTENT)
+        assertThat(view).hasLayoutParamsHeight(ViewGroup.LayoutParams.MATCH_PARENT)
+    }
+
+    @Test
+    fun fillWidth_wrapHeight() = fakeCoroutineScope.runBlockingTest {
+        val rv = context.runAndTranslate {
+            Text("content", modifier = GlanceModifier.fillMaxWidth().wrapContentHeight())
+        }
+
+        val view = context.applyRemoteViews(rv)
+        assertIs<TextView>(view)
+        assertThat(view).hasLayoutParamsWidth(ViewGroup.LayoutParams.MATCH_PARENT)
+        assertThat(view).hasLayoutParamsHeight(ViewGroup.LayoutParams.WRAP_CONTENT)
+    }
+
+    @Test
+    fun fillWidth_fixedHeight() = fakeCoroutineScope.runBlockingTest {
+        val rv = context.runAndTranslate {
+            Text("content", modifier = GlanceModifier.fillMaxWidth().height(50.dp))
+        }
+
+        val view = context.applyRemoteViews(rv)
+        assertThat(view).hasLayoutParamsWidth(ViewGroup.LayoutParams.MATCH_PARENT)
+
+        val targetHeight = 50.dp.toPixels(context)
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+            assertIs<TextView>(view)
+            assertThat(view).hasLayoutParamsHeight(targetHeight)
+        } else {
+            val sizeView = getSizingView(view)
+            assertThat(sizeView.minHeight).isEqualTo(targetHeight)
+            assertThat(sizeView.maxHeight).isEqualTo(targetHeight)
+        }
+    }
+
+    private fun getSizingView(view: View): TextView {
+        val sizeView = view.findView<ViewGroup> { it.id == R.id.sizeView }?.getChildAt(0)
+        assertNotNull(sizeView)
+        assertIs<TextView>(sizeView)
+        return sizeView
     }
 }
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/GlanceAppWidgetTest.kt b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/GlanceAppWidgetTest.kt
index cbda718..2b2341c 100644
--- a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/GlanceAppWidgetTest.kt
+++ b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/GlanceAppWidgetTest.kt
@@ -28,11 +28,10 @@
 import androidx.core.os.bundleOf
 import androidx.glance.LocalSize
 import androidx.glance.layout.Text
-import androidx.glance.unit.DpSize
-import androidx.glance.unit.dp
-import androidx.glance.unit.max
-import androidx.glance.unit.min
-import androidx.glance.unit.toSizeF
+import androidx.compose.ui.unit.DpSize
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.max
+import androidx.compose.ui.unit.min
 import androidx.test.core.app.ApplicationProvider
 import com.google.common.truth.Truth.assertThat
 import com.nhaarman.mockitokotlin2.mock
@@ -149,7 +148,7 @@
             val size = LocalSize.current
             Text("${size.width} x ${size.height}")
         }
-        val options = optionsBundleOf(DpSize(100.dp, 50.dp), DpSize(50.dp, 100.dp))
+        val options = optionsBundleOf(listOf(DpSize(100.dp, 50.dp), DpSize(50.dp, 100.dp)))
         val appWidgetManager = mock<AppWidgetManager> {
             on { getAppWidgetInfo(1) }.thenThrow(RuntimeException("This should not be called"))
         }
@@ -205,7 +204,7 @@
             Text("${size.width} x ${size.height}")
         }
         // Note: Landscape fits the 60x80 and 100x70, portrait doesn't fit anything
-        val options = optionsBundleOf(DpSize(125.dp, 90.dp), DpSize(40.0.dp, 120.dp))
+        val options = optionsBundleOf(listOf(DpSize(125.dp, 90.dp), DpSize(40.0.dp, 120.dp)))
         val appWidgetManager = mock<AppWidgetManager> {
             on { getAppWidgetInfo(1) }.thenThrow(RuntimeException("This should not be called"))
         }
@@ -322,7 +321,7 @@
             .isEqualTo(DpSize(50.dp, 50.dp))
     }
 
-    private fun optionsBundleOf(vararg sizes: DpSize): Bundle {
+    private fun optionsBundleOf(sizes: List<DpSize>): Bundle {
         require(sizes.isNotEmpty()) { "There must be at least one size" }
         val (minSize, maxSize) = sizes.fold(sizes[0] to sizes[0]) { acc, s ->
             DpSize(min(acc.first.width, s.width), min(acc.first.height, s.height)) to
@@ -360,5 +359,3 @@
         }
     }
 }
-
-private inline fun <reified T> Collection<T>.toArrayList() = ArrayList<T>(this)
diff --git a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/RemoteViewsTranslatorKtTest.kt b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/RemoteViewsTranslatorKtTest.kt
index 9ba3bcd..796b1e9 100644
--- a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/RemoteViewsTranslatorKtTest.kt
+++ b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/RemoteViewsTranslatorKtTest.kt
@@ -35,7 +35,7 @@
 import android.widget.TextView
 import androidx.compose.runtime.Composable
 import androidx.core.view.children
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.action.actionLaunchActivity
 import androidx.glance.appwidget.ViewSubject.Companion.assertThat
 import androidx.glance.appwidget.layout.AndroidRemoteViews
@@ -54,9 +54,9 @@
 import androidx.glance.layout.padding
 import androidx.glance.text.TextDecoration
 import androidx.glance.text.TextStyle
-import androidx.glance.unit.Color
-import androidx.glance.unit.Dp
-import androidx.glance.unit.dp
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
 import androidx.test.core.app.ApplicationProvider
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -182,7 +182,7 @@
     fun canTranslatePaddingModifier() = fakeCoroutineScope.runBlockingTest {
         val rv = context.runAndTranslate {
             Box(
-                modifier = Modifier.padding(
+                modifier = GlanceModifier.padding(
                     start = 4.dp,
                     end = 5.dp,
                     top = 6.dp,
@@ -203,7 +203,7 @@
     fun canTranslatePaddingRTL() = fakeCoroutineScope.runBlockingTest {
         val rv = context.runAndTranslateInRtl {
             Box(
-                modifier = Modifier.padding(
+                modifier = GlanceModifier.padding(
                     start = 4.dp,
                     end = 5.dp,
                     top = 6.dp,
@@ -224,7 +224,7 @@
     fun canTranslateAbsolutePaddingRTL() = fakeCoroutineScope.runBlockingTest {
         val rv = context.runAndTranslateInRtl {
             Box(
-                modifier = Modifier.absolutePadding(
+                modifier = GlanceModifier.absolutePadding(
                     left = 4.dp,
                     right = 5.dp,
                     top = 6.dp,
@@ -361,7 +361,7 @@
     fun canTranslateRowPaddingModifier() = fakeCoroutineScope.runBlockingTest {
         val rv = context.runAndTranslate {
             Row(
-                modifier = Modifier.padding(
+                modifier = GlanceModifier.padding(
                     start = 17.dp,
                     end = 16.dp,
                     top = 15.dp,
@@ -382,7 +382,7 @@
     fun canTranslateColumnPaddingModifier() = fakeCoroutineScope.runBlockingTest {
         val rv = context.runAndTranslate {
             Column(
-                modifier = Modifier.padding(
+                modifier = GlanceModifier.padding(
                     start = 13.dp,
                     end = 12.dp,
                     top = 11.dp,
@@ -403,7 +403,7 @@
     fun canTranslateRowPaddingRTL() = fakeCoroutineScope.runBlockingTest {
         val rv = context.runAndTranslateInRtl {
             Row(
-                modifier = Modifier.padding(
+                modifier = GlanceModifier.padding(
                     start = 4.dp,
                     end = 5.dp,
                     top = 6.dp,
@@ -424,7 +424,7 @@
     fun canTranslateColumnPaddingRTL() = fakeCoroutineScope.runBlockingTest {
         val rv = context.runAndTranslateInRtl {
             Column(
-                modifier = Modifier.padding(
+                modifier = GlanceModifier.padding(
                     start = 8.dp,
                     end = 9.dp,
                     top = 10.dp,
@@ -445,7 +445,7 @@
     fun canTranslateRowAbsolutePaddingRTL() = fakeCoroutineScope.runBlockingTest {
         val rv = context.runAndTranslateInRtl {
             Row(
-                modifier = Modifier.absolutePadding(
+                modifier = GlanceModifier.absolutePadding(
                     left = 12.dp,
                     right = 13.dp,
                     top = 14.dp,
@@ -466,7 +466,7 @@
     fun canTranslateColumnAbsolutePaddingRTL() = fakeCoroutineScope.runBlockingTest {
         val rv = context.runAndTranslateInRtl {
             Column(
-                modifier = Modifier.absolutePadding(
+                modifier = GlanceModifier.absolutePadding(
                     left = 16.dp,
                     right = 17.dp,
                     top = 18.dp,
@@ -538,6 +538,7 @@
         }
     }
 
+    /* TODO(b/202868171): Restore after viewStub are implemented
     @Test
     fun canTranslateLazyColumn_maximumLists() = fakeCoroutineScope.runBlockingTest {
         val rv = runAndTranslate {
@@ -564,6 +565,7 @@
             }
         }
     }
+     */
 
     @Test
     fun cannotTranslateNestedLists() = fakeCoroutineScope.runBlockingTest {
@@ -717,7 +719,7 @@
     @Test
     fun canTranslateBackground_red() = fakeCoroutineScope.runBlockingTest {
         val rv = runAndTranslate {
-            Box(modifier = Modifier.background(Color.Red)) {}
+            Box(modifier = GlanceModifier.background(Color.Red)) {}
         }
 
         val view = context.applyRemoteViews(rv)
@@ -728,7 +730,9 @@
     @Test
     fun canTranslateBackground_partialColor() = fakeCoroutineScope.runBlockingTest {
         val rv = runAndTranslate {
-            Box(modifier = Modifier.background(Color(red = 0.4f, green = 0.5f, blue = 0.6f))) {}
+            Box(
+                modifier = GlanceModifier.background(Color(red = 0.4f, green = 0.5f, blue = 0.6f))
+            ) {}
         }
 
         val view = context.applyRemoteViews(rv)
@@ -739,7 +743,7 @@
     @Test
     fun canTranslateBackground_transparent() = fakeCoroutineScope.runBlockingTest {
         val rv = runAndTranslate {
-            Box(modifier = Modifier.background(Color.Transparent)) {}
+            Box(modifier = GlanceModifier.background(Color.Transparent)) {}
         }
 
         val view = context.applyRemoteViews(rv)
@@ -751,7 +755,7 @@
     @Test
     fun canTranslateBackground_resId() = fakeCoroutineScope.runBlockingTest {
         val rv = runAndTranslate {
-            Box(modifier = Modifier.background(R.color.my_color)) {}
+            Box(modifier = GlanceModifier.background(R.color.my_color)) {}
         }
 
         assertThat(lightContext.applyRemoteViews(rv)).hasBackgroundColor("#EEEEEE")
@@ -762,7 +766,7 @@
     @Test
     fun canTranslateBackground_dayNight_light() = fakeCoroutineScope.runBlockingTest {
         val rv = runAndTranslate(context = lightContext) {
-            Box(modifier = Modifier.background(day = Color.Red, night = Color.Blue)) {}
+            Box(modifier = GlanceModifier.background(day = Color.Red, night = Color.Blue)) {}
         }
 
         val view = lightContext.applyRemoteViews(rv)
@@ -774,7 +778,7 @@
     @Test
     fun canTranslateBackground_dayNight_dark() = fakeCoroutineScope.runBlockingTest {
         val rv = runAndTranslate(context = darkContext) {
-            Box(modifier = Modifier.background(day = Color.Red, night = Color.Blue)) {}
+            Box(modifier = GlanceModifier.background(day = Color.Red, night = Color.Blue)) {}
         }
 
         val view = darkContext.applyRemoteViews(rv)
@@ -807,7 +811,7 @@
         content: @Composable () -> Unit
     ): RemoteViews {
         val root = runTestingComposition(content)
-        return translateComposition(context, appWidgetId, root)
+        return translateComposition(context, appWidgetId, TestWidget::class.java, root)
     }
 
     private fun configurationContext(modifier: Configuration.() -> Unit): Context {
diff --git a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/TestUtils.kt b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/TestUtils.kt
index 4ee330d..17afe57 100644
--- a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/TestUtils.kt
+++ b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/TestUtils.kt
@@ -25,15 +25,17 @@
 import android.util.TypedValue
 import android.view.View
 import android.view.ViewGroup
+import android.view.ViewGroup.LayoutParams
+import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
 import android.widget.FrameLayout
 import android.widget.RemoteViews
 import androidx.compose.runtime.BroadcastFrameClock
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Composition
 import androidx.compose.runtime.Recomposer
+import androidx.compose.ui.unit.TextUnit
 import androidx.core.view.children
 import androidx.glance.Applier
-import androidx.glance.unit.Sp
 import kotlinx.coroutines.coroutineScope
 import kotlinx.coroutines.currentCoroutineContext
 import kotlinx.coroutines.launch
@@ -64,7 +66,9 @@
         rv.writeToParcel(p, 0)
         p.setDataPosition(0)
         val parceled = RemoteViews(p)
-        parceled.apply(this, FrameLayout(this))
+        val parent = FrameLayout(this)
+        parent.layoutParams = LayoutParams(WRAP_CONTENT, WRAP_CONTENT)
+        parceled.apply(this, parent)
     } finally {
         p.recycle()
     }
@@ -75,7 +79,7 @@
     content: @Composable () -> Unit
 ): RemoteViews {
     val root = runTestingComposition(content)
-    return translateComposition(this, appWidgetId, root)
+    return translateComposition(this, appWidgetId, TestWidget::class.java, root)
 }
 
 internal suspend fun Context.runAndTranslateInRtl(
@@ -98,9 +102,11 @@
 ): AppWidgetProviderInfo =
     AppWidgetProviderInfo().apply(builder)
 
-internal fun Sp.toPixels(displayMetrics: DisplayMetrics) =
+internal fun TextUnit.toPixels(displayMetrics: DisplayMetrics) =
     TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, value, displayMetrics).toInt()
 
+internal inline fun <reified T> Collection<T>.toArrayList() = ArrayList<T>(this)
+
 inline fun <reified T : View> View.findView(noinline pred: (T) -> Boolean) =
     findView(pred, T::class.java)
 
@@ -121,3 +127,8 @@
     }
     return children.mapNotNull { it.findView(predicate, klass) }.firstOrNull()
 }
+
+internal class TestWidget : GlanceAppWidget() {
+    @Composable
+    override fun Content() {}
+}
diff --git a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/ViewSubject.kt b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/ViewSubject.kt
index 36ca5c6..4d3df29 100644
--- a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/ViewSubject.kt
+++ b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/ViewSubject.kt
@@ -19,9 +19,12 @@
 import android.graphics.drawable.ColorDrawable
 import android.view.View
 import androidx.annotation.ColorInt
+import androidx.annotation.Px
+import androidx.compose.ui.unit.Dp
 import com.google.common.truth.FailureMetadata
 import com.google.common.truth.Subject
 import com.google.common.truth.Truth.assertAbout
+import kotlin.test.assertNotNull
 
 internal class ViewSubject<V : View>(
     metaData: FailureMetadata,
@@ -42,6 +45,24 @@
     fun hasBackgroundColor(hexString: String) =
         hasBackgroundColor(android.graphics.Color.parseColor(hexString))
 
+    fun hasLayoutParamsWidth(@Px px: Int) {
+        check("getLayoutParams().width").that(actual?.layoutParams?.width).isEqualTo(px)
+    }
+
+    fun hasLayoutParamsWidth(dp: Dp) {
+        assertNotNull(actual)
+        hasLayoutParamsWidth(dp.toPixels(actual.context))
+    }
+
+    fun hasLayoutParamsHeight(@Px px: Int) {
+        check("getLayoutParams().height").that(actual?.layoutParams?.height).isEqualTo(px)
+    }
+
+    fun hasLayoutParamsHeight(dp: Dp) {
+        assertNotNull(actual)
+        hasLayoutParamsHeight(dp.toPixels(actual.context))
+    }
+
     companion object {
         internal fun <V : View> views(): Factory<ViewSubject<V>, V> {
             return Factory<ViewSubject<V>, V> { metadata, actual -> ViewSubject(metadata, actual) }
diff --git a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/action/LaunchActivityIntentActionTest.kt b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/action/LaunchActivityIntentActionTest.kt
index 8aa0fc6..0284863 100644
--- a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/action/LaunchActivityIntentActionTest.kt
+++ b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/action/LaunchActivityIntentActionTest.kt
@@ -19,7 +19,7 @@
 import android.app.Activity
 import android.content.Context
 import android.content.Intent
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.action.ActionModifier
 import androidx.glance.action.clickable
 import androidx.glance.findModifier
@@ -41,7 +41,7 @@
     fun testLaunchIntent() {
         val intentActionString = "test_action"
         val intent = Intent(context, TestActivity::class.java).setAction(intentActionString)
-        val modifiers = Modifier.clickable(launchActivityAction(intent))
+        val modifiers = GlanceModifier.clickable(actionLaunchActivity(intent))
         val modifier = checkNotNull(modifiers.findModifier<ActionModifier>())
         val action = assertIs<LaunchActivityIntentAction>(modifier.action)
         assertThat(action.intent).isEqualTo(intent)
diff --git a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/translators/TextTranslatorTest.kt b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/translators/TextTranslatorTest.kt
index ffcbd93..5ce5fac 100644
--- a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/translators/TextTranslatorTest.kt
+++ b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/translators/TextTranslatorTest.kt
@@ -29,7 +29,8 @@
 import android.view.Gravity
 import android.widget.LinearLayout
 import android.widget.TextView
-import androidx.glance.Modifier
+import androidx.compose.ui.unit.sp
+import androidx.glance.GlanceModifier
 import androidx.glance.appwidget.applyRemoteViews
 import androidx.glance.appwidget.runAndTranslate
 import androidx.glance.appwidget.runAndTranslateInRtl
@@ -42,7 +43,6 @@
 import androidx.glance.text.TextAlign
 import androidx.glance.text.TextDecoration
 import androidx.glance.text.TextStyle
-import androidx.glance.unit.sp
 import androidx.test.core.app.ApplicationProvider
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -184,7 +184,7 @@
     @Test
     fun canTranslateText_withAlignments() = fakeCoroutineScope.runBlockingTest {
         val rv = context.runAndTranslate {
-            Column(modifier = Modifier.fillMaxWidth()) {
+            Column(modifier = GlanceModifier.fillMaxWidth()) {
                 Text("Center", style = TextStyle(textAlign = TextAlign.Center))
                 Text("Left", style = TextStyle(textAlign = TextAlign.Left))
                 Text("Right", style = TextStyle(textAlign = TextAlign.Right))
@@ -230,7 +230,7 @@
     @Test
     fun canTranslateText_withAlignmentsInRtl() = fakeCoroutineScope.runBlockingTest {
         val rv = context.runAndTranslateInRtl {
-            Column(modifier = Modifier.fillMaxWidth()) {
+            Column(modifier = GlanceModifier.fillMaxWidth()) {
                 Text("Center", style = TextStyle(textAlign = TextAlign.Center))
                 Text("Left", style = TextStyle(textAlign = TextAlign.Left))
                 Text("Right", style = TextStyle(textAlign = TextAlign.Right))
diff --git a/glance/glance-wear/api/current.txt b/glance/glance-wear/api/current.txt
index 43aefd6..7f5416c 100644
--- a/glance/glance-wear/api/current.txt
+++ b/glance/glance-wear/api/current.txt
@@ -34,20 +34,20 @@
   }
 
   public final class CurvedRowKt {
-    method @androidx.compose.runtime.Composable public static void CurvedRow(optional androidx.glance.Modifier modifier, optional float anchorDegrees, optional int anchorType, optional int radialAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.wear.layout.CurvedRowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void CurvedRow(optional androidx.glance.GlanceModifier modifier, optional float anchorDegrees, optional int anchorType, optional int radialAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.wear.layout.CurvedRowScope,kotlin.Unit> content);
   }
 
   public final class CurvedRowScope {
     ctor public CurvedRowScope();
-    method @androidx.compose.runtime.Composable public void CurvedText(String text, optional androidx.glance.Modifier modifier, optional androidx.glance.wear.layout.CurvedTextStyle? textStyle);
+    method @androidx.compose.runtime.Composable public void CurvedText(String text, optional androidx.glance.GlanceModifier modifier, optional androidx.glance.wear.layout.CurvedTextStyle? textStyle);
   }
 
   @androidx.compose.runtime.Immutable public final class CurvedTextStyle {
-    ctor public CurvedTextStyle(optional androidx.glance.unit.Sp? fontSize, optional androidx.glance.text.FontWeight? fontWeight, optional androidx.glance.text.FontStyle? fontStyle);
-    method public androidx.glance.unit.Sp? getFontSize();
+    ctor public CurvedTextStyle(optional androidx.compose.ui.unit.TextUnit? fontSize, optional androidx.glance.text.FontWeight? fontWeight, optional androidx.glance.text.FontStyle? fontStyle);
+    method public androidx.compose.ui.unit.TextUnit? getFontSize();
     method public androidx.glance.text.FontStyle? getFontStyle();
     method public androidx.glance.text.FontWeight? getFontWeight();
-    property public final androidx.glance.unit.Sp? fontSize;
+    property public final androidx.compose.ui.unit.TextUnit? fontSize;
     property public final androidx.glance.text.FontStyle? fontStyle;
     property public final androidx.glance.text.FontWeight? fontWeight;
   }
diff --git a/glance/glance-wear/api/public_plus_experimental_current.txt b/glance/glance-wear/api/public_plus_experimental_current.txt
index 43aefd6..7f5416c 100644
--- a/glance/glance-wear/api/public_plus_experimental_current.txt
+++ b/glance/glance-wear/api/public_plus_experimental_current.txt
@@ -34,20 +34,20 @@
   }
 
   public final class CurvedRowKt {
-    method @androidx.compose.runtime.Composable public static void CurvedRow(optional androidx.glance.Modifier modifier, optional float anchorDegrees, optional int anchorType, optional int radialAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.wear.layout.CurvedRowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void CurvedRow(optional androidx.glance.GlanceModifier modifier, optional float anchorDegrees, optional int anchorType, optional int radialAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.wear.layout.CurvedRowScope,kotlin.Unit> content);
   }
 
   public final class CurvedRowScope {
     ctor public CurvedRowScope();
-    method @androidx.compose.runtime.Composable public void CurvedText(String text, optional androidx.glance.Modifier modifier, optional androidx.glance.wear.layout.CurvedTextStyle? textStyle);
+    method @androidx.compose.runtime.Composable public void CurvedText(String text, optional androidx.glance.GlanceModifier modifier, optional androidx.glance.wear.layout.CurvedTextStyle? textStyle);
   }
 
   @androidx.compose.runtime.Immutable public final class CurvedTextStyle {
-    ctor public CurvedTextStyle(optional androidx.glance.unit.Sp? fontSize, optional androidx.glance.text.FontWeight? fontWeight, optional androidx.glance.text.FontStyle? fontStyle);
-    method public androidx.glance.unit.Sp? getFontSize();
+    ctor public CurvedTextStyle(optional androidx.compose.ui.unit.TextUnit? fontSize, optional androidx.glance.text.FontWeight? fontWeight, optional androidx.glance.text.FontStyle? fontStyle);
+    method public androidx.compose.ui.unit.TextUnit? getFontSize();
     method public androidx.glance.text.FontStyle? getFontStyle();
     method public androidx.glance.text.FontWeight? getFontWeight();
-    property public final androidx.glance.unit.Sp? fontSize;
+    property public final androidx.compose.ui.unit.TextUnit? fontSize;
     property public final androidx.glance.text.FontStyle? fontStyle;
     property public final androidx.glance.text.FontWeight? fontWeight;
   }
diff --git a/glance/glance-wear/api/restricted_current.txt b/glance/glance-wear/api/restricted_current.txt
index 43aefd6..7f5416c 100644
--- a/glance/glance-wear/api/restricted_current.txt
+++ b/glance/glance-wear/api/restricted_current.txt
@@ -34,20 +34,20 @@
   }
 
   public final class CurvedRowKt {
-    method @androidx.compose.runtime.Composable public static void CurvedRow(optional androidx.glance.Modifier modifier, optional float anchorDegrees, optional int anchorType, optional int radialAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.wear.layout.CurvedRowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void CurvedRow(optional androidx.glance.GlanceModifier modifier, optional float anchorDegrees, optional int anchorType, optional int radialAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.wear.layout.CurvedRowScope,kotlin.Unit> content);
   }
 
   public final class CurvedRowScope {
     ctor public CurvedRowScope();
-    method @androidx.compose.runtime.Composable public void CurvedText(String text, optional androidx.glance.Modifier modifier, optional androidx.glance.wear.layout.CurvedTextStyle? textStyle);
+    method @androidx.compose.runtime.Composable public void CurvedText(String text, optional androidx.glance.GlanceModifier modifier, optional androidx.glance.wear.layout.CurvedTextStyle? textStyle);
   }
 
   @androidx.compose.runtime.Immutable public final class CurvedTextStyle {
-    ctor public CurvedTextStyle(optional androidx.glance.unit.Sp? fontSize, optional androidx.glance.text.FontWeight? fontWeight, optional androidx.glance.text.FontStyle? fontStyle);
-    method public androidx.glance.unit.Sp? getFontSize();
+    ctor public CurvedTextStyle(optional androidx.compose.ui.unit.TextUnit? fontSize, optional androidx.glance.text.FontWeight? fontWeight, optional androidx.glance.text.FontStyle? fontStyle);
+    method public androidx.compose.ui.unit.TextUnit? getFontSize();
     method public androidx.glance.text.FontStyle? getFontStyle();
     method public androidx.glance.text.FontWeight? getFontWeight();
-    property public final androidx.glance.unit.Sp? fontSize;
+    property public final androidx.compose.ui.unit.TextUnit? fontSize;
     property public final androidx.glance.text.FontStyle? fontStyle;
     property public final androidx.glance.text.FontWeight? fontWeight;
   }
diff --git a/glance/glance-wear/build.gradle b/glance/glance-wear/build.gradle
index 0d53cf8..803d4fa 100644
--- a/glance/glance-wear/build.gradle
+++ b/glance/glance-wear/build.gradle
@@ -33,7 +33,9 @@
     kotlinPlugin(project(":compose:compiler:compiler"))
 
     api(project(":glance:glance"))
-    api("androidx.compose.runtime:runtime:1.0.1")
+    api("androidx.compose.runtime:runtime:1.1.0-beta01")
+    api("androidx.compose.ui:ui-graphics:1.1.0-beta01")
+    api("androidx.compose.ui:ui-unit:1.1.0-beta01")
     api("androidx.wear.tiles:tiles:1.0.0-alpha12")
 
     implementation(libs.kotlinStdlib)
diff --git a/glance/glance-wear/src/androidAndroidTest/kotlin/androidx/glance/wear/ScreenshotTests.kt b/glance/glance-wear/src/androidAndroidTest/kotlin/androidx/glance/wear/ScreenshotTests.kt
index fd539d8..0f79f65 100644
--- a/glance/glance-wear/src/androidAndroidTest/kotlin/androidx/glance/wear/ScreenshotTests.kt
+++ b/glance/glance-wear/src/androidAndroidTest/kotlin/androidx/glance/wear/ScreenshotTests.kt
@@ -27,7 +27,7 @@
 import androidx.compose.runtime.Recomposer
 import androidx.core.content.ContextCompat
 import androidx.glance.Applier
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.background
 import androidx.glance.layout.Alignment
 import androidx.glance.layout.Box
@@ -42,9 +42,9 @@
 import androidx.glance.text.FontWeight
 import androidx.glance.text.TextDecoration
 import androidx.glance.text.TextStyle
-import androidx.glance.unit.Color
-import androidx.glance.unit.dp
-import androidx.glance.unit.sp
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
 import androidx.glance.wear.layout.AnchorType
 import androidx.glance.wear.layout.CurvedRow
 import androidx.glance.wear.layout.CurvedTextStyle
@@ -79,19 +79,19 @@
 
     @Test
     fun basicBoxTest() = runSingleGoldenTest("basic-box") {
-        Box(modifier = Modifier.size(100.dp).background(Color.Green)) { }
+        Box(modifier = GlanceModifier.size(100.dp).background(Color.Green)) { }
     }
 
     @Test
     fun rowColumnGrid() = runSingleGoldenTest("row-column-grid") {
         Row {
             Column {
-                Box(modifier = Modifier.size(20.dp).background(Color.Red)) {}
-                Box(modifier = Modifier.size(20.dp).background(Color.Green)) {}
+                Box(modifier = GlanceModifier.size(20.dp).background(Color.Red)) {}
+                Box(modifier = GlanceModifier.size(20.dp).background(Color.Green)) {}
             }
             Column {
-                Box(modifier = Modifier.size(20.dp).background(Color.Blue)) {}
-                Box(modifier = Modifier.size(20.dp).background(Color.Cyan)) {}
+                Box(modifier = GlanceModifier.size(20.dp).background(Color.Blue)) {}
+                Box(modifier = GlanceModifier.size(20.dp).background(Color.Cyan)) {}
             }
         }
     }
@@ -118,14 +118,14 @@
     fun textWithSize() = runSingleGoldenTest("text-with-size") {
         Text(
             text = "Hello World! This is a test",
-            modifier = Modifier.size(200.dp).background(Color.Red)
+            modifier = GlanceModifier.size(200.dp).background(Color.Red)
         )
     }
 
     @Test
     fun curvedText() = runSingleGoldenTest("curved-text") {
         CurvedRow(
-            modifier = Modifier.background(Color.Blue),
+            modifier = GlanceModifier.background(Color.Blue),
             radialAlignment = RadialAlignment.Center,
             anchorDegrees = -90f,
             anchorType = AnchorType.Center
@@ -138,17 +138,17 @@
     @Test
     fun curvedRowWithNormalElements() = runSingleGoldenTest("curved-row-with-normal-elements") {
         CurvedRow {
-            Box(modifier = Modifier.size(30.dp).background(Color.Red)) {}
-            Box(modifier = Modifier.size(30.dp).background(Color.Green)) {}
-            Box(modifier = Modifier.size(30.dp).background(Color.Blue)) {}
-            Box(modifier = Modifier.size(30.dp).background(Color.Cyan)) {}
-            Box(modifier = Modifier.size(30.dp).background(Color.Magenta)) {}
+            Box(modifier = GlanceModifier.size(30.dp).background(Color.Red)) {}
+            Box(modifier = GlanceModifier.size(30.dp).background(Color.Green)) {}
+            Box(modifier = GlanceModifier.size(30.dp).background(Color.Blue)) {}
+            Box(modifier = GlanceModifier.size(30.dp).background(Color.Cyan)) {}
+            Box(modifier = GlanceModifier.size(30.dp).background(Color.Magenta)) {}
         }
     }
 
     private suspend fun runComposition(content: @Composable () -> Unit) = coroutineScope {
         val root = EmittableBox()
-        root.modifier = Modifier.fillMaxWidth().fillMaxHeight()
+        root.modifier = GlanceModifier.fillMaxWidth().fillMaxHeight()
         root.contentAlignment = Alignment.Center
 
         val applier = Applier(root)
diff --git a/glance/glance-wear/src/androidMain/kotlin/androidx/glance/wear/WearCompositionTranslator.kt b/glance/glance-wear/src/androidMain/kotlin/androidx/glance/wear/WearCompositionTranslator.kt
index 8142f15..3c7a04c 100644
--- a/glance/glance-wear/src/androidMain/kotlin/androidx/glance/wear/WearCompositionTranslator.kt
+++ b/glance/glance-wear/src/androidMain/kotlin/androidx/glance/wear/WearCompositionTranslator.kt
@@ -19,9 +19,10 @@
 import android.content.Context
 import android.view.View
 import android.view.ViewGroup
+import androidx.compose.ui.graphics.toArgb
 import androidx.glance.BackgroundModifier
 import androidx.glance.Emittable
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.action.ActionModifier
 import androidx.glance.action.LaunchActivityAction
 import androidx.glance.action.LaunchActivityClassAction
@@ -47,7 +48,7 @@
 import androidx.glance.unit.ColorProvider
 import androidx.glance.unit.FixedColorProvider
 import androidx.glance.unit.ResourceColorProvider
-import androidx.glance.unit.dp
+import androidx.compose.ui.unit.dp
 import androidx.glance.unit.resolve
 import androidx.glance.wear.layout.AnchorType
 import androidx.glance.wear.layout.CurvedTextStyle
@@ -110,12 +111,12 @@
 
 private fun BackgroundModifier.toProto(context: Context): ModifiersBuilders.Background =
     ModifiersBuilders.Background.Builder()
-        .setColor(argb(this.colorProvider.getColor(context).value.toInt()))
+        .setColor(argb(this.colorProvider.getColor(context)))
         .build()
 
 private fun ColorProvider.getColor(context: Context) = when (this) {
-    is FixedColorProvider -> color
-    is ResourceColorProvider -> resolve(context)
+    is FixedColorProvider -> color.toArgb()
+    is ResourceColorProvider -> resolve(context).toArgb()
     else -> error("Unsupported color provider: $this")
 }
 
@@ -190,12 +191,12 @@
     }
 }
 
-private fun Modifier.getWidth(
+private fun GlanceModifier.getWidth(
     context: Context,
     default: Dimension = Dimension.Wrap
 ): Dimension = findModifier<WidthModifier>()?.width?.resolve(context) ?: default
 
-private fun Modifier.getHeight(
+private fun GlanceModifier.getHeight(
     context: Context,
     default: Dimension = Dimension.Wrap
 ): Dimension = findModifier<HeightModifier>()?.height?.resolve(context) ?: default
@@ -281,7 +282,12 @@
 private fun translateTextStyle(style: TextStyle): LayoutElementBuilders.FontStyle {
     val fontStyleBuilder = LayoutElementBuilders.FontStyle.Builder()
 
-    style.fontSize?.let { fontStyleBuilder.setSize(sp(it.value)) }
+    // TODO(b/203656358): Can we support Em here too?
+    style.fontSize?.let {
+        if (!it.isSp) {
+            throw IllegalArgumentException("Only Sp is supported for font size")
+        }
+        fontStyleBuilder.setSize(sp(it.value)) }
     style.fontStyle?.let { fontStyleBuilder.setItalic(it == FontStyle.Italic) }
     style.fontWeight?.let {
         fontStyleBuilder.setWeight(
@@ -398,7 +404,7 @@
 
 private fun translateModifiers(
     context: Context,
-    modifier: Modifier
+    modifier: GlanceModifier
 ): ModifiersBuilders.Modifiers =
     modifier.foldIn(ModifiersBuilders.Modifiers.Builder()) { builder, element ->
         when (element) {
diff --git a/glance/glance-wear/src/androidMain/kotlin/androidx/glance/wear/layout/AndroidLayoutElement.kt b/glance/glance-wear/src/androidMain/kotlin/androidx/glance/wear/layout/AndroidLayoutElement.kt
index fb2567c..e1f60ff 100644
--- a/glance/glance-wear/src/androidMain/kotlin/androidx/glance/wear/layout/AndroidLayoutElement.kt
+++ b/glance/glance-wear/src/androidMain/kotlin/androidx/glance/wear/layout/AndroidLayoutElement.kt
@@ -20,7 +20,7 @@
 import androidx.compose.runtime.ComposeNode
 import androidx.glance.Applier
 import androidx.glance.Emittable
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.wear.tiles.LayoutElementBuilders
 
 /**
@@ -39,7 +39,7 @@
 }
 
 internal class EmittableAndroidLayoutElement : Emittable {
-    override var modifier: Modifier = Modifier
+    override var modifier: GlanceModifier = GlanceModifier
     lateinit var layoutElement: LayoutElementBuilders.LayoutElement
 
     override fun toString() = "EmittableAndroidLayoutElement()"
diff --git a/glance/glance-wear/src/androidMain/kotlin/androidx/glance/wear/layout/CurvedRow.kt b/glance/glance-wear/src/androidMain/kotlin/androidx/glance/wear/layout/CurvedRow.kt
index 9cb7cf3..2173157 100644
--- a/glance/glance-wear/src/androidMain/kotlin/androidx/glance/wear/layout/CurvedRow.kt
+++ b/glance/glance-wear/src/androidMain/kotlin/androidx/glance/wear/layout/CurvedRow.kt
@@ -19,14 +19,14 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.ComposeNode
 import androidx.compose.runtime.Immutable
+import androidx.compose.ui.unit.TextUnit
 import androidx.glance.Applier
 import androidx.glance.Emittable
 import androidx.glance.EmittableWithChildren
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.text.FontStyle
 import androidx.glance.text.FontWeight
 import androidx.glance.text.TextStyle
-import androidx.glance.unit.Sp
 
 /**
  * The alignment of a [CurvedRow]'s elements, with respect to its anchor angle. This specifies how
@@ -101,7 +101,7 @@
 }
 
 internal class EmittableCurvedRow : EmittableWithChildren() {
-    override var modifier: Modifier = Modifier
+    override var modifier: GlanceModifier = GlanceModifier
 
     var anchorDegrees: Float = 270f
     var anchorType: AnchorType = AnchorType.Center
@@ -109,7 +109,7 @@
 }
 
 internal class EmittableCurvedText : Emittable {
-    override var modifier: Modifier = Modifier
+    override var modifier: GlanceModifier = GlanceModifier
     var text: String = ""
     var textStyle: CurvedTextStyle? = null
 }
@@ -138,7 +138,7 @@
  */
 @Composable
 public fun CurvedRow(
-    modifier: Modifier = Modifier,
+    modifier: GlanceModifier = GlanceModifier,
     anchorDegrees: Float = 270f,
     anchorType: AnchorType = AnchorType.Center,
     radialAlignment: RadialAlignment = RadialAlignment.Center,
@@ -161,7 +161,7 @@
  */
 @Immutable
 public class CurvedTextStyle(
-    public val fontSize: Sp? = null,
+    public val fontSize: TextUnit? = null,
     public val fontWeight: FontWeight? = null,
     public val fontStyle: FontStyle? = null
 ) {
@@ -201,7 +201,7 @@
     @Composable
     public fun CurvedText(
         text: String,
-        modifier: Modifier = Modifier,
+        modifier: GlanceModifier = GlanceModifier,
         textStyle: CurvedTextStyle? = null
     ) {
         ComposeNode<EmittableCurvedText, Applier>(
diff --git a/glance/glance-wear/src/test/kotlin/androidx/glance/wear/WearCompositionTranslatorTest.kt b/glance/glance-wear/src/test/kotlin/androidx/glance/wear/WearCompositionTranslatorTest.kt
index fc3acc0..6f2859bb 100644
--- a/glance/glance-wear/src/test/kotlin/androidx/glance/wear/WearCompositionTranslatorTest.kt
+++ b/glance/glance-wear/src/test/kotlin/androidx/glance/wear/WearCompositionTranslatorTest.kt
@@ -19,7 +19,7 @@
 import android.app.Activity
 import android.content.Context
 import androidx.compose.runtime.Composable
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.background
 import androidx.glance.action.clickable
 import androidx.glance.action.actionLaunchActivity
@@ -39,9 +39,9 @@
 import androidx.glance.text.FontWeight
 import androidx.glance.text.TextDecoration
 import androidx.glance.text.TextStyle
-import androidx.glance.unit.Color
-import androidx.glance.unit.dp
-import androidx.glance.unit.sp
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
 import androidx.glance.wear.layout.AnchorType
 import androidx.glance.wear.layout.AndroidLayoutElement
 import androidx.glance.wear.layout.CurvedRow
@@ -129,7 +129,8 @@
     @Test
     fun canTranslatePaddingModifier() = fakeCoroutineScope.runBlockingTest {
         val content = runAndTranslate {
-            Box(modifier = Modifier.padding(start = 1.dp, top = 2.dp, end = 3.dp, bottom = 4.dp)) {}
+            Box(modifier =
+                GlanceModifier.padding(start = 1.dp, top = 2.dp, end = 3.dp, bottom = 4.dp)) {}
         }
 
         val innerBox =
@@ -145,7 +146,7 @@
     @Test
     fun canTranslateBackgroundModifier() = fakeCoroutineScope.runBlockingTest {
         val content = runAndTranslate {
-            Box(modifier = Modifier.background(Color(0x11223344))) {}
+            Box(modifier = GlanceModifier.background(Color(0x11223344))) {}
         }
 
         val innerBox =
@@ -158,14 +159,15 @@
     @Test
     fun canTranslateBackgroundModifier_resId() = fakeCoroutineScope.runBlockingTest {
         val content = runAndTranslate {
-            Box(modifier = Modifier.background(R.color.color1)) {}
+            Box(modifier = GlanceModifier.background(R.color.color1)) {}
         }
 
         val innerBox =
             (content as LayoutElementBuilders.Box).contents[0] as LayoutElementBuilders.Box
         val background = requireNotNull(innerBox.modifiers!!.background)
 
-        assertThat(background.color!!.argb).isEqualTo(android.graphics.Color.rgb(0xC0, 0xFF, 0xEE))
+        assertThat(background.color!!.argb)
+            .isEqualTo(android.graphics.Color.rgb(0xC0, 0xFF, 0xEE))
     }
 
     @Test
@@ -198,7 +200,10 @@
             Row(
                 verticalAlignment = Alignment.Vertical.CenterVertically,
                 horizontalAlignment = Alignment.Horizontal.CenterHorizontally,
-                modifier = Modifier.fillMaxWidth().height(100.dp).background(Color(0x11223344))
+                modifier = GlanceModifier
+                    .fillMaxWidth()
+                    .height(100.dp)
+                    .background(Color(0x11223344))
             ) {}
         }
 
@@ -256,7 +261,10 @@
             Column(
                 verticalAlignment = Alignment.Vertical.CenterVertically,
                 horizontalAlignment = Alignment.Horizontal.CenterHorizontally,
-                modifier = Modifier.fillMaxHeight().width(100.dp).background(Color(0x11223344))
+                modifier = GlanceModifier
+                    .fillMaxHeight()
+                    .width(100.dp)
+                    .background(Color(0x11223344))
             ) {}
         }
 
@@ -293,7 +301,7 @@
                 fontStyle = FontStyle.Italic,
                 textDecoration = TextDecoration.Underline
             )
-            Text("Hello World", modifier = Modifier.padding(1.dp), style = style)
+            Text("Hello World", modifier = GlanceModifier.padding(1.dp), style = style)
         }
 
         val innerText = (content as LayoutElementBuilders.Box).contents[0]
@@ -309,7 +317,7 @@
     @Test
     fun textWithSizeInflatesInBox() = fakeCoroutineScope.runBlockingTest {
         val content = runAndTranslate {
-            Text("Hello World", modifier = Modifier.size(100.dp).padding(10.dp))
+            Text("Hello World", modifier = GlanceModifier.size(100.dp).padding(10.dp))
         }
 
         val innerBox = (content as LayoutElementBuilders.Box).contents[0] as
@@ -335,7 +343,7 @@
                 anchorDegrees = 20f,
                 radialAlignment = RadialAlignment.Inner,
                 anchorType = AnchorType.End,
-                modifier = Modifier.padding(20.dp)
+                modifier = GlanceModifier.padding(20.dp)
             ) {}
         }
 
@@ -356,7 +364,7 @@
                 anchorDegrees = 20f,
                 radialAlignment = RadialAlignment.Inner,
                 anchorType = AnchorType.End,
-                modifier = Modifier.padding(20.dp).size(10.dp)
+                modifier = GlanceModifier.padding(20.dp).size(10.dp)
             ) {}
         }
 
@@ -432,7 +440,7 @@
     fun canInflateLaunchAction() = fakeCoroutineScope.runBlockingTest {
         val content = runAndTranslate {
             Text(
-                modifier = Modifier.clickable(actionLaunchActivity(TestActivity::class.java)),
+                modifier = GlanceModifier.clickable(actionLaunchActivity(TestActivity::class.java)),
                 text = "Hello World"
             )
         }
@@ -465,7 +473,7 @@
             Button(
                 "Hello World",
                 onClick = actionLaunchActivity(TestActivity::class.java),
-                modifier = Modifier.padding(1.dp),
+                modifier = GlanceModifier.padding(1.dp),
                 style = style
             )
         }
@@ -489,7 +497,7 @@
     fun setSizeFromResource() = fakeCoroutineScope.runBlockingTest {
         val content = runAndTranslate {
             Column(
-                modifier = Modifier.width(R.dimen.dimension1)
+                modifier = GlanceModifier.width(R.dimen.dimension1)
                     .height(R.dimen.dimension2)
             ) {}
         }
diff --git a/glance/glance-wear/src/test/kotlin/androidx/glance/wear/layout/BackgroundTest.kt b/glance/glance-wear/src/test/kotlin/androidx/glance/wear/layout/BackgroundTest.kt
index 6190d10..d2aa0c6 100644
--- a/glance/glance-wear/src/test/kotlin/androidx/glance/wear/layout/BackgroundTest.kt
+++ b/glance/glance-wear/src/test/kotlin/androidx/glance/wear/layout/BackgroundTest.kt
@@ -17,10 +17,11 @@
 package androidx.glance.wear.layout
 
 import androidx.glance.BackgroundModifier
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.background
 import androidx.glance.findModifier
-import androidx.glance.unit.Color
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.toArgb
 import androidx.glance.unit.FixedColorProvider
 import androidx.glance.unit.ResourceColorProvider
 import androidx.glance.wear.test.R
@@ -31,18 +32,21 @@
 class BackgroundTest {
     @Test
     fun canUseBackgroundModifier() {
-        val modifier = Modifier.background(color = Color(0xFF223344u))
+        val modifier = GlanceModifier.background(color = Color(0xFF223344))
 
         val addedModifier = requireNotNull(modifier.findModifier<BackgroundModifier>())
 
         val modifierColors = addedModifier.colorProvider
         assertIs<FixedColorProvider>(modifierColors)
-        assertThat(modifierColors.color.value).isEqualTo(0xFF223344u)
+
+        // Note: 0xFF223344 will coerce to a Long in Kotlin (making the equality test fail).
+        // .toInt() is required here to make the tests work properly.
+        assertThat(modifierColors.color.toArgb()).isEqualTo(0xFF223344.toInt())
     }
 
     @Test
     fun canUseBackgroundModifier_resId() {
-        val modifier = Modifier.background(color = R.color.color1)
+        val modifier = GlanceModifier.background(color = R.color.color1)
 
         val addedModifier = requireNotNull(modifier.findModifier<BackgroundModifier>())
 
diff --git a/glance/glance-wear/src/test/kotlin/androidx/glance/wear/layout/CurvedRowTest.kt b/glance/glance-wear/src/test/kotlin/androidx/glance/wear/layout/CurvedRowTest.kt
index 106fe11..988c969 100644
--- a/glance/glance-wear/src/test/kotlin/androidx/glance/wear/layout/CurvedRowTest.kt
+++ b/glance/glance-wear/src/test/kotlin/androidx/glance/wear/layout/CurvedRowTest.kt
@@ -16,12 +16,12 @@
 
 package androidx.glance.wear.layout
 
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.findModifier
 import androidx.glance.layout.PaddingModifier
 import androidx.glance.layout.padding
-import androidx.glance.unit.dp
-import androidx.glance.unit.sp
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
 import androidx.glance.wear.runTestingComposition
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -44,7 +44,7 @@
     fun createComposableArc() = fakeCoroutineScope.runBlockingTest {
         val root = runTestingComposition {
             CurvedRow(
-                modifier = Modifier.padding(1.dp),
+                modifier = GlanceModifier.padding(1.dp),
                 anchorDegrees = 5f,
                 anchorType = AnchorType.End,
                 radialAlignment = RadialAlignment.Center
@@ -67,7 +67,7 @@
             CurvedRow {
                 CurvedText(
                     text = "Hello World",
-                    modifier = Modifier.padding(5.dp),
+                    modifier = GlanceModifier.padding(5.dp),
                     textStyle = CurvedTextStyle(fontSize = 24.sp)
                 )
             }
diff --git a/glance/glance/api/current.txt b/glance/glance/api/current.txt
index c53e014..3a6612b 100644
--- a/glance/glance/api/current.txt
+++ b/glance/glance/api/current.txt
@@ -2,45 +2,47 @@
 package androidx.glance {
 
   public final class BackgroundKt {
-    method public static androidx.glance.Modifier background(androidx.glance.Modifier, int color);
-    method public static androidx.glance.Modifier background(androidx.glance.Modifier, @ColorRes int color);
-    method public static androidx.glance.Modifier background(androidx.glance.Modifier, androidx.glance.unit.ColorProvider colorProvider);
+    method public static androidx.glance.GlanceModifier background(androidx.glance.GlanceModifier, long color);
+    method public static androidx.glance.GlanceModifier background(androidx.glance.GlanceModifier, @ColorRes int color);
+    method public static androidx.glance.GlanceModifier background(androidx.glance.GlanceModifier, androidx.glance.unit.ColorProvider colorProvider);
   }
 
-  public final class CombinedModifier implements androidx.glance.Modifier {
-    ctor public CombinedModifier(androidx.glance.Modifier outer, androidx.glance.Modifier inner);
-    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.glance.Modifier.Element,java.lang.Boolean> predicate);
-    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.glance.Modifier.Element,java.lang.Boolean> predicate);
-    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.glance.Modifier.Element,? extends R> operation);
-    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.glance.Modifier.Element,? super R,? extends R> operation);
+  public final class CombinedGlanceModifier implements androidx.glance.GlanceModifier {
+    ctor public CombinedGlanceModifier(androidx.glance.GlanceModifier outer, androidx.glance.GlanceModifier inner);
+    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.glance.GlanceModifier.Element,java.lang.Boolean> predicate);
+    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.glance.GlanceModifier.Element,java.lang.Boolean> predicate);
+    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.glance.GlanceModifier.Element,? extends R> operation);
+    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.glance.GlanceModifier.Element,? super R,? extends R> operation);
   }
 
   public final class CompositionLocalsKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> getLocalContext();
-    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.glance.unit.DpSize> getLocalSize();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.DpSize> getLocalSize();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> LocalContext;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.DpSize> LocalSize;
   }
 
-  @androidx.compose.runtime.Stable public interface Modifier {
-    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.glance.Modifier.Element,java.lang.Boolean> predicate);
-    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.glance.Modifier.Element,java.lang.Boolean> predicate);
-    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.glance.Modifier.Element,? extends R> operation);
-    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.glance.Modifier.Element,? super R,? extends R> operation);
-    method public default infix androidx.glance.Modifier then(androidx.glance.Modifier other);
-    field public static final androidx.glance.Modifier.Companion Companion;
+  @androidx.compose.runtime.Stable public interface GlanceModifier {
+    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.glance.GlanceModifier.Element,java.lang.Boolean> predicate);
+    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.glance.GlanceModifier.Element,java.lang.Boolean> predicate);
+    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.glance.GlanceModifier.Element,? extends R> operation);
+    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.glance.GlanceModifier.Element,? super R,? extends R> operation);
+    method public default infix androidx.glance.GlanceModifier then(androidx.glance.GlanceModifier other);
+    field public static final androidx.glance.GlanceModifier.Companion Companion;
   }
 
-  public static final class Modifier.Companion implements androidx.glance.Modifier {
-    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.glance.Modifier.Element,java.lang.Boolean> predicate);
-    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.glance.Modifier.Element,java.lang.Boolean> predicate);
-    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.glance.Modifier.Element,? extends R> operation);
-    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.glance.Modifier.Element,? super R,? extends R> operation);
+  public static final class GlanceModifier.Companion implements androidx.glance.GlanceModifier {
+    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.glance.GlanceModifier.Element,java.lang.Boolean> predicate);
+    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.glance.GlanceModifier.Element,java.lang.Boolean> predicate);
+    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.glance.GlanceModifier.Element,? extends R> operation);
+    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.glance.GlanceModifier.Element,? super R,? extends R> operation);
   }
 
-  public static interface Modifier.Element extends androidx.glance.Modifier {
-    method public default boolean all(kotlin.jvm.functions.Function1<? super androidx.glance.Modifier.Element,java.lang.Boolean> predicate);
-    method public default boolean any(kotlin.jvm.functions.Function1<? super androidx.glance.Modifier.Element,java.lang.Boolean> predicate);
-    method public default <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.glance.Modifier.Element,? extends R> operation);
-    method public default <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.glance.Modifier.Element,? super R,? extends R> operation);
+  public static interface GlanceModifier.Element extends androidx.glance.GlanceModifier {
+    method public default boolean all(kotlin.jvm.functions.Function1<? super androidx.glance.GlanceModifier.Element,java.lang.Boolean> predicate);
+    method public default boolean any(kotlin.jvm.functions.Function1<? super androidx.glance.GlanceModifier.Element,java.lang.Boolean> predicate);
+    method public default <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.glance.GlanceModifier.Element,? extends R> operation);
+    method public default <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.glance.GlanceModifier.Element,? super R,? extends R> operation);
   }
 
   public final class UtilsKt {
@@ -54,11 +56,34 @@
   }
 
   public final class ActionKt {
-    method public static androidx.glance.Modifier clickable(androidx.glance.Modifier, androidx.glance.action.Action onClick);
+    method public static androidx.glance.GlanceModifier clickable(androidx.glance.GlanceModifier, androidx.glance.action.Action onClick);
+  }
+
+  public abstract class ActionParameters {
+    method public abstract java.util.Map<androidx.glance.action.ActionParameters.Key<?>,java.lang.Object> asMap();
+    method public abstract operator <T> boolean contains(androidx.glance.action.ActionParameters.Key<T> key);
+    method public abstract operator <T> T? get(androidx.glance.action.ActionParameters.Key<T> key);
+  }
+
+  public static final class ActionParameters.Key<T> {
+    ctor public ActionParameters.Key(String name);
+    method public String getName();
+    method public infix androidx.glance.action.ActionParameters.Pair<T> to(T value);
+    property public final String name;
+  }
+
+  public static final class ActionParameters.Pair<T> {
+  }
+
+  public final class ActionParametersKt {
+    method public static androidx.glance.action.ActionParameters actionParametersOf(androidx.glance.action.ActionParameters.Pair<?>... pairs);
+    method public static androidx.glance.action.MutableActionParameters mutableActionParametersOf(androidx.glance.action.ActionParameters.Pair<?>... pairs);
+    method public static androidx.glance.action.MutableActionParameters toMutableParameters(androidx.glance.action.ActionParameters);
+    method public static androidx.glance.action.ActionParameters toParameters(androidx.glance.action.ActionParameters);
   }
 
   public interface ActionRunnable {
-    method public suspend Object? run(android.content.Context context, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public suspend Object? run(android.content.Context context, optional androidx.glance.action.ActionParameters parameters, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
   }
 
   public final class LaunchActivityActionKt {
@@ -67,9 +92,18 @@
     method public static inline <reified T extends android.app.Activity> androidx.glance.action.Action! actionLaunchActivity();
   }
 
+  public final class MutableActionParameters extends androidx.glance.action.ActionParameters {
+    method public java.util.Map<androidx.glance.action.ActionParameters.Key<?>,java.lang.Object> asMap();
+    method public void clear();
+    method public operator <T> boolean contains(androidx.glance.action.ActionParameters.Key<T> key);
+    method public operator <T> T? get(androidx.glance.action.ActionParameters.Key<T> key);
+    method public <T> T? remove(androidx.glance.action.ActionParameters.Key<T> key);
+    method public operator <T> T? set(androidx.glance.action.ActionParameters.Key<T> key, T? value);
+  }
+
   public final class UpdateContentActionKt {
-    method public static <T extends androidx.glance.action.ActionRunnable> androidx.glance.action.Action actionUpdateContent(Class<T> runnable);
-    method public static inline <reified T extends androidx.glance.action.ActionRunnable> androidx.glance.action.Action! actionUpdateContent();
+    method public static <T extends androidx.glance.action.ActionRunnable> androidx.glance.action.Action actionUpdateContent(Class<T> runnable, optional androidx.glance.action.ActionParameters parameters);
+    method public static inline <reified T extends androidx.glance.action.ActionRunnable> androidx.glance.action.Action! actionUpdateContent(optional androidx.glance.action.ActionParameters parameters);
   }
 
 }
@@ -145,59 +179,80 @@
   }
 
   public final class BoxKt {
-    method @androidx.compose.runtime.Composable public static void Box(optional androidx.glance.Modifier modifier, optional androidx.glance.layout.Alignment contentAlignment, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Box(optional androidx.glance.GlanceModifier modifier, optional androidx.glance.layout.Alignment contentAlignment, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
   public final class ButtonKt {
-    method @androidx.compose.runtime.Composable public static void Button(String text, androidx.glance.action.Action onClick, optional androidx.glance.Modifier modifier, optional boolean enabled, optional androidx.glance.text.TextStyle? style);
+    method @androidx.compose.runtime.Composable public static void Button(String text, androidx.glance.action.Action onClick, optional androidx.glance.GlanceModifier modifier, optional boolean enabled, optional androidx.glance.text.TextStyle? style);
   }
 
   public final class ColumnKt {
-    method @androidx.compose.runtime.Composable public static void Column(optional androidx.glance.Modifier modifier, optional int verticalAlignment, optional int horizontalAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Column(optional androidx.glance.GlanceModifier modifier, optional int verticalAlignment, optional int horizontalAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.layout.ColumnScope,kotlin.Unit> content);
   }
 
   public interface ColumnScope {
-    method public androidx.glance.Modifier defaultWeight(androidx.glance.Modifier);
+    method public androidx.glance.GlanceModifier defaultWeight(androidx.glance.GlanceModifier);
+  }
+
+  public final inline class ContentScale {
+    ctor public ContentScale();
+  }
+
+  public static final class ContentScale.Companion {
+    method public int getCrop();
+    method public int getFillBounds();
+    method public int getFit();
+    property public final int Crop;
+    property public final int FillBounds;
+    property public final int Fit;
   }
 
   public final class DimensionKt {
-    method public static androidx.glance.Modifier fillMaxHeight(androidx.glance.Modifier);
-    method public static androidx.glance.Modifier fillMaxSize(androidx.glance.Modifier);
-    method public static androidx.glance.Modifier fillMaxWidth(androidx.glance.Modifier);
-    method public static androidx.glance.Modifier height(androidx.glance.Modifier, float height);
-    method public static androidx.glance.Modifier height(androidx.glance.Modifier, @DimenRes int height);
-    method public static androidx.glance.Modifier size(androidx.glance.Modifier, float size);
-    method public static androidx.glance.Modifier size(androidx.glance.Modifier, @DimenRes int size);
-    method public static androidx.glance.Modifier size(androidx.glance.Modifier, float width, float height);
-    method public static androidx.glance.Modifier size(androidx.glance.Modifier, @DimenRes int width, @DimenRes int height);
-    method public static androidx.glance.Modifier width(androidx.glance.Modifier, float width);
-    method public static androidx.glance.Modifier width(androidx.glance.Modifier, @DimenRes int width);
-    method public static androidx.glance.Modifier wrapContentHeight(androidx.glance.Modifier);
-    method public static androidx.glance.Modifier wrapContentSize(androidx.glance.Modifier);
-    method public static androidx.glance.Modifier wrapContentWidth(androidx.glance.Modifier);
+    method public static androidx.glance.GlanceModifier fillMaxHeight(androidx.glance.GlanceModifier);
+    method public static androidx.glance.GlanceModifier fillMaxSize(androidx.glance.GlanceModifier);
+    method public static androidx.glance.GlanceModifier fillMaxWidth(androidx.glance.GlanceModifier);
+    method public static androidx.glance.GlanceModifier height(androidx.glance.GlanceModifier, float height);
+    method public static androidx.glance.GlanceModifier height(androidx.glance.GlanceModifier, @DimenRes int height);
+    method public static androidx.glance.GlanceModifier size(androidx.glance.GlanceModifier, float size);
+    method public static androidx.glance.GlanceModifier size(androidx.glance.GlanceModifier, @DimenRes int size);
+    method public static androidx.glance.GlanceModifier size(androidx.glance.GlanceModifier, float width, float height);
+    method public static androidx.glance.GlanceModifier size(androidx.glance.GlanceModifier, @DimenRes int width, @DimenRes int height);
+    method public static androidx.glance.GlanceModifier width(androidx.glance.GlanceModifier, float width);
+    method public static androidx.glance.GlanceModifier width(androidx.glance.GlanceModifier, @DimenRes int width);
+    method public static androidx.glance.GlanceModifier wrapContentHeight(androidx.glance.GlanceModifier);
+    method public static androidx.glance.GlanceModifier wrapContentSize(androidx.glance.GlanceModifier);
+    method public static androidx.glance.GlanceModifier wrapContentWidth(androidx.glance.GlanceModifier);
+  }
+
+  public final class ImageKt {
+    method @androidx.compose.runtime.Composable public static void Image(androidx.glance.layout.ImageProvider provider, String? contentDescription, optional androidx.glance.GlanceModifier modifier, optional int contentScale);
+    method public static androidx.glance.layout.ImageProvider ImageProvider(@DrawableRes int resId);
+  }
+
+  public interface ImageProvider {
   }
 
   public final class PaddingKt {
-    method public static androidx.glance.Modifier absolutePadding(androidx.glance.Modifier, optional float left, optional float top, optional float right, optional float bottom);
-    method public static androidx.glance.Modifier absolutePadding(androidx.glance.Modifier, optional @DimenRes int left, optional @DimenRes int top, optional @DimenRes int right, optional @DimenRes int bottom);
-    method public static androidx.glance.Modifier padding(androidx.glance.Modifier, optional float start, optional float top, optional float end, optional float bottom);
-    method public static androidx.glance.Modifier padding(androidx.glance.Modifier, optional @DimenRes int start, optional @DimenRes int top, optional @DimenRes int end, optional @DimenRes int bottom);
-    method public static androidx.glance.Modifier padding(androidx.glance.Modifier, optional float horizontal, optional float vertical);
-    method public static androidx.glance.Modifier padding(androidx.glance.Modifier, optional @DimenRes int horizontal, optional @DimenRes int vertical);
-    method public static androidx.glance.Modifier padding(androidx.glance.Modifier, float all);
-    method public static androidx.glance.Modifier padding(androidx.glance.Modifier, @DimenRes int all);
+    method public static androidx.glance.GlanceModifier absolutePadding(androidx.glance.GlanceModifier, optional float left, optional float top, optional float right, optional float bottom);
+    method public static androidx.glance.GlanceModifier absolutePadding(androidx.glance.GlanceModifier, optional @DimenRes int left, optional @DimenRes int top, optional @DimenRes int right, optional @DimenRes int bottom);
+    method public static androidx.glance.GlanceModifier padding(androidx.glance.GlanceModifier, optional float start, optional float top, optional float end, optional float bottom);
+    method public static androidx.glance.GlanceModifier padding(androidx.glance.GlanceModifier, optional @DimenRes int start, optional @DimenRes int top, optional @DimenRes int end, optional @DimenRes int bottom);
+    method public static androidx.glance.GlanceModifier padding(androidx.glance.GlanceModifier, optional float horizontal, optional float vertical);
+    method public static androidx.glance.GlanceModifier padding(androidx.glance.GlanceModifier, optional @DimenRes int horizontal, optional @DimenRes int vertical);
+    method public static androidx.glance.GlanceModifier padding(androidx.glance.GlanceModifier, float all);
+    method public static androidx.glance.GlanceModifier padding(androidx.glance.GlanceModifier, @DimenRes int all);
   }
 
   public final class RowKt {
-    method @androidx.compose.runtime.Composable public static void Row(optional androidx.glance.Modifier modifier, optional int horizontalAlignment, optional int verticalAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Row(optional androidx.glance.GlanceModifier modifier, optional int horizontalAlignment, optional int verticalAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.layout.RowScope,kotlin.Unit> content);
   }
 
   public interface RowScope {
-    method public androidx.glance.Modifier defaultWeight(androidx.glance.Modifier);
+    method public androidx.glance.GlanceModifier defaultWeight(androidx.glance.GlanceModifier);
   }
 
   public final class TextKt {
-    method @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.glance.Modifier modifier, optional androidx.glance.text.TextStyle? style);
+    method @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.glance.GlanceModifier modifier, optional androidx.glance.text.TextStyle? style);
   }
 
 }
@@ -251,6 +306,8 @@
 
   public final inline class TextDecoration {
     ctor public TextDecoration();
+    method @androidx.compose.runtime.Stable public operator boolean contains(int other);
+    method @androidx.compose.runtime.Stable public operator int plus(int decoration);
   }
 
   public static final class TextDecoration.Companion {
@@ -264,13 +321,13 @@
   }
 
   @androidx.compose.runtime.Immutable public final class TextStyle {
-    ctor public TextStyle(optional androidx.glance.unit.Sp? fontSize, optional androidx.glance.text.FontWeight? fontWeight, optional androidx.glance.text.FontStyle? fontStyle, optional androidx.glance.text.TextAlign? textAlign, optional androidx.glance.text.TextDecoration? textDecoration);
-    method public androidx.glance.unit.Sp? getFontSize();
+    ctor public TextStyle(optional androidx.compose.ui.unit.TextUnit? fontSize, optional androidx.glance.text.FontWeight? fontWeight, optional androidx.glance.text.FontStyle? fontStyle, optional androidx.glance.text.TextAlign? textAlign, optional androidx.glance.text.TextDecoration? textDecoration);
+    method public androidx.compose.ui.unit.TextUnit? getFontSize();
     method public androidx.glance.text.FontStyle? getFontStyle();
     method public androidx.glance.text.FontWeight? getFontWeight();
     method public androidx.glance.text.TextAlign? getTextAlign();
     method public androidx.glance.text.TextDecoration? getTextDecoration();
-    property public final androidx.glance.unit.Sp? fontSize;
+    property public final androidx.compose.ui.unit.TextUnit? fontSize;
     property public final androidx.glance.text.FontStyle? fontStyle;
     property public final androidx.glance.text.FontWeight? fontWeight;
     property public final androidx.glance.text.TextAlign? textAlign;
@@ -281,115 +338,13 @@
 
 package androidx.glance.unit {
 
-  public final inline class Color {
-    ctor public Color();
-    method public int getValue();
-    property public final int value;
-  }
-
-  public static final class Color.Companion {
-    method public int getBlack();
-    method public int getBlue();
-    method public int getCyan();
-    method public int getDarkGray();
-    method public int getGray();
-    method public int getGreen();
-    method public int getLightGray();
-    method public int getMagenta();
-    method public int getRed();
-    method public int getTransparent();
-    method public int getWhite();
-    method public int getYellow();
-    property public final int Black;
-    property public final int Blue;
-    property public final int Cyan;
-    property public final int DarkGray;
-    property public final int Gray;
-    property public final int Green;
-    property public final int LightGray;
-    property public final int Magenta;
-    property public final int Red;
-    property public final int Transparent;
-    property public final int White;
-    property public final int Yellow;
-  }
-
-  public final class ColorKt {
-    method @androidx.compose.runtime.Stable public static int Color(float red, float green, float blue, optional float alpha);
-  }
-
   public interface ColorProvider {
   }
 
   public final class ColorProviderKt {
-    method public static androidx.glance.unit.ColorProvider ColorProvider(int color);
+    method public static androidx.glance.unit.ColorProvider ColorProvider(long color);
     method public static androidx.glance.unit.ColorProvider ColorProvider(@ColorRes int resId);
   }
 
-  public final inline class Dp implements java.lang.Comparable<androidx.glance.unit.Dp> {
-    ctor public Dp();
-    method public operator int compareTo(float other);
-    method public float getValue();
-    property public final float value;
-  }
-
-  public final class DpKt {
-    method public static inline float getDp(int);
-    method public static inline float getDp(double);
-    method public static inline float getDp(float);
-    method public static float max(float a, float b);
-    method public static float min(float a, float b);
-    method public static operator float times(float, float other);
-    method public static operator float times(double, float other);
-    method public static operator float times(int, float other);
-  }
-
-  @androidx.compose.runtime.Immutable public final class DpSize {
-    ctor public DpSize(float width, float height);
-    method @androidx.compose.runtime.Stable public operator float component1();
-    method @androidx.compose.runtime.Stable public operator float component2();
-    method public androidx.glance.unit.DpSize copy(optional float width, optional float height);
-    method @androidx.compose.runtime.Stable public operator androidx.glance.unit.DpSize div(int other);
-    method @androidx.compose.runtime.Stable public operator androidx.glance.unit.DpSize div(float other);
-    method public float getHeight();
-    method public float getWidth();
-    method @androidx.compose.runtime.Stable public operator androidx.glance.unit.DpSize minus(androidx.glance.unit.DpSize other);
-    method @androidx.compose.runtime.Stable public operator androidx.glance.unit.DpSize plus(androidx.glance.unit.DpSize other);
-    method @androidx.compose.runtime.Stable public operator androidx.glance.unit.DpSize times(int other);
-    method @androidx.compose.runtime.Stable public operator androidx.glance.unit.DpSize times(float other);
-    property public final float height;
-    property public final float width;
-    field public static final androidx.glance.unit.DpSize.Companion Companion;
-  }
-
-  public static final class DpSize.Companion {
-    method public androidx.glance.unit.DpSize getZero();
-    property public final androidx.glance.unit.DpSize Zero;
-  }
-
-  public final class DpSizeKt {
-    method @androidx.compose.runtime.Stable public static operator androidx.glance.unit.DpSize times(int, androidx.glance.unit.DpSize size);
-    method @androidx.compose.runtime.Stable public static operator androidx.glance.unit.DpSize times(float, androidx.glance.unit.DpSize size);
-    method @androidx.compose.runtime.Stable public static android.util.SizeF toSizeF(androidx.glance.unit.DpSize);
-  }
-
-  public final inline class Sp implements java.lang.Comparable<androidx.glance.unit.Sp> {
-    ctor public Sp();
-    method public operator int compareTo(float other);
-    method public float getValue();
-    property public final float value;
-  }
-
-  public final class SpKt {
-    method public static inline float getSp(int);
-    method public static inline float getSp(double);
-    method public static inline float getSp(float);
-    method public static float max(float a, float b);
-    method public static float min(float a, float b);
-    method public static operator float times(float, float other);
-    method public static operator float times(double, float other);
-    method public static operator float times(int, float other);
-  }
-
 }
 
diff --git a/glance/glance/api/public_plus_experimental_current.txt b/glance/glance/api/public_plus_experimental_current.txt
index c53e014..3a6612b 100644
--- a/glance/glance/api/public_plus_experimental_current.txt
+++ b/glance/glance/api/public_plus_experimental_current.txt
@@ -2,45 +2,47 @@
 package androidx.glance {
 
   public final class BackgroundKt {
-    method public static androidx.glance.Modifier background(androidx.glance.Modifier, int color);
-    method public static androidx.glance.Modifier background(androidx.glance.Modifier, @ColorRes int color);
-    method public static androidx.glance.Modifier background(androidx.glance.Modifier, androidx.glance.unit.ColorProvider colorProvider);
+    method public static androidx.glance.GlanceModifier background(androidx.glance.GlanceModifier, long color);
+    method public static androidx.glance.GlanceModifier background(androidx.glance.GlanceModifier, @ColorRes int color);
+    method public static androidx.glance.GlanceModifier background(androidx.glance.GlanceModifier, androidx.glance.unit.ColorProvider colorProvider);
   }
 
-  public final class CombinedModifier implements androidx.glance.Modifier {
-    ctor public CombinedModifier(androidx.glance.Modifier outer, androidx.glance.Modifier inner);
-    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.glance.Modifier.Element,java.lang.Boolean> predicate);
-    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.glance.Modifier.Element,java.lang.Boolean> predicate);
-    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.glance.Modifier.Element,? extends R> operation);
-    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.glance.Modifier.Element,? super R,? extends R> operation);
+  public final class CombinedGlanceModifier implements androidx.glance.GlanceModifier {
+    ctor public CombinedGlanceModifier(androidx.glance.GlanceModifier outer, androidx.glance.GlanceModifier inner);
+    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.glance.GlanceModifier.Element,java.lang.Boolean> predicate);
+    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.glance.GlanceModifier.Element,java.lang.Boolean> predicate);
+    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.glance.GlanceModifier.Element,? extends R> operation);
+    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.glance.GlanceModifier.Element,? super R,? extends R> operation);
   }
 
   public final class CompositionLocalsKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> getLocalContext();
-    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.glance.unit.DpSize> getLocalSize();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.DpSize> getLocalSize();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> LocalContext;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.DpSize> LocalSize;
   }
 
-  @androidx.compose.runtime.Stable public interface Modifier {
-    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.glance.Modifier.Element,java.lang.Boolean> predicate);
-    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.glance.Modifier.Element,java.lang.Boolean> predicate);
-    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.glance.Modifier.Element,? extends R> operation);
-    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.glance.Modifier.Element,? super R,? extends R> operation);
-    method public default infix androidx.glance.Modifier then(androidx.glance.Modifier other);
-    field public static final androidx.glance.Modifier.Companion Companion;
+  @androidx.compose.runtime.Stable public interface GlanceModifier {
+    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.glance.GlanceModifier.Element,java.lang.Boolean> predicate);
+    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.glance.GlanceModifier.Element,java.lang.Boolean> predicate);
+    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.glance.GlanceModifier.Element,? extends R> operation);
+    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.glance.GlanceModifier.Element,? super R,? extends R> operation);
+    method public default infix androidx.glance.GlanceModifier then(androidx.glance.GlanceModifier other);
+    field public static final androidx.glance.GlanceModifier.Companion Companion;
   }
 
-  public static final class Modifier.Companion implements androidx.glance.Modifier {
-    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.glance.Modifier.Element,java.lang.Boolean> predicate);
-    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.glance.Modifier.Element,java.lang.Boolean> predicate);
-    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.glance.Modifier.Element,? extends R> operation);
-    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.glance.Modifier.Element,? super R,? extends R> operation);
+  public static final class GlanceModifier.Companion implements androidx.glance.GlanceModifier {
+    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.glance.GlanceModifier.Element,java.lang.Boolean> predicate);
+    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.glance.GlanceModifier.Element,java.lang.Boolean> predicate);
+    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.glance.GlanceModifier.Element,? extends R> operation);
+    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.glance.GlanceModifier.Element,? super R,? extends R> operation);
   }
 
-  public static interface Modifier.Element extends androidx.glance.Modifier {
-    method public default boolean all(kotlin.jvm.functions.Function1<? super androidx.glance.Modifier.Element,java.lang.Boolean> predicate);
-    method public default boolean any(kotlin.jvm.functions.Function1<? super androidx.glance.Modifier.Element,java.lang.Boolean> predicate);
-    method public default <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.glance.Modifier.Element,? extends R> operation);
-    method public default <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.glance.Modifier.Element,? super R,? extends R> operation);
+  public static interface GlanceModifier.Element extends androidx.glance.GlanceModifier {
+    method public default boolean all(kotlin.jvm.functions.Function1<? super androidx.glance.GlanceModifier.Element,java.lang.Boolean> predicate);
+    method public default boolean any(kotlin.jvm.functions.Function1<? super androidx.glance.GlanceModifier.Element,java.lang.Boolean> predicate);
+    method public default <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.glance.GlanceModifier.Element,? extends R> operation);
+    method public default <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.glance.GlanceModifier.Element,? super R,? extends R> operation);
   }
 
   public final class UtilsKt {
@@ -54,11 +56,34 @@
   }
 
   public final class ActionKt {
-    method public static androidx.glance.Modifier clickable(androidx.glance.Modifier, androidx.glance.action.Action onClick);
+    method public static androidx.glance.GlanceModifier clickable(androidx.glance.GlanceModifier, androidx.glance.action.Action onClick);
+  }
+
+  public abstract class ActionParameters {
+    method public abstract java.util.Map<androidx.glance.action.ActionParameters.Key<?>,java.lang.Object> asMap();
+    method public abstract operator <T> boolean contains(androidx.glance.action.ActionParameters.Key<T> key);
+    method public abstract operator <T> T? get(androidx.glance.action.ActionParameters.Key<T> key);
+  }
+
+  public static final class ActionParameters.Key<T> {
+    ctor public ActionParameters.Key(String name);
+    method public String getName();
+    method public infix androidx.glance.action.ActionParameters.Pair<T> to(T value);
+    property public final String name;
+  }
+
+  public static final class ActionParameters.Pair<T> {
+  }
+
+  public final class ActionParametersKt {
+    method public static androidx.glance.action.ActionParameters actionParametersOf(androidx.glance.action.ActionParameters.Pair<?>... pairs);
+    method public static androidx.glance.action.MutableActionParameters mutableActionParametersOf(androidx.glance.action.ActionParameters.Pair<?>... pairs);
+    method public static androidx.glance.action.MutableActionParameters toMutableParameters(androidx.glance.action.ActionParameters);
+    method public static androidx.glance.action.ActionParameters toParameters(androidx.glance.action.ActionParameters);
   }
 
   public interface ActionRunnable {
-    method public suspend Object? run(android.content.Context context, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public suspend Object? run(android.content.Context context, optional androidx.glance.action.ActionParameters parameters, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
   }
 
   public final class LaunchActivityActionKt {
@@ -67,9 +92,18 @@
     method public static inline <reified T extends android.app.Activity> androidx.glance.action.Action! actionLaunchActivity();
   }
 
+  public final class MutableActionParameters extends androidx.glance.action.ActionParameters {
+    method public java.util.Map<androidx.glance.action.ActionParameters.Key<?>,java.lang.Object> asMap();
+    method public void clear();
+    method public operator <T> boolean contains(androidx.glance.action.ActionParameters.Key<T> key);
+    method public operator <T> T? get(androidx.glance.action.ActionParameters.Key<T> key);
+    method public <T> T? remove(androidx.glance.action.ActionParameters.Key<T> key);
+    method public operator <T> T? set(androidx.glance.action.ActionParameters.Key<T> key, T? value);
+  }
+
   public final class UpdateContentActionKt {
-    method public static <T extends androidx.glance.action.ActionRunnable> androidx.glance.action.Action actionUpdateContent(Class<T> runnable);
-    method public static inline <reified T extends androidx.glance.action.ActionRunnable> androidx.glance.action.Action! actionUpdateContent();
+    method public static <T extends androidx.glance.action.ActionRunnable> androidx.glance.action.Action actionUpdateContent(Class<T> runnable, optional androidx.glance.action.ActionParameters parameters);
+    method public static inline <reified T extends androidx.glance.action.ActionRunnable> androidx.glance.action.Action! actionUpdateContent(optional androidx.glance.action.ActionParameters parameters);
   }
 
 }
@@ -145,59 +179,80 @@
   }
 
   public final class BoxKt {
-    method @androidx.compose.runtime.Composable public static void Box(optional androidx.glance.Modifier modifier, optional androidx.glance.layout.Alignment contentAlignment, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Box(optional androidx.glance.GlanceModifier modifier, optional androidx.glance.layout.Alignment contentAlignment, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
   public final class ButtonKt {
-    method @androidx.compose.runtime.Composable public static void Button(String text, androidx.glance.action.Action onClick, optional androidx.glance.Modifier modifier, optional boolean enabled, optional androidx.glance.text.TextStyle? style);
+    method @androidx.compose.runtime.Composable public static void Button(String text, androidx.glance.action.Action onClick, optional androidx.glance.GlanceModifier modifier, optional boolean enabled, optional androidx.glance.text.TextStyle? style);
   }
 
   public final class ColumnKt {
-    method @androidx.compose.runtime.Composable public static void Column(optional androidx.glance.Modifier modifier, optional int verticalAlignment, optional int horizontalAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Column(optional androidx.glance.GlanceModifier modifier, optional int verticalAlignment, optional int horizontalAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.layout.ColumnScope,kotlin.Unit> content);
   }
 
   public interface ColumnScope {
-    method public androidx.glance.Modifier defaultWeight(androidx.glance.Modifier);
+    method public androidx.glance.GlanceModifier defaultWeight(androidx.glance.GlanceModifier);
+  }
+
+  public final inline class ContentScale {
+    ctor public ContentScale();
+  }
+
+  public static final class ContentScale.Companion {
+    method public int getCrop();
+    method public int getFillBounds();
+    method public int getFit();
+    property public final int Crop;
+    property public final int FillBounds;
+    property public final int Fit;
   }
 
   public final class DimensionKt {
-    method public static androidx.glance.Modifier fillMaxHeight(androidx.glance.Modifier);
-    method public static androidx.glance.Modifier fillMaxSize(androidx.glance.Modifier);
-    method public static androidx.glance.Modifier fillMaxWidth(androidx.glance.Modifier);
-    method public static androidx.glance.Modifier height(androidx.glance.Modifier, float height);
-    method public static androidx.glance.Modifier height(androidx.glance.Modifier, @DimenRes int height);
-    method public static androidx.glance.Modifier size(androidx.glance.Modifier, float size);
-    method public static androidx.glance.Modifier size(androidx.glance.Modifier, @DimenRes int size);
-    method public static androidx.glance.Modifier size(androidx.glance.Modifier, float width, float height);
-    method public static androidx.glance.Modifier size(androidx.glance.Modifier, @DimenRes int width, @DimenRes int height);
-    method public static androidx.glance.Modifier width(androidx.glance.Modifier, float width);
-    method public static androidx.glance.Modifier width(androidx.glance.Modifier, @DimenRes int width);
-    method public static androidx.glance.Modifier wrapContentHeight(androidx.glance.Modifier);
-    method public static androidx.glance.Modifier wrapContentSize(androidx.glance.Modifier);
-    method public static androidx.glance.Modifier wrapContentWidth(androidx.glance.Modifier);
+    method public static androidx.glance.GlanceModifier fillMaxHeight(androidx.glance.GlanceModifier);
+    method public static androidx.glance.GlanceModifier fillMaxSize(androidx.glance.GlanceModifier);
+    method public static androidx.glance.GlanceModifier fillMaxWidth(androidx.glance.GlanceModifier);
+    method public static androidx.glance.GlanceModifier height(androidx.glance.GlanceModifier, float height);
+    method public static androidx.glance.GlanceModifier height(androidx.glance.GlanceModifier, @DimenRes int height);
+    method public static androidx.glance.GlanceModifier size(androidx.glance.GlanceModifier, float size);
+    method public static androidx.glance.GlanceModifier size(androidx.glance.GlanceModifier, @DimenRes int size);
+    method public static androidx.glance.GlanceModifier size(androidx.glance.GlanceModifier, float width, float height);
+    method public static androidx.glance.GlanceModifier size(androidx.glance.GlanceModifier, @DimenRes int width, @DimenRes int height);
+    method public static androidx.glance.GlanceModifier width(androidx.glance.GlanceModifier, float width);
+    method public static androidx.glance.GlanceModifier width(androidx.glance.GlanceModifier, @DimenRes int width);
+    method public static androidx.glance.GlanceModifier wrapContentHeight(androidx.glance.GlanceModifier);
+    method public static androidx.glance.GlanceModifier wrapContentSize(androidx.glance.GlanceModifier);
+    method public static androidx.glance.GlanceModifier wrapContentWidth(androidx.glance.GlanceModifier);
+  }
+
+  public final class ImageKt {
+    method @androidx.compose.runtime.Composable public static void Image(androidx.glance.layout.ImageProvider provider, String? contentDescription, optional androidx.glance.GlanceModifier modifier, optional int contentScale);
+    method public static androidx.glance.layout.ImageProvider ImageProvider(@DrawableRes int resId);
+  }
+
+  public interface ImageProvider {
   }
 
   public final class PaddingKt {
-    method public static androidx.glance.Modifier absolutePadding(androidx.glance.Modifier, optional float left, optional float top, optional float right, optional float bottom);
-    method public static androidx.glance.Modifier absolutePadding(androidx.glance.Modifier, optional @DimenRes int left, optional @DimenRes int top, optional @DimenRes int right, optional @DimenRes int bottom);
-    method public static androidx.glance.Modifier padding(androidx.glance.Modifier, optional float start, optional float top, optional float end, optional float bottom);
-    method public static androidx.glance.Modifier padding(androidx.glance.Modifier, optional @DimenRes int start, optional @DimenRes int top, optional @DimenRes int end, optional @DimenRes int bottom);
-    method public static androidx.glance.Modifier padding(androidx.glance.Modifier, optional float horizontal, optional float vertical);
-    method public static androidx.glance.Modifier padding(androidx.glance.Modifier, optional @DimenRes int horizontal, optional @DimenRes int vertical);
-    method public static androidx.glance.Modifier padding(androidx.glance.Modifier, float all);
-    method public static androidx.glance.Modifier padding(androidx.glance.Modifier, @DimenRes int all);
+    method public static androidx.glance.GlanceModifier absolutePadding(androidx.glance.GlanceModifier, optional float left, optional float top, optional float right, optional float bottom);
+    method public static androidx.glance.GlanceModifier absolutePadding(androidx.glance.GlanceModifier, optional @DimenRes int left, optional @DimenRes int top, optional @DimenRes int right, optional @DimenRes int bottom);
+    method public static androidx.glance.GlanceModifier padding(androidx.glance.GlanceModifier, optional float start, optional float top, optional float end, optional float bottom);
+    method public static androidx.glance.GlanceModifier padding(androidx.glance.GlanceModifier, optional @DimenRes int start, optional @DimenRes int top, optional @DimenRes int end, optional @DimenRes int bottom);
+    method public static androidx.glance.GlanceModifier padding(androidx.glance.GlanceModifier, optional float horizontal, optional float vertical);
+    method public static androidx.glance.GlanceModifier padding(androidx.glance.GlanceModifier, optional @DimenRes int horizontal, optional @DimenRes int vertical);
+    method public static androidx.glance.GlanceModifier padding(androidx.glance.GlanceModifier, float all);
+    method public static androidx.glance.GlanceModifier padding(androidx.glance.GlanceModifier, @DimenRes int all);
   }
 
   public final class RowKt {
-    method @androidx.compose.runtime.Composable public static void Row(optional androidx.glance.Modifier modifier, optional int horizontalAlignment, optional int verticalAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Row(optional androidx.glance.GlanceModifier modifier, optional int horizontalAlignment, optional int verticalAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.layout.RowScope,kotlin.Unit> content);
   }
 
   public interface RowScope {
-    method public androidx.glance.Modifier defaultWeight(androidx.glance.Modifier);
+    method public androidx.glance.GlanceModifier defaultWeight(androidx.glance.GlanceModifier);
   }
 
   public final class TextKt {
-    method @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.glance.Modifier modifier, optional androidx.glance.text.TextStyle? style);
+    method @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.glance.GlanceModifier modifier, optional androidx.glance.text.TextStyle? style);
   }
 
 }
@@ -251,6 +306,8 @@
 
   public final inline class TextDecoration {
     ctor public TextDecoration();
+    method @androidx.compose.runtime.Stable public operator boolean contains(int other);
+    method @androidx.compose.runtime.Stable public operator int plus(int decoration);
   }
 
   public static final class TextDecoration.Companion {
@@ -264,13 +321,13 @@
   }
 
   @androidx.compose.runtime.Immutable public final class TextStyle {
-    ctor public TextStyle(optional androidx.glance.unit.Sp? fontSize, optional androidx.glance.text.FontWeight? fontWeight, optional androidx.glance.text.FontStyle? fontStyle, optional androidx.glance.text.TextAlign? textAlign, optional androidx.glance.text.TextDecoration? textDecoration);
-    method public androidx.glance.unit.Sp? getFontSize();
+    ctor public TextStyle(optional androidx.compose.ui.unit.TextUnit? fontSize, optional androidx.glance.text.FontWeight? fontWeight, optional androidx.glance.text.FontStyle? fontStyle, optional androidx.glance.text.TextAlign? textAlign, optional androidx.glance.text.TextDecoration? textDecoration);
+    method public androidx.compose.ui.unit.TextUnit? getFontSize();
     method public androidx.glance.text.FontStyle? getFontStyle();
     method public androidx.glance.text.FontWeight? getFontWeight();
     method public androidx.glance.text.TextAlign? getTextAlign();
     method public androidx.glance.text.TextDecoration? getTextDecoration();
-    property public final androidx.glance.unit.Sp? fontSize;
+    property public final androidx.compose.ui.unit.TextUnit? fontSize;
     property public final androidx.glance.text.FontStyle? fontStyle;
     property public final androidx.glance.text.FontWeight? fontWeight;
     property public final androidx.glance.text.TextAlign? textAlign;
@@ -281,115 +338,13 @@
 
 package androidx.glance.unit {
 
-  public final inline class Color {
-    ctor public Color();
-    method public int getValue();
-    property public final int value;
-  }
-
-  public static final class Color.Companion {
-    method public int getBlack();
-    method public int getBlue();
-    method public int getCyan();
-    method public int getDarkGray();
-    method public int getGray();
-    method public int getGreen();
-    method public int getLightGray();
-    method public int getMagenta();
-    method public int getRed();
-    method public int getTransparent();
-    method public int getWhite();
-    method public int getYellow();
-    property public final int Black;
-    property public final int Blue;
-    property public final int Cyan;
-    property public final int DarkGray;
-    property public final int Gray;
-    property public final int Green;
-    property public final int LightGray;
-    property public final int Magenta;
-    property public final int Red;
-    property public final int Transparent;
-    property public final int White;
-    property public final int Yellow;
-  }
-
-  public final class ColorKt {
-    method @androidx.compose.runtime.Stable public static int Color(float red, float green, float blue, optional float alpha);
-  }
-
   public interface ColorProvider {
   }
 
   public final class ColorProviderKt {
-    method public static androidx.glance.unit.ColorProvider ColorProvider(int color);
+    method public static androidx.glance.unit.ColorProvider ColorProvider(long color);
     method public static androidx.glance.unit.ColorProvider ColorProvider(@ColorRes int resId);
   }
 
-  public final inline class Dp implements java.lang.Comparable<androidx.glance.unit.Dp> {
-    ctor public Dp();
-    method public operator int compareTo(float other);
-    method public float getValue();
-    property public final float value;
-  }
-
-  public final class DpKt {
-    method public static inline float getDp(int);
-    method public static inline float getDp(double);
-    method public static inline float getDp(float);
-    method public static float max(float a, float b);
-    method public static float min(float a, float b);
-    method public static operator float times(float, float other);
-    method public static operator float times(double, float other);
-    method public static operator float times(int, float other);
-  }
-
-  @androidx.compose.runtime.Immutable public final class DpSize {
-    ctor public DpSize(float width, float height);
-    method @androidx.compose.runtime.Stable public operator float component1();
-    method @androidx.compose.runtime.Stable public operator float component2();
-    method public androidx.glance.unit.DpSize copy(optional float width, optional float height);
-    method @androidx.compose.runtime.Stable public operator androidx.glance.unit.DpSize div(int other);
-    method @androidx.compose.runtime.Stable public operator androidx.glance.unit.DpSize div(float other);
-    method public float getHeight();
-    method public float getWidth();
-    method @androidx.compose.runtime.Stable public operator androidx.glance.unit.DpSize minus(androidx.glance.unit.DpSize other);
-    method @androidx.compose.runtime.Stable public operator androidx.glance.unit.DpSize plus(androidx.glance.unit.DpSize other);
-    method @androidx.compose.runtime.Stable public operator androidx.glance.unit.DpSize times(int other);
-    method @androidx.compose.runtime.Stable public operator androidx.glance.unit.DpSize times(float other);
-    property public final float height;
-    property public final float width;
-    field public static final androidx.glance.unit.DpSize.Companion Companion;
-  }
-
-  public static final class DpSize.Companion {
-    method public androidx.glance.unit.DpSize getZero();
-    property public final androidx.glance.unit.DpSize Zero;
-  }
-
-  public final class DpSizeKt {
-    method @androidx.compose.runtime.Stable public static operator androidx.glance.unit.DpSize times(int, androidx.glance.unit.DpSize size);
-    method @androidx.compose.runtime.Stable public static operator androidx.glance.unit.DpSize times(float, androidx.glance.unit.DpSize size);
-    method @androidx.compose.runtime.Stable public static android.util.SizeF toSizeF(androidx.glance.unit.DpSize);
-  }
-
-  public final inline class Sp implements java.lang.Comparable<androidx.glance.unit.Sp> {
-    ctor public Sp();
-    method public operator int compareTo(float other);
-    method public float getValue();
-    property public final float value;
-  }
-
-  public final class SpKt {
-    method public static inline float getSp(int);
-    method public static inline float getSp(double);
-    method public static inline float getSp(float);
-    method public static float max(float a, float b);
-    method public static float min(float a, float b);
-    method public static operator float times(float, float other);
-    method public static operator float times(double, float other);
-    method public static operator float times(int, float other);
-  }
-
 }
 
diff --git a/glance/glance/api/restricted_current.txt b/glance/glance/api/restricted_current.txt
index c53e014..3a6612b 100644
--- a/glance/glance/api/restricted_current.txt
+++ b/glance/glance/api/restricted_current.txt
@@ -2,45 +2,47 @@
 package androidx.glance {
 
   public final class BackgroundKt {
-    method public static androidx.glance.Modifier background(androidx.glance.Modifier, int color);
-    method public static androidx.glance.Modifier background(androidx.glance.Modifier, @ColorRes int color);
-    method public static androidx.glance.Modifier background(androidx.glance.Modifier, androidx.glance.unit.ColorProvider colorProvider);
+    method public static androidx.glance.GlanceModifier background(androidx.glance.GlanceModifier, long color);
+    method public static androidx.glance.GlanceModifier background(androidx.glance.GlanceModifier, @ColorRes int color);
+    method public static androidx.glance.GlanceModifier background(androidx.glance.GlanceModifier, androidx.glance.unit.ColorProvider colorProvider);
   }
 
-  public final class CombinedModifier implements androidx.glance.Modifier {
-    ctor public CombinedModifier(androidx.glance.Modifier outer, androidx.glance.Modifier inner);
-    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.glance.Modifier.Element,java.lang.Boolean> predicate);
-    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.glance.Modifier.Element,java.lang.Boolean> predicate);
-    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.glance.Modifier.Element,? extends R> operation);
-    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.glance.Modifier.Element,? super R,? extends R> operation);
+  public final class CombinedGlanceModifier implements androidx.glance.GlanceModifier {
+    ctor public CombinedGlanceModifier(androidx.glance.GlanceModifier outer, androidx.glance.GlanceModifier inner);
+    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.glance.GlanceModifier.Element,java.lang.Boolean> predicate);
+    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.glance.GlanceModifier.Element,java.lang.Boolean> predicate);
+    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.glance.GlanceModifier.Element,? extends R> operation);
+    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.glance.GlanceModifier.Element,? super R,? extends R> operation);
   }
 
   public final class CompositionLocalsKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> getLocalContext();
-    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.glance.unit.DpSize> getLocalSize();
+    method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.DpSize> getLocalSize();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<android.content.Context> LocalContext;
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.DpSize> LocalSize;
   }
 
-  @androidx.compose.runtime.Stable public interface Modifier {
-    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.glance.Modifier.Element,java.lang.Boolean> predicate);
-    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.glance.Modifier.Element,java.lang.Boolean> predicate);
-    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.glance.Modifier.Element,? extends R> operation);
-    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.glance.Modifier.Element,? super R,? extends R> operation);
-    method public default infix androidx.glance.Modifier then(androidx.glance.Modifier other);
-    field public static final androidx.glance.Modifier.Companion Companion;
+  @androidx.compose.runtime.Stable public interface GlanceModifier {
+    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.glance.GlanceModifier.Element,java.lang.Boolean> predicate);
+    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.glance.GlanceModifier.Element,java.lang.Boolean> predicate);
+    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.glance.GlanceModifier.Element,? extends R> operation);
+    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.glance.GlanceModifier.Element,? super R,? extends R> operation);
+    method public default infix androidx.glance.GlanceModifier then(androidx.glance.GlanceModifier other);
+    field public static final androidx.glance.GlanceModifier.Companion Companion;
   }
 
-  public static final class Modifier.Companion implements androidx.glance.Modifier {
-    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.glance.Modifier.Element,java.lang.Boolean> predicate);
-    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.glance.Modifier.Element,java.lang.Boolean> predicate);
-    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.glance.Modifier.Element,? extends R> operation);
-    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.glance.Modifier.Element,? super R,? extends R> operation);
+  public static final class GlanceModifier.Companion implements androidx.glance.GlanceModifier {
+    method public boolean all(kotlin.jvm.functions.Function1<? super androidx.glance.GlanceModifier.Element,java.lang.Boolean> predicate);
+    method public boolean any(kotlin.jvm.functions.Function1<? super androidx.glance.GlanceModifier.Element,java.lang.Boolean> predicate);
+    method public <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.glance.GlanceModifier.Element,? extends R> operation);
+    method public <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.glance.GlanceModifier.Element,? super R,? extends R> operation);
   }
 
-  public static interface Modifier.Element extends androidx.glance.Modifier {
-    method public default boolean all(kotlin.jvm.functions.Function1<? super androidx.glance.Modifier.Element,java.lang.Boolean> predicate);
-    method public default boolean any(kotlin.jvm.functions.Function1<? super androidx.glance.Modifier.Element,java.lang.Boolean> predicate);
-    method public default <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.glance.Modifier.Element,? extends R> operation);
-    method public default <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.glance.Modifier.Element,? super R,? extends R> operation);
+  public static interface GlanceModifier.Element extends androidx.glance.GlanceModifier {
+    method public default boolean all(kotlin.jvm.functions.Function1<? super androidx.glance.GlanceModifier.Element,java.lang.Boolean> predicate);
+    method public default boolean any(kotlin.jvm.functions.Function1<? super androidx.glance.GlanceModifier.Element,java.lang.Boolean> predicate);
+    method public default <R> R! foldIn(R? initial, kotlin.jvm.functions.Function2<? super R,? super androidx.glance.GlanceModifier.Element,? extends R> operation);
+    method public default <R> R! foldOut(R? initial, kotlin.jvm.functions.Function2<? super androidx.glance.GlanceModifier.Element,? super R,? extends R> operation);
   }
 
   public final class UtilsKt {
@@ -54,11 +56,34 @@
   }
 
   public final class ActionKt {
-    method public static androidx.glance.Modifier clickable(androidx.glance.Modifier, androidx.glance.action.Action onClick);
+    method public static androidx.glance.GlanceModifier clickable(androidx.glance.GlanceModifier, androidx.glance.action.Action onClick);
+  }
+
+  public abstract class ActionParameters {
+    method public abstract java.util.Map<androidx.glance.action.ActionParameters.Key<?>,java.lang.Object> asMap();
+    method public abstract operator <T> boolean contains(androidx.glance.action.ActionParameters.Key<T> key);
+    method public abstract operator <T> T? get(androidx.glance.action.ActionParameters.Key<T> key);
+  }
+
+  public static final class ActionParameters.Key<T> {
+    ctor public ActionParameters.Key(String name);
+    method public String getName();
+    method public infix androidx.glance.action.ActionParameters.Pair<T> to(T value);
+    property public final String name;
+  }
+
+  public static final class ActionParameters.Pair<T> {
+  }
+
+  public final class ActionParametersKt {
+    method public static androidx.glance.action.ActionParameters actionParametersOf(androidx.glance.action.ActionParameters.Pair<?>... pairs);
+    method public static androidx.glance.action.MutableActionParameters mutableActionParametersOf(androidx.glance.action.ActionParameters.Pair<?>... pairs);
+    method public static androidx.glance.action.MutableActionParameters toMutableParameters(androidx.glance.action.ActionParameters);
+    method public static androidx.glance.action.ActionParameters toParameters(androidx.glance.action.ActionParameters);
   }
 
   public interface ActionRunnable {
-    method public suspend Object? run(android.content.Context context, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public suspend Object? run(android.content.Context context, optional androidx.glance.action.ActionParameters parameters, optional kotlin.coroutines.Continuation<? super kotlin.Unit> p);
   }
 
   public final class LaunchActivityActionKt {
@@ -67,9 +92,18 @@
     method public static inline <reified T extends android.app.Activity> androidx.glance.action.Action! actionLaunchActivity();
   }
 
+  public final class MutableActionParameters extends androidx.glance.action.ActionParameters {
+    method public java.util.Map<androidx.glance.action.ActionParameters.Key<?>,java.lang.Object> asMap();
+    method public void clear();
+    method public operator <T> boolean contains(androidx.glance.action.ActionParameters.Key<T> key);
+    method public operator <T> T? get(androidx.glance.action.ActionParameters.Key<T> key);
+    method public <T> T? remove(androidx.glance.action.ActionParameters.Key<T> key);
+    method public operator <T> T? set(androidx.glance.action.ActionParameters.Key<T> key, T? value);
+  }
+
   public final class UpdateContentActionKt {
-    method public static <T extends androidx.glance.action.ActionRunnable> androidx.glance.action.Action actionUpdateContent(Class<T> runnable);
-    method public static inline <reified T extends androidx.glance.action.ActionRunnable> androidx.glance.action.Action! actionUpdateContent();
+    method public static <T extends androidx.glance.action.ActionRunnable> androidx.glance.action.Action actionUpdateContent(Class<T> runnable, optional androidx.glance.action.ActionParameters parameters);
+    method public static inline <reified T extends androidx.glance.action.ActionRunnable> androidx.glance.action.Action! actionUpdateContent(optional androidx.glance.action.ActionParameters parameters);
   }
 
 }
@@ -145,59 +179,80 @@
   }
 
   public final class BoxKt {
-    method @androidx.compose.runtime.Composable public static void Box(optional androidx.glance.Modifier modifier, optional androidx.glance.layout.Alignment contentAlignment, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Box(optional androidx.glance.GlanceModifier modifier, optional androidx.glance.layout.Alignment contentAlignment, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
 
   public final class ButtonKt {
-    method @androidx.compose.runtime.Composable public static void Button(String text, androidx.glance.action.Action onClick, optional androidx.glance.Modifier modifier, optional boolean enabled, optional androidx.glance.text.TextStyle? style);
+    method @androidx.compose.runtime.Composable public static void Button(String text, androidx.glance.action.Action onClick, optional androidx.glance.GlanceModifier modifier, optional boolean enabled, optional androidx.glance.text.TextStyle? style);
   }
 
   public final class ColumnKt {
-    method @androidx.compose.runtime.Composable public static void Column(optional androidx.glance.Modifier modifier, optional int verticalAlignment, optional int horizontalAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Column(optional androidx.glance.GlanceModifier modifier, optional int verticalAlignment, optional int horizontalAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.layout.ColumnScope,kotlin.Unit> content);
   }
 
   public interface ColumnScope {
-    method public androidx.glance.Modifier defaultWeight(androidx.glance.Modifier);
+    method public androidx.glance.GlanceModifier defaultWeight(androidx.glance.GlanceModifier);
+  }
+
+  public final inline class ContentScale {
+    ctor public ContentScale();
+  }
+
+  public static final class ContentScale.Companion {
+    method public int getCrop();
+    method public int getFillBounds();
+    method public int getFit();
+    property public final int Crop;
+    property public final int FillBounds;
+    property public final int Fit;
   }
 
   public final class DimensionKt {
-    method public static androidx.glance.Modifier fillMaxHeight(androidx.glance.Modifier);
-    method public static androidx.glance.Modifier fillMaxSize(androidx.glance.Modifier);
-    method public static androidx.glance.Modifier fillMaxWidth(androidx.glance.Modifier);
-    method public static androidx.glance.Modifier height(androidx.glance.Modifier, float height);
-    method public static androidx.glance.Modifier height(androidx.glance.Modifier, @DimenRes int height);
-    method public static androidx.glance.Modifier size(androidx.glance.Modifier, float size);
-    method public static androidx.glance.Modifier size(androidx.glance.Modifier, @DimenRes int size);
-    method public static androidx.glance.Modifier size(androidx.glance.Modifier, float width, float height);
-    method public static androidx.glance.Modifier size(androidx.glance.Modifier, @DimenRes int width, @DimenRes int height);
-    method public static androidx.glance.Modifier width(androidx.glance.Modifier, float width);
-    method public static androidx.glance.Modifier width(androidx.glance.Modifier, @DimenRes int width);
-    method public static androidx.glance.Modifier wrapContentHeight(androidx.glance.Modifier);
-    method public static androidx.glance.Modifier wrapContentSize(androidx.glance.Modifier);
-    method public static androidx.glance.Modifier wrapContentWidth(androidx.glance.Modifier);
+    method public static androidx.glance.GlanceModifier fillMaxHeight(androidx.glance.GlanceModifier);
+    method public static androidx.glance.GlanceModifier fillMaxSize(androidx.glance.GlanceModifier);
+    method public static androidx.glance.GlanceModifier fillMaxWidth(androidx.glance.GlanceModifier);
+    method public static androidx.glance.GlanceModifier height(androidx.glance.GlanceModifier, float height);
+    method public static androidx.glance.GlanceModifier height(androidx.glance.GlanceModifier, @DimenRes int height);
+    method public static androidx.glance.GlanceModifier size(androidx.glance.GlanceModifier, float size);
+    method public static androidx.glance.GlanceModifier size(androidx.glance.GlanceModifier, @DimenRes int size);
+    method public static androidx.glance.GlanceModifier size(androidx.glance.GlanceModifier, float width, float height);
+    method public static androidx.glance.GlanceModifier size(androidx.glance.GlanceModifier, @DimenRes int width, @DimenRes int height);
+    method public static androidx.glance.GlanceModifier width(androidx.glance.GlanceModifier, float width);
+    method public static androidx.glance.GlanceModifier width(androidx.glance.GlanceModifier, @DimenRes int width);
+    method public static androidx.glance.GlanceModifier wrapContentHeight(androidx.glance.GlanceModifier);
+    method public static androidx.glance.GlanceModifier wrapContentSize(androidx.glance.GlanceModifier);
+    method public static androidx.glance.GlanceModifier wrapContentWidth(androidx.glance.GlanceModifier);
+  }
+
+  public final class ImageKt {
+    method @androidx.compose.runtime.Composable public static void Image(androidx.glance.layout.ImageProvider provider, String? contentDescription, optional androidx.glance.GlanceModifier modifier, optional int contentScale);
+    method public static androidx.glance.layout.ImageProvider ImageProvider(@DrawableRes int resId);
+  }
+
+  public interface ImageProvider {
   }
 
   public final class PaddingKt {
-    method public static androidx.glance.Modifier absolutePadding(androidx.glance.Modifier, optional float left, optional float top, optional float right, optional float bottom);
-    method public static androidx.glance.Modifier absolutePadding(androidx.glance.Modifier, optional @DimenRes int left, optional @DimenRes int top, optional @DimenRes int right, optional @DimenRes int bottom);
-    method public static androidx.glance.Modifier padding(androidx.glance.Modifier, optional float start, optional float top, optional float end, optional float bottom);
-    method public static androidx.glance.Modifier padding(androidx.glance.Modifier, optional @DimenRes int start, optional @DimenRes int top, optional @DimenRes int end, optional @DimenRes int bottom);
-    method public static androidx.glance.Modifier padding(androidx.glance.Modifier, optional float horizontal, optional float vertical);
-    method public static androidx.glance.Modifier padding(androidx.glance.Modifier, optional @DimenRes int horizontal, optional @DimenRes int vertical);
-    method public static androidx.glance.Modifier padding(androidx.glance.Modifier, float all);
-    method public static androidx.glance.Modifier padding(androidx.glance.Modifier, @DimenRes int all);
+    method public static androidx.glance.GlanceModifier absolutePadding(androidx.glance.GlanceModifier, optional float left, optional float top, optional float right, optional float bottom);
+    method public static androidx.glance.GlanceModifier absolutePadding(androidx.glance.GlanceModifier, optional @DimenRes int left, optional @DimenRes int top, optional @DimenRes int right, optional @DimenRes int bottom);
+    method public static androidx.glance.GlanceModifier padding(androidx.glance.GlanceModifier, optional float start, optional float top, optional float end, optional float bottom);
+    method public static androidx.glance.GlanceModifier padding(androidx.glance.GlanceModifier, optional @DimenRes int start, optional @DimenRes int top, optional @DimenRes int end, optional @DimenRes int bottom);
+    method public static androidx.glance.GlanceModifier padding(androidx.glance.GlanceModifier, optional float horizontal, optional float vertical);
+    method public static androidx.glance.GlanceModifier padding(androidx.glance.GlanceModifier, optional @DimenRes int horizontal, optional @DimenRes int vertical);
+    method public static androidx.glance.GlanceModifier padding(androidx.glance.GlanceModifier, float all);
+    method public static androidx.glance.GlanceModifier padding(androidx.glance.GlanceModifier, @DimenRes int all);
   }
 
   public final class RowKt {
-    method @androidx.compose.runtime.Composable public static void Row(optional androidx.glance.Modifier modifier, optional int horizontalAlignment, optional int verticalAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Row(optional androidx.glance.GlanceModifier modifier, optional int horizontalAlignment, optional int verticalAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.layout.RowScope,kotlin.Unit> content);
   }
 
   public interface RowScope {
-    method public androidx.glance.Modifier defaultWeight(androidx.glance.Modifier);
+    method public androidx.glance.GlanceModifier defaultWeight(androidx.glance.GlanceModifier);
   }
 
   public final class TextKt {
-    method @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.glance.Modifier modifier, optional androidx.glance.text.TextStyle? style);
+    method @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.glance.GlanceModifier modifier, optional androidx.glance.text.TextStyle? style);
   }
 
 }
@@ -251,6 +306,8 @@
 
   public final inline class TextDecoration {
     ctor public TextDecoration();
+    method @androidx.compose.runtime.Stable public operator boolean contains(int other);
+    method @androidx.compose.runtime.Stable public operator int plus(int decoration);
   }
 
   public static final class TextDecoration.Companion {
@@ -264,13 +321,13 @@
   }
 
   @androidx.compose.runtime.Immutable public final class TextStyle {
-    ctor public TextStyle(optional androidx.glance.unit.Sp? fontSize, optional androidx.glance.text.FontWeight? fontWeight, optional androidx.glance.text.FontStyle? fontStyle, optional androidx.glance.text.TextAlign? textAlign, optional androidx.glance.text.TextDecoration? textDecoration);
-    method public androidx.glance.unit.Sp? getFontSize();
+    ctor public TextStyle(optional androidx.compose.ui.unit.TextUnit? fontSize, optional androidx.glance.text.FontWeight? fontWeight, optional androidx.glance.text.FontStyle? fontStyle, optional androidx.glance.text.TextAlign? textAlign, optional androidx.glance.text.TextDecoration? textDecoration);
+    method public androidx.compose.ui.unit.TextUnit? getFontSize();
     method public androidx.glance.text.FontStyle? getFontStyle();
     method public androidx.glance.text.FontWeight? getFontWeight();
     method public androidx.glance.text.TextAlign? getTextAlign();
     method public androidx.glance.text.TextDecoration? getTextDecoration();
-    property public final androidx.glance.unit.Sp? fontSize;
+    property public final androidx.compose.ui.unit.TextUnit? fontSize;
     property public final androidx.glance.text.FontStyle? fontStyle;
     property public final androidx.glance.text.FontWeight? fontWeight;
     property public final androidx.glance.text.TextAlign? textAlign;
@@ -281,115 +338,13 @@
 
 package androidx.glance.unit {
 
-  public final inline class Color {
-    ctor public Color();
-    method public int getValue();
-    property public final int value;
-  }
-
-  public static final class Color.Companion {
-    method public int getBlack();
-    method public int getBlue();
-    method public int getCyan();
-    method public int getDarkGray();
-    method public int getGray();
-    method public int getGreen();
-    method public int getLightGray();
-    method public int getMagenta();
-    method public int getRed();
-    method public int getTransparent();
-    method public int getWhite();
-    method public int getYellow();
-    property public final int Black;
-    property public final int Blue;
-    property public final int Cyan;
-    property public final int DarkGray;
-    property public final int Gray;
-    property public final int Green;
-    property public final int LightGray;
-    property public final int Magenta;
-    property public final int Red;
-    property public final int Transparent;
-    property public final int White;
-    property public final int Yellow;
-  }
-
-  public final class ColorKt {
-    method @androidx.compose.runtime.Stable public static int Color(float red, float green, float blue, optional float alpha);
-  }
-
   public interface ColorProvider {
   }
 
   public final class ColorProviderKt {
-    method public static androidx.glance.unit.ColorProvider ColorProvider(int color);
+    method public static androidx.glance.unit.ColorProvider ColorProvider(long color);
     method public static androidx.glance.unit.ColorProvider ColorProvider(@ColorRes int resId);
   }
 
-  public final inline class Dp implements java.lang.Comparable<androidx.glance.unit.Dp> {
-    ctor public Dp();
-    method public operator int compareTo(float other);
-    method public float getValue();
-    property public final float value;
-  }
-
-  public final class DpKt {
-    method public static inline float getDp(int);
-    method public static inline float getDp(double);
-    method public static inline float getDp(float);
-    method public static float max(float a, float b);
-    method public static float min(float a, float b);
-    method public static operator float times(float, float other);
-    method public static operator float times(double, float other);
-    method public static operator float times(int, float other);
-  }
-
-  @androidx.compose.runtime.Immutable public final class DpSize {
-    ctor public DpSize(float width, float height);
-    method @androidx.compose.runtime.Stable public operator float component1();
-    method @androidx.compose.runtime.Stable public operator float component2();
-    method public androidx.glance.unit.DpSize copy(optional float width, optional float height);
-    method @androidx.compose.runtime.Stable public operator androidx.glance.unit.DpSize div(int other);
-    method @androidx.compose.runtime.Stable public operator androidx.glance.unit.DpSize div(float other);
-    method public float getHeight();
-    method public float getWidth();
-    method @androidx.compose.runtime.Stable public operator androidx.glance.unit.DpSize minus(androidx.glance.unit.DpSize other);
-    method @androidx.compose.runtime.Stable public operator androidx.glance.unit.DpSize plus(androidx.glance.unit.DpSize other);
-    method @androidx.compose.runtime.Stable public operator androidx.glance.unit.DpSize times(int other);
-    method @androidx.compose.runtime.Stable public operator androidx.glance.unit.DpSize times(float other);
-    property public final float height;
-    property public final float width;
-    field public static final androidx.glance.unit.DpSize.Companion Companion;
-  }
-
-  public static final class DpSize.Companion {
-    method public androidx.glance.unit.DpSize getZero();
-    property public final androidx.glance.unit.DpSize Zero;
-  }
-
-  public final class DpSizeKt {
-    method @androidx.compose.runtime.Stable public static operator androidx.glance.unit.DpSize times(int, androidx.glance.unit.DpSize size);
-    method @androidx.compose.runtime.Stable public static operator androidx.glance.unit.DpSize times(float, androidx.glance.unit.DpSize size);
-    method @androidx.compose.runtime.Stable public static android.util.SizeF toSizeF(androidx.glance.unit.DpSize);
-  }
-
-  public final inline class Sp implements java.lang.Comparable<androidx.glance.unit.Sp> {
-    ctor public Sp();
-    method public operator int compareTo(float other);
-    method public float getValue();
-    property public final float value;
-  }
-
-  public final class SpKt {
-    method public static inline float getSp(int);
-    method public static inline float getSp(double);
-    method public static inline float getSp(float);
-    method public static float max(float a, float b);
-    method public static float min(float a, float b);
-    method public static operator float times(float, float other);
-    method public static operator float times(double, float other);
-    method public static operator float times(int, float other);
-  }
-
 }
 
diff --git a/glance/glance/build.gradle b/glance/glance/build.gradle
index f8f3794..76dad62 100644
--- a/glance/glance/build.gradle
+++ b/glance/glance/build.gradle
@@ -31,8 +31,10 @@
 dependencies {
     kotlinPlugin(project(":compose:compiler:compiler"))
 
-    api("androidx.compose.runtime:runtime:1.0.1")
     api("androidx.annotation:annotation:1.2.0")
+    api("androidx.compose.runtime:runtime:1.1.0-beta01")
+    api("androidx.compose.ui:ui-graphics:1.1.0-beta01")
+    api("androidx.compose.ui:ui-unit:1.1.0-beta01")
 
     implementation("androidx.annotation:annotation:1.1.0")
     implementation(libs.kotlinStdlib)
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/Background.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/Background.kt
index 72385e9..4f1e952 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/Background.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/Background.kt
@@ -18,12 +18,12 @@
 
 import androidx.annotation.ColorRes
 import androidx.annotation.RestrictTo
-import androidx.glance.unit.Color
+import androidx.compose.ui.graphics.Color
 import androidx.glance.unit.ColorProvider
 
 /** @suppress */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public class BackgroundModifier(public val colorProvider: ColorProvider) : Modifier.Element {
+public class BackgroundModifier(public val colorProvider: ColorProvider) : GlanceModifier.Element {
     override fun toString(): String = "BackgroundModifier(colorProvider=$colorProvider)"
 }
 
@@ -32,19 +32,21 @@
  * element to paint the specified [Color] as its background, which will fill the bounds of the
  * element.
  */
-public fun Modifier.background(color: Color): Modifier = background(ColorProvider(color))
+public fun GlanceModifier.background(color: Color): GlanceModifier =
+    background(ColorProvider(color))
 
 /**
  * Apply a background color to the element this modifier is attached to. This will cause the
  * element to paint the specified color resource as its background, which will fill the bounds of
  * the element.
  */
-public fun Modifier.background(@ColorRes color: Int): Modifier = background(ColorProvider(color))
+public fun GlanceModifier.background(@ColorRes color: Int): GlanceModifier =
+    background(ColorProvider(color))
 
 /**
  * Apply a background color to the element this modifier is attached to. This will cause the
  * element to paint the specified [ColorProvider] as its background, which will fill the bounds of
  * the element.
  */
-public fun Modifier.background(colorProvider: ColorProvider): Modifier =
+public fun GlanceModifier.background(colorProvider: ColorProvider): GlanceModifier =
     this.then(BackgroundModifier(colorProvider))
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/CompositionLocals.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/CompositionLocals.kt
index ee7142a..f2e1c8d 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/CompositionLocals.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/CompositionLocals.kt
@@ -18,7 +18,7 @@
 
 import android.content.Context
 import androidx.compose.runtime.staticCompositionLocalOf
-import androidx.glance.unit.DpSize
+import androidx.compose.ui.unit.DpSize
 
 /**
  * Size of the glance view being generated.
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/Emittables.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/Emittables.kt
index 2eea848..693dc31 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/Emittables.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/Emittables.kt
@@ -21,7 +21,7 @@
 /** @suppress */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public interface Emittable {
-    public var modifier: Modifier
+    public var modifier: GlanceModifier
 }
 
 /** @suppress */
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/Modifier.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/GlanceModifier.kt
similarity index 75%
rename from glance/glance/src/androidMain/kotlin/androidx/glance/Modifier.kt
rename to glance/glance/src/androidMain/kotlin/androidx/glance/GlanceModifier.kt
index e818fa8..64f5b82 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/Modifier.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/GlanceModifier.kt
@@ -23,7 +23,7 @@
  * This plays the same role as [androidx.compose.ui.Modifier], but for the Glance composables.
  */
 @Stable
-public interface Modifier {
+public interface GlanceModifier {
     /**
      * Accumulates a value starting with [initial] and applying [operation] to the current value
      * and each element from outside in.
@@ -47,28 +47,28 @@
     public fun <R> foldOut(initial: R, operation: (Element, R) -> R): R
 
     /**
-     * Returns `true` if [predicate] returns true for any [Element] in this [Modifier].
+     * Returns `true` if [predicate] returns true for any [Element] in this [GlanceModifier].
      */
     public fun any(predicate: (Element) -> Boolean): Boolean
 
     /**
-     * Returns `true` if [predicate] returns true for all [Element]s in this [Modifier] or if
-     * this [Modifier] contains no [Element]s.
+     * Returns `true` if [predicate] returns true for all [Element]s in this [GlanceModifier] or if
+     * this [GlanceModifier] contains no [Element]s.
      */
     public fun all(predicate: (Element) -> Boolean): Boolean
 
     /**
      * Concatenates this modifier with another.
      *
-     * Returns a [Modifier] representing this modifier followed by [other] in sequence.
+     * Returns a [GlanceModifier] representing this modifier followed by [other] in sequence.
      */
-    public infix fun then(other: Modifier): Modifier =
-        if (other === Modifier) this else CombinedModifier(this, other)
+    public infix fun then(other: GlanceModifier): GlanceModifier =
+        if (other === GlanceModifier) this else CombinedGlanceModifier(this, other)
 
     /**
-     * A single element contained within a [Modifier] chain.
+     * A single element contained within a [GlanceModifier] chain.
      */
-    public interface Element : Modifier {
+    public interface Element : GlanceModifier {
         override fun <R> foldIn(initial: R, operation: (R, Element) -> R): R =
             operation(initial, this)
 
@@ -80,44 +80,44 @@
     }
 
     /**
-     * The companion object `Modifier` is the empty, default, or starter [Modifier]
-     * that contains no [elements][Element]. Use it to create a new [Modifier] using
+     * The companion object `Modifier` is the empty, default, or starter [GlanceModifier]
+     * that contains no [elements][Element]. Use it to create a new [GlanceModifier] using
      * modifier extension factory functions.
      */
     // The companion object implements `Modifier` so that it may be used  as the start of a
     // modifier extension factory expression.
-    public companion object : Modifier {
+    public companion object : GlanceModifier {
         override fun <R> foldIn(initial: R, operation: (R, Element) -> R): R = initial
         override fun <R> foldOut(initial: R, operation: (Element, R) -> R): R = initial
         override fun any(predicate: (Element) -> Boolean): Boolean = false
         override fun all(predicate: (Element) -> Boolean): Boolean = true
-        override infix fun then(other: Modifier): Modifier = other
+        override infix fun then(other: GlanceModifier): GlanceModifier = other
         override fun toString(): String = "Modifier"
     }
 }
 
 /**
- * A node in a [Modifier] chain. A CombinedModifier always contains at least two elements;
+ * A node in a [GlanceModifier] chain. A CombinedModifier always contains at least two elements;
  * a Modifier [outer] that wraps around the Modifier [inner].
  */
-public class CombinedModifier(
-    private val outer: Modifier,
-    private val inner: Modifier
-) : Modifier {
-    override fun <R> foldIn(initial: R, operation: (R, Modifier.Element) -> R): R =
+public class CombinedGlanceModifier(
+    private val outer: GlanceModifier,
+    private val inner: GlanceModifier
+) : GlanceModifier {
+    override fun <R> foldIn(initial: R, operation: (R, GlanceModifier.Element) -> R): R =
         inner.foldIn(outer.foldIn(initial, operation), operation)
 
-    override fun <R> foldOut(initial: R, operation: (Modifier.Element, R) -> R): R =
+    override fun <R> foldOut(initial: R, operation: (GlanceModifier.Element, R) -> R): R =
         outer.foldOut(inner.foldOut(initial, operation), operation)
 
-    override fun any(predicate: (Modifier.Element) -> Boolean): Boolean =
+    override fun any(predicate: (GlanceModifier.Element) -> Boolean): Boolean =
         outer.any(predicate) || inner.any(predicate)
 
-    override fun all(predicate: (Modifier.Element) -> Boolean): Boolean =
+    override fun all(predicate: (GlanceModifier.Element) -> Boolean): Boolean =
         outer.all(predicate) && inner.all(predicate)
 
     override fun equals(other: Any?): Boolean =
-        other is CombinedModifier && outer == other.outer && inner == other.inner
+        other is CombinedGlanceModifier && outer == other.outer && inner == other.inner
 
     override fun hashCode(): Int = outer.hashCode() + 31 * inner.hashCode()
     override fun toString(): String = "[" + foldIn("") { acc, element ->
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/Utils.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/Utils.kt
index 96ab925..29ecce0 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/Utils.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/Utils.kt
@@ -20,7 +20,7 @@
 
 /** @suppress */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-inline fun <reified T> Modifier.findModifier(): T? = this.foldIn<T?>(null) { acc, cur ->
+inline fun <reified T> GlanceModifier.findModifier(): T? = this.foldIn<T?>(null) { acc, cur ->
     if (cur is T) {
         cur
     } else {
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/action/Action.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/action/Action.kt
index 744d5f1..f363143 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/action/Action.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/action/Action.kt
@@ -18,7 +18,7 @@
 
 import android.app.Activity
 import androidx.annotation.RestrictTo
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 
 /**
  * An Action defines the actions a user can take. Implementations specify what operation will be
@@ -30,12 +30,12 @@
 /**
  * Apply an [Action], to be executed in response to a user click.
  */
-public fun Modifier.clickable(onClick: Action): Modifier =
+public fun GlanceModifier.clickable(onClick: Action): GlanceModifier =
     this.then(ActionModifier(onClick))
 
 /** @suppress */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-class ActionModifier(public val action: Action) : Modifier.Element {
+class ActionModifier(public val action: Action) : GlanceModifier.Element {
     override fun toString(): String {
         return "ActionModifier(action=$action)"
     }
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/action/ActionParameters.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/action/ActionParameters.kt
new file mode 100644
index 0000000..dff4b3f
--- /dev/null
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/action/ActionParameters.kt
@@ -0,0 +1,186 @@
+/*
+ * 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 java.util.Collections
+
+/**
+ * Action parameters, used to pass information to an [Action].
+ *
+ * Construct action parameters using [actionParametersOf] or [mutableActionParametersOf], with typed
+ * key-value pairs. The [Key] class enforces typing of the values inserted.
+ */
+public abstract class ActionParameters internal constructor() {
+
+    /**
+     * Key for [ActionParameters] values. Type T is the type of the associated value. The [Key.name]
+     * must be unique, keys with the same name are considered equal.
+     */
+    public class Key<T : Any> (public val name: String) {
+        /**
+         * Infix function to create a Parameters.Pair.
+         *
+         * @param value the value this key should point to
+         */
+        public infix fun to(value: T): Pair<T> = Pair(this, value)
+
+        override fun equals(other: Any?): Boolean = other is Key<*> && name == other.name
+
+        override fun hashCode(): Int = name.hashCode()
+
+        override fun toString(): String = name
+    }
+
+    /**
+     * Key Value pairs for Parameters. Type T is the type of the value. Pairs must have unique keys,
+     * or they will be considered equal.
+     *
+     * Create this using the infix function [to].
+     */
+    public class Pair<T : Any> internal constructor(
+        internal val key: Key<T>,
+        internal val value: T
+    ) {
+        override fun equals(other: Any?): Boolean =
+            other is Pair<*> && key == other.key && value == other.value
+
+        override fun hashCode(): Int = key.hashCode() + value.hashCode()
+
+        override fun toString(): String = "(${key.name}, $value)"
+    }
+
+    /**
+     * Returns true if the Parameters set contains the given Key.
+     *
+     * @param key the key to check for
+     */
+    public abstract operator fun <T : Any> contains(key: Key<T>): Boolean
+
+    /**
+     * Get a parameter with a key. If the key is not set, returns null.
+     *
+     * @param T the type of the parameter
+     * @param key the key for the parameter
+     * @throws ClassCastException if there is something stored with the same name as [key] but it
+     * cannot be cast to T
+     */
+    public abstract operator fun <T : Any> get(key: Key<T>): T?
+
+    /**
+     * Retrieves a map of all key value pairs. The map is unmodifiable, and attempts to mutate it
+     * will throw runtime exceptions.
+     *
+     * @return a map of all parameters in this Parameters
+     */
+    public abstract fun asMap(): Map<Key<out Any>, Any>
+}
+
+/**
+ * Mutable version of [ActionParameters]. Allows for editing the underlying data, and adding or
+ * removing key-value pairs.
+ */
+public class MutableActionParameters internal constructor(
+    internal val map: MutableMap<Key<out Any>, Any> = mutableMapOf()
+) : ActionParameters() {
+
+    override operator fun <T : Any> contains(key: Key<T>): Boolean = map.containsKey(key)
+
+    @Suppress("UNCHECKED_CAST")
+    override operator fun <T : Any> get(key: Key<T>): T? = map[key] as T?
+
+    override fun asMap(): Map<Key<out Any>, Any> = Collections.unmodifiableMap(map)
+
+    /**
+     * Sets a key value pair in MutableParameters. If the value is null, the key is removed from the
+     * parameters.
+     *
+     * @param key the parameter to set
+     * @param value the value to assign to this parameter
+     * @return the previous value associated with the key, or null if the key was not present
+     */
+    public operator fun <T : Any> set(key: Key<T>, value: T?): T? {
+        val mapValue = get(key)
+        when (value) {
+            null -> remove(key)
+            else -> map[key] = value
+        }
+        return mapValue
+    }
+
+    /**
+     * Removes an item from this MutableParameters.
+     *
+     * @param key the parameter to remove
+     * @return the original value of the parameter
+     */
+    @Suppress("UNCHECKED_CAST")
+    public fun <T : Any> remove(key: Key<T>) = map.remove(key) as T?
+
+    /**
+     * Removes all parameters from this MutableParameters.
+     */
+    public fun clear() = map.clear()
+
+    override fun equals(other: Any?): Boolean = other is MutableActionParameters && map == other.map
+
+    override fun hashCode(): Int = map.hashCode()
+
+    override fun toString(): String = map.toString()
+}
+
+/**
+ * Returns a new read-only Parameters, from the specified contents. The key element in the given
+ * pairs will point to the corresponding value element.
+ *
+ * If multiple pairs have the same key, the resulting map will contain only the value from the last
+ * of those pairs.
+ */
+public fun actionParametersOf(vararg pairs: ActionParameters.Pair<out Any>): ActionParameters =
+    mutableActionParametersOf(*pairs)
+
+/**
+ * Returns a new MutableParameters, from the specified contents. The key element in the given pairs
+ * will point to the corresponding value element.
+ *
+ * If multiple pairs have the same key, the resulting Parameters will contain only the value from
+ * the last of those pairs.
+ */
+public fun mutableActionParametersOf(
+    vararg pairs: ActionParameters.Pair<out Any>
+): MutableActionParameters = MutableActionParameters(
+    mutableMapOf(*pairs.map { it.key to it.value }.toTypedArray())
+)
+
+/**
+ * Gets a mutable copy of Parameters, containing all key value pairs. This can be used to edit
+ * the parameter data without creating a new object.
+ *
+ * This is similar to [Map.toMutableMap].
+ *
+ * @return a MutableParameters with all the same parameters as this Parameters
+ */
+public fun ActionParameters.toMutableParameters(): MutableActionParameters =
+    MutableActionParameters(asMap().toMutableMap())
+
+/**
+ * Gets a read-only copy of Parameters, containing all key value pairs.
+ *
+ * This is similar to [Map.toMap].
+ *
+ * @return a copy of this Parameters
+ */
+public fun ActionParameters.toParameters(): ActionParameters = toMutableParameters()
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/action/LaunchActivityAction.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/action/LaunchActivityAction.kt
index f09201b..387893d 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/action/LaunchActivityAction.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/action/LaunchActivityAction.kt
@@ -26,21 +26,28 @@
 
 /** @suppress */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public class LaunchActivityComponentAction(val componentName: ComponentName) : LaunchActivityAction
+public class LaunchActivityComponentAction(
+    public val componentName: ComponentName
+) : LaunchActivityAction
 
 /** @suppress */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public class LaunchActivityClassAction(val activityClass: Class<out Activity>) :
-    LaunchActivityAction
+public class LaunchActivityClassAction(
+    public val activityClass: Class<out Activity>
+) : LaunchActivityAction
 
 /**
  * Creates an [Action] that launches the [Activity] specified by the given [ComponentName].
+ *
+ * @param componentName component of the activity to launch
  */
 public fun actionLaunchActivity(componentName: ComponentName): Action =
     LaunchActivityComponentAction(componentName)
 
 /**
  * Creates an [Action] that launches the specified [Activity] when triggered.
+ *
+ * @param activity class of the activity to launch
  */
 public fun <T : Activity> actionLaunchActivity(activity: Class<T>): Action =
     LaunchActivityClassAction(activity)
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/action/UpdateContentAction.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/action/UpdateContentAction.kt
index 3ea29c2..760d2cb5 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/action/UpdateContentAction.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/action/UpdateContentAction.kt
@@ -21,10 +21,13 @@
 
 /** @suppress */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public class UpdateContentAction(val runnableClass: Class<out ActionRunnable>) : Action {
+public class UpdateContentAction(
+    public val runnableClass: Class<out ActionRunnable>,
+    public val parameters: ActionParameters
+) : Action {
     companion object {
 
-        public suspend fun run(context: Context, className: String) {
+        public suspend fun run(context: Context, className: String, parameters: ActionParameters) {
             val workClass = Class.forName(className)
 
             if (!ActionRunnable::class.java.isAssignableFrom(workClass)) {
@@ -32,7 +35,7 @@
             }
 
             val work = workClass.newInstance()
-            (work as ActionRunnable).run(context)
+            (work as ActionRunnable).run(context, parameters)
         }
     }
 }
@@ -43,21 +46,35 @@
  * the class at runtime.
  */
 public interface ActionRunnable {
-    suspend fun run(context: Context)
+    /**
+     * Performs the work associated with this action. Called when the action is triggered.
+     *
+     * @param context the calling context
+     * @param parameters the parameters associated with the action
+     */
+    suspend fun run(context: Context, parameters: ActionParameters = actionParametersOf())
 }
 
 /**
  * Creates an [Action] that executes a custom [ActionRunnable] and then updates the component
  * content.
+ *
+ * @param runnable the class of the runnable
+ * @param parameters the parameters associated with the action
  */
-public fun <T : ActionRunnable> actionUpdateContent(runnable: Class<T>): Action =
-    UpdateContentAction(runnable)
+public fun <T : ActionRunnable> actionUpdateContent(
+    runnable: Class<T>,
+    parameters: ActionParameters = actionParametersOf()
+): Action = UpdateContentAction(runnable, parameters)
 
 @Suppress("MissingNullability") /* Shouldn't need to specify @NonNull. b/199284086 */
 /**
  * Creates an [Action] that executes a custom [ActionRunnable] and then updates the component
  * content.
+ *
+ * @param parameters the parameters associated with the action
  */
 // TODO(b/201418282): Add the UI update path
-public inline fun <reified T : ActionRunnable> actionUpdateContent(): Action =
-    actionUpdateContent(T::class.java)
+public inline fun <reified T : ActionRunnable> actionUpdateContent(
+    parameters: ActionParameters = actionParametersOf()
+): Action = actionUpdateContent(T::class.java, parameters)
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Box.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Box.kt
index df8e966..90c5b12 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Box.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Box.kt
@@ -21,12 +21,12 @@
 import androidx.compose.runtime.ComposeNode
 import androidx.glance.Applier
 import androidx.glance.EmittableWithChildren
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 
 /** @suppress */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public class EmittableBox : EmittableWithChildren() {
-    override var modifier: Modifier = Modifier
+    override var modifier: GlanceModifier = GlanceModifier
     public var contentAlignment: Alignment = Alignment.TopStart
 
     override fun toString(): String {
@@ -48,7 +48,7 @@
  */
 @Composable
 public fun Box(
-    modifier: Modifier = Modifier,
+    modifier: GlanceModifier = GlanceModifier,
     contentAlignment: Alignment = Alignment.TopStart,
     content: @Composable() () -> Unit
 ) {
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Button.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Button.kt
index 2834957..4a120ca 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Button.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Button.kt
@@ -21,7 +21,7 @@
 import androidx.compose.runtime.ComposeNode
 import androidx.glance.Applier
 import androidx.glance.Emittable
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.action.Action
 import androidx.glance.action.clickable
 import androidx.glance.text.TextStyle
@@ -39,7 +39,7 @@
 fun Button(
     text: String,
     onClick: Action,
-    modifier: Modifier = Modifier,
+    modifier: GlanceModifier = GlanceModifier,
     enabled: Boolean = true,
     style: TextStyle? = null
 ) {
@@ -58,7 +58,7 @@
 /** @suppress */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 class EmittableButton : Emittable {
-    override var modifier: Modifier = Modifier
+    override var modifier: GlanceModifier = GlanceModifier
     var text: String = ""
     var style: TextStyle? = null
     var enabled: Boolean = true
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Column.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Column.kt
index c295ce0..f9265ab 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Column.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Column.kt
@@ -21,12 +21,12 @@
 import androidx.compose.runtime.ComposeNode
 import androidx.glance.Applier
 import androidx.glance.EmittableWithChildren
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 
 /** @suppress */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public class EmittableColumn : EmittableWithChildren() {
-    override var modifier: Modifier = Modifier
+    override var modifier: GlanceModifier = GlanceModifier
     public var verticalAlignment: Alignment.Vertical = Alignment.Top
     public var horizontalAlignment: Alignment.Horizontal = Alignment.Start
 }
@@ -39,11 +39,11 @@
      * unweighted child elements and distribute it according to the weights, the default weight
      * being 1.
      */
-    fun Modifier.defaultWeight(): Modifier
+    fun GlanceModifier.defaultWeight(): GlanceModifier
 }
 
 private object ColumnScopeImplInstance : ColumnScope {
-    override fun Modifier.defaultWeight(): Modifier =
+    override fun GlanceModifier.defaultWeight(): GlanceModifier =
         this.then(HeightModifier(Dimension.Expand))
 }
 
@@ -64,7 +64,7 @@
  */
 @Composable
 public fun Column(
-    modifier: Modifier = Modifier,
+    modifier: GlanceModifier = GlanceModifier,
     verticalAlignment: Alignment.Vertical = Alignment.Top,
     horizontalAlignment: Alignment.Horizontal = Alignment.Start,
     content: @Composable ColumnScope.() -> Unit
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/ContentScale.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/ContentScale.kt
new file mode 100644
index 0000000..4314024
--- /dev/null
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/ContentScale.kt
@@ -0,0 +1,45 @@
+/*
+ * 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.layout
+
+/**
+ * Scaling to be used when an element is smaller than its available bounds. Mainly used by
+ * [Image] to dictate how the image should be drawn within the [Image] element's bounding box.
+ */
+@Suppress("INLINE_CLASS_DEPRECATED")
+public inline class ContentScale(private val value: Int) {
+    public companion object {
+        /**
+         * Scale the source uniformly (maintaining the source's aspect ratio) so that both
+         * dimensions (width and height) of the source will be equal to or larger than the
+         * corresponding dimension of the destination.
+         */
+        public val Crop: ContentScale = ContentScale(0)
+
+        /**
+         * Scale the source uniformly (maintaining the source's aspect ratio) so that both
+         * dimensions (width and height) of the source will be equal to or less than the
+         * corresponding dimension of the destination
+         */
+        public val Fit: ContentScale = ContentScale(1)
+
+        /**
+         * Scale horizontal and vertically non-uniformly to fill the destination bounds.
+         */
+        public val FillBounds: ContentScale = ContentScale(2)
+    }
+}
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Dimension.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Dimension.kt
index 0ee1dac..30d135f 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Dimension.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Dimension.kt
@@ -18,8 +18,8 @@
 
 import androidx.annotation.DimenRes
 import androidx.annotation.RestrictTo
-import androidx.glance.Modifier
-import androidx.glance.unit.Dp
+import androidx.compose.ui.unit.Dp
+import androidx.glance.GlanceModifier
 
 /**
  * Dimension types. This contains all the dimension types which are supported by androidx.glance.
@@ -31,7 +31,7 @@
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public sealed class Dimension {
-    public class Dp(public val dp: androidx.glance.unit.Dp) : Dimension()
+    public class Dp(public val dp: androidx.compose.ui.unit.Dp) : Dimension()
     public object Wrap : Dimension()
     public object Fill : Dimension()
     public object Expand : Dimension()
@@ -44,24 +44,26 @@
  * @suppress
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public class WidthModifier(public val width: Dimension) : Modifier.Element
+public class WidthModifier(public val width: Dimension) : GlanceModifier.Element
 
 /** Sets the absolute width of an element, in [Dp]. */
-public fun Modifier.width(width: Dp): Modifier = this.then(WidthModifier(Dimension.Dp(width)))
+public fun GlanceModifier.width(width: Dp): GlanceModifier =
+    this.then(WidthModifier(Dimension.Dp(width)))
 
 /** Set the width of a view from the value of a resource. */
-public fun Modifier.width(@DimenRes width: Int): Modifier =
+public fun GlanceModifier.width(@DimenRes width: Int): GlanceModifier =
     this.then(WidthModifier(Dimension.Resource(width)))
 
 /** Specifies that the width of the element should wrap its contents. */
-public fun Modifier.wrapContentWidth(): Modifier = this.then(WidthModifier(Dimension.Wrap))
+public fun GlanceModifier.wrapContentWidth(): GlanceModifier =
+    this.then(WidthModifier(Dimension.Wrap))
 
 /**
  * Specifies that the width of the element should expand to the size of its parent. Note that if
  * multiple elements within a linear container (e.g. Row or Column) have their width as
  * [fillMaxWidth], then they will all share the remaining space.
  */
-public fun Modifier.fillMaxWidth(): Modifier = this.then(WidthModifier(Dimension.Fill))
+public fun GlanceModifier.fillMaxWidth(): GlanceModifier = this.then(WidthModifier(Dimension.Fill))
 
 /**
  * Modifier to represent the height of an element.
@@ -69,40 +71,45 @@
  * @suppress
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public class HeightModifier(public val height: Dimension) : Modifier.Element
+public class HeightModifier(public val height: Dimension) : GlanceModifier.Element
 
 /** Sets the absolute height of an element, in [Dp]. */
-public fun Modifier.height(height: Dp): Modifier = this.then(HeightModifier(Dimension.Dp(height)))
+public fun GlanceModifier.height(height: Dp): GlanceModifier =
+    this.then(HeightModifier(Dimension.Dp(height)))
 
 /** Set the height of the view from a resource. */
-public fun Modifier.height(@DimenRes height: Int): Modifier =
+public fun GlanceModifier.height(@DimenRes height: Int): GlanceModifier =
     this.then(HeightModifier(Dimension.Resource(height)))
 
 /** Specifies that the height of the element should wrap its contents. */
-public fun Modifier.wrapContentHeight(): Modifier = this.then(HeightModifier(Dimension.Wrap))
+public fun GlanceModifier.wrapContentHeight(): GlanceModifier =
+    this.then(HeightModifier(Dimension.Wrap))
 
 /**
  * Specifies that the height of the element should expand to the size of its parent. Note that if
  * multiple elements within a linear container (e.g. Row or Column) have their height as
  * expandHeight, then they will all share the remaining space.
  */
-public fun Modifier.fillMaxHeight(): Modifier = this.then(HeightModifier(Dimension.Fill))
+public fun GlanceModifier.fillMaxHeight(): GlanceModifier =
+    this.then(HeightModifier(Dimension.Fill))
 
 /** Sets both the width and height of an element, in [Dp]. */
-public fun Modifier.size(size: Dp): Modifier = this.width(size).height(size)
+public fun GlanceModifier.size(size: Dp): GlanceModifier = this.width(size).height(size)
 
 /** Sets both width and height of an element from a resource. */
-public fun Modifier.size(@DimenRes size: Int): Modifier = this.width(size).height(size)
+public fun GlanceModifier.size(@DimenRes size: Int): GlanceModifier = this.width(size).height(size)
 
 /** Sets both the width and height of an element, in [Dp]. */
-public fun Modifier.size(width: Dp, height: Dp): Modifier = this.width(width).height(height)
+public fun GlanceModifier.size(width: Dp, height: Dp): GlanceModifier =
+    this.width(width).height(height)
 
 /** Sets both the width and height of an element from resources. */
-public fun Modifier.size(@DimenRes width: Int, @DimenRes height: Int): Modifier =
+public fun GlanceModifier.size(@DimenRes width: Int, @DimenRes height: Int): GlanceModifier =
     this.width(width).height(height)
 
 /** Wrap both the width and height's content. */
-public fun Modifier.wrapContentSize(): Modifier = this.wrapContentHeight().wrapContentWidth()
+public fun GlanceModifier.wrapContentSize(): GlanceModifier =
+    this.wrapContentHeight().wrapContentWidth()
 
 /** Set both the width and height to the maximum available space. */
-public fun Modifier.fillMaxSize(): Modifier = this.fillMaxWidth().fillMaxHeight()
\ No newline at end of file
+public fun GlanceModifier.fillMaxSize(): GlanceModifier = this.fillMaxWidth().fillMaxHeight()
\ No newline at end of file
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Image.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Image.kt
new file mode 100644
index 0000000..658931c
--- /dev/null
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Image.kt
@@ -0,0 +1,84 @@
+/*
+ * 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.layout
+
+import androidx.annotation.DrawableRes
+import androidx.annotation.RestrictTo
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ComposeNode
+import androidx.glance.Applier
+import androidx.glance.Emittable
+import androidx.glance.GlanceModifier
+
+/**
+ * Interface representing an Image source which can be used with a Glance [Image] element.
+ */
+public interface ImageProvider
+
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+/** @suppress */
+public class AndroidResourceImageProvider(@DrawableRes public val resId: Int) : ImageProvider
+
+/**
+ * Image resource from an Android Drawable resource.
+ *
+ * @param resId The resource ID of the Drawable resource to be used.
+ */
+public fun ImageProvider(@DrawableRes resId: Int): ImageProvider =
+    AndroidResourceImageProvider(resId)
+
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+/** @suppress */
+public class EmittableImage : Emittable {
+    override var modifier: GlanceModifier = GlanceModifier
+
+    public var provider: ImageProvider? = null
+    public var contentDescription: String? = null
+    public var contentScale: ContentScale = ContentScale.Fit
+}
+
+/**
+ * A composable which lays out and draws the image specified in [provider]. This will attempt to lay
+ * out the image using the intrinsic width and height of the provided image, but this can be
+ * overridden by using a modifier to set the width or height of this element.
+ *
+ * @param provider The image provider to use to draw the image
+ * @param contentDescription text used by accessibility services to describe what this image
+ *   represents. This should always be provided unless this image is used for decorative purposes,
+ *   and does not represent a meaningful action that a user can take. This text should be
+ *   localized.
+ * @param modifier Modifier used to adjust the layout algorithm or draw decoration content.
+ * @param contentScale How to lay the image out with respect to its bounds, if the bounds are
+ *   smaller than the image.
+ */
+@Composable
+public fun Image(
+    provider: ImageProvider,
+    contentDescription: String?,
+    modifier: GlanceModifier = GlanceModifier,
+    contentScale: ContentScale = ContentScale.Fit
+) {
+    ComposeNode<EmittableImage, Applier>(
+        factory = ::EmittableImage,
+        update = {
+            this.set(provider) { this.provider = it }
+            this.set(contentDescription) { this.contentDescription = it }
+            this.set(modifier) { this.modifier = it }
+            this.set(contentScale) { this.contentScale = it }
+        }
+    )
+}
\ No newline at end of file
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Padding.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Padding.kt
index cddfc2b..ced8493 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Padding.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Padding.kt
@@ -18,9 +18,9 @@
 import android.content.res.Resources
 import androidx.annotation.DimenRes
 import androidx.annotation.RestrictTo
-import androidx.glance.Modifier
-import androidx.glance.unit.Dp
-import androidx.glance.unit.dp
+import androidx.glance.GlanceModifier
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
 
 /**
  * Apply additional space along each edge of the content in [Dp]: [start], [top], [end] and
@@ -31,12 +31,12 @@
  * If any value is not defined, it will be [0.dp] or whatever value was defined by an earlier
  * modifier.
  */
-public fun Modifier.padding(
+public fun GlanceModifier.padding(
     start: Dp = 0.dp,
     top: Dp = 0.dp,
     end: Dp = 0.dp,
     bottom: Dp = 0.dp,
-): Modifier = this.then(
+): GlanceModifier = this.then(
     PaddingModifier(
         start = start.toPadding(),
         top = top.toPadding(),
@@ -54,12 +54,12 @@
  * If any value is not defined, it will be [0.dp] or whatever value was defined by an earlier
  * modifier.
  */
-public fun Modifier.padding(
+public fun GlanceModifier.padding(
     @DimenRes start: Int = 0,
     @DimenRes top: Int = 0,
     @DimenRes end: Int = 0,
     @DimenRes bottom: Int = 0
-): Modifier = this.then(
+): GlanceModifier = this.then(
     PaddingModifier(
         start = start.toPadding(),
         top = top.toPadding(),
@@ -75,10 +75,10 @@
  * If any value is not defined, it will be [0.dp] or whatever value was defined by an earlier
  * modifier.
  */
-public fun Modifier.padding(
+public fun GlanceModifier.padding(
     horizontal: Dp = 0.dp,
     vertical: Dp = 0.dp,
-): Modifier = this.then(
+): GlanceModifier = this.then(
     PaddingModifier(
         start = horizontal.toPadding(),
         top = vertical.toPadding(),
@@ -94,10 +94,10 @@
  * If any value is not defined, it will be [0.dp] or whatever value was defined by an earlier
  * modifier.
  */
-public fun Modifier.padding(
+public fun GlanceModifier.padding(
     @DimenRes horizontal: Int = 0,
     @DimenRes vertical: Int = 0
-): Modifier = this.then(
+): GlanceModifier = this.then(
     PaddingModifier(
         start = horizontal.toPadding(),
         top = vertical.toPadding(),
@@ -109,7 +109,7 @@
 /**
  * Apply [all] dp of additional space along each edge of the content, left, top, right and bottom.
  */
-public fun Modifier.padding(all: Dp): Modifier {
+public fun GlanceModifier.padding(all: Dp): GlanceModifier {
     val allDp = all.toPadding()
     return this.then(
         PaddingModifier(
@@ -124,7 +124,7 @@
 /**
  * Apply [all] dp of additional space along each edge of the content, left, top, right and bottom.
  */
-public fun Modifier.padding(@DimenRes all: Int): Modifier {
+public fun GlanceModifier.padding(@DimenRes all: Int): GlanceModifier {
     val allDp = all.toPadding()
     return this.then(
         PaddingModifier(
@@ -140,12 +140,12 @@
  *  Apply additional space along each edge of the content in [Dp]: [left], [top], [right] and
  * [bottom], ignoring the current locale's layout direction.
  */
-public fun Modifier.absolutePadding(
+public fun GlanceModifier.absolutePadding(
     left: Dp = 0.dp,
     top: Dp = 0.dp,
     right: Dp = 0.dp,
     bottom: Dp = 0.dp,
-): Modifier = this.then(
+): GlanceModifier = this.then(
     PaddingModifier(
         left = left.toPadding(),
         top = top.toPadding(),
@@ -158,12 +158,12 @@
  *  Apply additional space along each edge of the content in [Dp]: [left], [top], [right] and
  * [bottom], ignoring the current locale's layout direction.
  */
-public fun Modifier.absolutePadding(
+public fun GlanceModifier.absolutePadding(
     @DimenRes left: Int = 0,
     @DimenRes top: Int = 0,
     @DimenRes right: Int = 0,
     @DimenRes bottom: Int = 0
-): Modifier = this.then(
+): GlanceModifier = this.then(
     PaddingModifier(
         left = left.toPadding(),
         top = top.toPadding(),
@@ -180,7 +180,7 @@
 
 /** @suppress */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public fun Modifier.collectPadding(): PaddingModifier? =
+public fun GlanceModifier.collectPadding(): PaddingModifier? =
     foldIn<PaddingModifier?>(null) { acc, modifier ->
         if (modifier is PaddingModifier) {
             (acc ?: PaddingModifier()) + modifier
@@ -191,7 +191,7 @@
 
 /** @suppress */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public fun Modifier.collectPaddingInDp(resources: Resources) =
+public fun GlanceModifier.collectPaddingInDp(resources: Resources) =
     collectPadding()?.let { padding ->
         PaddingInDp(
             left = padding.left.dp + padding.left.resources.toDp(resources),
@@ -217,7 +217,7 @@
     public val right: PaddingDimension = PaddingDimension(),
     public val end: PaddingDimension = PaddingDimension(),
     public val bottom: PaddingDimension = PaddingDimension(),
-) : Modifier.Element {
+) : GlanceModifier.Element {
 
     public operator fun plus(other: PaddingModifier) =
         PaddingModifier(
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Row.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Row.kt
index 1281054..a1479cc 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Row.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Row.kt
@@ -21,12 +21,12 @@
 import androidx.compose.runtime.ComposeNode
 import androidx.glance.Applier
 import androidx.glance.EmittableWithChildren
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 
 /** @suppress */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public class EmittableRow : EmittableWithChildren() {
-    override var modifier: Modifier = Modifier
+    override var modifier: GlanceModifier = GlanceModifier
     public var horizontalAlignment: Alignment.Horizontal = Alignment.Start
     public var verticalAlignment: Alignment.Vertical = Alignment.Top
 }
@@ -39,11 +39,11 @@
      * unweighted child elements and distribute it according to the weights, the default weight
      * being 1.
      */
-    fun Modifier.defaultWeight(): Modifier
+    fun GlanceModifier.defaultWeight(): GlanceModifier
 }
 
 private object RowScopeImplInstance : RowScope {
-    override fun Modifier.defaultWeight(): Modifier {
+    override fun GlanceModifier.defaultWeight(): GlanceModifier {
         return this.then(WidthModifier(Dimension.Expand))
     }
 }
@@ -65,7 +65,7 @@
  */
 @Composable
 public fun Row(
-    modifier: Modifier = Modifier,
+    modifier: GlanceModifier = GlanceModifier,
     horizontalAlignment: Alignment.Horizontal = Alignment.Start,
     verticalAlignment: Alignment.Vertical = Alignment.Top,
     content: @Composable RowScope.() -> Unit
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Text.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Text.kt
index 2cbcfcd..2be4e32 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Text.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Text.kt
@@ -22,14 +22,14 @@
 import androidx.compose.runtime.ComposeNode
 import androidx.glance.Applier
 import androidx.glance.Emittable
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.text.TextStyle
 
 /**
  * Adds a text view to the glance view.
  */
 @Composable
-public fun Text(text: String, modifier: Modifier = Modifier, style: TextStyle? = null) {
+public fun Text(text: String, modifier: GlanceModifier = GlanceModifier, style: TextStyle? = null) {
     ComposeNode<EmittableText, Applier>(
         factory = ::EmittableText,
         update = {
@@ -43,7 +43,7 @@
 /** @suppress */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public class EmittableText : Emittable {
-    override var modifier: Modifier = Modifier
+    override var modifier: GlanceModifier = GlanceModifier
     public var text: String = ""
     public var style: TextStyle? = null
 
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/text/TextStyle.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/text/TextStyle.kt
index 5123c3f..e3ff529 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/text/TextStyle.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/text/TextStyle.kt
@@ -17,14 +17,14 @@
 package androidx.glance.text
 
 import androidx.compose.runtime.Immutable
-import androidx.glance.unit.Sp
+import androidx.compose.ui.unit.TextUnit
 
 /**
  * Description of a text style for the [androidx.glance.layout.Text] composable.
  */
 @Immutable
 public class TextStyle(
-    public val fontSize: Sp? = null,
+    public val fontSize: TextUnit? = null,
     public val fontWeight: FontWeight? = null,
     public val fontStyle: FontStyle? = null,
     public val textAlign: TextAlign? = null,
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/unit/Color.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/unit/Color.kt
deleted file mode 100644
index 6ecabae..0000000
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/unit/Color.kt
+++ /dev/null
@@ -1,131 +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.glance.unit
-
-import androidx.compose.runtime.Stable
-
-/**
- * The [Color] class contains color information to be used while drawing elements. [Color] supports
- * colors encoded in the ARGB format.
- */
-@Suppress("INLINE_CLASS_DEPRECATED")
-public inline class Color(public val value: UInt) {
-    public constructor(value: Long) : this(value.toUInt())
-
-    /**
-     * Returns the value of the red component of this [Color]. Return values are in the range
-     * 0.0 - 1.0.
-     */
-    @Stable
-    public val red: Float
-        get() {
-            return ((value shr 16) and 0xFFu).toFloat() / 255.0f
-        }
-
-    /**
-     * Returns the value of the green component of this [Color]. Return values are in the range
-     * 0.0 - 1.0.
-     */
-    @Stable
-    public val green: Float
-        get() {
-            return ((value shr 8) and 0xFFu).toFloat() / 255.0f
-        }
-
-    /**
-     * Returns the value of the blue component of this [Color]. Return values are in the range
-     * 0.0 - 1.0.
-     */
-    @Stable
-    public val blue: Float
-        get() {
-            return ((value shr 0) and 0xFFu).toFloat() / 255.0f
-        }
-
-    /**
-     * Returns the value of the alpha] component of this [Color]. Return values are in the range
-     * 0.0 - 1.0.
-     */
-    @Stable
-    public val alpha: Float
-        get() {
-            return ((value shr 24) and 0xFFu).toFloat() / 255.0f
-        }
-
-    override fun toString(): String {
-        return "Color($red, $green, $blue, $alpha)"
-    }
-
-    public companion object {
-        @Stable
-        public val Black: Color = Color(0xFF000000u)
-
-        @Stable
-        public val DarkGray: Color = Color(0xFF444444u)
-
-        @Stable
-        public val Gray: Color = Color(0xFF888888u)
-
-        @Stable
-        public val LightGray: Color = Color(0xFFCCCCCCu)
-
-        @Stable
-        public val White: Color = Color(0xFFFFFFFFu)
-
-        @Stable
-        public val Red: Color = Color(0xFFFF0000u)
-
-        @Stable
-        public val Green: Color = Color(0xFF00FF00u)
-
-        @Stable
-        public val Blue: Color = Color(0xFF0000FFu)
-
-        @Stable
-        public val Yellow: Color = Color(0xFFFFFF00u)
-
-        @Stable
-        public val Cyan: Color = Color(0xFF00FFFFu)
-
-        @Stable
-        public val Magenta: Color = Color(0xFFFF00FFu)
-
-        @Stable
-        public val Transparent: Color = Color(0x00000000u)
-    }
-}
-
-/**
- * Create a [Color] by passing individual [red], [green], [blue] and [alpha] components. The
- * default [alpha] is `1.0` if omitted.
- */
-@Stable
-public fun Color(
-    red: Float,
-    green: Float,
-    blue: Float,
-    alpha: Float = 1.0f
-): Color {
-    val argb = (
-        ((alpha * 255.0f + 0.5f).toInt() shl 24) or
-            ((red * 255.0f + 0.5f).toInt() shl 16) or
-            ((green * 255.0f + 0.5f).toInt() shl 8) or
-            (blue * 255.0f + 0.5f).toInt()
-        )
-
-    return Color(value = argb.toUInt())
-}
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/unit/ColorProvider.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/unit/ColorProvider.kt
index 74bbea0..e653c6f 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/unit/ColorProvider.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/unit/ColorProvider.kt
@@ -23,6 +23,7 @@
 import androidx.annotation.DoNotInline
 import androidx.annotation.RequiresApi
 import androidx.annotation.RestrictTo
+import androidx.compose.ui.graphics.Color
 
 /** Provider of colors for a glance composable's attributes. */
 public interface ColorProvider
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/unit/Dp.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/unit/Dp.kt
deleted file mode 100644
index c56dedf..0000000
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/unit/Dp.kt
+++ /dev/null
@@ -1,120 +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.glance.unit
-
-import kotlin.math.max
-import kotlin.math.min
-
-/**
- * Dimension value representing device-independent pixels (dp). Component APIs specify their
- * dimensions such as line thickness in DP with Dp objects. Dp are normally defined using [dp],
- * which can be applied to [Int], [Double], and [Float].
- *     val leftMargin = 10.dp
- *     val rightMargin = 10f.dp
- *     val topMargin = 20.0.dp
- *     val bottomMargin = 10.dp
- */
-@Suppress("INLINE_CLASS_DEPRECATED", "EXPERIMENTAL_FEATURE_WARNING")
-public inline class Dp(public val value: Float) : Comparable<Dp> {
-    /**
-     * Add two [Dp]s together.
-     */
-    public operator fun plus(other: Dp): Dp =
-        Dp(value = this.value + other.value)
-
-    /**
-     * Subtract a Dp from another one.
-     */
-    public operator fun minus(other: Dp): Dp =
-        Dp(value = this.value - other.value)
-
-    /**
-     * This is the same as multiplying the Dp by -1.0.
-     */
-    public operator fun unaryMinus(): Dp = Dp(-value)
-
-    /**
-     * Divide a Dp by a scalar.
-     */
-    public operator fun div(other: Float): Dp =
-        Dp(value = value / other)
-
-    public operator fun div(other: Int): Dp =
-        Dp(value = value / other)
-
-    /**
-     * Divide by another Dp to get a scalar.
-     */
-    public operator fun div(other: Dp): Float = value / other.value
-
-    /**
-     * Multiply a Dp by a scalar.
-     */
-    public operator fun times(other: Float): Dp =
-        Dp(value = value * other)
-
-    public operator fun times(other: Int): Dp =
-        Dp(value = value * other)
-
-    /**
-     * Support comparing Dimensions with comparison operators.
-     */
-    override /* TODO: inline */ operator fun compareTo(other: Dp): Int =
-        value.compareTo(other.value)
-
-    override fun toString(): String = "$value.dp"
-}
-
-/**
- * Create a [Dp] using an [Int]:
- *     val left = 10
- *     val x = left.dp
- *     // -- or --
- *     val y = 10.dp
- */
-public inline val Int.dp: Dp get() = Dp(value = this.toFloat())
-
-/**
- * Create a [Dp] using a [Double]:
- *     val left = 10.0
- *     val x = left.dp
- *     // -- or --
- *     val y = 10.0.dp
- */
-public inline val Double.dp: Dp get() = Dp(value = this.toFloat())
-
-/**
- * Create a [Dp] using a [Float]:
- *     val left = 10f
- *     val x = left.dp
- *     // -- or --
- *     val y = 10f.dp
- */
-public inline val Float.dp: Dp get() = Dp(value = this)
-
-public operator fun Float.times(other: Dp): Dp =
-    Dp(this * other.value)
-
-public operator fun Double.times(other: Dp): Dp =
-    Dp(this.toFloat() * other.value)
-
-public operator fun Int.times(other: Dp): Dp =
-    Dp(this * other.value)
-
-public fun min(a: Dp, b: Dp): Dp = Dp(value = min(a.value, b.value))
-
-public fun max(a: Dp, b: Dp): Dp = Dp(value = max(a.value, b.value))
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/unit/DpSize.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/unit/DpSize.kt
deleted file mode 100644
index 443dda4..0000000
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/unit/DpSize.kt
+++ /dev/null
@@ -1,131 +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.glance.unit
-
-import android.util.SizeF
-import androidx.compose.runtime.Immutable
-import androidx.compose.runtime.Stable
-
-/**
- * A two-dimensional Size using [Dp] for units.
- *
- * @property width The horizontal aspect of the size in [Dp]
- * @property height The vertical aspect of the size in [Dp]
- */
-@Immutable
-public class DpSize(
-    public val width: Dp,
-    public val height: Dp,
-) {
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (javaClass != other?.javaClass) return false
-
-        other as DpSize
-
-        if (width != other.width) return false
-        if (height != other.height) return false
-
-        return true
-    }
-
-    override fun hashCode(): Int {
-        var result = width.hashCode()
-        result = 31 * result + height.hashCode()
-        return result
-    }
-
-    override fun toString(): String {
-        return "DpSize(width=$width, height=$height)"
-    }
-
-    /**
-     * Returns a copy of this [DpSize] instance optionally overriding the
-     * width or height parameter
-     */
-    fun copy(width: Dp = this.width, height: Dp = this.height) =
-        DpSize(width, height)
-
-    /**
-     * Adds a [DpSize] to another one.
-     */
-    @Stable
-    public operator fun plus(other: DpSize): DpSize =
-        DpSize(width + other.width, height + other.height)
-
-    /**
-     * Subtracts a [DpSize] from another one.
-     */
-    @Stable
-    public operator fun minus(other: DpSize): DpSize =
-        DpSize(width - other.width, height - other.height)
-
-    @Stable
-    public operator fun component1(): Dp = width
-
-    @Stable
-    public operator fun component2(): Dp = height
-
-    /**
-     * Multiplies the components of a [DpSize] by a constant factor.
-     */
-    @Stable
-    public operator fun times(other: Int): DpSize = DpSize(width * other, height * other)
-
-    /**
-     * Multiplies the components of a [DpSize] by a constant factor.
-     */
-    @Stable
-    public operator fun times(other: Float): DpSize = DpSize(width * other, height * other)
-
-    /**
-     * Divides the components of a [DpSize] by a constant factor.
-     */
-    @Stable
-    public operator fun div(other: Int): DpSize = DpSize(width / other, height / other)
-
-    /**
-     * Divides the components of a [DpSize] by a constant factor.
-     */
-    @Stable
-    public operator fun div(other: Float): DpSize = DpSize(width / other, height / other)
-
-    companion object {
-        /**
-         * A [DpSize] with 0 DP [width] and 0 DP [height] values.
-         */
-        val Zero = DpSize(0.dp, 0.dp)
-    }
-}
-
-/**
- * Multiplies the components of a [DpSize] by a constant factor.
- */
-@Stable
-public operator fun Int.times(size: DpSize) = size * this
-
-/**
- * Multiplies the components of a [DpSize] by a constant factor.
- */
-@Stable
-public operator fun Float.times(size: DpSize) = size * this
-
-/**
- * Creates a SizeF with the same values.
- */
-@Stable
-public fun DpSize.toSizeF(): SizeF = SizeF(width.value, height.value)
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/unit/Sp.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/unit/Sp.kt
deleted file mode 100644
index ba77e7e..0000000
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/unit/Sp.kt
+++ /dev/null
@@ -1,120 +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.glance.unit
-
-import kotlin.math.max
-import kotlin.math.min
-
-/**
- * Dimension value representing scale-independent pixels (sp). Component APIs specify their
- * text size in SP with Sp objects. Sp are normally defined using [sp], which can be applied to
- * [Int], [Double], and [Float].
- *     val titleSize = 10.sp
- *     val rightMargin = 10f.sp
- *     val topMargin = 20.0.sp
- *     val bottomMargin = 10.sp
- */
-@Suppress("INLINE_CLASS_DEPRECATED", "EXPERIMENTAL_FEATURE_WARNING")
-public inline class Sp(public val value: Float) : Comparable<Sp> {
-    /**
-     * Add two [Sp]s together.
-     */
-    public operator fun plus(other: Sp): Sp =
-        Sp(value = this.value + other.value)
-
-    /**
-     * Subtract a Sp from another one.
-     */
-    public operator fun minus(other: Sp): Sp =
-        Sp(value = this.value - other.value)
-
-    /**
-     * This is the same as multiplying the Sp by -1.0.
-     */
-    public operator fun unaryMinus(): Sp = Sp(-value)
-
-    /**
-     * Divide a Sp by a scalar.
-     */
-    public operator fun div(other: Float): Sp =
-        Sp(value = value / other)
-
-    public operator fun div(other: Int): Sp =
-        Sp(value = value / other)
-
-    /**
-     * Divide by another Sp to get a scalar.
-     */
-    public operator fun div(other: Sp): Float = value / other.value
-
-    /**
-     * Multiply a Sp by a scalar.
-     */
-    public operator fun times(other: Float): Sp =
-        Sp(value = value * other)
-
-    public operator fun times(other: Int): Sp =
-        Sp(value = value * other)
-
-    /**
-     * Support comparing Dimensions with comparison operators.
-     */
-    override /* TODO: inline */ operator fun compareTo(other: Sp): Int =
-        value.compareTo(other.value)
-
-    override fun toString(): String = "$value.dp"
-}
-
-/**
- * Create a [Sp] using an [Int]:
- *     val left = 10
- *     val x = left.dp
- *     // -- or --
- *     val y = 10.dp
- */
-public inline val Int.sp: Sp get() = Sp(value = this.toFloat())
-
-/**
- * Create a [Sp] using a [Double]:
- *     val left = 10.0
- *     val x = left.dp
- *     // -- or --
- *     val y = 10.0.dp
- */
-public inline val Double.sp: Sp get() = Sp(value = this.toFloat())
-
-/**
- * Create a [Sp] using a [Float]:
- *     val left = 10f
- *     val x = left.dp
- *     // -- or --
- *     val y = 10f.dp
- */
-public inline val Float.sp: Sp get() = Sp(value = this)
-
-public operator fun Float.times(other: Sp): Sp =
-    Sp(this * other.value)
-
-public operator fun Double.times(other: Sp): Sp =
-    Sp(this.toFloat() * other.value)
-
-public operator fun Int.times(other: Sp): Sp =
-    Sp(this * other.value)
-
-public fun min(a: Sp, b: Sp): Sp = Sp(value = min(a.value, b.value))
-
-public fun max(a: Sp, b: Sp): Sp = Sp(value = max(a.value, b.value))
diff --git a/glance/glance/src/test/kotlin/androidx/glance/ApplierTest.kt b/glance/glance/src/test/kotlin/androidx/glance/ApplierTest.kt
index 87679fb7..b5e3e29 100644
--- a/glance/glance/src/test/kotlin/androidx/glance/ApplierTest.kt
+++ b/glance/glance/src/test/kotlin/androidx/glance/ApplierTest.kt
@@ -141,17 +141,17 @@
 }
 
 private class RootEmittable(maxDepth: Int = Int.MAX_VALUE) : EmittableWithChildren(maxDepth) {
-    override var modifier: Modifier = Modifier
+    override var modifier: GlanceModifier = GlanceModifier
 }
 
 private class MiddleEmittable : EmittableWithChildren() {
-    override var modifier: Modifier = Modifier
+    override var modifier: GlanceModifier = GlanceModifier
 }
 
 private class LeafEmittable : Emittable {
-    override var modifier: Modifier = Modifier
+    override var modifier: GlanceModifier = GlanceModifier
 }
 
 private class ResetsDepthEmittable : EmittableWithChildren(resetsDepthForChildren = true) {
-    override var modifier: Modifier = Modifier
+    override var modifier: GlanceModifier = GlanceModifier
 }
diff --git a/glance/glance/src/test/kotlin/androidx/glance/CombinedModifierTest.kt b/glance/glance/src/test/kotlin/androidx/glance/CombinedGlanceModifierTest.kt
similarity index 75%
rename from glance/glance/src/test/kotlin/androidx/glance/CombinedModifierTest.kt
rename to glance/glance/src/test/kotlin/androidx/glance/CombinedGlanceModifierTest.kt
index 7eb7b70..25cd34f 100644
--- a/glance/glance/src/test/kotlin/androidx/glance/CombinedModifierTest.kt
+++ b/glance/glance/src/test/kotlin/androidx/glance/CombinedGlanceModifierTest.kt
@@ -18,7 +18,7 @@
 import com.google.common.truth.Truth.assertThat
 import org.junit.Test
 
-class CombinedModifierTest {
+class CombinedGlanceModifierTest {
     @Test
     fun foldIn() {
         assertThat(
@@ -53,18 +53,18 @@
 
     @Test
     fun equals() {
-        assertThat(testModifier).isEqualTo(Modifier.element(1).element(2).element(3))
-        assertThat(testModifier).isNotEqualTo(Modifier.element(1).element(2).element(4))
-        assertThat(testModifier).isNotEqualTo(Modifier.element(1).element(2))
-        assertThat(testModifier).isNotEqualTo(Modifier)
+        assertThat(testModifier).isEqualTo(GlanceModifier.element(1).element(2).element(3))
+        assertThat(testModifier).isNotEqualTo(GlanceModifier.element(1).element(2).element(4))
+        assertThat(testModifier).isNotEqualTo(GlanceModifier.element(1).element(2))
+        assertThat(testModifier).isNotEqualTo(GlanceModifier)
     }
 
     private companion object {
-        val testModifier = Modifier.element(1).element(2).element(3)
+        val testModifier = GlanceModifier.element(1).element(2).element(3)
     }
 }
 
-private data class Element(val value: Int) : Modifier.Element
+private data class Element(val value: Int) : GlanceModifier.Element
 
-private fun Modifier.element(value: Int) =
+private fun GlanceModifier.element(value: Int) =
     this.then(Element(value))
\ No newline at end of file
diff --git a/glance/glance/src/test/kotlin/androidx/glance/action/ActionParametersTest.kt b/glance/glance/src/test/kotlin/androidx/glance/action/ActionParametersTest.kt
new file mode 100644
index 0000000..15cb570
--- /dev/null
+++ b/glance/glance/src/test/kotlin/androidx/glance/action/ActionParametersTest.kt
@@ -0,0 +1,133 @@
+/*
+ * 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 com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import kotlin.test.assertFailsWith
+import kotlin.test.assertFalse
+import kotlin.test.assertTrue
+
+class ActionParametersTest {
+    @Test
+    fun testKeyName() {
+        val name = "key_name"
+        val intKey1 = ActionParameters.Key<Int>(name)
+        val intKey2 = ActionParameters.Key<Int>(name)
+        assertThat(intKey1).isEqualTo(intKey2)
+    }
+
+    @Test
+    fun testKeepLast() {
+        val name = "key_name"
+        val intKey1 = ActionParameters.Key<Int>(name)
+        val intKey2 = ActionParameters.Key<Int>(name)
+        val params = mutableActionParametersOf()
+
+        params[intKey1] = 25
+        assertTrue(intKey1 in params)
+        assertTrue(intKey2 in params)
+        assertThat(params[intKey1]).isEqualTo(25)
+        assertThat(params[intKey2]).isEqualTo(25)
+
+        params[intKey2] = 300
+        assertTrue(intKey1 in params)
+        assertTrue(intKey2 in params)
+        assertThat(params[intKey1]).isEqualTo(300)
+        assertThat(params[intKey2]).isEqualTo(300)
+    }
+
+    @Test
+    @Suppress("UNUSED_VARIABLE")
+    fun testKeyConflict() {
+        val name = "key_name"
+        val intKey = ActionParameters.Key<Int>(name)
+        val stringKey = ActionParameters.Key<String>(name)
+        val params = mutableActionParametersOf()
+
+        params[intKey] = 25
+        assertTrue(intKey in params)
+        assertTrue(stringKey in params)
+        assertThat(params[intKey]).isEqualTo(25)
+        assertFailsWith<ClassCastException> {
+            val value = params[stringKey] // Only throws if assigned to a variable
+        }
+    }
+
+    @Test
+    fun testTypedKey() {
+        val booleanKey = ActionParameters.Key<Boolean>("key_name")
+        val params = actionParametersOf(booleanKey to true)
+        assertTrue(booleanKey in params)
+        assertTrue(params[booleanKey]!!)
+    }
+
+    @Test
+    fun testNoKey() {
+        val booleanKey = ActionParameters.Key<Boolean>("key_name")
+        val params = mutableActionParametersOf()
+        assertFalse(booleanKey in params)
+    }
+
+    @Test
+    fun testMixedKeys() {
+        val string = "test string"
+        val booleanKey = ActionParameters.Key<Boolean>("key_name")
+        val stringKey = ActionParameters.Key<String>("key_name2")
+        val params = mutableActionParametersOf()
+        params[stringKey] = string
+        params[booleanKey] = false
+
+        assertTrue(booleanKey in params)
+        assertTrue(stringKey in params)
+        assertFalse(params[booleanKey]!!)
+        assertThat(params[stringKey]).isEqualTo(string)
+    }
+
+    @Test
+    fun testMixedKeysConstructor() {
+        val string = "test_string"
+        val booleanKey = ActionParameters.Key<Boolean>("key_name")
+        val stringKey = ActionParameters.Key<String>("key_name2")
+        val params = actionParametersOf(stringKey to string, booleanKey to true)
+
+        assertTrue(booleanKey in params)
+        assertTrue(stringKey in params)
+        assertTrue(params[booleanKey]!!)
+        assertThat(params[stringKey]).isEqualTo(string)
+    }
+
+    @Test
+    fun testClear() {
+        val intKey = ActionParameters.Key<Int>("name")
+        val params = mutableActionParametersOf(intKey to 309)
+        val empty = mutableActionParametersOf()
+        params.clear()
+        assertThat(params).isEqualTo(empty)
+    }
+
+    @Test
+    fun testEquals() {
+        val keyName = "name"
+        val value = "hello"
+        val key1 = ActionParameters.Key<String>(keyName)
+        val key2 = ActionParameters.Key<String>(keyName)
+        val params1 = actionParametersOf(key1 to value)
+        val params2 = actionParametersOf(key2 to value)
+        assertThat(params1).isEqualTo(params2)
+    }
+}
diff --git a/glance/glance/src/test/kotlin/androidx/glance/action/ActionTest.kt b/glance/glance/src/test/kotlin/androidx/glance/action/ActionTest.kt
index 4edbaa2..b6d89c8 100644
--- a/glance/glance/src/test/kotlin/androidx/glance/action/ActionTest.kt
+++ b/glance/glance/src/test/kotlin/androidx/glance/action/ActionTest.kt
@@ -19,7 +19,7 @@
 import android.content.Context
 import com.google.common.truth.Truth.assertThat
 import android.content.ComponentName
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.findModifier
 import androidx.test.core.app.ApplicationProvider
 import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -46,14 +46,14 @@
 
     @Test
     fun testLaunchActivity() {
-        val modifiers = Modifier.clickable(actionLaunchActivity(TestActivity::class.java))
+        val modifiers = GlanceModifier.clickable(actionLaunchActivity(TestActivity::class.java))
         val modifier = checkNotNull(modifiers.findModifier<ActionModifier>())
         assertIs<LaunchActivityClassAction>(modifier.action)
     }
 
     @Test
     fun testUpdate() {
-        val modifiers = Modifier.clickable(actionUpdateContent<TestRunnable>())
+        val modifiers = GlanceModifier.clickable(actionUpdateContent<TestRunnable>())
         val modifier = checkNotNull(modifiers.findModifier<ActionModifier>())
         assertIs<UpdateContentAction>(modifier.action)
     }
@@ -62,7 +62,7 @@
     fun testLaunchFromComponent() = fakeCoroutineScope.runBlockingTest {
         val c = ComponentName("androidx.glance.action", "androidx.glance.action.TestActivity")
 
-        val modifiers = Modifier.clickable(actionLaunchActivity(c))
+        val modifiers = GlanceModifier.clickable(actionLaunchActivity(c))
         val modifier = checkNotNull(modifiers.findModifier<ActionModifier>())
         val action = assertIs<LaunchActivityComponentAction>(modifier.action)
         val component = assertNotNull(action.componentName)
@@ -74,7 +74,7 @@
     fun testLaunchFromComponentWithContext() = fakeCoroutineScope.runBlockingTest {
         val c = ComponentName(context, "androidx.glance.action.TestActivity")
 
-        val modifiers = Modifier.clickable(actionLaunchActivity(c))
+        val modifiers = GlanceModifier.clickable(actionLaunchActivity(c))
         val modifier = checkNotNull(modifiers.findModifier<ActionModifier>())
         val action = assertIs<LaunchActivityComponentAction>(modifier.action)
         val component = assertNotNull(action.componentName)
@@ -84,5 +84,5 @@
 }
 
 class TestRunnable : ActionRunnable {
-    override suspend fun run(context: Context) { }
+    override suspend fun run(context: Context, parameters: ActionParameters) { }
 }
diff --git a/glance/glance/src/test/kotlin/androidx/glance/layout/BoxTest.kt b/glance/glance/src/test/kotlin/androidx/glance/layout/BoxTest.kt
index 9381169..eb7bbb4 100644
--- a/glance/glance/src/test/kotlin/androidx/glance/layout/BoxTest.kt
+++ b/glance/glance/src/test/kotlin/androidx/glance/layout/BoxTest.kt
@@ -16,9 +16,9 @@
 
 package androidx.glance.layout
 
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.findModifier
-import androidx.glance.unit.dp
+import androidx.compose.ui.unit.dp
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.test.TestCoroutineScope
@@ -53,7 +53,7 @@
     @Test
     fun createComposableBoxWithModifier() = fakeCoroutineScope.runBlockingTest {
         val root = runTestingComposition {
-            Box(modifier = Modifier.padding(1.dp)) {}
+            Box(modifier = GlanceModifier.padding(1.dp)) {}
         }
 
         val innerBox = assertIs<EmittableBox>(root.children[0])
diff --git a/glance/glance/src/test/kotlin/androidx/glance/layout/ColumnTest.kt b/glance/glance/src/test/kotlin/androidx/glance/layout/ColumnTest.kt
index 166f057..fca4c81 100644
--- a/glance/glance/src/test/kotlin/androidx/glance/layout/ColumnTest.kt
+++ b/glance/glance/src/test/kotlin/androidx/glance/layout/ColumnTest.kt
@@ -16,9 +16,9 @@
 
 package androidx.glance.layout
 
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.findModifier
-import androidx.glance.unit.dp
+import androidx.compose.ui.unit.dp
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.test.TestCoroutineScope
@@ -51,7 +51,7 @@
     fun createComposableRowWithParams() = fakeCoroutineScope.runBlockingTest {
         val root = runTestingComposition {
             Column(
-                modifier = Modifier.padding(2.dp),
+                modifier = GlanceModifier.padding(2.dp),
                 horizontalAlignment = Alignment.CenterHorizontally,
                 verticalAlignment = Alignment.CenterVertically
             ) {}
@@ -85,7 +85,7 @@
     fun createComposableColumnWithWeightChildren() = fakeCoroutineScope.runBlockingTest {
         val root = runTestingComposition {
             Column {
-                Box(modifier = Modifier.defaultWeight()) { }
+                Box(modifier = GlanceModifier.defaultWeight()) { }
             }
         }
 
diff --git a/glance/glance/src/test/kotlin/androidx/glance/layout/DimensionTest.kt b/glance/glance/src/test/kotlin/androidx/glance/layout/DimensionTest.kt
index bdb3ec5..69f2e0a 100644
--- a/glance/glance/src/test/kotlin/androidx/glance/layout/DimensionTest.kt
+++ b/glance/glance/src/test/kotlin/androidx/glance/layout/DimensionTest.kt
@@ -16,9 +16,9 @@
 
 package androidx.glance.layout
 
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.findModifier
-import androidx.glance.unit.dp
+import androidx.compose.ui.unit.dp
 import com.google.common.truth.Truth.assertThat
 import org.junit.Test
 import kotlin.test.assertIs
@@ -26,7 +26,7 @@
 class DimensionTest {
     @Test
     fun absoluteWidthModifier() {
-        val modifier = Modifier.width(5.dp)
+        val modifier = GlanceModifier.width(5.dp)
 
         val widthModifier = checkNotNull(modifier.findModifier<WidthModifier>())
 
@@ -36,7 +36,7 @@
 
     @Test
     fun wrapWidthModifier() {
-        val modifier = Modifier.wrapContentWidth()
+        val modifier = GlanceModifier.wrapContentWidth()
 
         val widthModifier = checkNotNull(modifier.findModifier<WidthModifier>())
         assertThat(widthModifier.width).isSameInstanceAs(Dimension.Wrap)
@@ -44,7 +44,7 @@
 
     @Test
     fun fillMaxWidthModifier() {
-        val modifier = Modifier.fillMaxWidth()
+        val modifier = GlanceModifier.fillMaxWidth()
 
         val widthModifier = checkNotNull(modifier.findModifier<WidthModifier>())
         assertThat(widthModifier.width).isSameInstanceAs(Dimension.Fill)
@@ -52,7 +52,7 @@
 
     @Test
     fun absoluteHeightModifier() {
-        val modifier = Modifier.height(5.dp)
+        val modifier = GlanceModifier.height(5.dp)
 
         val heightModifier = checkNotNull(modifier.findModifier<HeightModifier>())
 
@@ -62,7 +62,7 @@
 
     @Test
     fun wrapHeightModifier() {
-        val modifier = Modifier.wrapContentHeight()
+        val modifier = GlanceModifier.wrapContentHeight()
 
         val heightModifier = checkNotNull(modifier.findModifier<HeightModifier>())
         assertThat(heightModifier.height).isInstanceOf(Dimension.Wrap::class.java)
@@ -70,7 +70,7 @@
 
     @Test
     fun fillMaxHeightModifier() {
-        val modifier = Modifier.fillMaxHeight()
+        val modifier = GlanceModifier.fillMaxHeight()
 
         val heightModifier = checkNotNull(modifier.findModifier<HeightModifier>())
         assertThat(heightModifier.height).isSameInstanceAs(Dimension.Fill)
@@ -78,7 +78,7 @@
 
     @Test
     fun sizeModifier() {
-        val modifier = Modifier.size(1.dp, 2.dp)
+        val modifier = GlanceModifier.size(1.dp, 2.dp)
 
         val widthModifier = checkNotNull(modifier.findModifier<WidthModifier>())
         val heightModifier = checkNotNull(modifier.findModifier<HeightModifier>())
@@ -92,7 +92,7 @@
 
     @Test
     fun sizeModifierWithResources() {
-        val modifier = Modifier.size(123, 234)
+        val modifier = GlanceModifier.size(123, 234)
 
         val widthModifier = checkNotNull(modifier.findModifier<WidthModifier>())
         val heightModifier = checkNotNull(modifier.findModifier<HeightModifier>())
@@ -106,7 +106,7 @@
 
     @Test
     fun combinedSizeModifier() {
-        val modifier = Modifier.size(10.dp)
+        val modifier = GlanceModifier.size(10.dp)
 
         val widthModifier = checkNotNull(modifier.findModifier<WidthModifier>())
         val heightModifier = checkNotNull(modifier.findModifier<HeightModifier>())
@@ -120,7 +120,7 @@
 
     @Test
     fun combinedSizeModifierWithResources() {
-        val modifier = Modifier.size(123)
+        val modifier = GlanceModifier.size(123)
 
         val widthModifier = checkNotNull(modifier.findModifier<WidthModifier>())
         val heightModifier = checkNotNull(modifier.findModifier<HeightModifier>())
@@ -134,7 +134,7 @@
 
     @Test
     fun fillMaxSizeModifier() {
-        val modifier = Modifier.fillMaxSize()
+        val modifier = GlanceModifier.fillMaxSize()
 
         val widthModifier = checkNotNull(modifier.findModifier<WidthModifier>())
         val heightModifier = checkNotNull(modifier.findModifier<HeightModifier>())
@@ -145,7 +145,7 @@
 
     @Test
     fun wrapContentSizeModifier() {
-        val modifier = Modifier.wrapContentSize()
+        val modifier = GlanceModifier.wrapContentSize()
 
         val widthModifier = checkNotNull(modifier.findModifier<WidthModifier>())
         val heightModifier = checkNotNull(modifier.findModifier<HeightModifier>())
@@ -156,7 +156,7 @@
 
     @Test
     fun resourceWidthModifier() {
-        val modifier = Modifier.width(123)
+        val modifier = GlanceModifier.width(123)
 
         val widthModifier = checkNotNull(modifier.findModifier<WidthModifier>())
 
@@ -166,7 +166,7 @@
 
     @Test
     fun resourceHeightModifier() {
-        val modifier = Modifier.height(123)
+        val modifier = GlanceModifier.height(123)
 
         val heightModifier = checkNotNull(modifier.findModifier<HeightModifier>())
 
diff --git a/glance/glance/src/test/kotlin/androidx/glance/layout/ImageTest.kt b/glance/glance/src/test/kotlin/androidx/glance/layout/ImageTest.kt
new file mode 100644
index 0000000..0d94651
--- /dev/null
+++ b/glance/glance/src/test/kotlin/androidx/glance/layout/ImageTest.kt
@@ -0,0 +1,61 @@
+/*
+ * 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.layout
+
+import androidx.compose.ui.unit.dp
+import androidx.glance.findModifier
+import androidx.glance.GlanceModifier
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.TestCoroutineScope
+import kotlinx.coroutines.test.runBlockingTest
+import org.junit.Before
+import org.junit.Test
+import kotlin.test.assertIs
+
+@OptIn(ExperimentalCoroutinesApi::class)
+class ImageTest {
+    private lateinit var fakeCoroutineScope: TestCoroutineScope
+
+    @Before
+    fun setUp() {
+        fakeCoroutineScope = TestCoroutineScope()
+    }
+
+    @Test
+    fun createImage() = fakeCoroutineScope.runBlockingTest {
+        val root = runTestingComposition {
+            Image(
+                provider = ImageProvider(5),
+                contentDescription = "Hello World",
+                modifier = GlanceModifier.padding(5.dp),
+                contentScale = ContentScale.FillBounds
+            )
+        }
+
+        assertThat(root.children).hasSize(1)
+        assertThat(root.children[0]).isInstanceOf(EmittableImage::class.java)
+
+        val img = root.children[0] as EmittableImage
+
+        val imgSource = assertIs<AndroidResourceImageProvider>(img.provider)
+        assertThat(imgSource.resId).isEqualTo(5)
+        assertThat(img.contentDescription).isEqualTo("Hello World")
+        assertThat(img.contentScale).isEqualTo(ContentScale.FillBounds)
+        assertThat(img.modifier.findModifier<PaddingModifier>()).isNotNull()
+    }
+}
\ No newline at end of file
diff --git a/glance/glance/src/test/kotlin/androidx/glance/layout/PaddingTest.kt b/glance/glance/src/test/kotlin/androidx/glance/layout/PaddingTest.kt
index 6d7cbe6..0bbe79e 100644
--- a/glance/glance/src/test/kotlin/androidx/glance/layout/PaddingTest.kt
+++ b/glance/glance/src/test/kotlin/androidx/glance/layout/PaddingTest.kt
@@ -17,9 +17,9 @@
 
 import android.content.res.Resources
 import android.util.DisplayMetrics
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.findModifier
-import androidx.glance.unit.dp
+import androidx.compose.ui.unit.dp
 import com.google.common.truth.Truth.assertThat
 import com.nhaarman.mockitokotlin2.doReturn
 import com.nhaarman.mockitokotlin2.mock
@@ -39,7 +39,7 @@
 
     @Test
     fun buildPadding() {
-        val modifiers = Modifier.padding(
+        val modifiers = GlanceModifier.padding(
             start = 1.dp,
             top = 2.dp,
             end = 3.dp,
@@ -61,7 +61,7 @@
 
     @Test
     fun buildVerticalHorizontalPadding() {
-        val modifiers = Modifier.padding(vertical = 2.dp, horizontal = 4.dp)
+        val modifiers = GlanceModifier.padding(vertical = 2.dp, horizontal = 4.dp)
 
         val paddingModifier = checkNotNull(modifiers.findModifier<PaddingModifier>())
 
@@ -77,7 +77,7 @@
 
     @Test
     fun buildAllPadding() {
-        val modifiers = Modifier.padding(all = 5.dp)
+        val modifiers = GlanceModifier.padding(all = 5.dp)
 
         val paddingModifier = checkNotNull(modifiers.findModifier<PaddingModifier>())
 
@@ -93,7 +93,7 @@
 
     @Test
     fun buildAbsolutePadding() {
-        val modifiers = Modifier.absolutePadding(
+        val modifiers = GlanceModifier.absolutePadding(
             left = 1.dp,
             top = 2.dp,
             right = 3.dp,
@@ -114,7 +114,7 @@
 
     @Test
     fun extractPadding_shouldReturnNull() {
-        val modifiers = Modifier.then(object : Modifier.Element {})
+        val modifiers = GlanceModifier.then(object : GlanceModifier.Element {})
 
         assertThat(modifiers.collectPadding()).isNull()
         assertThat(modifiers.collectPaddingInDp(mockResources)).isNull()
@@ -122,7 +122,7 @@
 
     @Test
     fun mergePadding_noOrientation() {
-        val modifiers = Modifier.padding(horizontal = 15.dp).padding(vertical = dimensionRes1)
+        val modifiers = GlanceModifier.padding(horizontal = 15.dp).padding(vertical = dimensionRes1)
 
         val paddingModifier = checkNotNull(modifiers.collectPadding())
 
@@ -149,7 +149,7 @@
 
     @Test
     fun mergePadding_resetWithAll() {
-        val modifiers = Modifier.padding(horizontal = 12.dp).padding(all = dimensionRes2)
+        val modifiers = GlanceModifier.padding(horizontal = 12.dp).padding(all = dimensionRes2)
 
         val paddingModifier = checkNotNull(modifiers.collectPadding())
 
@@ -176,7 +176,7 @@
 
     @Test
     fun mergePadding_withRelativeOrientation() {
-        val modifiers = Modifier.padding(start = 15.dp, end = 12.dp, top = 20.dp)
+        val modifiers = GlanceModifier.padding(start = 15.dp, end = 12.dp, top = 20.dp)
             .padding(end = dimensionRes1)
 
         val paddingModifier = checkNotNull(modifiers.collectPadding())
@@ -192,7 +192,7 @@
 
     @Test
     fun mergePadding_withAbsoluteOrientation() {
-        val modifiers = Modifier.absolutePadding(left = 15.dp, right = 12.dp)
+        val modifiers = GlanceModifier.absolutePadding(left = 15.dp, right = 12.dp)
             .absolutePadding(left = dimensionRes1, bottom = dimensionRes2)
 
         val paddingModifier = checkNotNull(modifiers.collectPadding())
@@ -208,7 +208,7 @@
 
     @Test
     fun mergePadding_setOrientationToRelative() {
-        val modifiers = Modifier.absolutePadding(left = 10.dp, right = 10.dp)
+        val modifiers = GlanceModifier.absolutePadding(left = 10.dp, right = 10.dp)
             .padding(start = dimensionRes1, end = dimensionRes2)
 
         val paddingModifier = checkNotNull(modifiers.collectPadding())
@@ -225,7 +225,7 @@
 
     @Test
     fun mergePadding_setOrientationToAbsolute() {
-        val modifiers = Modifier.padding(start = dimensionRes1, end = dimensionRes2)
+        val modifiers = GlanceModifier.padding(start = dimensionRes1, end = dimensionRes2)
             .absolutePadding(left = 10.dp, right = 12.dp)
 
         val paddingModifier = checkNotNull(modifiers.collectPadding())
diff --git a/glance/glance/src/test/kotlin/androidx/glance/layout/RowTest.kt b/glance/glance/src/test/kotlin/androidx/glance/layout/RowTest.kt
index 671d0c0..4a2adff 100644
--- a/glance/glance/src/test/kotlin/androidx/glance/layout/RowTest.kt
+++ b/glance/glance/src/test/kotlin/androidx/glance/layout/RowTest.kt
@@ -16,9 +16,9 @@
 
 package androidx.glance.layout
 
-import androidx.glance.Modifier
+import androidx.glance.GlanceModifier
 import androidx.glance.findModifier
-import androidx.glance.unit.dp
+import androidx.compose.ui.unit.dp
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.test.TestCoroutineScope
@@ -51,7 +51,7 @@
     fun createComposableRowWithParams() = fakeCoroutineScope.runBlockingTest {
         val root = runTestingComposition {
             Row(
-                modifier = Modifier.padding(2.dp),
+                modifier = GlanceModifier.padding(2.dp),
                 verticalAlignment = Alignment.Bottom,
                 horizontalAlignment = Alignment.End
             ) {}
@@ -85,7 +85,7 @@
     fun createComposableRowWithWeightChildren() = fakeCoroutineScope.runBlockingTest {
         val root = runTestingComposition {
             Row {
-                Box(modifier = Modifier.defaultWeight()) { }
+                Box(modifier = GlanceModifier.defaultWeight()) { }
             }
         }
 
diff --git a/glance/glance/src/test/kotlin/androidx/glance/layout/TextTest.kt b/glance/glance/src/test/kotlin/androidx/glance/layout/TextTest.kt
index dfc925f..d43b39b 100644
--- a/glance/glance/src/test/kotlin/androidx/glance/layout/TextTest.kt
+++ b/glance/glance/src/test/kotlin/androidx/glance/layout/TextTest.kt
@@ -16,14 +16,14 @@
 
 package androidx.glance.layout
 
-import androidx.glance.Modifier
+import androidx.compose.ui.unit.sp
 import androidx.glance.findModifier
+import androidx.glance.GlanceModifier
 import androidx.glance.text.FontStyle
 import androidx.glance.text.FontWeight
 import androidx.glance.text.TextAlign
 import androidx.glance.text.TextDecoration
 import androidx.glance.text.TextStyle
-import androidx.glance.unit.sp
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.test.TestCoroutineScope
@@ -81,7 +81,7 @@
     @Test
     fun createComposableTextWithModifiers() = fakeCoroutineScope.runBlockingTest {
         val root = runTestingComposition {
-            Text("text", modifier = Modifier.fillMaxWidth())
+            Text("text", modifier = GlanceModifier.fillMaxWidth())
         }
 
         assertThat(root.children).hasSize(1)
diff --git a/glance/glance/src/test/kotlin/androidx/glance/unit/DpSizeTest.kt b/glance/glance/src/test/kotlin/androidx/glance/unit/DpSizeTest.kt
deleted file mode 100644
index e134c93..0000000
--- a/glance/glance/src/test/kotlin/androidx/glance/unit/DpSizeTest.kt
+++ /dev/null
@@ -1,66 +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.glance.unit
-
-import com.google.common.truth.Truth.assertThat
-import org.junit.Test
-
-class DpSizeTest {
-
-    @Test
-    fun identity() {
-        assertThat(DpSize(1.dp, 2.dp)).isEqualTo(DpSize(1.dp, 2.dp))
-        assertThat(DpSize(1.dp, 2.dp)).isNotEqualTo(DpSize(2.dp, 1.dp))
-    }
-
-    @Test
-    fun copy() {
-        assertThat(DpSize.Zero.copy(height = 2.dp)).isEqualTo(DpSize(0.dp, 2.dp))
-        assertThat(DpSize.Zero.copy(width = 2.dp)).isEqualTo(DpSize(2.dp, 0.dp))
-    }
-
-    @Test
-    fun plus() {
-        assertThat(DpSize(1.dp, 2.dp) + DpSize(3.dp, 4.dp)).isEqualTo(DpSize(4.dp, 6.dp))
-    }
-
-    @Test
-    fun minus() {
-        assertThat(DpSize(1.dp, 2.dp) - DpSize(3.dp, 4.dp)).isEqualTo(DpSize(-2.dp, -2.dp))
-    }
-
-    @Test
-    fun components() {
-        val (width, height) = DpSize(1.dp, 2.dp)
-        assertThat(width).isEqualTo(1.dp)
-        assertThat(height).isEqualTo(2.dp)
-    }
-
-    @Test
-    fun times() {
-        assertThat(DpSize(1.dp, 2.dp) * 2).isEqualTo(DpSize(2.dp, 4.dp))
-        assertThat(DpSize(1.dp, 2.dp) * 2.5f).isEqualTo(DpSize(2.5.dp, 5.dp))
-        assertThat(2 * DpSize(1.dp, 2.dp)).isEqualTo(DpSize(2.dp, 4.dp))
-        assertThat(2.5f * DpSize(1.dp, 2.dp)).isEqualTo(DpSize(2.5.dp, 5.dp))
-    }
-
-    @Test
-    fun div() {
-        assertThat(DpSize(1.dp, 2.dp) / 2).isEqualTo(DpSize(0.5.dp, 1.dp))
-        assertThat(DpSize(2.5.dp, 5.dp) / 2.5f).isEqualTo(DpSize(1.dp, 2.dp))
-    }
-}
\ No newline at end of file
diff --git a/glance/glance/src/test/kotlin/androidx/glance/unit/DpTest.kt b/glance/glance/src/test/kotlin/androidx/glance/unit/DpTest.kt
deleted file mode 100644
index 80a27dc..0000000
--- a/glance/glance/src/test/kotlin/androidx/glance/unit/DpTest.kt
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.glance.unit
-
-import org.junit.Assert.assertEquals
-import org.junit.Assert.assertTrue
-import org.junit.Assert.fail
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-
-@RunWith(JUnit4::class)
-class DpTest {
-    @Test
-    fun constructor() {
-        val dim1 = Dp(value = 5f)
-        assertEquals(5f, dim1.value, 0f)
-
-        val dim2 = Dp(value = Float.POSITIVE_INFINITY)
-        assertEquals(Float.POSITIVE_INFINITY, dim2.value, 0f)
-
-        val dim3 = Dp(value = Float.NaN)
-        assertEquals(Float.NaN, dim3.value, 0f)
-    }
-
-    @Test
-    fun dpIntegerConstruction() {
-        val dim = 10.dp
-        assertEquals(10f, dim.value, 0f)
-    }
-
-    @Test
-    fun dpFloatConstruction() {
-        val dim = 10f.dp
-        assertEquals(10f, dim.value, 0f)
-    }
-
-    @Test
-    fun dpDoubleConstruction() {
-        val dim = 10.0.dp
-        assertEquals(10f, dim.value, 0f)
-    }
-
-    @Test
-    fun subtractOperator() {
-        assertEquals(-1f, (3.dp - 4.dp).value)
-        assertEquals(1f, (10.dp - 9.dp).value, 0f)
-    }
-
-    @Test
-    fun addOperator() {
-        assertEquals(2f, (1.dp + 1.dp).value, 0f)
-        assertEquals(10f, (6.dp + 4.dp).value, 0f)
-    }
-
-    @Test
-    fun multiplyOperator() {
-        assertEquals(0f, (1.dp * 0f).value, 0f)
-        assertEquals(10f, (1.dp * 10f).value, 0f)
-    }
-
-    @Test
-    fun multiplyOperatorScalar() {
-        assertEquals(10f, 10f * 1.dp.value, 0f)
-        assertEquals(10f, 10 * 1.dp.value, 0f)
-        assertEquals(10f, (10.0 * 1.dp).value, 0f)
-    }
-
-    @Test
-    fun divideOperator() {
-        assertEquals(10f, 100.dp / 10f.dp, 0f)
-        assertEquals(0f, 0.dp / 10f.dp, 0f)
-    }
-
-    @Test
-    fun divideToScalar() {
-        assertEquals(1f, 1.dp / 1.dp, 0f)
-    }
-
-    @Suppress("DIVISION_BY_ZERO")
-    @Test
-    fun compare() {
-        assertTrue(0.dp < Float.MIN_VALUE.dp)
-        assertTrue(1.dp < 3.dp)
-        assertEquals(0, 1.dp.compareTo(1.dp))
-        assertTrue(1.dp > 0.dp)
-        assertTrue(Float.NEGATIVE_INFINITY.dp < 0.dp)
-
-        val zeroNaN = 0f / 0f
-        val infNaN = Float.POSITIVE_INFINITY / Float.NEGATIVE_INFINITY
-        assertEquals(0, zeroNaN.dp.compareTo(zeroNaN.dp))
-        assertEquals(0, infNaN.dp.compareTo(infNaN.dp))
-    }
-
-    @Test
-    fun minTest() {
-        assertEquals(10f, min(10.dp, 20.dp).value, 0f)
-        assertEquals(10f, min(20.dp, 10.dp).value, 0f)
-        assertEquals(10f, min(10.dp, 10.dp).value, 0f)
-    }
-
-    @Test
-    fun maxTest() {
-        assertEquals(20f, max(10.dp, 20.dp).value, 0f)
-        assertEquals(20f, max(20.dp, 10.dp).value, 0f)
-        assertEquals(20f, max(20.dp, 20.dp).value, 0f)
-    }
-
-    @Test
-    fun coerceIn() {
-        assertEquals(10f, 10.dp.coerceIn(0.dp, 20.dp).value, 0f)
-        assertEquals(10f, 20.dp.coerceIn(0.dp, 10.dp).value, 0f)
-        assertEquals(10f, 0.dp.coerceIn(10.dp, 20.dp).value, 0f)
-        try {
-            10.dp.coerceIn(20.dp, 10.dp)
-            fail("Expected an exception here")
-        } catch (e: IllegalArgumentException) {
-            // success!
-        }
-    }
-
-    @Test
-    fun coerceAtLeast() {
-        assertEquals(10f, 0.dp.coerceAtLeast(10.dp).value, 0f)
-        assertEquals(10f, 10.dp.coerceAtLeast(5.dp).value, 0f)
-        assertEquals(10f, 10.dp.coerceAtLeast(10.dp).value, 0f)
-    }
-
-    @Test
-    fun coerceAtMost() {
-        assertEquals(10f, 100.dp.coerceAtMost(10.dp).value, 0f)
-        assertEquals(10f, 10.dp.coerceAtMost(20.dp).value, 0f)
-        assertEquals(10f, 10.dp.coerceAtMost(10.dp).value, 0f)
-    }
-}
\ No newline at end of file
diff --git a/glance/glance/src/test/kotlin/androidx/glance/unit/SpTest.kt b/glance/glance/src/test/kotlin/androidx/glance/unit/SpTest.kt
deleted file mode 100644
index 4c2fbd1..0000000
--- a/glance/glance/src/test/kotlin/androidx/glance/unit/SpTest.kt
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.glance.unit
-
-import org.junit.Assert.assertEquals
-import org.junit.Assert.assertTrue
-import org.junit.Assert.fail
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-
-@RunWith(JUnit4::class)
-class SpTest {
-    @Test
-    fun constructor() {
-        val dim1 = Sp(value = 5f)
-        assertEquals(5f, dim1.value, 0f)
-
-        val dim2 = Sp(value = Float.POSITIVE_INFINITY)
-        assertEquals(Float.POSITIVE_INFINITY, dim2.value, 0f)
-
-        val dim3 = Sp(value = Float.NaN)
-        assertEquals(Float.NaN, dim3.value, 0f)
-    }
-
-    @Test
-    fun spIntegerConstruction() {
-        val dim = 10.sp
-        assertEquals(10f, dim.value, 0f)
-    }
-
-    @Test
-    fun spFloatConstruction() {
-        val dim = 10f.sp
-        assertEquals(10f, dim.value, 0f)
-    }
-
-    @Test
-    fun spDoubleConstruction() {
-        val dim = 10.0.sp
-        assertEquals(10f, dim.value, 0f)
-    }
-
-    @Test
-    fun subtractOperator() {
-        assertEquals(-1f, (3.sp - 4.sp).value)
-        assertEquals(1f, (10.sp - 9.sp).value, 0f)
-    }
-
-    @Test
-    fun addOperator() {
-        assertEquals(2f, (1.sp + 1.sp).value, 0f)
-        assertEquals(10f, (6.sp + 4.sp).value, 0f)
-    }
-
-    @Test
-    fun multiplyOperator() {
-        assertEquals(0f, (1.sp * 0f).value, 0f)
-        assertEquals(10f, (1.sp * 10f).value, 0f)
-    }
-
-    @Test
-    fun multiplyOperatorScalar() {
-        assertEquals(10f, 10f * 1.sp.value, 0f)
-        assertEquals(10f, 10 * 1.sp.value, 0f)
-        assertEquals(10f, (10.0 * 1.sp).value, 0f)
-    }
-
-    @Test
-    fun divideOperator() {
-        assertEquals(10f, 100.sp / 10f.sp, 0f)
-        assertEquals(0f, 0.sp / 10f.sp, 0f)
-    }
-
-    @Test
-    fun divideToScalar() {
-        assertEquals(1f, 1.sp / 1.sp, 0f)
-    }
-
-    @Suppress("DIVISION_BY_ZERO")
-    @Test
-    fun compare() {
-        assertTrue(0.sp < Float.MIN_VALUE.sp)
-        assertTrue(1.sp < 3.sp)
-        assertEquals(0, 1.sp.compareTo(1.sp))
-        assertTrue(1.sp > 0.sp)
-        assertTrue(Float.NEGATIVE_INFINITY.sp < 0.sp)
-
-        val zeroNaN = 0f / 0f
-        val infNaN = Float.POSITIVE_INFINITY / Float.NEGATIVE_INFINITY
-        assertEquals(0, zeroNaN.sp.compareTo(zeroNaN.sp))
-        assertEquals(0, infNaN.sp.compareTo(infNaN.sp))
-    }
-
-    @Test
-    fun minTest() {
-        assertEquals(10f, min(10.sp, 20.sp).value, 0f)
-        assertEquals(10f, min(20.sp, 10.sp).value, 0f)
-        assertEquals(10f, min(10.sp, 10.sp).value, 0f)
-    }
-
-    @Test
-    fun maxTest() {
-        assertEquals(20f, max(10.sp, 20.sp).value, 0f)
-        assertEquals(20f, max(20.sp, 10.sp).value, 0f)
-        assertEquals(20f, max(20.sp, 20.sp).value, 0f)
-    }
-
-    @Test
-    fun coerceIn() {
-        assertEquals(10f, 10.sp.coerceIn(0.sp, 20.sp).value, 0f)
-        assertEquals(10f, 20.sp.coerceIn(0.sp, 10.sp).value, 0f)
-        assertEquals(10f, 0.sp.coerceIn(10.sp, 20.sp).value, 0f)
-        try {
-            10.sp.coerceIn(20.sp, 10.sp)
-            fail("Expected an exception here")
-        } catch (e: IllegalArgumentException) {
-            // success!
-        }
-    }
-
-    @Test
-    fun coerceAtLeast() {
-        assertEquals(10f, 0.sp.coerceAtLeast(10.sp).value, 0f)
-        assertEquals(10f, 10.sp.coerceAtLeast(5.sp).value, 0f)
-        assertEquals(10f, 10.sp.coerceAtLeast(10.sp).value, 0f)
-    }
-
-    @Test
-    fun coerceAtMost() {
-        assertEquals(10f, 100.sp.coerceAtMost(10.sp).value, 0f)
-        assertEquals(10f, 10.sp.coerceAtMost(20.sp).value, 0f)
-        assertEquals(10f, 10.sp.coerceAtMost(10.sp).value, 0f)
-    }
-}
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
index 4b0eb07..35795c5 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -3,7 +3,8 @@
 org.gradle.configureondemand=true
 org.gradle.parallel=true
 org.gradle.caching=true
-org.gradle.vfs.watch=true
+# Disabled due to https://github.com/gradle/gradle/issues/18626
+# org.gradle.vfs.watch=true
 org.gradle.unsafe.configuration-cache=true
 org.gradle.unsafe.configuration-cache-problems=warn
 org.gradle.unsafe.configuration-cache.max-problems=4000
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 0c16be7..970508f 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -35,7 +35,7 @@
 ktlint = "0.42.1"
 leakcanary = "2.7"
 mockito = "2.25.0"
-skiko = "0.4.16"
+skiko = "0.5.2"
 sqldelight = "1.3.0"
 wire = "3.6.0"
 
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 9c3e116..adffa8d 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -5,4 +5,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=../../../../tools/external/gradle/gradle-7.2-bin.zip
+distributionUrl=../../../../tools/external/gradle/gradle-7.3-rc-1-bin.zip
diff --git a/health/health-services-client/build.gradle b/health/health-services-client/build.gradle
index 7cb9dcc..a2210b0 100644
--- a/health/health-services-client/build.gradle
+++ b/health/health-services-client/build.gradle
@@ -37,7 +37,7 @@
 
 android {
     defaultConfig {
-        minSdkVersion 26
+        minSdkVersion 30
     }
     buildFeatures {
         aidl = true
diff --git a/health/health-services-client/lint-baseline.xml b/health/health-services-client/lint-baseline.xml
index afadcc9..f02d661 100644
--- a/health/health-services-client/lint-baseline.xml
+++ b/health/health-services-client/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.2.0-dev" type="baseline" client="gradle" dependencies="false" name="AGP (7.2.0-dev)" variant="all" version="7.2.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"
@@ -92,6 +92,28 @@
     <issue
         id="BanSynchronizedMethods"
         message="Use of synchronized methods is not recommended"
+        errorLine1="        @Synchronized"
+        errorLine2="        ^">
+        <location
+            file="src/main/java/androidx/health/services/client/impl/PassiveMonitoringCallbackStub.kt"
+            line="61"
+            column="9"/>
+    </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/PassiveMonitoringCallbackStub.kt"
+            line="71"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="BanSynchronizedMethods"
+        message="Use of synchronized methods is not recommended"
         errorLine1="    private synchronized void handleRetriableDisconnection(Throwable throwable) {"
         errorLine2="    ^">
         <location
@@ -101,17 +123,6 @@
     </issue>
 
     <issue
-        id="VisibleForTests"
-        message="This method should only be accessed from tests or within private scope"
-        errorLine1="        get() = ServiceBackedMeasureClient.getClient(applicationContext)"
-        errorLine2="                                           ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/ServiceBackedHealthServicesClient.kt"
-            line="51"
-            column="44"/>
-    </issue>
-
-    <issue
         id="SyntheticAccessor"
         message="Access to `private` field `mCurrentVersion` of class `Client` requires synthetic accessor"
         errorLine1="                        mCurrentVersion ="
@@ -135,57 +146,46 @@
 
     <issue
         id="SyntheticAccessor"
-        message="Access to `private` field `mCurrentVersion` of class `Client` requires synthetic accessor"
-        errorLine1="                            mCurrentVersion ="
-        errorLine2="                            ~~~~~~~~~~~~~~~">
+        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="139"
+            line="143"
             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="                                            ~~~~~~~~~~~~~~~">
+        message="Access to `private` field `mConnectionConfiguration` of class `Client` requires synthetic accessor"
+        errorLine1="                                    new BaseQueueOperation(mConnectionConfiguration));"
+        errorLine2="                                                           ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
             line="144"
-            column="45"/>
+            column="60"/>
     </issue>
 
     <issue
         id="SyntheticAccessor"
         message="Access to `private` field `mConnectionManager` of class `Client` requires synthetic accessor"
-        errorLine1="                                mConnectionManager.scheduleForExecution("
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~">
+        errorLine1="                            mConnectionManager.scheduleForExecution("
+        errorLine2="                            ~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
-            line="146"
-            column="33"/>
+            line="150"
+            column="29"/>
     </issue>
 
     <issue
         id="SyntheticAccessor"
         message="Access to `private` method `createQueueOperation` of class `Client` requires synthetic accessor"
-        errorLine1="                                        createQueueOperation(operation, settableFuture));"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="                                    createQueueOperation(operation, settableFuture));"
+        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
-            line="147"
-            column="41"/>
+            line="151"
+            column="37"/>
     </issue>
 
     <issue
@@ -195,7 +195,7 @@
         errorLine2="                                  ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
-            line="266"
+            line="278"
             column="35"/>
     </issue>
 
@@ -233,6 +233,17 @@
     </issue>
 
     <issue
+        id="SyntheticAccessor"
+        message="Access to `private` constructor of class `PassiveMonitoringCallbackStub` requires synthetic accessor"
+        errorLine1="                PassiveMonitoringCallbackStub(packageName, callback)"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/health/services/client/impl/PassiveMonitoringCallbackStub.kt"
+            line="67"
+            column="17"/>
+    </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="            RemoteFutureOperation&lt;S, R> operation, int minApiVersion) {"
@@ -422,149 +433,149 @@
     <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="                  ~~~~~~~~~~~~~~~~~~~">
+        errorLine1="    protected ListenableFuture&lt;Integer> getCurrentRemoteVersion(boolean forceRefresh) {"
+        errorLine2="              ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
-            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, RemoteOperation&lt;S, R> registerListenerOperation) {"
-        errorLine2="            ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
-            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, RemoteOperation&lt;S, R> registerListenerOperation) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
-            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>
-
-    <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="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, RemoteOperation&lt;S, R> unregisterListenerOperation) {"
-        errorLine2="            ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
-            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, RemoteOperation&lt;S, R> unregisterListenerOperation) {"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
-            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>
-
-    <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 Exception getApiVersionCheckFailureException(int currentVersion, int minApiVersion) {"
-        errorLine2="              ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
-            line="249"
+            line="169"
             column="15"/>
     </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="196"
+            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, RemoteOperation&lt;S, R> registerListenerOperation) {"
+        errorLine2="            ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
+            line="197"
+            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, RemoteOperation&lt;S, R> registerListenerOperation) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
+            line="197"
+            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="217"
+            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="218"
+            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="218"
+            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="235"
+            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, RemoteOperation&lt;S, R> unregisterListenerOperation) {"
+        errorLine2="            ~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
+            line="236"
+            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, RemoteOperation&lt;S, R> unregisterListenerOperation) {"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/health/services/client/impl/ipc/Client.java"
+            line="236"
+            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="253"
+            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="254"
+            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="254"
+            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="    public ClientConfiguration(String apiClientName, String servicePackageName, String bindAction) {"
         errorLine2="                               ~~~~~~">
         <location
@@ -635,7 +646,7 @@
         errorLine2="            ~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/internal/ConnectionConfiguration.java"
-            line="38"
+            line="37"
             column="13"/>
     </issue>
 
@@ -646,7 +657,7 @@
         errorLine2="            ~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/internal/ConnectionConfiguration.java"
-            line="39"
+            line="38"
             column="13"/>
     </issue>
 
@@ -657,7 +668,7 @@
         errorLine2="            ~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/internal/ConnectionConfiguration.java"
-            line="40"
+            line="39"
             column="13"/>
     </issue>
 
@@ -668,7 +679,7 @@
         errorLine2="            ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/internal/ConnectionConfiguration.java"
-            line="41"
+            line="40"
             column="13"/>
     </issue>
 
@@ -800,7 +811,7 @@
         errorLine2="                                     ~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/internal/DefaultExecutionTracker.java"
-            line="45"
+            line="53"
             column="38"/>
     </issue>
 
@@ -905,39 +916,6 @@
 
     <issue
         id="UnknownNullness"
-        message="Should explicitly declare type here since implicit type does not specify nullness"
-        errorLine1="    override val capabilities: ListenableFuture&lt;ExerciseCapabilities>"
-        errorLine2="                 ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/ServiceBackedExerciseClient.kt"
-            line="160"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Should explicitly declare type here since implicit type does not specify nullness"
-        errorLine1="    override val capabilities: ListenableFuture&lt;MeasureCapabilities>"
-        errorLine2="                 ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/ServiceBackedMeasureClient.kt"
-            line="92"
-            column="18"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Should explicitly declare type here since implicit type does not specify nullness"
-        errorLine1="    override val capabilities: ListenableFuture&lt;PassiveMonitoringCapabilities>"
-        errorLine2="                 ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/health/services/client/impl/ServiceBackedPassiveMonitoringClient.kt"
-            line="95"
-            column="18"/>
-    </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="                         ~~~~~~~~~~~~~~~~~">
@@ -965,7 +943,7 @@
         errorLine2="                                   ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/internal/ServiceConnection.java"
-            line="287"
+            line="288"
             column="36"/>
     </issue>
 
@@ -976,7 +954,7 @@
         errorLine2="                                                                ~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/internal/ServiceConnection.java"
-            line="287"
+            line="288"
             column="65"/>
     </issue>
 
@@ -987,7 +965,7 @@
         errorLine2="                                      ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/internal/ServiceConnection.java"
-            line="320"
+            line="321"
             column="39"/>
     </issue>
 
@@ -998,7 +976,7 @@
         errorLine2="                              ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/internal/ServiceConnection.java"
-            line="326"
+            line="327"
             column="31"/>
     </issue>
 
@@ -1009,7 +987,7 @@
         errorLine2="                              ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/health/services/client/impl/ipc/internal/ServiceConnection.java"
-            line="332"
+            line="333"
             column="31"/>
     </issue>
 
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 b89f985..0592190 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
@@ -17,8 +17,10 @@
 package androidx.health.services.client.impl
 
 import android.util.Log
+import androidx.annotation.GuardedBy
 import androidx.health.services.client.PassiveMonitoringCallback
 import androidx.health.services.client.impl.event.PassiveCallbackEvent
+import androidx.health.services.client.impl.ipc.internal.ListenerKey
 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
@@ -28,9 +30,13 @@
  *
  * @hide
  */
-internal class PassiveMonitoringCallbackStub
-internal constructor(private val callback: PassiveMonitoringCallback) :
-    IPassiveMonitoringCallback.Stub() {
+public class PassiveMonitoringCallbackStub
+private constructor(
+    private val packageName: String,
+    private val callback: PassiveMonitoringCallback
+) : IPassiveMonitoringCallback.Stub() {
+
+    public val listenerKey: ListenerKey = ListenerKey(packageName)
 
     override fun onPassiveCallbackEvent(event: PassiveCallbackEvent) {
         val proto = event.proto
@@ -44,6 +50,35 @@
         }
     }
 
+    /**
+     * Its important to use the same stub for registration and un-registration, to ensure same
+     * binder object is passed by framework to service side of the IPC.
+     */
+    public class PassiveMonitoringCallbackCache private constructor() {
+        @GuardedBy("this")
+        private val listeners: MutableMap<String, PassiveMonitoringCallbackStub> = HashMap()
+
+        @Synchronized
+        public fun getOrCreate(
+            packageName: String,
+            callback: PassiveMonitoringCallback
+        ): PassiveMonitoringCallbackStub {
+            return listeners.getOrPut(packageName) {
+                PassiveMonitoringCallbackStub(packageName, callback)
+            }
+        }
+
+        @Synchronized
+        public fun remove(packageName: String): PassiveMonitoringCallbackStub? {
+            return listeners.remove(packageName)
+        }
+
+        public companion object {
+            @JvmField
+            public val INSTANCE: PassiveMonitoringCallbackCache = PassiveMonitoringCallbackCache()
+        }
+    }
+
     private companion object {
         const val TAG = "PassiveCallbackStub"
     }
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 5f6b63b..16f9885 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
@@ -18,6 +18,7 @@
 
 import android.content.ComponentName
 import android.content.Context
+import androidx.annotation.VisibleForTesting
 import androidx.core.content.ContextCompat
 import androidx.health.services.client.PassiveMonitoringCallback
 import androidx.health.services.client.PassiveMonitoringClient
@@ -26,10 +27,12 @@
 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.PassiveMonitoringCallbackStub.PassiveMonitoringCallbackCache
 import androidx.health.services.client.impl.internal.HsConnectionManager
 import androidx.health.services.client.impl.internal.StatusCallback
 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.BackgroundRegistrationRequest
 import androidx.health.services.client.impl.request.CapabilitiesRequest
 import androidx.health.services.client.impl.request.FlushRequest
@@ -42,11 +45,16 @@
  *
  * @hide
  */
-internal class ServiceBackedPassiveMonitoringClient(private val applicationContext: Context) :
+@VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
+public class ServiceBackedPassiveMonitoringClient(
+    private val applicationContext: Context,
+    private val connectionManager: ConnectionManager =
+        HsConnectionManager.getInstance(applicationContext)
+) :
     PassiveMonitoringClient,
     Client<IPassiveMonitoringApiService>(
         CLIENT_CONFIGURATION,
-        HsConnectionManager.getInstance(applicationContext),
+        connectionManager,
         { binder -> IPassiveMonitoringApiService.Stub.asInterface(binder) },
         { service -> service.apiVersion }
     ) {
@@ -55,17 +63,54 @@
 
     override fun registerDataCallback(
         configuration: PassiveMonitoringConfig
-    ): ListenableFuture<Void> = registerDataCallbackInternal(configuration, callback = null)
+    ): ListenableFuture<Void> {
+        val callbackStub = PassiveMonitoringCallbackCache.INSTANCE.remove(packageName)
+        // If the client had a previous callback registered, make sure it's cleared.
+        if (callbackStub != null) {
+            return unregisterListener(callbackStub.listenerKey) { service, resultFuture ->
+                service.registerDataCallback(
+                    BackgroundRegistrationRequest(configuration),
+                    null,
+                    StatusCallback(resultFuture)
+                )
+            }
+        }
+
+        return execute { service, resultFuture ->
+            service.registerDataCallback(
+                BackgroundRegistrationRequest(configuration),
+                null,
+                StatusCallback(resultFuture)
+            )
+        }
+    }
 
     override fun registerDataCallback(
         configuration: PassiveMonitoringConfig,
         callback: PassiveMonitoringCallback
-    ): ListenableFuture<Void> = registerDataCallbackInternal(configuration, callback)
+    ): ListenableFuture<Void> {
+        val callbackStub =
+            PassiveMonitoringCallbackCache.INSTANCE.getOrCreate(packageName, callback)
+        return registerListener(callbackStub.listenerKey) { service, resultFuture ->
+            service.registerDataCallback(
+                BackgroundRegistrationRequest(configuration),
+                callbackStub,
+                StatusCallback(resultFuture)
+            )
+        }
+    }
 
-    override fun unregisterDataCallback(): ListenableFuture<Void> =
-        execute { service, resultFuture ->
+    override fun unregisterDataCallback(): ListenableFuture<Void> {
+        val callbackStub = PassiveMonitoringCallbackCache.INSTANCE.remove(packageName)
+        if (callbackStub != null) {
+            return unregisterListener(callbackStub.listenerKey) { service, resultFuture ->
+                service.unregisterDataCallback(packageName, StatusCallback(resultFuture))
+            }
+        }
+        return execute { service, resultFuture ->
             service.unregisterDataCallback(packageName, StatusCallback(resultFuture))
         }
+    }
 
     // TODO(jlannin): Make this take in the BroadcastReceiver directly.
     override fun registerPassiveGoalCallback(
@@ -100,23 +145,8 @@
                 ContextCompat.getMainExecutor(applicationContext)
             )
 
-    private fun registerDataCallbackInternal(
-        configuration: PassiveMonitoringConfig,
-        callback: PassiveMonitoringCallback?
-    ): 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"
+        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/ipc/Client.java b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ipc/Client.java
index 9292b95..3782df9 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
@@ -20,7 +20,7 @@
 import android.os.IInterface;
 import android.os.RemoteException;
 
-import androidx.annotation.Nullable;
+import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.health.services.client.impl.ipc.internal.BaseQueueOperation;
@@ -128,43 +128,55 @@
      */
     protected <R> ListenableFuture<R> executeWithVersionCheck(
             RemoteFutureOperation<S, R> operation, int minApiVersion) {
-        if (mCurrentVersion == UNKNOWN_VERSION) {
-            SettableFuture<R> settableFuture = SettableFuture.create();
-            ListenableFuture<Integer> versionFuture = execute(mRemoteVersionGetter);
-            Futures.addCallback(
-                    versionFuture,
-                    new FutureCallback<Integer>() {
-                        @Override
-                        public void onSuccess(@Nullable Integer remoteVersion) {
-                            mCurrentVersion =
-                                    remoteVersion == null ? UNKNOWN_VERSION : remoteVersion;
-                            if (mCurrentVersion < minApiVersion) {
-                                settableFuture.setException(
-                                        getApiVersionCheckFailureException(
-                                            mCurrentVersion, minApiVersion));
-                            } else {
-                                mConnectionManager.scheduleForExecution(
-                                        createQueueOperation(operation, settableFuture));
-                            }
-                        }
+        SettableFuture<R> settableFuture = SettableFuture.create();
+        ListenableFuture<Integer> versionFuture =
+                getCurrentRemoteVersion(/* forceRefresh= */ false);
+        Futures.addCallback(
+                versionFuture,
+                new FutureCallback<Integer>() {
+                    @Override
+                    public void onSuccess(Integer remoteVersion) {
+                        if (remoteVersion < minApiVersion) {
+                            // This empty operation is executed just to connect to the service.
+                            // If we didn't connect it could happen that we won't detect
+                            // change in the API version.
+                            mConnectionManager.scheduleForExecution(
+                                    new BaseQueueOperation(mConnectionConfiguration));
 
-                        @Override
-                        public void onFailure(Throwable throwable) {
-                            settableFuture.setException(throwable);
+                            settableFuture.setException(
+                                    getApiVersionCheckFailureException(
+                                            remoteVersion, minApiVersion));
+                        } else {
+                            mConnectionManager.scheduleForExecution(
+                                    createQueueOperation(operation, settableFuture));
                         }
+                    }
+
+                    @Override
+                    public void onFailure(Throwable throwable) {
+                        settableFuture.setException(throwable);
+                    }
+                },
+                MoreExecutors.directExecutor());
+        return settableFuture;
+    }
+
+    /**
+     * Return current version of the backing service implementation.
+     *
+     * <p>If current version is available from earlier calls, it would return the value from cache.
+     */
+    protected ListenableFuture<Integer> getCurrentRemoteVersion(boolean forceRefresh) {
+        if (mCurrentVersion == UNKNOWN_VERSION || forceRefresh) {
+            return Futures.transform(
+                    execute(mRemoteVersionGetter),
+                    version -> {
+                        mCurrentVersion = version;
+                        return mCurrentVersion;
                     },
                     MoreExecutors.directExecutor());
-            return settableFuture;
-        } else if (mCurrentVersion >= minApiVersion) {
-            return execute(operation);
         } else {
-            // This empty operation is executed just to connect to the service. If we didn't connect
-            // it
-            // could happen that we won't detect change in the API version.
-            mConnectionManager.scheduleForExecution(
-                    new BaseQueueOperation(mConnectionConfiguration));
-            return Futures.immediateFailedFuture(
-                    getApiVersionCheckFailureException(mCurrentVersion, minApiVersion));
+            return Futures.immediateFuture(mCurrentVersion);
         }
     }
 
@@ -246,7 +258,8 @@
         return settableFuture;
     }
 
-    protected Exception getApiVersionCheckFailureException(int currentVersion, int minApiVersion) {
+    protected @NonNull Exception getApiVersionCheckFailureException(
+            int currentVersion, int minApiVersion) {
         return new ApiVersionException(currentVersion, minApiVersion);
     }
 
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ipc/internal/ConnectionConfiguration.java b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ipc/internal/ConnectionConfiguration.java
index 9b6c42b..59965b3 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ipc/internal/ConnectionConfiguration.java
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ipc/internal/ConnectionConfiguration.java
@@ -20,7 +20,6 @@
 
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
-import androidx.health.services.client.impl.ipc.ClientConfiguration;
 
 /**
  * Internal representation of configuration of IPC service connection.
@@ -50,23 +49,17 @@
         return String.format("%s#%s#%s", mClientName, mPackageName, mBindAction);
     }
 
-    /** API Client name defined in the {@link ClientConfiguration#getApiClientName()}. */
+    /** Returns name of the service, use for logging and debugging only. */
     String getClientName() {
         return mClientName;
     }
 
-    /**
-     * An action used to bind to the remote service. Taken from {@link
-     * ClientConfiguration#getBindAction()}.
-     */
+    /** Returns the action used to bind to the remote service. */
     String getBindAction() {
         return mBindAction;
     }
 
-    /**
-     * Package name of remote service. Taken from {@link
-     * ClientConfiguration#getServicePackageName()}.
-     */
+    /** Returns the application package of the remote service. */
     String getPackageName() {
         return mPackageName;
     }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ipc/internal/DefaultExecutionTracker.java b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ipc/internal/DefaultExecutionTracker.java
index c8b527e..744ca14 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ipc/internal/DefaultExecutionTracker.java
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ipc/internal/DefaultExecutionTracker.java
@@ -37,15 +37,25 @@
 
     @Override
     public void track(SettableFuture<?> future) {
-        mFuturesInProgress.add(future);
-        future.addListener(() -> mFuturesInProgress.remove(future), MoreExecutors.directExecutor());
+        synchronized (mFuturesInProgress) {
+            mFuturesInProgress.add(future);
+        }
+        future.addListener(
+                () -> {
+                    synchronized (mFuturesInProgress) {
+                        mFuturesInProgress.remove(future);
+                    }
+                },
+                MoreExecutors.directExecutor());
     }
 
     @Override
     public void cancelPendingFutures(Throwable throwable) {
-        for (SettableFuture<?> future : mFuturesInProgress) {
-            future.setException(throwable);
+        synchronized (mFuturesInProgress) {
+            for (SettableFuture<?> future : mFuturesInProgress) {
+                future.setException(throwable);
+            }
+            mFuturesInProgress.clear();
         }
-        mFuturesInProgress.clear();
     }
 }
diff --git a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ipc/internal/ServiceConnection.java b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ipc/internal/ServiceConnection.java
index fa432bc..880b852 100644
--- a/health/health-services-client/src/main/java/androidx/health/services/client/impl/ipc/internal/ServiceConnection.java
+++ b/health/health-services-client/src/main/java/androidx/health/services/client/impl/ipc/internal/ServiceConnection.java
@@ -180,7 +180,8 @@
         return (200 << retryNumber);
     }
 
-    private void clearConnection(Throwable throwable) {
+    @VisibleForTesting
+    void clearConnection(Throwable throwable) {
         if (mIsServiceBound) {
             try {
                 mContext.unbindService(this);
@@ -336,6 +337,6 @@
                         + mConnectionConfiguration.getClientName()
                         + "', binder is null");
         // This connection will never be usable, don't bother with retries.
-        handleNonRetriableDisconnection(new CancellationException("Null binding"));
+        handleRetriableDisconnection(new CancellationException("Null binding"));
     }
 }
diff --git a/heifwriter/heifwriter/src/androidTest/java/androidx/heifwriter/HeifWriterTest.java b/heifwriter/heifwriter/src/androidTest/java/androidx/heifwriter/HeifWriterTest.java
index dbfadd6..fd65713 100644
--- a/heifwriter/heifwriter/src/androidTest/java/androidx/heifwriter/HeifWriterTest.java
+++ b/heifwriter/heifwriter/src/androidTest/java/androidx/heifwriter/HeifWriterTest.java
@@ -36,7 +36,6 @@
 import android.media.MediaFormat;
 import android.media.MediaMetadataRetriever;
 import android.opengl.GLES20;
-import android.os.Environment;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Process;
@@ -48,6 +47,7 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.FlakyTest;
 import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 import androidx.test.rule.GrantPermissionRule;
 
@@ -193,6 +193,7 @@
         doTestForVariousNumberImages(builder);
     }
 
+    @SdkSuppress(maxSdkVersion = 29) // b/192261638
     @Test
     @LargeTest
     public void testInputSurface_NoGrid_NoHandler() throws Throwable {
@@ -202,6 +203,7 @@
         doTestForVariousNumberImages(builder);
     }
 
+    @SdkSuppress(maxSdkVersion = 29) // b/192261638
     @Test
     @LargeTest
     public void testInputSurface_Grid_NoHandler() throws Throwable {
@@ -211,6 +213,7 @@
         doTestForVariousNumberImages(builder);
     }
 
+    @SdkSuppress(maxSdkVersion = 29) // b/192261638
     @Test
     @LargeTest
     public void testInputSurface_NoGrid_Handler() throws Throwable {
@@ -220,6 +223,7 @@
         doTestForVariousNumberImages(builder);
     }
 
+    @SdkSuppress(maxSdkVersion = 29) // b/192261638
     @Test
     @LargeTest
     public void testInputSurface_Grid_Handler() throws Throwable {
@@ -229,6 +233,7 @@
         doTestForVariousNumberImages(builder);
     }
 
+    @SdkSuppress(maxSdkVersion = 29) // b/192261638
     @Test
     @LargeTest
     public void testInputBitmap_NoGrid_NoHandler() throws Throwable {
@@ -242,6 +247,7 @@
         }
     }
 
+    @SdkSuppress(maxSdkVersion = 29) // b/192261638
     @Test
     @LargeTest
     public void testInputBitmap_Grid_NoHandler() throws Throwable {
@@ -255,6 +261,7 @@
         }
     }
 
+    @SdkSuppress(maxSdkVersion = 29) // b/192261638
     @Test
     @LargeTest
     public void testInputBitmap_NoGrid_Handler() throws Throwable {
@@ -268,6 +275,7 @@
         }
     }
 
+    @SdkSuppress(maxSdkVersion = 29) // b/192261638
     @Test
     @LargeTest
     public void testInputBitmap_Grid_Handler() throws Throwable {
@@ -281,6 +289,7 @@
         }
     }
 
+    @SdkSuppress(maxSdkVersion = 29) // b/192261638
     @Test
     @SmallTest
     public void testCloseWithoutStart() throws Throwable {
diff --git a/hilt/hilt-navigation-compose/api/current.txt b/hilt/hilt-navigation-compose/api/current.txt
index ffa3e52..7783ca4 100644
--- a/hilt/hilt-navigation-compose/api/current.txt
+++ b/hilt/hilt-navigation-compose/api/current.txt
@@ -2,9 +2,9 @@
 package androidx.hilt.navigation.compose {
 
   public final class HiltViewModelKt {
-    method @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! hiltNavGraphViewModel();
-    method @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! hiltNavGraphViewModel(androidx.navigation.NavBackStackEntry backStackEntry);
-    method @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! hiltNavGraphViewModel(androidx.navigation.NavController, String route);
+    method @Deprecated @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! hiltNavGraphViewModel();
+    method @Deprecated @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! hiltNavGraphViewModel(androidx.navigation.NavBackStackEntry backStackEntry);
+    method @Deprecated @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! hiltNavGraphViewModel(androidx.navigation.NavController, String route);
     method @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! hiltViewModel(optional androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner);
   }
 
diff --git a/hilt/hilt-navigation-compose/api/public_plus_experimental_current.txt b/hilt/hilt-navigation-compose/api/public_plus_experimental_current.txt
index ffa3e52..7783ca4 100644
--- a/hilt/hilt-navigation-compose/api/public_plus_experimental_current.txt
+++ b/hilt/hilt-navigation-compose/api/public_plus_experimental_current.txt
@@ -2,9 +2,9 @@
 package androidx.hilt.navigation.compose {
 
   public final class HiltViewModelKt {
-    method @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! hiltNavGraphViewModel();
-    method @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! hiltNavGraphViewModel(androidx.navigation.NavBackStackEntry backStackEntry);
-    method @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! hiltNavGraphViewModel(androidx.navigation.NavController, String route);
+    method @Deprecated @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! hiltNavGraphViewModel();
+    method @Deprecated @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! hiltNavGraphViewModel(androidx.navigation.NavBackStackEntry backStackEntry);
+    method @Deprecated @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! hiltNavGraphViewModel(androidx.navigation.NavController, String route);
     method @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! hiltViewModel(optional androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner);
   }
 
diff --git a/hilt/hilt-navigation-compose/api/restricted_current.txt b/hilt/hilt-navigation-compose/api/restricted_current.txt
index 74cf2f4..9c7152a 100644
--- a/hilt/hilt-navigation-compose/api/restricted_current.txt
+++ b/hilt/hilt-navigation-compose/api/restricted_current.txt
@@ -3,9 +3,9 @@
 
   public final class HiltViewModelKt {
     method @androidx.compose.runtime.Composable @kotlin.PublishedApi internal static androidx.lifecycle.ViewModelProvider.Factory? createHiltViewModelFactory(androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner);
-    method @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! hiltNavGraphViewModel();
-    method @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! hiltNavGraphViewModel(androidx.navigation.NavBackStackEntry backStackEntry);
-    method @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! hiltNavGraphViewModel(androidx.navigation.NavController, String route);
+    method @Deprecated @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! hiltNavGraphViewModel();
+    method @Deprecated @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! hiltNavGraphViewModel(androidx.navigation.NavBackStackEntry backStackEntry);
+    method @Deprecated @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! hiltNavGraphViewModel(androidx.navigation.NavController, String route);
     method @androidx.compose.runtime.Composable public static inline <reified VM extends androidx.lifecycle.ViewModel> VM! hiltViewModel(optional androidx.lifecycle.ViewModelStoreOwner viewModelStoreOwner);
   }
 
diff --git a/leanback/leanback-grid/api/current.txt b/leanback/leanback-grid/api/current.txt
new file mode 100644
index 0000000..f0c5dbc
--- /dev/null
+++ b/leanback/leanback-grid/api/current.txt
@@ -0,0 +1,206 @@
+// Signature format: 4.0
+package androidx.leanback.widget {
+
+  public abstract class BaseGridView extends androidx.recyclerview.widget.RecyclerView {
+    method public void addOnChildViewHolderSelectedListener(androidx.leanback.widget.OnChildViewHolderSelectedListener);
+    method public final void addOnLayoutCompletedListener(androidx.leanback.widget.BaseGridView.OnLayoutCompletedListener);
+    method public void animateIn();
+    method public void animateOut();
+    method public int getChildDrawingOrder(int, int);
+    method @Deprecated public int getHorizontalMargin();
+    method public int getHorizontalSpacing();
+    method public int getInitialPrefetchItemCount();
+    method public int getItemAlignmentOffset();
+    method public float getItemAlignmentOffsetPercent();
+    method public int getItemAlignmentViewId();
+    method public androidx.leanback.widget.BaseGridView.OnUnhandledKeyListener? getOnUnhandledKeyListener();
+    method public final int getSaveChildrenLimitNumber();
+    method public final int getSaveChildrenPolicy();
+    method public int getSelectedPosition();
+    method public androidx.leanback.widget.BaseGridView.SmoothScrollByBehavior? getSmoothScrollByBehavior();
+    method public final int getSmoothScrollMaxPendingMoves();
+    method public final float getSmoothScrollSpeedFactor();
+    method @Deprecated public int getVerticalMargin();
+    method public int getVerticalSpacing();
+    method public void getViewSelectedOffsets(android.view.View, int[]);
+    method public int getWindowAlignment();
+    method public int getWindowAlignmentOffset();
+    method public float getWindowAlignmentOffsetPercent();
+    method public boolean hasPreviousViewInSameRow(int);
+    method public boolean isChildLayoutAnimated();
+    method public boolean isFocusDrawingOrderEnabled();
+    method public final boolean isFocusSearchDisabled();
+    method public boolean isItemAlignmentOffsetWithPadding();
+    method public boolean isScrollEnabled();
+    method public boolean isWindowAlignmentPreferKeyLineOverHighEdge();
+    method public boolean isWindowAlignmentPreferKeyLineOverLowEdge();
+    method public boolean onRequestFocusInDescendants(int, android.graphics.Rect?);
+    method public void removeOnChildViewHolderSelectedListener(androidx.leanback.widget.OnChildViewHolderSelectedListener);
+    method public final void removeOnLayoutCompletedListener(androidx.leanback.widget.BaseGridView.OnLayoutCompletedListener);
+    method public void setAnimateChildLayout(boolean);
+    method public void setChildrenVisibility(int);
+    method public void setFocusDrawingOrderEnabled(boolean);
+    method public final void setFocusSearchDisabled(boolean);
+    method public void setGravity(int);
+    method public void setHasOverlappingRendering(boolean);
+    method @Deprecated public void setHorizontalMargin(int);
+    method public void setHorizontalSpacing(int);
+    method public void setInitialPrefetchItemCount(int);
+    method public void setItemAlignmentOffset(int);
+    method public void setItemAlignmentOffsetPercent(float);
+    method public void setItemAlignmentOffsetWithPadding(boolean);
+    method public void setItemAlignmentViewId(int);
+    method @Deprecated public void setItemMargin(int);
+    method public void setItemSpacing(int);
+    method public void setLayoutEnabled(boolean);
+    method public void setOnChildLaidOutListener(androidx.leanback.widget.OnChildLaidOutListener?);
+    method public void setOnChildSelectedListener(androidx.leanback.widget.OnChildSelectedListener?);
+    method public void setOnChildViewHolderSelectedListener(androidx.leanback.widget.OnChildViewHolderSelectedListener?);
+    method public void setOnKeyInterceptListener(androidx.leanback.widget.BaseGridView.OnKeyInterceptListener?);
+    method public void setOnMotionInterceptListener(androidx.leanback.widget.BaseGridView.OnMotionInterceptListener?);
+    method public void setOnTouchInterceptListener(androidx.leanback.widget.BaseGridView.OnTouchInterceptListener?);
+    method public void setOnUnhandledKeyListener(androidx.leanback.widget.BaseGridView.OnUnhandledKeyListener?);
+    method public void setPruneChild(boolean);
+    method public final void setSaveChildrenLimitNumber(int);
+    method public final void setSaveChildrenPolicy(int);
+    method public void setScrollEnabled(boolean);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, int);
+    method public void setSelectedPosition(int, androidx.leanback.widget.ViewHolderTask?);
+    method public void setSelectedPositionSmooth(int);
+    method public void setSelectedPositionSmooth(int, androidx.leanback.widget.ViewHolderTask?);
+    method public final void setSmoothScrollByBehavior(androidx.leanback.widget.BaseGridView.SmoothScrollByBehavior?);
+    method public final void setSmoothScrollMaxPendingMoves(int);
+    method public final void setSmoothScrollSpeedFactor(float);
+    method @Deprecated public void setVerticalMargin(int);
+    method public void setVerticalSpacing(int);
+    method public void setWindowAlignment(int);
+    method public void setWindowAlignmentOffset(int);
+    method public void setWindowAlignmentOffsetPercent(float);
+    method public void setWindowAlignmentPreferKeyLineOverHighEdge(boolean);
+    method public void setWindowAlignmentPreferKeyLineOverLowEdge(boolean);
+    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
+    field public static final int SAVE_ALL_CHILD = 3; // 0x3
+    field public static final int SAVE_LIMITED_CHILD = 2; // 0x2
+    field public static final int SAVE_NO_CHILD = 0; // 0x0
+    field public static final int SAVE_ON_SCREEN_CHILD = 1; // 0x1
+    field public static final int WINDOW_ALIGN_BOTH_EDGE = 3; // 0x3
+    field public static final int WINDOW_ALIGN_HIGH_EDGE = 2; // 0x2
+    field public static final int WINDOW_ALIGN_LOW_EDGE = 1; // 0x1
+    field public static final int WINDOW_ALIGN_NO_EDGE = 0; // 0x0
+    field public static final float WINDOW_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
+  }
+
+  public static interface BaseGridView.OnKeyInterceptListener {
+    method public boolean onInterceptKeyEvent(android.view.KeyEvent);
+  }
+
+  public static interface BaseGridView.OnLayoutCompletedListener {
+    method public void onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State);
+  }
+
+  public static interface BaseGridView.OnMotionInterceptListener {
+    method public boolean onInterceptMotionEvent(android.view.MotionEvent);
+  }
+
+  public static interface BaseGridView.OnTouchInterceptListener {
+    method public boolean onInterceptTouchEvent(android.view.MotionEvent);
+  }
+
+  public static interface BaseGridView.OnUnhandledKeyListener {
+    method public boolean onUnhandledKey(android.view.KeyEvent);
+  }
+
+  public static interface BaseGridView.SmoothScrollByBehavior {
+    method public int configSmoothScrollByDuration(int, int);
+    method public android.view.animation.Interpolator? configSmoothScrollByInterpolator(int, int);
+  }
+
+  public interface FacetProvider {
+    method public Object? getFacet(Class<?>);
+  }
+
+  public interface FacetProviderAdapter {
+    method public androidx.leanback.widget.FacetProvider? getFacetProvider(int);
+  }
+
+  public final class GridLayoutManager extends androidx.recyclerview.widget.RecyclerView.LayoutManager {
+    ctor public GridLayoutManager();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
+    method public void setOrientation(int);
+  }
+
+  public class HorizontalGridView extends androidx.leanback.widget.BaseGridView {
+    ctor public HorizontalGridView(android.content.Context);
+    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet?);
+    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet?, int);
+    method public final boolean getFadingLeftEdge();
+    method public final int getFadingLeftEdgeLength();
+    method public final int getFadingLeftEdgeOffset();
+    method public final boolean getFadingRightEdge();
+    method public final int getFadingRightEdgeLength();
+    method public final int getFadingRightEdgeOffset();
+    method protected void initAttributes(android.content.Context, android.util.AttributeSet?);
+    method public final void setFadingLeftEdge(boolean);
+    method public final void setFadingLeftEdgeLength(int);
+    method public final void setFadingLeftEdgeOffset(int);
+    method public final void setFadingRightEdge(boolean);
+    method public final void setFadingRightEdgeLength(int);
+    method public final void setFadingRightEdgeOffset(int);
+    method public void setNumRows(int);
+    method public void setRowHeight(int);
+  }
+
+  public final class ItemAlignmentFacet {
+    ctor public ItemAlignmentFacet();
+    method public androidx.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef![] getAlignmentDefs();
+    method public boolean isMultiAlignment();
+    method public void setAlignmentDefs(androidx.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef![]);
+    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
+  }
+
+  public static class ItemAlignmentFacet.ItemAlignmentDef {
+    ctor public ItemAlignmentFacet.ItemAlignmentDef();
+    method public final int getItemAlignmentFocusViewId();
+    method public final int getItemAlignmentOffset();
+    method public final float getItemAlignmentOffsetPercent();
+    method public final int getItemAlignmentViewId();
+    method public boolean isAlignedToTextViewBaseLine();
+    method public final boolean isItemAlignmentOffsetWithPadding();
+    method public final void setAlignedToTextViewBaseline(boolean);
+    method public final void setItemAlignmentFocusViewId(int);
+    method public final void setItemAlignmentOffset(int);
+    method public final void setItemAlignmentOffsetPercent(float);
+    method public final void setItemAlignmentOffsetWithPadding(boolean);
+    method public final void setItemAlignmentViewId(int);
+  }
+
+  public interface OnChildLaidOutListener {
+    method public void onChildLaidOut(android.view.ViewGroup, android.view.View, int, long);
+  }
+
+  @Deprecated public interface OnChildSelectedListener {
+    method @Deprecated public void onChildSelected(android.view.ViewGroup, android.view.View?, int, long);
+  }
+
+  public abstract class OnChildViewHolderSelectedListener {
+    ctor public OnChildViewHolderSelectedListener();
+    method public void onChildViewHolderSelected(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder?, int, int);
+    method public void onChildViewHolderSelectedAndPositioned(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder?, int, int);
+  }
+
+  public class VerticalGridView extends androidx.leanback.widget.BaseGridView {
+    ctor public VerticalGridView(android.content.Context);
+    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet?);
+    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet?, int);
+    method protected void initAttributes(android.content.Context, android.util.AttributeSet?);
+    method public void setColumnWidth(int);
+    method public void setNumColumns(int);
+  }
+
+  public interface ViewHolderTask {
+    method public void run(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+  }
+
+}
+
diff --git a/leanback/leanback-grid/api/public_plus_experimental_current.txt b/leanback/leanback-grid/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..f0c5dbc
--- /dev/null
+++ b/leanback/leanback-grid/api/public_plus_experimental_current.txt
@@ -0,0 +1,206 @@
+// Signature format: 4.0
+package androidx.leanback.widget {
+
+  public abstract class BaseGridView extends androidx.recyclerview.widget.RecyclerView {
+    method public void addOnChildViewHolderSelectedListener(androidx.leanback.widget.OnChildViewHolderSelectedListener);
+    method public final void addOnLayoutCompletedListener(androidx.leanback.widget.BaseGridView.OnLayoutCompletedListener);
+    method public void animateIn();
+    method public void animateOut();
+    method public int getChildDrawingOrder(int, int);
+    method @Deprecated public int getHorizontalMargin();
+    method public int getHorizontalSpacing();
+    method public int getInitialPrefetchItemCount();
+    method public int getItemAlignmentOffset();
+    method public float getItemAlignmentOffsetPercent();
+    method public int getItemAlignmentViewId();
+    method public androidx.leanback.widget.BaseGridView.OnUnhandledKeyListener? getOnUnhandledKeyListener();
+    method public final int getSaveChildrenLimitNumber();
+    method public final int getSaveChildrenPolicy();
+    method public int getSelectedPosition();
+    method public androidx.leanback.widget.BaseGridView.SmoothScrollByBehavior? getSmoothScrollByBehavior();
+    method public final int getSmoothScrollMaxPendingMoves();
+    method public final float getSmoothScrollSpeedFactor();
+    method @Deprecated public int getVerticalMargin();
+    method public int getVerticalSpacing();
+    method public void getViewSelectedOffsets(android.view.View, int[]);
+    method public int getWindowAlignment();
+    method public int getWindowAlignmentOffset();
+    method public float getWindowAlignmentOffsetPercent();
+    method public boolean hasPreviousViewInSameRow(int);
+    method public boolean isChildLayoutAnimated();
+    method public boolean isFocusDrawingOrderEnabled();
+    method public final boolean isFocusSearchDisabled();
+    method public boolean isItemAlignmentOffsetWithPadding();
+    method public boolean isScrollEnabled();
+    method public boolean isWindowAlignmentPreferKeyLineOverHighEdge();
+    method public boolean isWindowAlignmentPreferKeyLineOverLowEdge();
+    method public boolean onRequestFocusInDescendants(int, android.graphics.Rect?);
+    method public void removeOnChildViewHolderSelectedListener(androidx.leanback.widget.OnChildViewHolderSelectedListener);
+    method public final void removeOnLayoutCompletedListener(androidx.leanback.widget.BaseGridView.OnLayoutCompletedListener);
+    method public void setAnimateChildLayout(boolean);
+    method public void setChildrenVisibility(int);
+    method public void setFocusDrawingOrderEnabled(boolean);
+    method public final void setFocusSearchDisabled(boolean);
+    method public void setGravity(int);
+    method public void setHasOverlappingRendering(boolean);
+    method @Deprecated public void setHorizontalMargin(int);
+    method public void setHorizontalSpacing(int);
+    method public void setInitialPrefetchItemCount(int);
+    method public void setItemAlignmentOffset(int);
+    method public void setItemAlignmentOffsetPercent(float);
+    method public void setItemAlignmentOffsetWithPadding(boolean);
+    method public void setItemAlignmentViewId(int);
+    method @Deprecated public void setItemMargin(int);
+    method public void setItemSpacing(int);
+    method public void setLayoutEnabled(boolean);
+    method public void setOnChildLaidOutListener(androidx.leanback.widget.OnChildLaidOutListener?);
+    method public void setOnChildSelectedListener(androidx.leanback.widget.OnChildSelectedListener?);
+    method public void setOnChildViewHolderSelectedListener(androidx.leanback.widget.OnChildViewHolderSelectedListener?);
+    method public void setOnKeyInterceptListener(androidx.leanback.widget.BaseGridView.OnKeyInterceptListener?);
+    method public void setOnMotionInterceptListener(androidx.leanback.widget.BaseGridView.OnMotionInterceptListener?);
+    method public void setOnTouchInterceptListener(androidx.leanback.widget.BaseGridView.OnTouchInterceptListener?);
+    method public void setOnUnhandledKeyListener(androidx.leanback.widget.BaseGridView.OnUnhandledKeyListener?);
+    method public void setPruneChild(boolean);
+    method public final void setSaveChildrenLimitNumber(int);
+    method public final void setSaveChildrenPolicy(int);
+    method public void setScrollEnabled(boolean);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, int);
+    method public void setSelectedPosition(int, androidx.leanback.widget.ViewHolderTask?);
+    method public void setSelectedPositionSmooth(int);
+    method public void setSelectedPositionSmooth(int, androidx.leanback.widget.ViewHolderTask?);
+    method public final void setSmoothScrollByBehavior(androidx.leanback.widget.BaseGridView.SmoothScrollByBehavior?);
+    method public final void setSmoothScrollMaxPendingMoves(int);
+    method public final void setSmoothScrollSpeedFactor(float);
+    method @Deprecated public void setVerticalMargin(int);
+    method public void setVerticalSpacing(int);
+    method public void setWindowAlignment(int);
+    method public void setWindowAlignmentOffset(int);
+    method public void setWindowAlignmentOffsetPercent(float);
+    method public void setWindowAlignmentPreferKeyLineOverHighEdge(boolean);
+    method public void setWindowAlignmentPreferKeyLineOverLowEdge(boolean);
+    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
+    field public static final int SAVE_ALL_CHILD = 3; // 0x3
+    field public static final int SAVE_LIMITED_CHILD = 2; // 0x2
+    field public static final int SAVE_NO_CHILD = 0; // 0x0
+    field public static final int SAVE_ON_SCREEN_CHILD = 1; // 0x1
+    field public static final int WINDOW_ALIGN_BOTH_EDGE = 3; // 0x3
+    field public static final int WINDOW_ALIGN_HIGH_EDGE = 2; // 0x2
+    field public static final int WINDOW_ALIGN_LOW_EDGE = 1; // 0x1
+    field public static final int WINDOW_ALIGN_NO_EDGE = 0; // 0x0
+    field public static final float WINDOW_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
+  }
+
+  public static interface BaseGridView.OnKeyInterceptListener {
+    method public boolean onInterceptKeyEvent(android.view.KeyEvent);
+  }
+
+  public static interface BaseGridView.OnLayoutCompletedListener {
+    method public void onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State);
+  }
+
+  public static interface BaseGridView.OnMotionInterceptListener {
+    method public boolean onInterceptMotionEvent(android.view.MotionEvent);
+  }
+
+  public static interface BaseGridView.OnTouchInterceptListener {
+    method public boolean onInterceptTouchEvent(android.view.MotionEvent);
+  }
+
+  public static interface BaseGridView.OnUnhandledKeyListener {
+    method public boolean onUnhandledKey(android.view.KeyEvent);
+  }
+
+  public static interface BaseGridView.SmoothScrollByBehavior {
+    method public int configSmoothScrollByDuration(int, int);
+    method public android.view.animation.Interpolator? configSmoothScrollByInterpolator(int, int);
+  }
+
+  public interface FacetProvider {
+    method public Object? getFacet(Class<?>);
+  }
+
+  public interface FacetProviderAdapter {
+    method public androidx.leanback.widget.FacetProvider? getFacetProvider(int);
+  }
+
+  public final class GridLayoutManager extends androidx.recyclerview.widget.RecyclerView.LayoutManager {
+    ctor public GridLayoutManager();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
+    method public void setOrientation(int);
+  }
+
+  public class HorizontalGridView extends androidx.leanback.widget.BaseGridView {
+    ctor public HorizontalGridView(android.content.Context);
+    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet?);
+    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet?, int);
+    method public final boolean getFadingLeftEdge();
+    method public final int getFadingLeftEdgeLength();
+    method public final int getFadingLeftEdgeOffset();
+    method public final boolean getFadingRightEdge();
+    method public final int getFadingRightEdgeLength();
+    method public final int getFadingRightEdgeOffset();
+    method protected void initAttributes(android.content.Context, android.util.AttributeSet?);
+    method public final void setFadingLeftEdge(boolean);
+    method public final void setFadingLeftEdgeLength(int);
+    method public final void setFadingLeftEdgeOffset(int);
+    method public final void setFadingRightEdge(boolean);
+    method public final void setFadingRightEdgeLength(int);
+    method public final void setFadingRightEdgeOffset(int);
+    method public void setNumRows(int);
+    method public void setRowHeight(int);
+  }
+
+  public final class ItemAlignmentFacet {
+    ctor public ItemAlignmentFacet();
+    method public androidx.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef![] getAlignmentDefs();
+    method public boolean isMultiAlignment();
+    method public void setAlignmentDefs(androidx.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef![]);
+    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
+  }
+
+  public static class ItemAlignmentFacet.ItemAlignmentDef {
+    ctor public ItemAlignmentFacet.ItemAlignmentDef();
+    method public final int getItemAlignmentFocusViewId();
+    method public final int getItemAlignmentOffset();
+    method public final float getItemAlignmentOffsetPercent();
+    method public final int getItemAlignmentViewId();
+    method public boolean isAlignedToTextViewBaseLine();
+    method public final boolean isItemAlignmentOffsetWithPadding();
+    method public final void setAlignedToTextViewBaseline(boolean);
+    method public final void setItemAlignmentFocusViewId(int);
+    method public final void setItemAlignmentOffset(int);
+    method public final void setItemAlignmentOffsetPercent(float);
+    method public final void setItemAlignmentOffsetWithPadding(boolean);
+    method public final void setItemAlignmentViewId(int);
+  }
+
+  public interface OnChildLaidOutListener {
+    method public void onChildLaidOut(android.view.ViewGroup, android.view.View, int, long);
+  }
+
+  @Deprecated public interface OnChildSelectedListener {
+    method @Deprecated public void onChildSelected(android.view.ViewGroup, android.view.View?, int, long);
+  }
+
+  public abstract class OnChildViewHolderSelectedListener {
+    ctor public OnChildViewHolderSelectedListener();
+    method public void onChildViewHolderSelected(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder?, int, int);
+    method public void onChildViewHolderSelectedAndPositioned(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder?, int, int);
+  }
+
+  public class VerticalGridView extends androidx.leanback.widget.BaseGridView {
+    ctor public VerticalGridView(android.content.Context);
+    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet?);
+    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet?, int);
+    method protected void initAttributes(android.content.Context, android.util.AttributeSet?);
+    method public void setColumnWidth(int);
+    method public void setNumColumns(int);
+  }
+
+  public interface ViewHolderTask {
+    method public void run(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/leanback/leanback-grid/api/res-current.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to leanback/leanback-grid/api/res-current.txt
diff --git a/leanback/leanback-grid/api/restricted_current.txt b/leanback/leanback-grid/api/restricted_current.txt
new file mode 100644
index 0000000..28e69a2
--- /dev/null
+++ b/leanback/leanback-grid/api/restricted_current.txt
@@ -0,0 +1,220 @@
+// Signature format: 4.0
+package androidx.leanback.widget {
+
+  public abstract class BaseGridView extends androidx.recyclerview.widget.RecyclerView {
+    method public void addOnChildViewHolderSelectedListener(androidx.leanback.widget.OnChildViewHolderSelectedListener);
+    method public final void addOnLayoutCompletedListener(androidx.leanback.widget.BaseGridView.OnLayoutCompletedListener);
+    method public void animateIn();
+    method public void animateOut();
+    method public int getChildDrawingOrder(int, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getExtraLayoutSpace();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getFocusScrollStrategy();
+    method @Deprecated public int getHorizontalMargin();
+    method public int getHorizontalSpacing();
+    method public int getInitialPrefetchItemCount();
+    method public int getItemAlignmentOffset();
+    method public float getItemAlignmentOffsetPercent();
+    method public int getItemAlignmentViewId();
+    method public androidx.leanback.widget.BaseGridView.OnUnhandledKeyListener? getOnUnhandledKeyListener();
+    method public final int getSaveChildrenLimitNumber();
+    method public final int getSaveChildrenPolicy();
+    method public int getSelectedPosition();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getSelectedSubPosition();
+    method public androidx.leanback.widget.BaseGridView.SmoothScrollByBehavior? getSmoothScrollByBehavior();
+    method public final int getSmoothScrollMaxPendingMoves();
+    method public final float getSmoothScrollSpeedFactor();
+    method @Deprecated public int getVerticalMargin();
+    method public int getVerticalSpacing();
+    method public void getViewSelectedOffsets(android.view.View, int[]);
+    method public int getWindowAlignment();
+    method public int getWindowAlignmentOffset();
+    method public float getWindowAlignmentOffsetPercent();
+    method public boolean hasPreviousViewInSameRow(int);
+    method public boolean isChildLayoutAnimated();
+    method public boolean isFocusDrawingOrderEnabled();
+    method public final boolean isFocusSearchDisabled();
+    method public boolean isItemAlignmentOffsetWithPadding();
+    method public boolean isScrollEnabled();
+    method public boolean isWindowAlignmentPreferKeyLineOverHighEdge();
+    method public boolean isWindowAlignmentPreferKeyLineOverLowEdge();
+    method public boolean onRequestFocusInDescendants(int, android.graphics.Rect?);
+    method public void removeOnChildViewHolderSelectedListener(androidx.leanback.widget.OnChildViewHolderSelectedListener);
+    method public final void removeOnLayoutCompletedListener(androidx.leanback.widget.BaseGridView.OnLayoutCompletedListener);
+    method public void setAnimateChildLayout(boolean);
+    method public void setChildrenVisibility(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setExtraLayoutSpace(int);
+    method public void setFocusDrawingOrderEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setFocusScrollStrategy(int);
+    method public final void setFocusSearchDisabled(boolean);
+    method public void setGravity(int);
+    method public void setHasOverlappingRendering(boolean);
+    method @Deprecated public void setHorizontalMargin(int);
+    method public void setHorizontalSpacing(int);
+    method public void setInitialPrefetchItemCount(int);
+    method public void setItemAlignmentOffset(int);
+    method public void setItemAlignmentOffsetPercent(float);
+    method public void setItemAlignmentOffsetWithPadding(boolean);
+    method public void setItemAlignmentViewId(int);
+    method @Deprecated public void setItemMargin(int);
+    method public void setItemSpacing(int);
+    method public void setLayoutEnabled(boolean);
+    method public void setOnChildLaidOutListener(androidx.leanback.widget.OnChildLaidOutListener?);
+    method public void setOnChildSelectedListener(androidx.leanback.widget.OnChildSelectedListener?);
+    method public void setOnChildViewHolderSelectedListener(androidx.leanback.widget.OnChildViewHolderSelectedListener?);
+    method public void setOnKeyInterceptListener(androidx.leanback.widget.BaseGridView.OnKeyInterceptListener?);
+    method public void setOnMotionInterceptListener(androidx.leanback.widget.BaseGridView.OnMotionInterceptListener?);
+    method public void setOnTouchInterceptListener(androidx.leanback.widget.BaseGridView.OnTouchInterceptListener?);
+    method public void setOnUnhandledKeyListener(androidx.leanback.widget.BaseGridView.OnUnhandledKeyListener?);
+    method public void setPruneChild(boolean);
+    method public final void setSaveChildrenLimitNumber(int);
+    method public final void setSaveChildrenPolicy(int);
+    method public void setScrollEnabled(boolean);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, int);
+    method public void setSelectedPosition(int, androidx.leanback.widget.ViewHolderTask?);
+    method public void setSelectedPositionSmooth(int);
+    method public void setSelectedPositionSmooth(int, androidx.leanback.widget.ViewHolderTask?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSelectedPositionSmoothWithSub(int, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSelectedPositionWithSub(int, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSelectedPositionWithSub(int, int, int);
+    method public final void setSmoothScrollByBehavior(androidx.leanback.widget.BaseGridView.SmoothScrollByBehavior?);
+    method public final void setSmoothScrollMaxPendingMoves(int);
+    method public final void setSmoothScrollSpeedFactor(float);
+    method @Deprecated public void setVerticalMargin(int);
+    method public void setVerticalSpacing(int);
+    method public void setWindowAlignment(int);
+    method public void setWindowAlignmentOffset(int);
+    method public void setWindowAlignmentOffsetPercent(float);
+    method public void setWindowAlignmentPreferKeyLineOverHighEdge(boolean);
+    method public void setWindowAlignmentPreferKeyLineOverLowEdge(boolean);
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final int FOCUS_SCROLL_ALIGNED = 0; // 0x0
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final int FOCUS_SCROLL_ITEM = 1; // 0x1
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final int FOCUS_SCROLL_PAGE = 2; // 0x2
+    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
+    field public static final int SAVE_ALL_CHILD = 3; // 0x3
+    field public static final int SAVE_LIMITED_CHILD = 2; // 0x2
+    field public static final int SAVE_NO_CHILD = 0; // 0x0
+    field public static final int SAVE_ON_SCREEN_CHILD = 1; // 0x1
+    field public static final int WINDOW_ALIGN_BOTH_EDGE = 3; // 0x3
+    field public static final int WINDOW_ALIGN_HIGH_EDGE = 2; // 0x2
+    field public static final int WINDOW_ALIGN_LOW_EDGE = 1; // 0x1
+    field public static final int WINDOW_ALIGN_NO_EDGE = 0; // 0x0
+    field public static final float WINDOW_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
+  }
+
+  public static interface BaseGridView.OnKeyInterceptListener {
+    method public boolean onInterceptKeyEvent(android.view.KeyEvent);
+  }
+
+  public static interface BaseGridView.OnLayoutCompletedListener {
+    method public void onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State);
+  }
+
+  public static interface BaseGridView.OnMotionInterceptListener {
+    method public boolean onInterceptMotionEvent(android.view.MotionEvent);
+  }
+
+  public static interface BaseGridView.OnTouchInterceptListener {
+    method public boolean onInterceptTouchEvent(android.view.MotionEvent);
+  }
+
+  public static interface BaseGridView.OnUnhandledKeyListener {
+    method public boolean onUnhandledKey(android.view.KeyEvent);
+  }
+
+  public static interface BaseGridView.SmoothScrollByBehavior {
+    method public int configSmoothScrollByDuration(int, int);
+    method public android.view.animation.Interpolator? configSmoothScrollByInterpolator(int, int);
+  }
+
+  public interface FacetProvider {
+    method public Object? getFacet(Class<?>);
+  }
+
+  public interface FacetProviderAdapter {
+    method public androidx.leanback.widget.FacetProvider? getFacetProvider(int);
+  }
+
+  public final class GridLayoutManager extends androidx.recyclerview.widget.RecyclerView.LayoutManager {
+    ctor public GridLayoutManager();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
+    method public void setOrientation(@androidx.recyclerview.widget.RecyclerView.Orientation int);
+  }
+
+  public class HorizontalGridView extends androidx.leanback.widget.BaseGridView {
+    ctor public HorizontalGridView(android.content.Context);
+    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet?);
+    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet?, int);
+    method public final boolean getFadingLeftEdge();
+    method public final int getFadingLeftEdgeLength();
+    method public final int getFadingLeftEdgeOffset();
+    method public final boolean getFadingRightEdge();
+    method public final int getFadingRightEdgeLength();
+    method public final int getFadingRightEdgeOffset();
+    method protected void initAttributes(android.content.Context, android.util.AttributeSet?);
+    method public final void setFadingLeftEdge(boolean);
+    method public final void setFadingLeftEdgeLength(int);
+    method public final void setFadingLeftEdgeOffset(int);
+    method public final void setFadingRightEdge(boolean);
+    method public final void setFadingRightEdgeLength(int);
+    method public final void setFadingRightEdgeOffset(int);
+    method public void setNumRows(int);
+    method public void setRowHeight(int);
+  }
+
+  public final class ItemAlignmentFacet {
+    ctor public ItemAlignmentFacet();
+    method public androidx.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef![] getAlignmentDefs();
+    method public boolean isMultiAlignment();
+    method public void setAlignmentDefs(androidx.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef![]);
+    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
+  }
+
+  public static class ItemAlignmentFacet.ItemAlignmentDef {
+    ctor public ItemAlignmentFacet.ItemAlignmentDef();
+    method public final int getItemAlignmentFocusViewId();
+    method public final int getItemAlignmentOffset();
+    method public final float getItemAlignmentOffsetPercent();
+    method public final int getItemAlignmentViewId();
+    method public boolean isAlignedToTextViewBaseLine();
+    method public final boolean isItemAlignmentOffsetWithPadding();
+    method public final void setAlignedToTextViewBaseline(boolean);
+    method public final void setItemAlignmentFocusViewId(int);
+    method public final void setItemAlignmentOffset(int);
+    method public final void setItemAlignmentOffsetPercent(float);
+    method public final void setItemAlignmentOffsetWithPadding(boolean);
+    method public final void setItemAlignmentViewId(int);
+  }
+
+  public interface OnChildLaidOutListener {
+    method public void onChildLaidOut(android.view.ViewGroup, android.view.View, int, long);
+  }
+
+  @Deprecated public interface OnChildSelectedListener {
+    method @Deprecated public void onChildSelected(android.view.ViewGroup, android.view.View?, int, long);
+  }
+
+  public abstract class OnChildViewHolderSelectedListener {
+    ctor public OnChildViewHolderSelectedListener();
+    method public void onChildViewHolderSelected(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder?, int, int);
+    method public void onChildViewHolderSelectedAndPositioned(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder?, int, int);
+  }
+
+  public class VerticalGridView extends androidx.leanback.widget.BaseGridView {
+    ctor public VerticalGridView(android.content.Context);
+    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet?);
+    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet?, int);
+    method protected void initAttributes(android.content.Context, android.util.AttributeSet?);
+    method public void setColumnWidth(int);
+    method public void setNumColumns(int);
+  }
+
+  public interface ViewHolderTask {
+    method public void run(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+  }
+
+  @IntDef({android.view.View.VISIBLE, android.view.View.INVISIBLE, android.view.View.GONE}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public @interface Visibility {
+  }
+
+}
+
diff --git a/leanback/leanback-grid/build.gradle b/leanback/leanback-grid/build.gradle
new file mode 100644
index 0000000..454e8dd
--- /dev/null
+++ b/leanback/leanback-grid/build.gradle
@@ -0,0 +1,62 @@
+/*
+ * 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.LibraryVersions
+import androidx.build.Publish
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+}
+
+dependencies {
+    api("androidx.annotation:annotation:1.1.0")
+    api("androidx.core:core:1.1.0")
+    api("androidx.recyclerview:recyclerview:1.2.1")
+    implementation("androidx.collection:collection:1.0.0")
+
+    constraints {
+        // TODO: Mention min version for leanback.
+        implementation(project(":leanback:leanback"))
+    }
+
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    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(project(":internal-testutils-espresso"))
+    androidTestImplementation(project(":internal-testutils-runtime"))
+    androidTestImplementation(project(":internal-testutils-common"))
+}
+
+android {
+    defaultConfig {
+        minSdkVersion 17
+    }
+}
+
+androidx {
+    name = "AndroidX Leanback Grid"
+    publish = Publish.SNAPSHOT_AND_RELEASE
+    mavenGroup = LibraryGroups.LEANBACK
+    mavenVersion = LibraryVersions.LEANBACK_GRID
+    inceptionYear = "2021"
+    description = "This library adds grid view components to be used in TV"
+}
diff --git a/glance/glance-appwidget/src/androidMain/layoutTemplates/list1.xml b/leanback/leanback-grid/src/main/AndroidManifest.xml
similarity index 76%
copy from glance/glance-appwidget/src/androidMain/layoutTemplates/list1.xml
copy to leanback/leanback-grid/src/main/AndroidManifest.xml
index d228e836..df35449 100644
--- a/glance/glance-appwidget/src/androidMain/layoutTemplates/list1.xml
+++ b/leanback/leanback-grid/src/main/AndroidManifest.xml
@@ -1,4 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?><!--
+<?xml version="1.0" encoding="utf-8"?>
+<!--
   Copyright 2021 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,7 +14,4 @@
   See the License for the specific language governing permissions and
   limitations under the License.
   -->
-
-<ListView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@id/glanceListView1"
-    android:divider="@null" />
+<manifest package="androidx.leanback.widget"/>
diff --git a/leanback/leanback/src/main/java/androidx/leanback/widget/BaseGridView.java b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/BaseGridView.java
similarity index 89%
rename from leanback/leanback/src/main/java/androidx/leanback/widget/BaseGridView.java
rename to leanback/leanback-grid/src/main/java/androidx/leanback/widget/BaseGridView.java
index 5b7aaf7..a2cbe955 100644
--- a/leanback/leanback/src/main/java/androidx/leanback/widget/BaseGridView.java
+++ b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/BaseGridView.java
@@ -1,15 +1,17 @@
 /*
- * Copyright (C) 2014 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. You may obtain a copy of the License at
+ * 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
+ *      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.
+ * 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.leanback.widget;
 
@@ -29,7 +31,6 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
-import androidx.leanback.R;
 import androidx.recyclerview.widget.RecyclerView;
 import androidx.recyclerview.widget.SimpleItemAnimator;
 
@@ -47,25 +48,28 @@
      * WINDOW_ALIGN_XXX and ITEM_ALIGN_XXX to define how focused item is aligned.
      * In this mode, the last focused position will be remembered and restored when focus
      * is back to the view.
+     *
      * @hide
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public final static int FOCUS_SCROLL_ALIGNED = 0;
+    public static final int FOCUS_SCROLL_ALIGNED = 0;
 
     /**
      * Scroll to make the focused item inside client area.
+     *
      * @hide
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public final static int FOCUS_SCROLL_ITEM = 1;
+    public static final int FOCUS_SCROLL_ITEM = 1;
 
     /**
      * Scroll a page of items when focusing to item outside the client area.
      * The page size matches the client area size of RecyclerView.
+     *
      * @hide
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public final static int FOCUS_SCROLL_PAGE = 2;
+    public static final int FOCUS_SCROLL_PAGE = 2;
 
     /**
      * The first item is aligned with the low edge of the viewport. When
@@ -83,7 +87,7 @@
      * {@link #setWindowAlignmentPreferKeyLineOverLowEdge(boolean)} to control whether you prefer
      * to align the items to key line or low edge. Default is preferring low edge.
      */
-    public final static int WINDOW_ALIGN_LOW_EDGE = 1;
+    public static final int WINDOW_ALIGN_LOW_EDGE = 1;
 
     /**
      * The last item is aligned with the high edge of the viewport when
@@ -102,7 +106,7 @@
      * {@link #setWindowAlignmentPreferKeyLineOverHighEdge(boolean)} to control whether you prefer
      * to align the items to key line or high edge. Default is preferring key line.
      */
-    public final static int WINDOW_ALIGN_HIGH_EDGE = 1 << 1;
+    public static final int WINDOW_ALIGN_HIGH_EDGE = 1 << 1;
 
     /**
      * The first item and last item are aligned with the two edges of the
@@ -113,7 +117,7 @@
      * "windowAlignOffsetPercent"; if neither of these two is defined, the
      * default value is 1/2 of the size.
      */
-    public final static int WINDOW_ALIGN_BOTH_EDGE =
+    public static final int WINDOW_ALIGN_BOTH_EDGE =
             WINDOW_ALIGN_LOW_EDGE | WINDOW_ALIGN_HIGH_EDGE;
 
     /**
@@ -123,17 +127,17 @@
      * "windowAlignOffsetPercent"; if neither of these two is defined, the
      * default value is 1/2 of the size.
      */
-    public final static int WINDOW_ALIGN_NO_EDGE = 0;
+    public static final int WINDOW_ALIGN_NO_EDGE = 0;
 
     /**
      * Value indicates that percent is not used.
      */
-    public final static float WINDOW_ALIGN_OFFSET_PERCENT_DISABLED = -1;
+    public static final float WINDOW_ALIGN_OFFSET_PERCENT_DISABLED = -1;
 
     /**
      * Value indicates that percent is not used.
      */
-    public final static float ITEM_ALIGN_OFFSET_PERCENT_DISABLED =
+    public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED =
             ItemAlignmentFacet.ITEM_ALIGN_OFFSET_PERCENT_DISABLED;
 
     /**
@@ -158,7 +162,7 @@
      */
     public static final int SAVE_ALL_CHILD = 3;
 
-    private static final int PFLAG_RETAIN_FOCUS_FOR_CHILD = 1 << 0;
+    private static final int PFLAG_RETAIN_FOCUS_FOR_CHILD = 1;
 
     /**
      * Defines behavior of duration and interpolator for smoothScrollBy().
@@ -166,6 +170,7 @@
     public interface SmoothScrollByBehavior {
         /**
          * Defines duration in milliseconds of smoothScrollBy().
+         *
          * @param dx x distance in pixels.
          * @param dy y distance in pixels.
          * @return Duration in milliseconds or UNDEFINED_DURATION for default value.
@@ -174,6 +179,7 @@
 
         /**
          * Defines interpolator of smoothScrollBy().
+         *
          * @param dx x distance in pixels.
          * @param dy y distance in pixels.
          * @return Interpolator to be used or null for default interpolator.
@@ -189,7 +195,7 @@
         /**
          * Returns true if the touch dispatch event should be consumed.
          */
-        public boolean onInterceptTouchEvent(MotionEvent event);
+        boolean onInterceptTouchEvent(@NonNull MotionEvent event);
     }
 
     /**
@@ -199,7 +205,7 @@
         /**
          * Returns true if the touch dispatch event should be consumed.
          */
-        public boolean onInterceptMotionEvent(MotionEvent event);
+        boolean onInterceptMotionEvent(@NonNull MotionEvent event);
     }
 
     /**
@@ -209,14 +215,17 @@
         /**
          * Returns true if the key dispatch event should be consumed.
          */
-        public boolean onInterceptKeyEvent(KeyEvent event);
+        boolean onInterceptKeyEvent(@NonNull KeyEvent event);
     }
 
+    /**
+     * Listener for intercepting unhandled key events.
+     */
     public interface OnUnhandledKeyListener {
         /**
          * Returns true if the key event should be consumed.
          */
-        public boolean onUnhandledKey(KeyEvent event);
+        boolean onUnhandledKey(@NonNull KeyEvent event);
     }
 
     /**
@@ -272,7 +281,7 @@
         // Disable change animation by default on leanback.
         // Change animation will create a new view and cause undesired
         // focus animation between the old view and new view.
-        ((SimpleItemAnimator)getItemAnimator()).setSupportsChangeAnimations(false);
+        ((SimpleItemAnimator) getItemAnimator()).setSupportsChangeAnimations(false);
         super.addRecyclerListener(new RecyclerView.RecyclerListener() {
             @Override
             public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
@@ -309,12 +318,13 @@
      * <li>{@link #FOCUS_SCROLL_ITEM}</li>
      * <li>{@link #FOCUS_SCROLL_PAGE}</li>
      * </ul>
+     *
      * @hide
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     public void setFocusScrollStrategy(int scrollStrategy) {
         if (scrollStrategy != FOCUS_SCROLL_ALIGNED && scrollStrategy != FOCUS_SCROLL_ITEM
-            && scrollStrategy != FOCUS_SCROLL_PAGE) {
+                && scrollStrategy != FOCUS_SCROLL_PAGE) {
             throw new IllegalArgumentException("Invalid scrollStrategy");
         }
         mLayoutManager.setFocusScrollStrategy(scrollStrategy);
@@ -328,6 +338,7 @@
      * <li>{@link #FOCUS_SCROLL_ITEM}</li>
      * <li>{@link #FOCUS_SCROLL_PAGE}</li>
      * </ul>
+     *
      * @hide
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
@@ -339,8 +350,8 @@
      * Sets the method for focused item alignment in the view.
      *
      * @param windowAlignment {@link #WINDOW_ALIGN_BOTH_EDGE},
-     *        {@link #WINDOW_ALIGN_LOW_EDGE}, {@link #WINDOW_ALIGN_HIGH_EDGE} or
-     *        {@link #WINDOW_ALIGN_NO_EDGE}.
+     *                        {@link #WINDOW_ALIGN_LOW_EDGE}, {@link #WINDOW_ALIGN_HIGH_EDGE} or
+     *                        {@link #WINDOW_ALIGN_NO_EDGE}.
      */
     public void setWindowAlignment(int windowAlignment) {
         mLayoutManager.setWindowAlignment(windowAlignment);
@@ -351,7 +362,7 @@
      * Returns the method for focused item alignment in the view.
      *
      * @return {@link #WINDOW_ALIGN_BOTH_EDGE}, {@link #WINDOW_ALIGN_LOW_EDGE},
-     *         {@link #WINDOW_ALIGN_HIGH_EDGE} or {@link #WINDOW_ALIGN_NO_EDGE}.
+     * {@link #WINDOW_ALIGN_HIGH_EDGE} or {@link #WINDOW_ALIGN_NO_EDGE}.
      */
     public int getWindowAlignment() {
         return mLayoutManager.getWindowAlignment();
@@ -416,10 +427,10 @@
      * Sets the offset in pixels for window alignment key line.
      *
      * @param offset The number of pixels to offset.  If the offset is positive,
-     *        it is distance from low edge (see {@link #WINDOW_ALIGN_LOW_EDGE});
-     *        if the offset is negative, the absolute value is distance from high
-     *        edge (see {@link #WINDOW_ALIGN_HIGH_EDGE}).
-     *        Default value is 0.
+     *               it is distance from low edge (see {@link #WINDOW_ALIGN_LOW_EDGE});
+     *               if the offset is negative, the absolute value is distance from high
+     *               edge (see {@link #WINDOW_ALIGN_HIGH_EDGE}).
+     *               Default value is 0.
      */
     public void setWindowAlignmentOffset(int offset) {
         mLayoutManager.setWindowAlignmentOffset(offset);
@@ -430,10 +441,10 @@
      * Returns the offset in pixels for window alignment key line.
      *
      * @return The number of pixels to offset.  If the offset is positive,
-     *        it is distance from low edge (see {@link #WINDOW_ALIGN_LOW_EDGE});
-     *        if the offset is negative, the absolute value is distance from high
-     *        edge (see {@link #WINDOW_ALIGN_HIGH_EDGE}).
-     *        Default value is 0.
+     * it is distance from low edge (see {@link #WINDOW_ALIGN_LOW_EDGE});
+     * if the offset is negative, the absolute value is distance from high
+     * edge (see {@link #WINDOW_ALIGN_HIGH_EDGE}).
+     * Default value is 0.
      */
     public int getWindowAlignmentOffset() {
         return mLayoutManager.getWindowAlignmentOffset();
@@ -444,9 +455,9 @@
      * #getWindowAlignmentOffset()}.
      *
      * @param offsetPercent Percentage to offset. E.g., 40 means 40% of the
-     *        width from low edge. Use
-     *        {@link #WINDOW_ALIGN_OFFSET_PERCENT_DISABLED} to disable.
-     *         Default value is 50.
+     *                      width from low edge. Use
+     *                      {@link #WINDOW_ALIGN_OFFSET_PERCENT_DISABLED} to disable.
+     *                      Default value is 50.
      */
     public void setWindowAlignmentOffsetPercent(float offsetPercent) {
         mLayoutManager.setWindowAlignmentOffsetPercent(offsetPercent);
@@ -458,8 +469,8 @@
      * {@link #getWindowAlignmentOffset()}.
      *
      * @return Percentage to offset. E.g., 40 means 40% of the width from the
-     *         low edge, or {@link #WINDOW_ALIGN_OFFSET_PERCENT_DISABLED} if
-     *         disabled. Default value is 50.
+     * low edge, or {@link #WINDOW_ALIGN_OFFSET_PERCENT_DISABLED} if
+     * disabled. Default value is 50.
      */
     public float getWindowAlignmentOffsetPercent() {
         return mLayoutManager.getWindowAlignmentOffsetPercent();
@@ -527,8 +538,8 @@
      * is provided by {@link RecyclerView.ViewHolder} or {@link FacetProviderAdapter}.
      *
      * @param offsetPercent Percentage to offset. E.g., 40 means 40% of the
-     *        width from the low edge. Use
-     *        {@link #ITEM_ALIGN_OFFSET_PERCENT_DISABLED} to disable.
+     *                      width from the low edge. Use
+     *                      {@link #ITEM_ALIGN_OFFSET_PERCENT_DISABLED} to disable.
      */
     public void setItemAlignmentOffsetPercent(float offsetPercent) {
         mLayoutManager.setItemAlignmentOffsetPercent(offsetPercent);
@@ -540,8 +551,8 @@
      * #getItemAlignmentOffset()}.
      *
      * @return Percentage to offset. E.g., 40 means 40% of the width from the
-     *         low edge, or {@link #ITEM_ALIGN_OFFSET_PERCENT_DISABLED} if
-     *         disabled. Default value is 50.
+     * low edge, or {@link #ITEM_ALIGN_OFFSET_PERCENT_DISABLED} if
+     * disabled. Default value is 50.
      */
     public float getItemAlignmentOffsetPercent() {
         return mLayoutManager.getItemAlignmentOffsetPercent();
@@ -560,6 +571,7 @@
     /**
      * Returns the id of the view to align with, or {@link android.view.View#NO_ID} for the root
      * {@link RecyclerView.ViewHolder#itemView}.
+     *
      * @return The id of the view to align with, or {@link android.view.View#NO_ID} for the root
      * {@link RecyclerView.ViewHolder#itemView}.
      */
@@ -569,6 +581,7 @@
 
     /**
      * Sets the spacing in pixels between two child items.
+     *
      * @deprecated use {@link #setItemSpacing(int)}
      */
     @Deprecated
@@ -578,6 +591,7 @@
 
     /**
      * Sets the vertical and horizontal spacing in pixels between two child items.
+     *
      * @param spacing Vertical and horizontal spacing in pixels between two child items.
      */
     public void setItemSpacing(int spacing) {
@@ -587,6 +601,7 @@
 
     /**
      * Sets the spacing in pixels between two child items vertically.
+     *
      * @deprecated Use {@link #setVerticalSpacing(int)}
      */
     @Deprecated
@@ -596,6 +611,7 @@
 
     /**
      * Returns the spacing in pixels between two child items vertically.
+     *
      * @deprecated Use {@link #getVerticalSpacing()}
      */
     @Deprecated
@@ -605,6 +621,7 @@
 
     /**
      * Sets the spacing in pixels between two child items horizontally.
+     *
      * @deprecated Use {@link #setHorizontalSpacing(int)}
      */
     @Deprecated
@@ -614,6 +631,7 @@
 
     /**
      * Returns the spacing in pixels between two child items horizontally.
+     *
      * @deprecated Use {@link #getHorizontalSpacing()}
      */
     @Deprecated
@@ -623,6 +641,7 @@
 
     /**
      * Sets the vertical spacing in pixels between two child items.
+     *
      * @param spacing Vertical spacing between two child items.
      */
     public void setVerticalSpacing(int spacing) {
@@ -632,6 +651,7 @@
 
     /**
      * Returns the vertical spacing in pixels between two child items.
+     *
      * @return The vertical spacing in pixels between two child items.
      */
     public int getVerticalSpacing() {
@@ -640,6 +660,7 @@
 
     /**
      * Sets the horizontal spacing in pixels between two child items.
+     *
      * @param spacing Horizontal spacing in pixels between two child items.
      */
     public void setHorizontalSpacing(int spacing) {
@@ -649,6 +670,7 @@
 
     /**
      * Returns the horizontal spacing in pixels between two child items.
+     *
      * @return The Horizontal spacing in pixels between two child items.
      */
     public int getHorizontalSpacing() {
@@ -661,7 +683,7 @@
      *
      * @param listener The listener to be invoked.
      */
-    public void setOnChildLaidOutListener(OnChildLaidOutListener listener) {
+    public void setOnChildLaidOutListener(@Nullable OnChildLaidOutListener listener) {
         mLayoutManager.setOnChildLaidOutListener(listener);
     }
 
@@ -674,7 +696,8 @@
      * @param listener The listener to be invoked.
      */
     @SuppressLint("ReferencesDeprecated")
-    public void setOnChildSelectedListener(OnChildSelectedListener listener) {
+    @SuppressWarnings("deprecation")
+    public void setOnChildSelectedListener(@Nullable OnChildSelectedListener listener) {
         mLayoutManager.setOnChildSelectedListener(listener);
     }
 
@@ -706,7 +729,8 @@
      *
      * @param listener The listener to be invoked.
      */
-    public void setOnChildViewHolderSelectedListener(OnChildViewHolderSelectedListener listener) {
+    public void setOnChildViewHolderSelectedListener(
+            @Nullable OnChildViewHolderSelectedListener listener) {
         mLayoutManager.setOnChildViewHolderSelectedListener(listener);
     }
 
@@ -718,7 +742,8 @@
      *
      * @param listener The listener to be invoked.
      */
-    public void addOnChildViewHolderSelectedListener(OnChildViewHolderSelectedListener listener) {
+    public void addOnChildViewHolderSelectedListener(
+            @NonNull OnChildViewHolderSelectedListener listener) {
         mLayoutManager.addOnChildViewHolderSelectedListener(listener);
     }
 
@@ -727,8 +752,8 @@
      *
      * @param listener The listener to be removed.
      */
-    public void removeOnChildViewHolderSelectedListener(OnChildViewHolderSelectedListener listener)
-            {
+    public void removeOnChildViewHolderSelectedListener(
+            @NonNull OnChildViewHolderSelectedListener listener) {
         mLayoutManager.removeOnChildViewHolderSelectedListener(listener);
     }
 
@@ -741,6 +766,7 @@
 
     /**
      * Changes the selected item and/or subposition immediately without animation.
+     *
      * @hide
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
@@ -761,6 +787,7 @@
      * Changes the selected item and/or subposition immediately without animation, scrollExtra is
      * applied in primary scroll direction.  The scrollExtra will be kept until
      * another {@link #setSelectedPosition} or {@link #setSelectedPositionSmooth} call.
+     *
      * @hide
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
@@ -771,6 +798,7 @@
     /**
      * Changes the selected item and run an animation to scroll to the target
      * position.
+     *
      * @param position Adapter position of the item to select.
      */
     public void setSelectedPositionSmooth(int position) {
@@ -780,6 +808,7 @@
     /**
      * Changes the selected item and/or subposition, runs an animation to scroll to the target
      * position.
+     *
      * @hide
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
@@ -789,16 +818,18 @@
 
     /**
      * Perform a task on ViewHolder at given position after smooth scrolling to it.
+     *
      * @param position Position of item in adapter.
-     * @param task Task to executed on the ViewHolder at a given position.
+     * @param task     Task to executed on the ViewHolder at a given position.
      */
-    public void setSelectedPositionSmooth(final int position, final ViewHolderTask task) {
+    @SuppressWarnings("deprecation")
+    public void setSelectedPositionSmooth(final int position, @Nullable final ViewHolderTask task) {
         if (task != null) {
             RecyclerView.ViewHolder vh = findViewHolderForPosition(position);
             if (vh == null || hasPendingAdapterUpdates()) {
                 addOnChildViewHolderSelectedListener(new OnChildViewHolderSelectedListener() {
                     @Override
-                    public void onChildViewHolderSelected(RecyclerView parent,
+                    public void onChildViewHolderSelected(@NonNull RecyclerView parent,
                             RecyclerView.ViewHolder child, int selectedPosition, int subposition) {
                         if (selectedPosition == position) {
                             removeOnChildViewHolderSelectedListener(this);
@@ -815,16 +846,18 @@
 
     /**
      * Perform a task on ViewHolder at given position after scroll to it.
+     *
      * @param position Position of item in adapter.
-     * @param task Task to executed on the ViewHolder at a given position.
+     * @param task     Task to executed on the ViewHolder at a given position.
      */
-    public void setSelectedPosition(final int position, final ViewHolderTask task) {
+    @SuppressWarnings("deprecation")
+    public void setSelectedPosition(final int position, @Nullable final ViewHolderTask task) {
         if (task != null) {
             RecyclerView.ViewHolder vh = findViewHolderForPosition(position);
             if (vh == null || hasPendingAdapterUpdates()) {
                 addOnChildViewHolderSelectedListener(new OnChildViewHolderSelectedListener() {
                     @Override
-                    public void onChildViewHolderSelectedAndPositioned(RecyclerView parent,
+                    public void onChildViewHolderSelectedAndPositioned(@NonNull RecyclerView parent,
                             RecyclerView.ViewHolder child, int selectedPosition, int subposition) {
                         if (selectedPosition == position) {
                             removeOnChildViewHolderSelectedListener(this);
@@ -841,6 +874,7 @@
 
     /**
      * Returns the adapter position of selected item.
+     *
      * @return The adapter position of selected item.
      */
     public int getSelectedPosition() {
@@ -852,6 +886,7 @@
      * multiple {@link ItemAlignmentFacet}s provided by {@link RecyclerView.ViewHolder}
      * or {@link FacetProviderAdapter}.  Zero is returned when no {@link ItemAlignmentFacet}
      * is defined.
+     *
      * @hide
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
@@ -862,6 +897,7 @@
     /**
      * Sets whether ItemAnimator should run when a child changes size or when adding
      * or removing a child.
+     *
      * @param animateChildLayout True to enable ItemAnimator, false to disable.
      */
     public void setAnimateChildLayout(boolean animateChildLayout) {
@@ -879,6 +915,7 @@
     /**
      * Returns true if an animation will run when a child changes size or when
      * adding or removing a child.
+     *
      * @return True if ItemAnimator is enabled, false otherwise.
      */
     public boolean isChildLayoutAnimated() {
@@ -913,7 +950,8 @@
     }
 
     @Override
-    public boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) {
+    public boolean onRequestFocusInDescendants(int direction,
+            @Nullable Rect previouslyFocusedRect) {
         if ((mPrivateFlag & PFLAG_RETAIN_FOCUS_FOR_CHILD) == PFLAG_RETAIN_FOCUS_FOR_CHILD) {
             // dont focus to child if GridView itself retains focus for child
             return false;
@@ -926,10 +964,10 @@
      * Returns the x/y offsets to final position from current position if the view
      * is selected.
      *
-     * @param view The view to get offsets.
+     * @param view    The view to get offsets.
      * @param offsets offsets[0] holds offset of X, offsets[1] holds offset of Y.
      */
-    public void getViewSelectedOffsets(View view, int[] offsets) {
+    public void getViewSelectedOffsets(@NonNull View view, @NonNull int[] offsets) {
         mLayoutManager.getViewSelectedOffsets(view, offsets);
     }
 
@@ -943,6 +981,7 @@
     }
 
     @Override
+    @Nullable
     public View focusSearch(int direction) {
         if (isFocused()) {
             // focusSearch(int) is called when GridView itself is focused.
@@ -957,24 +996,27 @@
     }
 
     @Override
-    protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
+    protected void onFocusChanged(boolean gainFocus, int direction,
+            @Nullable Rect previouslyFocusedRect) {
         super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
         mLayoutManager.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
     }
 
     /**
      * Disables or enables focus search.
+     *
      * @param disabled True to disable focus search, false to enable.
      */
     public final void setFocusSearchDisabled(boolean disabled) {
         // LayoutManager may detachView and attachView in fastRelayout, it causes RowsFragment
         // re-gain focus after a BACK key pressed, so block children focus during transition.
-        setDescendantFocusability(disabled ? FOCUS_BLOCK_DESCENDANTS: FOCUS_AFTER_DESCENDANTS);
+        setDescendantFocusability(disabled ? FOCUS_BLOCK_DESCENDANTS : FOCUS_AFTER_DESCENDANTS);
         mLayoutManager.setFocusSearchDisabled(disabled);
     }
 
     /**
      * Returns true if focus search is disabled.
+     *
      * @return True if focus search is disabled.
      */
     public final boolean isFocusSearchDisabled() {
@@ -984,6 +1026,7 @@
     /**
      * Enables or disables layout.  All children will be removed when layout is
      * disabled.
+     *
      * @param layoutEnabled True to enable layout, false otherwise.
      */
     public void setLayoutEnabled(boolean layoutEnabled) {
@@ -992,6 +1035,7 @@
 
     /**
      * Changes and overrides children's visibility.
+     *
      * @param visibility See {@link View#getVisibility()}.
      */
     public void setChildrenVisibility(int visibility) {
@@ -1000,6 +1044,7 @@
 
     /**
      * Enables or disables pruning of children.  Disable is useful during transition.
+     *
      * @param pruneChild True to prune children out side visible area, false to enable.
      */
     public void setPruneChild(boolean pruneChild) {
@@ -1008,6 +1053,7 @@
 
     /**
      * Enables or disables scrolling.  Disable is useful during transition.
+     *
      * @param scrollEnabled True to enable scroll, false to disable.
      */
     public void setScrollEnabled(boolean scrollEnabled) {
@@ -1016,6 +1062,7 @@
 
     /**
      * Returns true if scrolling is enabled, false otherwise.
+     *
      * @return True if scrolling is enabled, false otherwise.
      */
     public boolean isScrollEnabled() {
@@ -1035,6 +1082,7 @@
 
     /**
      * Enables or disables the default "focus draw at last" order rule. Default is enabled.
+     *
      * @param enabled True to draw the selected child at last, false otherwise.
      */
     public void setFocusDrawingOrderEnabled(boolean enabled) {
@@ -1043,6 +1091,7 @@
 
     /**
      * Returns true if draws selected child at last, false otherwise. Default is enabled.
+     *
      * @return True if draws selected child at last, false otherwise.
      */
     public boolean isFocusDrawingOrderEnabled() {
@@ -1051,46 +1100,52 @@
 
     /**
      * Sets the touch intercept listener.
+     *
      * @param listener The touch intercept listener.
      */
-    public void setOnTouchInterceptListener(OnTouchInterceptListener listener) {
+    public void setOnTouchInterceptListener(@Nullable OnTouchInterceptListener listener) {
         mOnTouchInterceptListener = listener;
     }
 
     /**
      * Sets the generic motion intercept listener.
+     *
      * @param listener The motion intercept listener.
      */
-    public void setOnMotionInterceptListener(OnMotionInterceptListener listener) {
+    public void setOnMotionInterceptListener(@Nullable OnMotionInterceptListener listener) {
         mOnMotionInterceptListener = listener;
     }
 
     /**
      * Sets the key intercept listener.
+     *
      * @param listener The key intercept listener.
      */
-    public void setOnKeyInterceptListener(OnKeyInterceptListener listener) {
+    public void setOnKeyInterceptListener(@Nullable OnKeyInterceptListener listener) {
         mOnKeyInterceptListener = listener;
     }
 
     /**
      * Sets the unhandled key listener.
+     *
      * @param listener The unhandled key intercept listener.
      */
-    public void setOnUnhandledKeyListener(OnUnhandledKeyListener listener) {
+    public void setOnUnhandledKeyListener(@Nullable OnUnhandledKeyListener listener) {
         mOnUnhandledKeyListener = listener;
     }
 
     /**
      * Returns the unhandled key listener.
+     *
      * @return The unhandled key listener.
      */
+    @Nullable
     public OnUnhandledKeyListener getOnUnhandledKeyListener() {
         return mOnUnhandledKeyListener;
     }
 
     @Override
-    public boolean dispatchKeyEvent(KeyEvent event) {
+    public boolean dispatchKeyEvent(@NonNull KeyEvent event) {
         if (mOnKeyInterceptListener != null && mOnKeyInterceptListener.onInterceptKeyEvent(event)) {
             return true;
         }
@@ -1101,7 +1156,7 @@
     }
 
     @Override
-    public boolean dispatchTouchEvent(MotionEvent event) {
+    public boolean dispatchTouchEvent(@NonNull MotionEvent event) {
         if (mOnTouchInterceptListener != null) {
             if (mOnTouchInterceptListener.onInterceptTouchEvent(event)) {
                 return true;
@@ -1111,7 +1166,7 @@
     }
 
     @Override
-    protected boolean dispatchGenericFocusedEvent(MotionEvent event) {
+    protected boolean dispatchGenericFocusedEvent(@NonNull MotionEvent event) {
         if (mOnMotionInterceptListener != null) {
             if (mOnMotionInterceptListener.onInterceptMotionEvent(event)) {
                 return true;
@@ -1132,7 +1187,7 @@
 
     /**
      * Returns the limit used when when {@link #getSaveChildrenPolicy()} is
-     *         {@link #SAVE_LIMITED_CHILD}
+     * {@link #SAVE_LIMITED_CHILD}
      */
     public final int getSaveChildrenLimitNumber() {
         return mLayoutManager.mChildrenStates.getLimitNumber();
@@ -1140,8 +1195,9 @@
 
     /**
      * Sets the policy for saving children.
+     *
      * @param savePolicy One of {@link #SAVE_NO_CHILD} {@link #SAVE_ON_SCREEN_CHILD}
-     * {@link #SAVE_LIMITED_CHILD} {@link #SAVE_ALL_CHILD}.
+     *                   {@link #SAVE_LIMITED_CHILD} {@link #SAVE_ALL_CHILD}.
      */
     public final void setSaveChildrenPolicy(int savePolicy) {
         mLayoutManager.mChildrenStates.setSavePolicy(savePolicy);
@@ -1176,8 +1232,8 @@
     /**
      * Sets pixels of extra space for layout child in invisible area.
      *
-     * @param extraLayoutSpace  Pixels of extra space for layout invisible child.
-     *                          Must be bigger or equals to 0.
+     * @param extraLayoutSpace Pixels of extra space for layout invisible child.
+     *                         Must be bigger or equals to 0.
      * @hide
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
@@ -1233,6 +1289,7 @@
 
     /**
      * Set custom behavior for smoothScrollBy().
+     *
      * @param behavior Custom behavior of SmoothScrollBy(). Null for default behavior.
      */
     public final void setSmoothScrollByBehavior(@Nullable SmoothScrollByBehavior behavior) {
@@ -1241,6 +1298,7 @@
 
     /**
      * Returns custom behavior for smoothScrollBy().
+     *
      * @return Custom behavior for SmoothScrollBy(). Null for default behavior.
      */
     @Nullable
@@ -1273,6 +1331,7 @@
     /**
      * Set factor of how slow the smoothScroller should run. For example when set to 2f, the smooth
      * scroller is twice slower. The value is 1f by default.
+     *
      * @param smoothScrollSpeedFactor Factor of how slow the smooth scroll is.
      */
     public final void setSmoothScrollSpeedFactor(float smoothScrollSpeedFactor) {
@@ -1293,6 +1352,7 @@
      * the value is set too low, it may miss many DPAD events. The default value is 10. If app
      * increases {@link #setSmoothScrollSpeedFactor(float)}, it may need decrease the max pending
      * DPAD events to avoid scrolling too long after DPAD release.
+     *
      * @param maxPendingMoves Maximum number of pending DPAD events to be remembered.
      */
     public final void setSmoothScrollMaxPendingMoves(int maxPendingMoves) {
@@ -1306,8 +1366,9 @@
      * the value is set too low, it may miss many DPAD events. The default value is 10. If app
      * increases {@link #setSmoothScrollSpeedFactor(float)}, it may need decrease the max pending
      * DPAD events to avoid scrolling too long after DPAD release.
+     *
      * @return Maximum number of pending DPAD events to be remembered when smooth scroll cannot
-     *         catch up speed of DPAD events being sent.
+     * catch up speed of DPAD events being sent.
      */
     public final int getSmoothScrollMaxPendingMoves() {
         return mLayoutManager.mMaxPendingMoves;
@@ -1337,10 +1398,10 @@
      * the number of Views created and in active use.</p>
      *
      * @param itemCount Number of items to prefetch
-     *
      * @see #getInitialPrefetchItemCount()
      * @see RecyclerView.LayoutManager#isItemPrefetchEnabled()
-     * @see RecyclerView.LayoutManager#collectInitialPrefetchPositions(int, RecyclerView.LayoutManager.LayoutPrefetchRegistry)
+     * @see RecyclerView.LayoutManager#collectInitialPrefetchPositions(int,
+     * RecyclerView.LayoutManager.LayoutPrefetchRegistry)
      */
     public void setInitialPrefetchItemCount(int itemCount) {
         mInitialPrefetchItemCount = itemCount;
@@ -1352,18 +1413,18 @@
      * which defines how many inner items should be prefetched when this GridView is nested inside
      * another RecyclerView.
      *
+     * @return number of items to prefetch.
      * @see RecyclerView.LayoutManager#isItemPrefetchEnabled()
      * @see #setInitialPrefetchItemCount(int)
-     * @see RecyclerView.LayoutManager#collectInitialPrefetchPositions(int, RecyclerView.LayoutManager.LayoutPrefetchRegistry)
-     *
-     * @return number of items to prefetch.
+     * @see RecyclerView.LayoutManager#collectInitialPrefetchPositions(int,
+     * RecyclerView.LayoutManager.LayoutPrefetchRegistry)
      */
     public int getInitialPrefetchItemCount() {
         return mInitialPrefetchItemCount;
     }
 
     @Override
-    public void removeView(View view) {
+    public void removeView(@NonNull View view) {
         boolean retainFocusForChild = view.hasFocus() && isFocusable();
         if (retainFocusForChild) {
             // When animation or scrolling removes a focused child, focus to GridView itself to
diff --git a/leanback/leanback/src/main/java/androidx/leanback/widget/FacetProvider.java b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/FacetProvider.java
similarity index 76%
rename from leanback/leanback/src/main/java/androidx/leanback/widget/FacetProvider.java
rename to leanback/leanback-grid/src/main/java/androidx/leanback/widget/FacetProvider.java
index 3287bea..8f4ed24 100644
--- a/leanback/leanback/src/main/java/androidx/leanback/widget/FacetProvider.java
+++ b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/FacetProvider.java
@@ -1,18 +1,23 @@
 /*
- * Copyright (C) 2015 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. You may obtain a copy of the License at
+ * 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
+ *      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.
+ * 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.leanback.widget;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
 /**
  * This is the query interface to supply optional features(aka facets) on an object without the need
  * of letting the object to subclass or implement java interfaces. Facets allow leanback to
@@ -60,10 +65,11 @@
 
     /**
      * Queries optional implemented facet.
-     * @param facetClass  Facet classes to query,  examples are: class of
-     *                    {@link ItemAlignmentFacet}.
+     *
+     * @param facetClass Facet classes to query,  examples are: class of
+     *                   {@link ItemAlignmentFacet}.
      * @return Facet implementation for the facetClass or null if feature not implemented.
      */
-    public Object getFacet(Class<?> facetClass);
-
+    @Nullable
+    Object getFacet(@NonNull Class<?> facetClass);
 }
diff --git a/leanback/leanback-grid/src/main/java/androidx/leanback/widget/FacetProviderAdapter.java b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/FacetProviderAdapter.java
new file mode 100644
index 0000000..f967eaa
--- /dev/null
+++ b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/FacetProviderAdapter.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.leanback.widget;
+
+import androidx.annotation.Nullable;
+
+/**
+ * Optional interface that implemented by
+ * {@link androidx.recyclerview.widget.RecyclerView.Adapter} to
+ * query {@link FacetProvider} for a given item view type within Adapter. Note that
+ * {@link androidx.recyclerview.widget.RecyclerView.ViewHolder} may also implement
+ * {@link FacetProvider} which has a higher priority than the one returned
+ * from{@link #getFacetProvider(int)}.
+ * <p>
+ * A typical use case of {@link FacetProvider} is that VerticalGridView/HorizontalGridView retrieves
+ * {@link ItemAlignmentFacet} for a ViewHolder or a item view type.
+ */
+public interface FacetProviderAdapter {
+    /**
+     * Queries {@link FacetProvider} for a given type within Adapter.
+     *
+     * @param type type of the item.
+     * @return Facet provider for the type.
+     */
+    @Nullable
+    FacetProvider getFacetProvider(int type);
+}
diff --git a/leanback/leanback/src/main/java/androidx/leanback/widget/Grid.java b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/Grid.java
similarity index 86%
rename from leanback/leanback/src/main/java/androidx/leanback/widget/Grid.java
rename to leanback/leanback-grid/src/main/java/androidx/leanback/widget/Grid.java
index 9608fec..2b37bd4 100644
--- a/leanback/leanback/src/main/java/androidx/leanback/widget/Grid.java
+++ b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/Grid.java
@@ -1,15 +1,17 @@
 /*
- * Copyright (C) 2014 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. You may obtain a copy of the License at
+ * 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
+ *      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.
+ * 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.leanback.widget;
 
@@ -28,12 +30,12 @@
  * Grid is the base class for single row, non-staggered grid and staggered grid.
  * <p>
  * To use the Grid, user must implement a Provider to create or remove visible item.
- * Grid maintains a list of visible items.  Visible items are created when
+ * Grid maintains a list of visible items. Visible items are created when
  * user calls appendVisibleItems() or prependVisibleItems() with certain limitation
- * (e.g. a max edge that append up to).  Visible items are deleted when user calls
- * removeInvisibleItemsAtEnd() or removeInvisibleItemsAtFront().  Grid's algorithm
+ * (e.g. a max edge that append up to). Visible items are deleted when user calls
+ * removeInvisibleItemsAtEnd() or removeInvisibleItemsAtFront(). Grid's algorithm
  * uses size of visible item returned from Provider.createItem() to decide which row
- * to add a new visible item and may cache the algorithm results.   User must call
+ * to add a new visible item and may cache the algorithm results. User must call
  * invalidateItemsAfter() when it detects item size changed to ask Grid to remove cached
  * results.
  */
@@ -43,7 +45,7 @@
      * A constant representing a default starting index, indicating that the
      * developer did not provide a start index.
      */
-    public static final int START_DEFAULT = -1;
+    static final int START_DEFAULT = -1;
 
     Object[] mTmpItem = new Object[1];
 
@@ -51,7 +53,7 @@
      * When user uses Grid,  he should provide count of items and
      * the method to create item and remove item.
      */
-    public static interface Provider {
+    interface Provider {
 
         /**
          * Return how many items (are in the adapter).
@@ -71,43 +73,48 @@
         /**
          * Create visible item and where the provider should measure it.
          * The call is always followed by addItem().
-         * @param index     0-based index of the item in provider
-         * @param append  True if new item is after last visible item, false if new item is
-         *                before first visible item.
-         * @param item    item[0] returns created item that will be passed in addItem() call.
+         *
+         * @param index            0-based index of the item in provider
+         * @param append           True if new item is after last visible item, false if new item is
+         *                         before first visible item.
+         * @param item             item[0] returns created item that will be passed in addItem()
+         *                         call.
          * @param disappearingItem The item is a disappearing item added by
          *                         {@link Grid#fillDisappearingItems(int[], int, SparseIntArray)}.
-         *
          * @return length of the item.
          */
         int createItem(int index, boolean append, Object[] item, boolean disappearingItem);
 
         /**
          * add item to given row and given edge.  The call is always after createItem().
-         * @param item      The object returned by createItem()
-         * @param index     0-based index of the item in provider
-         * @param length    The size of the object
-         * @param rowIndex  Row index to put the item
-         * @param edge      min_edge if not reversed or max_edge if reversed.
+         *
+         * @param item     The object returned by createItem()
+         * @param index    0-based index of the item in provider
+         * @param length   The size of the object
+         * @param rowIndex Row index to put the item
+         * @param edge     min_edge if not reversed or max_edge if reversed.
          */
         void addItem(Object item, int index, int length, int rowIndex, int edge);
 
         /**
          * Remove visible item at index.
-         * @param index     0-based index of the item in provider
+         *
+         * @param index 0-based index of the item in provider
          */
         void removeItem(int index);
 
         /**
          * Get edge of an existing visible item. edge will be the min_edge
          * if not reversed or the max_edge if reversed.
-         * @param index     0-based index of the item in provider
+         *
+         * @param index 0-based index of the item in provider
          */
         int getEdge(int index);
 
         /**
          * Get size of an existing visible item.
-         * @param index     0-based index of the item in provider
+         *
+         * @param index 0-based index of the item in provider
          */
         int getSize(int index);
     }
@@ -115,14 +122,14 @@
     /**
      * Cached representation of an item in Grid.  May be subclassed.
      */
-    public static class Location {
+    static class Location {
         /**
          * The index of the row for this Location.
          */
-        public int row;
+        int mRow;
 
-        public Location(int row) {
-            this.row = row;
+        Location(int row) {
+            this.mRow = row;
         }
     }
 
@@ -273,7 +280,7 @@
         if (location == null) {
             return -1;
         }
-        return location.row;
+        return location.mRow;
     }
 
     /**
@@ -292,7 +299,8 @@
 
     /**
      * Finds the largest or smallest row min edge of visible items, starts searching from
-     * indexLimit, the row index is returned in indices[0], the item index is returned in indices[1].
+     * indexLimit, the row index is returned in indices[0], the item index is returned in
+     * indices[1].
      */
     protected abstract int findRowMin(boolean findLarge, int indexLimit, int[] rowIndex);
 
@@ -319,7 +327,7 @@
             return false;
         }
         return mReversedFlow ? findRowMin(true, null) <= toLimit + mSpacing :
-                    findRowMax(false, null) >= toLimit - mSpacing;
+                findRowMax(false, null) >= toLimit - mSpacing;
     }
 
     /**
@@ -330,7 +338,7 @@
             return false;
         }
         return mReversedFlow ? findRowMax(false, null) >= toLimit - mSpacing :
-                    findRowMin(true, null) <= toLimit + mSpacing;
+                findRowMin(true, null) <= toLimit + mSpacing;
     }
 
     /**
@@ -357,6 +365,7 @@
     /**
      * Prepends items and stops after one column is filled.
      * (i.e. filled items from row 0 to row mNumRows - 1)
+     *
      * @return true if at least one item is filled.
      */
     public final boolean prependOneColumnVisibleItems() {
@@ -374,8 +383,9 @@
     /**
      * Prepends items until first item or reaches toLimit (min edge when not reversed or
      * max edge when reversed).
-     * @param oneColumnMode  true when fills one column and stops,  false
-     * when checks if condition matches before filling first column.
+     *
+     * @param oneColumnMode true when fills one column and stops,  false
+     *                      when checks if condition matches before filling first column.
      * @return true if at least one item is filled.
      */
     protected abstract boolean prependVisibleItems(int toLimit, boolean oneColumnMode);
@@ -383,6 +393,7 @@
     /**
      * Appends items and stops after one column is filled.
      * (i.e. filled items from row 0 to row mNumRows - 1)
+     *
      * @return true if at least one item is filled.
      */
     public boolean appendOneColumnVisibleItems() {
@@ -400,19 +411,21 @@
     /**
      * Appends items until last or reaches toLimit (high edge when not
      * reversed or low edge when reversed).
+     *
      * @param oneColumnMode True when fills one column and stops,  false
-     * when checks if condition matches before filling first column.
+     *                      when checks if condition matches before filling first column.
      * @return true if filled at least one item
      */
     protected abstract boolean appendVisibleItems(int toLimit, boolean oneColumnMode);
 
     /**
      * Removes invisible items from end until reaches item at aboveIndex or toLimit.
+     *
      * @param aboveIndex Don't remove items whose index is equals or smaller than aboveIndex
-     * @param toLimit Don't remove items whose left edge is less than toLimit.
+     * @param toLimit    Don't remove items whose left edge is less than toLimit.
      */
     public void removeInvisibleItemsAtEnd(int aboveIndex, int toLimit) {
-        while(mLastVisibleIndex >= mFirstVisibleIndex && mLastVisibleIndex > aboveIndex) {
+        while (mLastVisibleIndex >= mFirstVisibleIndex && mLastVisibleIndex > aboveIndex) {
             boolean offEnd = !mReversedFlow ? mProvider.getEdge(mLastVisibleIndex) >= toLimit
                     : mProvider.getEdge(mLastVisibleIndex) <= toLimit;
             if (offEnd) {
@@ -427,11 +440,12 @@
 
     /**
      * Removes invisible items from front until reaches item at belowIndex or toLimit.
+     *
      * @param belowIndex Don't remove items whose index is equals or larger than belowIndex
-     * @param toLimit Don't remove items whose right edge is equals or greater than toLimit.
+     * @param toLimit    Don't remove items whose right edge is equals or greater than toLimit.
      */
     public void removeInvisibleItemsAtFront(int belowIndex, int toLimit) {
-        while(mLastVisibleIndex >= mFirstVisibleIndex && mFirstVisibleIndex < belowIndex) {
+        while (mLastVisibleIndex >= mFirstVisibleIndex && mFirstVisibleIndex < belowIndex) {
             final int size = mProvider.getSize(mFirstVisibleIndex);
             boolean offFront = !mReversedFlow
                     ? mProvider.getEdge(mFirstVisibleIndex) + size <= toLimit
@@ -457,7 +471,8 @@
      * location so recyclerview will run a slide out animation. The positions that was greater than
      * last visible index will be appended to end, the positions that was smaller than first visible
      * index will be prepend to beginning.
-     * @param positions Sorted list of positions of disappearing items.
+     *
+     * @param positions     Sorted list of positions of disappearing items.
      * @param positionToRow Which row we want to put the disappearing item.
      */
     public void fillDisappearingItems(int[] positions, int positionsLength,
diff --git a/leanback/leanback/src/main/java/androidx/leanback/widget/GridLayoutManager.java b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/GridLayoutManager.java
similarity index 96%
rename from leanback/leanback/src/main/java/androidx/leanback/widget/GridLayoutManager.java
rename to leanback/leanback-grid/src/main/java/androidx/leanback/widget/GridLayoutManager.java
index d12f76d3..e9a9f4b 100644
--- a/leanback/leanback/src/main/java/androidx/leanback/widget/GridLayoutManager.java
+++ b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/GridLayoutManager.java
@@ -1,15 +1,17 @@
 /*
- * Copyright (C) 2014 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. You may obtain a copy of the License at
+ * 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
+ *      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.
+ * 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.leanback.widget;
 
@@ -71,7 +73,7 @@
      * - Saves optical bounds insets.
      * - Caches focus align view center.
      */
-    final static class LayoutParams extends RecyclerView.LayoutParams {
+    static final class LayoutParams extends RecyclerView.LayoutParams {
 
         // For placement
         int mLeftInset;
@@ -85,27 +87,27 @@
         private int[] mAlignMultiple;
         private ItemAlignmentFacet mAlignmentFacet;
 
-        public LayoutParams(Context c, AttributeSet attrs) {
+        LayoutParams(Context c, AttributeSet attrs) {
             super(c, attrs);
         }
 
-        public LayoutParams(int width, int height) {
+        LayoutParams(int width, int height) {
             super(width, height);
         }
 
-        public LayoutParams(MarginLayoutParams source) {
+        LayoutParams(MarginLayoutParams source) {
             super(source);
         }
 
-        public LayoutParams(ViewGroup.LayoutParams source) {
+        LayoutParams(ViewGroup.LayoutParams source) {
             super(source);
         }
 
-        public LayoutParams(RecyclerView.LayoutParams source) {
+        LayoutParams(RecyclerView.LayoutParams source) {
             super(source);
         }
 
-        public LayoutParams(LayoutParams source) {
+        LayoutParams(LayoutParams source) {
             super(source);
         }
 
@@ -199,7 +201,6 @@
             mRightInset = rightInset;
             mBottomInset = bottomInset;
         }
-
     }
 
     /**
@@ -294,7 +295,7 @@
     final class PendingMoveSmoothScroller extends GridLinearSmoothScroller {
         // -2 is a target position that LinearSmoothScroller can never find until
         // consumePendingMovesXXX() sets real targetPosition.
-        final static int TARGET_UNDEFINED = -2;
+        static final int TARGET_UNDEFINED = -2;
         // whether the grid is staggered.
         private final boolean mStaggeredGrid;
         // Number of pending movements on primary direction, negative if PREV_ITEM.
@@ -331,7 +332,7 @@
             int startPos = mPendingMoves > 0 ? mFocusPosition + mNumRows :
                     mFocusPosition - mNumRows;
             for (int pos = startPos; mPendingMoves != 0;
-                    pos = mPendingMoves > 0 ? pos + mNumRows: pos - mNumRows) {
+                    pos = mPendingMoves > 0 ? pos + mNumRows : pos - mNumRows) {
                 View v = findViewByPosition(pos);
                 if (v == null) {
                     break;
@@ -394,7 +395,7 @@
             View v = findViewByPosition(getTargetPosition());
             if (v != null) scrollToView(v, true);
         }
-    };
+    }
 
     private static final String TAG = "GridLayoutManager";
     static final boolean DEBUG = false;
@@ -406,7 +407,7 @@
     int mMaxPendingMoves = DEFAULT_MAX_PENDING_MOVES;
     // minimal milliseconds to scroll window size in major direction,  we put a cap to prevent the
     // effect smooth scrolling too over to bind an item view then drag the item view back.
-    final static int MIN_MS_SMOOTH_SCROLL_MAIN_SCREEN = 30;
+    static final int MIN_MS_SMOOTH_SCROLL_MAIN_SCREEN = 30;
 
     String getTag() {
         return TAG + ":" + mBaseGridView.getId();
@@ -503,8 +504,8 @@
     static final int PF_ROW_SECONDARY_SIZE_REFRESH = 1 << 10;
 
     /**
-     *  Allow DPAD key to navigate out at the front of the View (where position = 0),
-     *  default is false.
+     * Allow DPAD key to navigate out at the front of the View (where position = 0),
+     * default is false.
      */
     static final int PF_FOCUS_OUT_FRONT = 1 << 11;
 
@@ -516,8 +517,8 @@
     static final int PF_FOCUS_OUT_MASKS = PF_FOCUS_OUT_FRONT | PF_FOCUS_OUT_END;
 
     /**
-     *  Allow DPAD key to navigate out of second axis.
-     *  default is true.
+     * Allow DPAD key to navigate out of second axis.
+     * default is true.
      */
     static final int PF_FOCUS_OUT_SIDE_START = 1 << 13;
 
@@ -559,6 +560,7 @@
             | PF_FOCUS_OUT_SIDE_START | PF_FOCUS_OUT_SIDE_END
             | PF_PRUNE_CHILD | PF_SCROLL_ENABLED;
 
+    @SuppressWarnings("deprecation")
     private OnChildSelectedListener mChildSelectedListener = null;
 
     private ArrayList<OnChildViewHolderSelectedListener> mChildViewHolderSelectedListeners = null;
@@ -595,7 +597,7 @@
     /**
      * The offset to be applied to mFocusPosition, due to adapter change, on the next
      * layout.  Set to Integer.MIN_VALUE means we should stop adding delta to mFocusPosition
-     * until next layout cycler.
+     * until next layout cycle.
      * TODO:  This is somewhat duplication of RecyclerView getOldPosition() which is
      * unfortunately cleared after prelayout.
      */
@@ -710,7 +712,7 @@
     /**
      * Temporaries used for measuring.
      */
-    private int[] mMeasuredDimension = new int[2];
+    private final int[] mMeasuredDimension = new int[2];
 
     final ViewsStateBundle mChildrenStates = new ViewsStateBundle();
 
@@ -723,6 +725,7 @@
         this(null);
     }
 
+    @SuppressLint("WrongConstant")
     GridLayoutManager(@Nullable BaseGridView baseGridView) {
         mBaseGridView = baseGridView;
         mChildVisibility = -1;
@@ -735,6 +738,9 @@
         mGrid = null;
     }
 
+    /**
+     * Sets grid view orientation.
+     */
     public void setOrientation(@RecyclerView.Orientation int orientation) {
         if (orientation != HORIZONTAL && orientation != VERTICAL) {
             if (DEBUG) Log.v(getTag(), "invalid orientation: " + orientation);
@@ -896,6 +902,7 @@
         return mGrid != null;
     }
 
+    @SuppressWarnings("deprecation")
     void setOnChildSelectedListener(OnChildSelectedListener listener) {
         mChildSelectedListener = listener;
     }
@@ -906,7 +913,7 @@
             return;
         }
         if (mChildViewHolderSelectedListeners == null) {
-            mChildViewHolderSelectedListeners = new ArrayList<OnChildViewHolderSelectedListener>();
+            mChildViewHolderSelectedListeners = new ArrayList<>();
         } else {
             mChildViewHolderSelectedListeners.clear();
         }
@@ -937,7 +944,7 @@
         if (mChildViewHolderSelectedListeners == null) {
             return;
         }
-        for (int i = mChildViewHolderSelectedListeners.size() - 1; i >= 0 ; i--) {
+        for (int i = mChildViewHolderSelectedListeners.size() - 1; i >= 0; i--) {
             mChildViewHolderSelectedListeners.get(i).onChildViewHolderSelected(parent, child,
                     position, subposition);
         }
@@ -948,7 +955,7 @@
         if (mChildViewHolderSelectedListeners == null) {
             return;
         }
-        for (int i = mChildViewHolderSelectedListeners.size() - 1; i >= 0 ; i--) {
+        for (int i = mChildViewHolderSelectedListeners.size() - 1; i >= 0; i--) {
             mChildViewHolderSelectedListeners.get(i).onChildViewHolderSelectedAndPositioned(parent,
                     child, position, subposition);
         }
@@ -1023,7 +1030,7 @@
             RecyclerView.ViewHolder vh = mBaseGridView.getChildViewHolder(view);
             if (mChildSelectedListener != null) {
                 mChildSelectedListener.onChildSelected(mBaseGridView, view, mFocusPosition,
-                        vh == null? NO_ID: vh.getItemId());
+                        vh == null ? NO_ID : vh.getItemId());
             }
             fireOnChildViewHolderSelected(mBaseGridView, vh, mFocusPosition, mSubFocusPosition);
         } else {
@@ -1140,19 +1147,19 @@
         return v;
     }
 
-    final int getOpticalLeft(View v) {
+    int getOpticalLeft(View v) {
         return ((LayoutParams) v.getLayoutParams()).getOpticalLeft(v);
     }
 
-    final int getOpticalRight(View v) {
+    int getOpticalRight(View v) {
         return ((LayoutParams) v.getLayoutParams()).getOpticalRight(v);
     }
 
-    final int getOpticalTop(View v) {
+    int getOpticalTop(View v) {
         return ((LayoutParams) v.getLayoutParams()).getOpticalTop(v);
     }
 
-    final int getOpticalBottom(View v) {
+    int getOpticalBottom(View v) {
         return ((LayoutParams) v.getLayoutParams()).getOpticalBottom(v);
     }
 
@@ -1249,6 +1256,7 @@
      * Re-initialize data structures for a data change or handling invisible
      * selection. The method tries its best to preserve position information so
      * that staggered grid looks same before and after re-initialize.
+     *
      * @return true if can fastRelayout()
      */
     private boolean layoutInit() {
@@ -1305,7 +1313,7 @@
         // Iterate from left to right, which is a different index traversal
         // in RTL flow
         if ((mFlag & PF_REVERSE_FLOW_SECONDARY) != 0) {
-            for (int i = mNumRows-1; i > rowIndex; i--) {
+            for (int i = mNumRows - 1; i > rowIndex; i--) {
                 start += getRowSizeSecondary(i) + mSpacingSecondary;
             }
         } else {
@@ -1645,7 +1653,7 @@
         return facet;
     }
 
-    private Grid.Provider mGridProvider = new Grid.Provider() {
+    private final Grid.Provider mGridProvider = new Grid.Provider() {
 
         @Override
         public int getMinIndex() {
@@ -1902,7 +1910,8 @@
                 if (mBaseGridView.getScrollState() != SCROLL_STATE_IDLE || isSmoothScrolling()) {
                     mBaseGridView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                         @Override
-                        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
+                        public void onScrollStateChanged(@NonNull RecyclerView recyclerView,
+                                int newState) {
                             if (newState == SCROLL_STATE_IDLE) {
                                 mBaseGridView.removeOnScrollListener(this);
                                 requestLayout();
@@ -2019,7 +2028,7 @@
                 break;
             }
 
-            int startSecondary = getRowStartSecondary(location.row)
+            int startSecondary = getRowStartSecondary(location.mRow)
                     + mWindowAlignment.secondAxis().getPaddingMin() - mScrollOffsetSecondary;
             int primarySize, end;
             int start = getViewMin(view);
@@ -2041,7 +2050,7 @@
                 primarySize = getDecoratedMeasuredHeightWithMargin(view);
                 end = start + primarySize;
             }
-            layoutChild(location.row, view, start, end, startSecondary);
+            layoutChild(location.mRow, view, start, end, startSecondary);
             if (oldPrimarySize != primarySize) {
                 // size changed invalidate remaining Locations
                 if (DEBUG) Log.d(getTag(), "fastRelayout: view size changed at " + position);
@@ -2069,7 +2078,9 @@
             } else {
                 // prune disabled(e.g. in RowsFragment transition): append all removed items
                 while (mGrid.appendOneColumnVisibleItems()
-                        && mGrid.getLastVisibleIndex() < savedLastPos);
+                        && mGrid.getLastVisibleIndex() < savedLastPos) {
+                    // Do nothing.
+                }
             }
         }
         updateScrollLimits();
@@ -2132,13 +2143,13 @@
     void updatePositionToRowMapInPostLayout() {
         mPositionToRowInPostLayout.clear();
         final int childCount = getChildCount();
-        for (int i = 0;  i < childCount; i++) {
+        for (int i = 0; i < childCount; i++) {
             // Grid still maps to old positions at this point, use old position to get row infor
             int position = mBaseGridView.getChildViewHolder(getChildAt(i)).getOldPosition();
             if (position >= 0) {
                 Grid.Location loc = mGrid.getLocation(position);
                 if (loc != null) {
-                    mPositionToRowInPostLayout.put(position, loc.row);
+                    mPositionToRowInPostLayout.put(position, loc.mRow);
                 }
             }
         }
@@ -2151,7 +2162,7 @@
             return;
         }
         // initialize the int array or re-allocate the array.
-        if (mDisappearingPositions == null  || scrapSize > mDisappearingPositions.length) {
+        if (mDisappearingPositions == null || scrapSize > mDisappearingPositions.length) {
             int length = mDisappearingPositions == null ? 16 : mDisappearingPositions.length;
             while (length < scrapSize) {
                 length = length << 1;
@@ -2248,9 +2259,9 @@
                     // 4. item is moved out of old adapter position range.
                     if (lp.isItemChanged() || lp.isItemRemoved() || view.isLayoutRequested()
                             || (!view.hasFocus()
-                                && mFocusPosition == lp.getAbsoluteAdapterPosition())
+                            && mFocusPosition == lp.getAbsoluteAdapterPosition())
                             || (view.hasFocus()
-                                && mFocusPosition != lp.getAbsoluteAdapterPosition())
+                            && mFocusPosition != lp.getAbsoluteAdapterPosition())
                             || newAdapterPosition < minOldAdapterPosition
                             || newAdapterPosition > maxOldAdapterPosition) {
                         minChangedEdge = Math.min(minChangedEdge, getViewMin(view));
@@ -2562,7 +2573,7 @@
         int numToPrefetch = mBaseGridView.mInitialPrefetchItemCount;
         if (adapterItemCount != 0 && numToPrefetch != 0) {
             // prefetch items centered around mFocusPosition
-            int initialPos = Math.max(0, Math.min(mFocusPosition - (numToPrefetch - 1)/ 2,
+            int initialPos = Math.max(0, Math.min(mFocusPosition - (numToPrefetch - 1) / 2,
                     adapterItemCount - numToPrefetch));
             for (int i = initialPos; i < adapterItemCount && i < initialPos + numToPrefetch; i++) {
                 layoutPrefetchRegistry.addPosition(i, 0);
@@ -2843,8 +2854,10 @@
     @Override
     public void onItemsAdded(@NonNull RecyclerView recyclerView, int positionStart,
             int itemCount) {
-        if (DEBUG) Log.v(getTag(), "onItemsAdded positionStart "
-                + positionStart + " itemCount " + itemCount);
+        if (DEBUG) {
+            Log.v(getTag(), "onItemsAdded positionStart "
+                    + positionStart + " itemCount " + itemCount);
+        }
         if (mFocusPosition != NO_POSITION && mGrid != null && mGrid.getFirstVisibleIndex() >= 0
                 && mFocusPositionOffset != Integer.MIN_VALUE) {
             int pos = mFocusPosition + mFocusPositionOffset;
@@ -2865,9 +2878,11 @@
     @Override
     public void onItemsRemoved(@NonNull RecyclerView recyclerView,
             int positionStart, int itemCount) {
-        if (DEBUG) Log.v(getTag(), "onItemsRemoved positionStart "
-                + positionStart + " itemCount " + itemCount);
-        if (mFocusPosition != NO_POSITION  && mGrid != null && mGrid.getFirstVisibleIndex() >= 0
+        if (DEBUG) {
+            Log.v(getTag(), "onItemsRemoved positionStart "
+                    + positionStart + " itemCount " + itemCount);
+        }
+        if (mFocusPosition != NO_POSITION && mGrid != null && mGrid.getFirstVisibleIndex() >= 0
                 && mFocusPositionOffset != Integer.MIN_VALUE) {
             int pos = mFocusPosition + mFocusPositionOffset;
             if (positionStart <= pos) {
@@ -2887,8 +2902,10 @@
     @Override
     public void onItemsMoved(@NonNull RecyclerView recyclerView,
             int fromPosition, int toPosition, int itemCount) {
-        if (DEBUG) Log.v(getTag(), "onItemsMoved fromPosition "
-                + fromPosition + " toPosition " + toPosition);
+        if (DEBUG) {
+            Log.v(getTag(), "onItemsMoved fromPosition "
+                    + fromPosition + " toPosition " + toPosition);
+        }
         if (mFocusPosition != NO_POSITION && mFocusPositionOffset != Integer.MIN_VALUE) {
             int pos = mFocusPosition + mFocusPositionOffset;
             if (fromPosition <= pos && pos < fromPosition + itemCount) {
@@ -2908,8 +2925,10 @@
     @Override
     public void onItemsUpdated(@NonNull RecyclerView recyclerView,
             int positionStart, int itemCount) {
-        if (DEBUG) Log.v(getTag(), "onItemsUpdated positionStart "
-                + positionStart + " itemCount " + itemCount);
+        if (DEBUG) {
+            Log.v(getTag(), "onItemsUpdated positionStart "
+                    + positionStart + " itemCount " + itemCount);
+        }
         for (int i = positionStart, end = positionStart + itemCount; i < end; i++) {
             mChildrenStates.remove(i);
         }
@@ -2990,6 +3009,7 @@
     private void scrollToView(View view, View childView, boolean smooth) {
         scrollToView(view, childView, smooth, 0, 0);
     }
+
     /**
      * Scroll to a given child view and change mFocusPosition. Ignored when in slideOut() state.
      */
@@ -3204,7 +3224,8 @@
     void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
         if (gainFocus) {
             // if gridview.requestFocus() is called, select first focusable child.
-            for (int i = mFocusPosition; ;i++) {
+            int i = mFocusPosition;
+            while (true) {
                 View view = findViewByPosition(i);
                 if (view == null) {
                     break;
@@ -3213,6 +3234,7 @@
                     view.requestFocus();
                     break;
                 }
+                i++;
             }
         }
     }
@@ -3227,7 +3249,7 @@
 
     @Nullable
     @Override
-    public View onInterceptFocusSearch(@NonNull View focused, int direction) {
+    public View onInterceptFocusSearch(@Nullable View focused, int direction) {
         if ((mFlag & PF_FOCUS_SEARCH_DISABLED) != 0) {
             return focused;
         }
@@ -3306,11 +3328,11 @@
         if (mGrid.getFirstVisibleIndex() > 0) {
             return true;
         }
-        final int focusedRow = mGrid.getLocation(pos).row;
+        final int focusedRow = mGrid.getLocation(pos).mRow;
         for (int i = getChildCount() - 1; i >= 0; i--) {
             int position = getAdapterPositionByIndex(i);
             Grid.Location loc = mGrid.getLocation(position);
-            if (loc != null && loc.row == focusedRow) {
+            if (loc != null && loc.mRow == focusedRow) {
                 if (position < pos) {
                     return true;
                 }
@@ -3321,7 +3343,8 @@
 
     @Override
     public boolean onAddFocusables(@NonNull RecyclerView recyclerView,
-            @NonNull ArrayList<View> views, int direction, int focusableMode) {
+            @SuppressLint("ConcreteCollection") @NonNull ArrayList<View> views, int direction,
+            int focusableMode) {
         if ((mFlag & PF_FOCUS_SEARCH_DISABLED) != 0) {
             return true;
         }
@@ -3347,7 +3370,7 @@
                     : findViewByPosition(focusedPos);
             // Add focusables of focused item.
             if (immediateFocusedChild != null) {
-                immediateFocusedChild.addFocusables(views,  direction, focusableMode);
+                immediateFocusedChild.addFocusables(views, direction, focusableMode);
             }
             if (mGrid == null || getChildCount() == 0) {
                 // no grid information, or no child, bail out.
@@ -3359,7 +3382,7 @@
             }
             // Add focusables of neighbor depending on the focus search direction.
             final int focusedRow = mGrid != null && immediateFocusedChild != null
-                    ? mGrid.getLocation(focusedPos).row : NO_POSITION;
+                    ? mGrid.getLocation(focusedPos).mRow : NO_POSITION;
             final int focusableCount = views.size();
             int inc = movement == NEXT_ITEM || movement == NEXT_ROW ? 1 : -1;
             int loop_end = inc > 0 ? getChildCount() - 1 : 0;
@@ -3377,7 +3400,7 @@
                 // if there wasn't any focused item, add the very first focusable
                 // items and stop.
                 if (immediateFocusedChild == null) {
-                    child.addFocusables(views,  direction, focusableMode);
+                    child.addFocusables(views, direction, focusableMode);
                     if (views.size() > focusableCount) {
                         break;
                     }
@@ -3390,36 +3413,36 @@
                 }
                 if (movement == NEXT_ITEM) {
                     // Add first focusable item on the same row
-                    if (loc.row == focusedRow && position > focusedPos) {
-                        child.addFocusables(views,  direction, focusableMode);
+                    if (loc.mRow == focusedRow && position > focusedPos) {
+                        child.addFocusables(views, direction, focusableMode);
                         if (views.size() > focusableCount) {
                             break;
                         }
                     }
                 } else if (movement == PREV_ITEM) {
                     // Add first focusable item on the same row
-                    if (loc.row == focusedRow && position < focusedPos) {
-                        child.addFocusables(views,  direction, focusableMode);
+                    if (loc.mRow == focusedRow && position < focusedPos) {
+                        child.addFocusables(views, direction, focusableMode);
                         if (views.size() > focusableCount) {
                             break;
                         }
                     }
                 } else if (movement == NEXT_ROW) {
                     // Add all focusable items after this item whose row index is bigger
-                    if (loc.row == focusedRow) {
+                    if (loc.mRow == focusedRow) {
                         continue;
-                    } else if (loc.row < focusedRow) {
+                    } else if (loc.mRow < focusedRow) {
                         break;
                     }
-                    child.addFocusables(views,  direction, focusableMode);
+                    child.addFocusables(views, direction, focusableMode);
                 } else if (movement == PREV_ROW) {
                     // Add all focusable items before this item whose row index is smaller
-                    if (loc.row == focusedRow) {
+                    if (loc.mRow == focusedRow) {
                         continue;
-                    } else if (loc.row > focusedRow) {
+                    } else if (loc.mRow > focusedRow) {
                         break;
                     }
-                    child.addFocusables(views,  direction, focusableMode);
+                    child.addFocusables(views, direction, focusableMode);
                 }
             }
         } else {
@@ -3544,16 +3567,16 @@
         return false;
     }
 
-    private final static int PREV_ITEM = 0;
-    private final static int NEXT_ITEM = 1;
-    private final static int PREV_ROW = 2;
-    private final static int NEXT_ROW = 3;
+    private static final int PREV_ITEM = 0;
+    private static final int NEXT_ITEM = 1;
+    private static final int PREV_ROW = 2;
+    private static final int NEXT_ROW = 3;
 
     private int getMovement(int direction) {
         int movement = View.FOCUS_LEFT;
 
         if (mOrientation == HORIZONTAL) {
-            switch(direction) {
+            switch (direction) {
                 case View.FOCUS_LEFT:
                     movement = (mFlag & PF_REVERSE_FLOW_PRIMARY) == 0 ? PREV_ITEM : NEXT_ITEM;
                     break;
@@ -3568,7 +3591,7 @@
                     break;
             }
         } else if (mOrientation == VERTICAL) {
-            switch(direction) {
+            switch (direction) {
                 case View.FOCUS_LEFT:
                     movement = (mFlag & PF_REVERSE_FLOW_SECONDARY) == 0 ? PREV_ROW : NEXT_ROW;
                     break;
@@ -3639,22 +3662,22 @@
         mChildVisibility = visibility;
         if (mChildVisibility != -1) {
             int count = getChildCount();
-            for (int i= 0; i < count; i++) {
+            for (int i = 0; i < count; i++) {
                 getChildAt(i).setVisibility(mChildVisibility);
             }
         }
     }
 
     @SuppressLint("BanParcelableUsage")
-    final static class SavedState implements Parcelable {
+    static final class SavedState implements Parcelable {
 
-        int index; // index inside adapter of the current view
-        Bundle childStates = Bundle.EMPTY;
+        int mIndex; // index inside adapter of the current view
+        Bundle mChildStates = Bundle.EMPTY;
 
         @Override
         public void writeToParcel(Parcel out, int flags) {
-            out.writeInt(index);
-            out.writeBundle(childStates);
+            out.writeInt(mIndex);
+            out.writeBundle(mChildStates);
         }
 
         @SuppressWarnings("hiding")
@@ -3677,8 +3700,8 @@
         }
 
         SavedState(Parcel in) {
-            index = in.readInt();
-            childStates = in.readBundle(GridLayoutManager.class.getClassLoader());
+            mIndex = in.readInt();
+            mChildStates = in.readBundle(GridLayoutManager.class.getClassLoader());
         }
 
         SavedState() {
@@ -3691,7 +3714,7 @@
         if (DEBUG) Log.v(getTag(), "onSaveInstanceState getSelection() " + getSelection());
         SavedState ss = new SavedState();
         // save selected index
-        ss.index = getSelection();
+        ss.mIndex = getSelection();
         // save offscreen child (state when they are recycled)
         Bundle bundle = mChildrenStates.saveAsBundle();
         // save views currently is on screen (TODO save cached views)
@@ -3702,7 +3725,7 @@
                 bundle = mChildrenStates.saveOnScreenView(bundle, view, position);
             }
         }
-        ss.childStates = bundle;
+        ss.mChildStates = bundle;
         return ss;
     }
 
@@ -3718,10 +3741,10 @@
         if (!(state instanceof SavedState)) {
             return;
         }
-        SavedState loadingState = (SavedState)state;
-        mFocusPosition = loadingState.index;
+        SavedState loadingState = (SavedState) state;
+        mFocusPosition = loadingState.mIndex;
         mFocusPositionOffset = 0;
-        mChildrenStates.loadFromBundle(loadingState.childStates);
+        mChildrenStates.loadFromBundle(loadingState.mChildStates);
         mFlag |= PF_FORCE_FULL_LAYOUT;
         requestLayout();
         if (DEBUG) Log.v(getTag(), "onRestoreInstanceState mFocusPosition " + mFocusPosition);
diff --git a/leanback/leanback/src/main/java/androidx/leanback/widget/HorizontalGridView.java b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/HorizontalGridView.java
similarity index 91%
rename from leanback/leanback/src/main/java/androidx/leanback/widget/HorizontalGridView.java
rename to leanback/leanback-grid/src/main/java/androidx/leanback/widget/HorizontalGridView.java
index 6bda0d3..6987c74 100644
--- a/leanback/leanback/src/main/java/androidx/leanback/widget/HorizontalGridView.java
+++ b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/HorizontalGridView.java
@@ -1,15 +1,17 @@
 /*
- * Copyright (C) 2014 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. You may obtain a copy of the License at
+ * 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
+ *      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.
+ * 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.leanback.widget;
 
@@ -29,12 +31,14 @@
 import android.util.TypedValue;
 import android.view.View;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.core.view.ViewCompat;
-import androidx.leanback.R;
 import androidx.recyclerview.widget.RecyclerView;
 
 /**
- * A {@link android.view.ViewGroup} that shows items in a horizontal scrolling list. The items come from
+ * A {@link android.view.ViewGroup} that shows items in a horizontal scrolling list. The items
+ * come from
  * the {@link RecyclerView.Adapter} associated with this view.
  * <p>
  * {@link RecyclerView.Adapter} can optionally implement {@link FacetProviderAdapter} which
@@ -64,24 +68,25 @@
     private LinearGradient mHighFadeShader;
     private int mHighFadeShaderLength;
     private int mHighFadeShaderOffset;
-    private Rect mTempRect = new Rect();
+    private final Rect mTempRect = new Rect();
 
-    public HorizontalGridView(Context context) {
+    public HorizontalGridView(@NonNull Context context) {
         this(context, null);
     }
 
-    public HorizontalGridView(Context context, AttributeSet attrs) {
+    public HorizontalGridView(@NonNull Context context, @Nullable AttributeSet attrs) {
         this(context, attrs, 0);
     }
 
-    public HorizontalGridView(Context context, AttributeSet attrs, int defStyle) {
+    public HorizontalGridView(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyle) {
         super(context, attrs, defStyle);
         mLayoutManager.setOrientation(RecyclerView.HORIZONTAL);
         initAttributes(context, attrs);
     }
 
     @SuppressLint("CustomViewStyleable")
-    protected void initAttributes(Context context, AttributeSet attrs) {
+    protected void initAttributes(@NonNull Context context, @Nullable AttributeSet attrs) {
         initBaseGridViewAttributes(context, attrs);
         TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.lbHorizontalGridView);
         ViewCompat.saveAttributeDataForStyleable(this,
@@ -140,6 +145,7 @@
     /**
      * Returns true if left edge fading is enabled.
      */
+    @SuppressLint("GetterSetterNames")
     public final boolean getFadingLeftEdge() {
         return mFadingLowEdge;
     }
@@ -206,6 +212,7 @@
     /**
      * Returns true if fading right edge is enabled.
      */
+    @SuppressLint("GetterSetterNames")
     public final boolean getFadingRightEdge() {
         return mFadingHighEdge;
     }
@@ -312,7 +319,7 @@
     }
 
     @Override
-    public void draw(Canvas canvas) {
+    public void draw(@NonNull Canvas canvas) {
         final boolean needsFadingLow = needsFadingLowEdge();
         final boolean needsFadingHigh = needsFadingHighEdge();
         if (!needsFadingLow) {
@@ -326,7 +333,8 @@
             return;
         }
 
-        int lowEdge = mFadingLowEdge? getPaddingLeft() - mLowFadeShaderOffset - mLowFadeShaderLength : 0;
+        int lowEdge =
+                mFadingLowEdge ? getPaddingLeft() - mLowFadeShaderOffset - mLowFadeShaderLength : 0;
         int highEdge = mFadingHighEdge ? getWidth() - getPaddingRight()
                 + mHighFadeShaderOffset + mHighFadeShaderLength : getWidth();
 
diff --git a/leanback/leanback/src/main/java/androidx/leanback/widget/ItemAlignment.java b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/ItemAlignment.java
similarity index 63%
rename from leanback/leanback/src/main/java/androidx/leanback/widget/ItemAlignment.java
rename to leanback/leanback-grid/src/main/java/androidx/leanback/widget/ItemAlignment.java
index d16f90e..6f203d7 100644
--- a/leanback/leanback/src/main/java/androidx/leanback/widget/ItemAlignment.java
+++ b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/ItemAlignment.java
@@ -1,15 +1,17 @@
 /*
- * Copyright (C) 2014 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. You may obtain a copy of the License at
+ * 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
+ *      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.
+ * 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.leanback.widget;
@@ -27,8 +29,8 @@
  */
 class ItemAlignment {
 
-    final static class Axis extends ItemAlignmentFacet.ItemAlignmentDef {
-        private int mOrientation;
+    static final class Axis extends ItemAlignmentFacet.ItemAlignmentDef {
+        private final int mOrientation;
 
         Axis(int orientation) {
             mOrientation = orientation;
@@ -44,23 +46,23 @@
 
     private int mOrientation = HORIZONTAL;
 
-    final public Axis vertical = new Axis(VERTICAL);
+    public final Axis vertical = new Axis(VERTICAL);
 
-    final public Axis horizontal = new Axis(HORIZONTAL);
+    public final Axis horizontal = new Axis(HORIZONTAL);
 
     private Axis mMainAxis = horizontal;
 
     private Axis mSecondAxis = vertical;
 
-    final public Axis mainAxis() {
+    public final Axis mainAxis() {
         return mMainAxis;
     }
 
-    final public Axis secondAxis() {
+    public final Axis secondAxis() {
         return mSecondAxis;
     }
 
-    final public void setOrientation(int orientation) {
+    public final void setOrientation(int orientation) {
         mOrientation = orientation;
         if (mOrientation == HORIZONTAL) {
             mMainAxis = horizontal;
@@ -71,9 +73,7 @@
         }
     }
 
-    final public int getOrientation() {
+    public final int getOrientation() {
         return mOrientation;
     }
-
-
 }
diff --git a/leanback/leanback/src/main/java/androidx/leanback/widget/ItemAlignmentFacet.java b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/ItemAlignmentFacet.java
similarity index 89%
rename from leanback/leanback/src/main/java/androidx/leanback/widget/ItemAlignmentFacet.java
rename to leanback/leanback-grid/src/main/java/androidx/leanback/widget/ItemAlignmentFacet.java
index 84097bf..9f26cb9 100644
--- a/leanback/leanback/src/main/java/androidx/leanback/widget/ItemAlignmentFacet.java
+++ b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/ItemAlignmentFacet.java
@@ -1,28 +1,28 @@
 /*
- * Copyright (C) 2015 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. You may obtain a copy of the License at
+ * 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
+ *      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.
+ * 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.leanback.widget;
 
 import android.view.View;
 
-import androidx.recyclerview.widget.RecyclerView;
+import androidx.annotation.NonNull;
 
 /**
- * Optional facet provided by {@link RecyclerView.Adapter} or {@link RecyclerView.ViewHolder} for
- * use in {@link HorizontalGridView} and {@link VerticalGridView}. Apps using {@link Presenter} may
- * set facet using {@link Presenter#setFacet(Class, Object)} or
- * {@link Presenter.ViewHolder#setFacet(Class, Object)}. Facet on ViewHolder has a higher priority
- * than Presenter or Adapter.
+ * Optional facet provided by {@link androidx.recyclerview.widget.RecyclerView.Adapter} or
+ * {@link androidx.recyclerview.widget.RecyclerView.ViewHolder} for
+ * use in {@link HorizontalGridView} and {@link VerticalGridView}.
  * <p>
  * ItemAlignmentFacet contains single or multiple {@link ItemAlignmentDef}s. First
  * {@link ItemAlignmentDef} describes the default alignment position for ViewHolder, it also
@@ -39,7 +39,7 @@
     /**
      * Value indicates that percent is not used. Equivalent to 0.
      */
-    public final static float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1;
+    public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1;
 
     /**
      * Definition of an alignment position under a view.
@@ -54,6 +54,7 @@
 
         /**
          * Sets number of pixels to the end of low edge. Supports right to left layout direction.
+         *
          * @param offset In left to right or vertical case, it's the offset added to left/top edge.
          *               In right to left case, it's the offset subtracted from right edge.
          */
@@ -65,6 +66,7 @@
          * Returns number of pixels to the end of low edge. Supports right to left layout direction.
          * In left to right or vertical case, it's the offset added to left/top edge. In right to
          * left case, it's the offset subtracted from right edge.
+         *
          * @return Number of pixels to the end of low edge.
          */
         public final int getItemAlignmentOffset() {
@@ -153,6 +155,7 @@
         /**
          * Sets Id of which child view take focus for alignment.  When not set, it will use
          * use same id of {@link #getItemAlignmentViewId()}.
+         *
          * @param viewId The id of child view that will be focused to.
          */
         public final void setItemAlignmentFocusViewId(int viewId) {
@@ -170,6 +173,7 @@
         /**
          * When true, align to {@link View#getBaseline()} for the view of with id equals
          * {@link #getItemAlignmentViewId()}; false otherwise.
+         *
          * @param alignToBaseline Boolean indicating whether to align to view baseline.
          */
         public final void setAlignedToTextViewBaseline(boolean alignToBaseline) {
@@ -193,7 +197,8 @@
     /**
      * Sets definitions of alignment positions.
      */
-    public void setAlignmentDefs(ItemAlignmentDef[] defs) {
+    public void setAlignmentDefs(
+            @SuppressWarnings("ArrayReturn") @NonNull ItemAlignmentDef[] defs) {
         if (defs == null || defs.length < 1) {
             throw new IllegalArgumentException();
         }
@@ -203,8 +208,9 @@
     /**
      * Returns read only definitions of alignment positions.
      */
+    @SuppressWarnings("ArrayReturn")
+    @NonNull
     public ItemAlignmentDef[] getAlignmentDefs() {
         return mAlignmentDefs;
     }
-
 }
diff --git a/leanback/leanback/src/main/java/androidx/leanback/widget/ItemAlignmentFacetHelper.java b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/ItemAlignmentFacetHelper.java
similarity index 88%
rename from leanback/leanback/src/main/java/androidx/leanback/widget/ItemAlignmentFacetHelper.java
rename to leanback/leanback-grid/src/main/java/androidx/leanback/widget/ItemAlignmentFacetHelper.java
index 5ca7458..9bc0fd8 100644
--- a/leanback/leanback/src/main/java/androidx/leanback/widget/ItemAlignmentFacetHelper.java
+++ b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/ItemAlignmentFacetHelper.java
@@ -1,15 +1,17 @@
 /*
- * Copyright (C) 2015 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. You may obtain a copy of the License at
+ * 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
+ *      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.
+ * 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.leanback.widget;
 
@@ -27,7 +29,7 @@
  */
 class ItemAlignmentFacetHelper {
 
-    private static Rect sRect = new Rect();
+    private static final Rect sRect = new Rect();
 
     /**
      * get alignment position relative to optical left/top of itemView.
@@ -63,7 +65,7 @@
                     ((ViewGroup) itemView).offsetDescendantRectToMyCoords(view, sRect);
                     alignPos = sRect.right + p.getOpticalRightInset();
                 }
-            } else  {
+            } else {
                 if (facet.mOffsetWithPadding) {
                     if (facet.mOffsetPercent == 0f) {
                         alignPos += view.getPaddingLeft();
diff --git a/leanback/leanback-grid/src/main/java/androidx/leanback/widget/OnChildLaidOutListener.java b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/OnChildLaidOutListener.java
new file mode 100644
index 0000000..8689dc3
--- /dev/null
+++ b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/OnChildLaidOutListener.java
@@ -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.leanback.widget;
+
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Interface for receiving notification when a child of this
+ * ViewGroup has been laid out.
+ */
+public interface OnChildLaidOutListener {
+    /**
+     * Callback method to be invoked when a child of this ViewGroup has been
+     * added to the view hierarchy and has been laid out.
+     *
+     * @param parent   The ViewGroup where the layout happened.
+     * @param view     The view within the ViewGroup that was laid out.
+     * @param position The position of the view in the adapter.
+     * @param id       The id of the child.
+     */
+    void onChildLaidOut(@NonNull ViewGroup parent, @NonNull View view, int position, long id);
+}
diff --git a/leanback/leanback-grid/src/main/java/androidx/leanback/widget/OnChildSelectedListener.java b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/OnChildSelectedListener.java
new file mode 100644
index 0000000..0d9df1e
--- /dev/null
+++ b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/OnChildSelectedListener.java
@@ -0,0 +1,45 @@
+/*
+ * 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.leanback.widget;
+
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+/**
+ * Interface for receiving notification when a child of this
+ * ViewGroup has been selected.
+ *
+ * @deprecated Use {@link OnChildViewHolderSelectedListener}
+ */
+@Deprecated
+public interface OnChildSelectedListener {
+    /**
+     * Callback method to be invoked when a child of this ViewGroup has been
+     * selected.
+     *
+     * @param parent   The ViewGroup where the selection happened.
+     * @param view     The view within the ViewGroup that is selected, or null if no
+     *                 view is selected.
+     * @param position The position of the view in the adapter, or NO_POSITION
+     *                 if no view is selected.
+     * @param id       The id of the child that is selected, or NO_ID if no view is
+     *                 selected.
+     */
+    void onChildSelected(@NonNull ViewGroup parent, @Nullable View view, int position, long id);
+}
diff --git a/leanback/leanback-grid/src/main/java/androidx/leanback/widget/OnChildViewHolderSelectedListener.java b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/OnChildViewHolderSelectedListener.java
new file mode 100644
index 0000000..42e3e57
--- /dev/null
+++ b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/OnChildViewHolderSelectedListener.java
@@ -0,0 +1,76 @@
+/*
+ * 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.leanback.widget;
+
+import android.annotation.SuppressLint;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef;
+import androidx.recyclerview.widget.RecyclerView;
+
+/**
+ * Interface for receiving notification when a child of this ViewGroup has been selected.
+ * There are two methods:
+ * <ul>
+ * <li>
+ *     {link {@link #onChildViewHolderSelected(RecyclerView, RecyclerView.ViewHolder, int, int)}}
+ *     is called when the view holder is about to be selected.  The listener could change size
+ *     of the view holder in this callback.
+ * </li>
+ * <li>
+ *     {link {@link #onChildViewHolderSelectedAndPositioned(RecyclerView, RecyclerView.ViewHolder,
+ *     int, int)} is called when view holder has been selected and laid out in RecyclerView.
+ * </li>
+ * </ul>
+ */
+@SuppressLint("ListenerInterface")
+public abstract class OnChildViewHolderSelectedListener {
+    /**
+     * Callback method to be invoked when a child of this ViewGroup has been selected. Listener
+     * might change the size of the child and the position of the child is not finalized. To get
+     * the final layout position of child, override {@link #onChildViewHolderSelectedAndPositioned(
+     *RecyclerView, RecyclerView.ViewHolder, int, int)}.
+     *
+     * @param parent      The RecyclerView where the selection happened.
+     * @param child       The ViewHolder within the RecyclerView that is selected, or null if no
+     *                    view is selected.
+     * @param position    The position of the view in the adapter, or NO_POSITION
+     *                    if no view is selected.
+     * @param subposition The index of which {@link ItemAlignmentDef} being used,
+     *                    0 if there is no ItemAlignmentDef defined for the item.
+     */
+    public void onChildViewHolderSelected(@NonNull RecyclerView parent,
+            @Nullable RecyclerView.ViewHolder child,
+            int position, int subposition) {
+    }
+
+    /**
+     * Callback method to be invoked when a child of this ViewGroup has been selected and
+     * positioned.
+     *
+     * @param parent      The RecyclerView where the selection happened.
+     * @param child       The ViewHolder within the RecyclerView that is selected, or null if no
+     *                    view is selected.
+     * @param position    The position of the view in the adapter, or NO_POSITION
+     *                    if no view is selected.
+     * @param subposition The index of which {@link ItemAlignmentDef} being used,
+     *                    0 if there is no ItemAlignmentDef defined for the item.
+     */
+    public void onChildViewHolderSelectedAndPositioned(@NonNull RecyclerView parent,
+            @Nullable RecyclerView.ViewHolder child, int position, int subposition) {
+    }
+}
diff --git a/leanback/leanback/src/main/java/androidx/leanback/widget/SingleRow.java b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/SingleRow.java
similarity index 90%
rename from leanback/leanback/src/main/java/androidx/leanback/widget/SingleRow.java
rename to leanback/leanback-grid/src/main/java/androidx/leanback/widget/SingleRow.java
index 078fa7e..279d407 100644
--- a/leanback/leanback/src/main/java/androidx/leanback/widget/SingleRow.java
+++ b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/SingleRow.java
@@ -1,15 +1,17 @@
 /*
- * Copyright (C) 2015 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. You may obtain a copy of the License at
+ * 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
+ *      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.
+ * 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.leanback.widget;
 
@@ -112,7 +114,7 @@
         for (int index = getStartIndexForAppend(); index < mProvider.getCount(); index++) {
             int size = mProvider.createItem(index, true, mTmpItem, false);
             int edge;
-            if (mFirstVisibleIndex < 0 || mLastVisibleIndex< 0) {
+            if (mFirstVisibleIndex < 0 || mLastVisibleIndex < 0) {
                 edge = mReversedFlow ? Integer.MAX_VALUE : Integer.MIN_VALUE;
                 mLastVisibleIndex = mFirstVisibleIndex = index;
             } else {
@@ -134,7 +136,7 @@
 
     @Override
     public void collectAdjacentPrefetchPositions(int fromLimit, int da,
-        @NonNull RecyclerView.LayoutManager.LayoutPrefetchRegistry layoutPrefetchRegistry) {
+            @NonNull RecyclerView.LayoutManager.LayoutPrefetchRegistry layoutPrefetchRegistry) {
         int indexToPrefetch;
         int nearestEdge;
         if (mReversedFlow ? da > 0 : da < 0) {
@@ -190,5 +192,4 @@
         return mReversedFlow ? mProvider.getEdge(indexLimit)
                 : mProvider.getEdge(indexLimit) + mProvider.getSize(indexLimit);
     }
-
 }
diff --git a/leanback/leanback/src/main/java/androidx/leanback/widget/StaggeredGrid.java b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/StaggeredGrid.java
similarity index 88%
rename from leanback/leanback/src/main/java/androidx/leanback/widget/StaggeredGrid.java
rename to leanback/leanback-grid/src/main/java/androidx/leanback/widget/StaggeredGrid.java
index 92ff750..e9371fe 100644
--- a/leanback/leanback/src/main/java/androidx/leanback/widget/StaggeredGrid.java
+++ b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/StaggeredGrid.java
@@ -1,15 +1,17 @@
 /*
- * Copyright (C) 2014 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. You may obtain a copy of the License at
+ * 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
+ *      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.
+ * 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.leanback.widget;
 
@@ -41,27 +43,27 @@
     /**
      * Cached representation of Staggered item.
      */
-    public static class Location extends Grid.Location {
+    static class Location extends Grid.Location {
         /**
          * Offset to previous item location.
          * min_edge(index) - min_edge(index - 1) for non reversed case
          * max_edge(index) - max_edge(index - 1) for reversed case
          */
-        public int offset;
+        int mOffset;
 
         /**
          * size of the item.
          */
-        public int size;
+        int mSize;
 
-        public Location(int row, int offset, int size) {
+        Location(int row, int offset, int size) {
             super(row);
-            this.offset = offset;
-            this.size = size;
+            this.mOffset = offset;
+            this.mSize = size;
         }
     }
 
-    protected CircularArray<Location> mLocations = new CircularArray<Location>(64);
+    protected CircularArray<Location> mLocations = new CircularArray<>(64);
 
     // mFirstIndex <= mFirstVisibleIndex <= mLastVisibleIndex
     //    <= mFirstIndex + mLocations.size() - 1
@@ -106,7 +108,7 @@
     public final void debugPrint(PrintWriter pw) {
         for (int i = 0, size = mLocations.size(); i < size; i++) {
             Location loc = mLocations.get(i);
-            pw.print("<" + (mFirstIndex + i) + "," + loc.row + ">");
+            pw.print("<" + (mFirstIndex + i) + "," + loc.mRow + ">");
             pw.print(" ");
             pw.println();
         }
@@ -145,7 +147,7 @@
         if (mFirstVisibleIndex >= 0) {
             // prepend visible items from first visible index
             edge = mProvider.getEdge(mFirstVisibleIndex);
-            offset = getLocation(mFirstVisibleIndex).offset;
+            offset = getLocation(mFirstVisibleIndex).mOffset;
             itemIndex = mFirstVisibleIndex - 1;
         } else {
             // prepend first visible item
@@ -164,9 +166,9 @@
         int firstIndex = Math.max(mProvider.getMinIndex(), mFirstIndex);
         for (; itemIndex >= firstIndex; itemIndex--) {
             Location loc = getLocation(itemIndex);
-            int rowIndex = loc.row;
+            int rowIndex = loc.mRow;
             int size = mProvider.createItem(itemIndex, false, mTmpItem, false);
-            if (size != loc.size) {
+            if (size != loc.mSize) {
                 mLocations.removeFromStart(itemIndex + 1 - mFirstIndex);
                 mFirstIndex = mFirstVisibleIndex;
                 // pending item will be added in prependVisibleItemsWithoutCache
@@ -183,7 +185,7 @@
                 return true;
             }
             edge = mProvider.getEdge(itemIndex);
-            offset = loc.offset;
+            offset = loc.mOffset;
             // Check limit after filled a full column
             if (rowIndex == 0) {
                 if (oneColumnMode) {
@@ -203,7 +205,7 @@
         boolean foundCachedItemInSameRow = false;
         while (cachedIndex >= mFirstIndex) {
             Location loc = getLocation(cachedIndex);
-            if (loc.row == row) {
+            if (loc.mRow == row) {
                 foundCachedItemInSameRow = true;
                 break;
             }
@@ -215,10 +217,10 @@
         // Assuming the cachedIndex is next to item on the same row, so the
         // sum of offset of [cachedIndex + 1, itemIndex] should be size of the
         // cached item plus spacing.
-        int offset = isReversedFlow() ?  -getLocation(cachedIndex).size - mSpacing:
-                getLocation(cachedIndex).size + mSpacing;
+        int offset = isReversedFlow() ? -getLocation(cachedIndex).mSize - mSpacing :
+                getLocation(cachedIndex).mSize + mSpacing;
         for (int i = cachedIndex + 1; i <= getLastIndex(); i++) {
-            offset -= getLocation(i).offset;
+            offset -= getLocation(i).mOffset;
         }
         return offset;
     }
@@ -247,23 +249,23 @@
         mLocations.addFirst(loc);
         Object item;
         if (mPendingItem != null) {
-            loc.size = mPendingItemSize;
+            loc.mSize = mPendingItemSize;
             item = mPendingItem;
             mPendingItem = null;
         } else {
-            loc.size = mProvider.createItem(itemIndex, false, mTmpItem, false);
+            loc.mSize = mProvider.createItem(itemIndex, false, mTmpItem, false);
             item = mTmpItem[0];
         }
         mFirstIndex = mFirstVisibleIndex = itemIndex;
         if (mLastVisibleIndex < 0) {
             mLastVisibleIndex = itemIndex;
         }
-        int thisEdge = !mReversedFlow ? edge - loc.size : edge + loc.size;
+        int thisEdge = !mReversedFlow ? edge - loc.mSize : edge + loc.mSize;
         if (oldFirstLoc != null) {
-            oldFirstLoc.offset = oldFirstEdge - thisEdge;
+            oldFirstLoc.mOffset = oldFirstEdge - thisEdge;
         }
-        mProvider.addItem(item, itemIndex, loc.size, rowIndex, thisEdge);
-        return loc.size;
+        mProvider.addItem(item, itemIndex, loc.mSize, rowIndex, thisEdge);
+        return loc.mSize;
     }
 
     @Override
@@ -318,12 +320,12 @@
         for (; itemIndex < count && itemIndex <= lastIndex; itemIndex++) {
             Location loc = getLocation(itemIndex);
             if (edge != Integer.MAX_VALUE) {
-                edge = edge + loc.offset;
+                edge = edge + loc.mOffset;
             }
-            int rowIndex = loc.row;
+            int rowIndex = loc.mRow;
             int size = mProvider.createItem(itemIndex, true, mTmpItem, false);
-            if (size != loc.size) {
-                loc.size = size;
+            if (size != loc.mSize) {
+                loc.mSize = size;
                 mLocations.removeFromEnd(lastIndex - itemIndex);
                 lastIndex = itemIndex;
             }
@@ -381,11 +383,11 @@
         mLocations.addLast(loc);
         Object item;
         if (mPendingItem != null) {
-            loc.size = mPendingItemSize;
+            loc.mSize = mPendingItemSize;
             item = mPendingItem;
             mPendingItem = null;
         } else {
-            loc.size = mProvider.createItem(itemIndex, true, mTmpItem, false);
+            loc.mSize = mProvider.createItem(itemIndex, true, mTmpItem, false);
             item = mTmpItem[0];
         }
         if (mLocations.size() == 1) {
@@ -397,8 +399,8 @@
                 mLastVisibleIndex++;
             }
         }
-        mProvider.addItem(item, itemIndex, loc.size, rowIndex, location);
-        return loc.size;
+        mProvider.addItem(item, itemIndex, loc.mSize, rowIndex, location);
+        return loc.mSize;
     }
 
     @Override
@@ -408,7 +410,7 @@
         }
         if (startPos >= 0) {
             for (int i = startPos; i <= endPos; i++) {
-                CircularIntArray row = mTmpItemPositionsInRows[getLocation(i).row];
+                CircularIntArray row = mTmpItemPositionsInRows[getLocation(i).mRow];
                 if (row.size() > 0 && row.getLast() == i - 1) {
                     // update continuous range
                     row.popLast();
@@ -431,5 +433,4 @@
             mFirstIndex = -1;
         }
     }
-
 }
diff --git a/leanback/leanback/src/main/java/androidx/leanback/widget/StaggeredGridDefault.java b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/StaggeredGridDefault.java
similarity index 86%
rename from leanback/leanback/src/main/java/androidx/leanback/widget/StaggeredGridDefault.java
rename to leanback/leanback-grid/src/main/java/androidx/leanback/widget/StaggeredGridDefault.java
index 0a7bcb4..97701f9 100644
--- a/leanback/leanback/src/main/java/androidx/leanback/widget/StaggeredGridDefault.java
+++ b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/StaggeredGridDefault.java
@@ -1,15 +1,17 @@
 /*
- * Copyright (C) 2014 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. You may obtain a copy of the License at
+ * 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
+ *      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.
+ * 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.leanback.widget;
 
@@ -31,27 +33,27 @@
         }
         if (mReversedFlow) {
             int edge = mProvider.getEdge(mFirstVisibleIndex);
-            if (getLocation(mFirstVisibleIndex).row == rowIndex) {
+            if (getLocation(mFirstVisibleIndex).mRow == rowIndex) {
                 return edge;
             }
             for (int i = mFirstVisibleIndex + 1; i <= getLastIndex(); i++) {
                 Location loc = getLocation(i);
-                edge += loc.offset;
-                if (loc.row == rowIndex) {
+                edge += loc.mOffset;
+                if (loc.mRow == rowIndex) {
                     return edge;
                 }
             }
         } else {
             int edge = mProvider.getEdge(mLastVisibleIndex);
             Location loc = getLocation(mLastVisibleIndex);
-            if (loc.row == rowIndex) {
-                return edge + loc.size;
+            if (loc.mRow == rowIndex) {
+                return edge + loc.mSize;
             }
             for (int i = mLastVisibleIndex - 1; i >= getFirstIndex(); i--) {
-                edge -= loc.offset;
+                edge -= loc.mOffset;
                 loc = getLocation(i);
-                if (loc.row == rowIndex) {
-                    return edge + loc.size;
+                if (loc.mRow == rowIndex) {
+                    return edge + loc.mSize;
                 }
             }
         }
@@ -69,25 +71,25 @@
         if (mReversedFlow) {
             int edge = mProvider.getEdge(mLastVisibleIndex);
             Location loc = getLocation(mLastVisibleIndex);
-            if (loc.row == rowIndex) {
-                return edge - loc.size;
+            if (loc.mRow == rowIndex) {
+                return edge - loc.mSize;
             }
             for (int i = mLastVisibleIndex - 1; i >= getFirstIndex(); i--) {
-                edge -= loc.offset;
+                edge -= loc.mOffset;
                 loc = getLocation(i);
-                if (loc.row == rowIndex) {
-                    return edge - loc.size;
+                if (loc.mRow == rowIndex) {
+                    return edge - loc.mSize;
                 }
             }
         } else {
             int edge = mProvider.getEdge(mFirstVisibleIndex);
-            if (getLocation(mFirstVisibleIndex).row == rowIndex) {
+            if (getLocation(mFirstVisibleIndex).mRow == rowIndex) {
                 return edge;
             }
-            for (int i = mFirstVisibleIndex + 1; i <= getLastIndex() ; i++) {
+            for (int i = mFirstVisibleIndex + 1; i <= getLastIndex(); i++) {
                 Location loc = getLocation(i);
-                edge += loc.offset;
-                if (loc.row == rowIndex) {
+                edge += loc.mOffset;
+                if (loc.mRow == rowIndex) {
                     return edge;
                 }
             }
@@ -104,7 +106,7 @@
         int value;
         int edge = mProvider.getEdge(indexLimit);
         Location loc = getLocation(indexLimit);
-        int row = loc.row;
+        int row = loc.mRow;
         int index = indexLimit;
         int visitedRows = 1;
         int visitRow = row;
@@ -112,9 +114,9 @@
             value = edge;
             for (int i = indexLimit + 1; visitedRows < mNumRows && i <= mLastVisibleIndex; i++) {
                 loc = getLocation(i);
-                edge += loc.offset;
-                if (loc.row != visitRow) {
-                    visitRow = loc.row;
+                edge += loc.mOffset;
+                if (loc.mRow != visitRow) {
+                    visitRow = loc.mRow;
                     visitedRows++;
                     if (findLarge ? edge > value : edge < value) {
                         row = visitRow;
@@ -126,10 +128,10 @@
         } else {
             value = edge + mProvider.getSize(indexLimit);
             for (int i = indexLimit - 1; visitedRows < mNumRows && i >= mFirstVisibleIndex; i--) {
-                edge -= loc.offset;
+                edge -= loc.mOffset;
                 loc = getLocation(i);
-                if (loc.row != visitRow) {
-                    visitRow = loc.row;
+                if (loc.mRow != visitRow) {
+                    visitRow = loc.mRow;
                     visitedRows++;
                     int newValue = edge + mProvider.getSize(i);
                     if (findLarge ? newValue > value : newValue < value) {
@@ -156,17 +158,17 @@
         int value;
         int edge = mProvider.getEdge(indexLimit);
         Location loc = getLocation(indexLimit);
-        int row = loc.row;
+        int row = loc.mRow;
         int index = indexLimit;
         int visitedRows = 1;
         int visitRow = row;
         if (mReversedFlow) {
             value = edge - mProvider.getSize(indexLimit);
             for (int i = indexLimit - 1; visitedRows < mNumRows && i >= mFirstVisibleIndex; i--) {
-                edge -= loc.offset;
+                edge -= loc.mOffset;
                 loc = getLocation(i);
-                if (loc.row != visitRow) {
-                    visitRow = loc.row;
+                if (loc.mRow != visitRow) {
+                    visitRow = loc.mRow;
                     visitedRows++;
                     int newValue = edge - mProvider.getSize(i);
                     if (findLarge ? newValue > value : newValue < value) {
@@ -180,9 +182,9 @@
             value = edge;
             for (int i = indexLimit + 1; visitedRows < mNumRows && i <= mLastVisibleIndex; i++) {
                 loc = getLocation(i);
-                edge += loc.offset;
-                if (loc.row != visitRow) {
-                    visitRow = loc.row;
+                edge += loc.mOffset;
+                if (loc.mRow != visitRow) {
+                    visitRow = loc.mRow;
                     visitedRows++;
                     if (findLarge ? edge > value : edge < value) {
                         value = edge;
@@ -203,7 +205,7 @@
         boolean wrapped = false;
         if (append) {
             for (int index = mLastVisibleIndex; index >= mFirstVisibleIndex; index--) {
-                int row = getLocation(index).row;
+                int row = getLocation(index).mRow;
                 if (row == 0) {
                     wrapped = true;
                 } else if (wrapped && row == mNumRows - 1) {
@@ -212,7 +214,7 @@
             }
         } else {
             for (int index = mFirstVisibleIndex; index <= mLastVisibleIndex; index++) {
-                int row = getLocation(index).row;
+                int row = getLocation(index).mRow;
                 if (row == mNumRows - 1) {
                     wrapped = true;
                 } else if (wrapped && row == 0) {
@@ -236,7 +238,7 @@
                 return false;
             }
             itemIndex = mLastVisibleIndex + 1;
-            rowIndex = getLocation(mLastVisibleIndex).row;
+            rowIndex = getLocation(mLastVisibleIndex).mRow;
             // find start item index of "previous column"
             int edgeLimitSearchIndex = findRowEdgeLimitSearchIndex(true);
             if (edgeLimitSearchIndex < 0) {
@@ -267,7 +269,7 @@
         } else {
             itemIndex = mStartIndex != START_DEFAULT ? mStartIndex : 0;
             // if there are cached items,  put on next row of last cached item.
-            rowIndex = (mLocations.size() > 0 ? getLocation(getLastIndex()).row + 1 : itemIndex)
+            rowIndex = (mLocations.size() > 0 ? getLocation(getLastIndex()).mRow + 1 : itemIndex)
                     % mNumRows;
             edgeLimit = 0;
             edgeLimitIsValid = false;
@@ -287,12 +289,14 @@
                 if (location == Integer.MAX_VALUE || location == Integer.MIN_VALUE) {
                     // nothing on the row
                     if (rowIndex == 0) {
-                        location = mReversedFlow ? getRowMin(mNumRows - 1) : getRowMax(mNumRows - 1);
+                        location = mReversedFlow ? getRowMin(mNumRows - 1) : getRowMax(
+                                mNumRows - 1);
                         if (location != Integer.MAX_VALUE && location != Integer.MIN_VALUE) {
                             location = location + (mReversedFlow ? -mSpacing : mSpacing);
                         }
                     } else {
-                        location = mReversedFlow ? getRowMax(rowIndex - 1) : getRowMin(rowIndex - 1);
+                        location = mReversedFlow ? getRowMax(rowIndex - 1) : getRowMin(
+                                rowIndex - 1);
                     }
                 } else {
                     location = location + (mReversedFlow ? -mSpacing : mSpacing);
@@ -304,10 +308,11 @@
                 if (edgeLimitIsValid) {
                     while (mReversedFlow ? location - size > edgeLimit :
                             location + size < edgeLimit) {
-                        if (itemIndex == count || (!oneColumnMode && checkAppendOverLimit(toLimit))) {
+                        if (itemIndex == count || (!oneColumnMode && checkAppendOverLimit(
+                                toLimit))) {
                             return filledOne;
                         }
-                        location = location + (mReversedFlow ? - size - mSpacing : size + mSpacing);
+                        location = location + (mReversedFlow ? -size - mSpacing : size + mSpacing);
                         size = appendVisibleItemToRow(itemIndex++, rowIndex, location);
                     }
                 } else {
@@ -336,7 +341,7 @@
                 return false;
             }
             itemIndex = mFirstVisibleIndex - 1;
-            rowIndex = getLocation(mFirstVisibleIndex).row;
+            rowIndex = getLocation(mFirstVisibleIndex).mRow;
             // find start item index of "previous column"
             int edgeLimitSearchIndex = findRowEdgeLimitSearchIndex(false);
             if (edgeLimitSearchIndex < 0) {
@@ -369,7 +374,7 @@
         } else {
             itemIndex = mStartIndex != START_DEFAULT ? mStartIndex : 0;
             // if there are cached items,  put on previous row of first cached item.
-            rowIndex = (mLocations.size() > 0 ? getLocation(getFirstIndex()).row + mNumRows - 1
+            rowIndex = (mLocations.size() > 0 ? getLocation(getFirstIndex()).mRow + mNumRows - 1
                     : itemIndex) % mNumRows;
             edgeLimit = 0;
             edgeLimitIsValid = false;
@@ -393,7 +398,8 @@
                             location = location + (mReversedFlow ? mSpacing : -mSpacing);
                         }
                     } else {
-                        location = mReversedFlow ? getRowMin(rowIndex + 1) : getRowMax(rowIndex + 1);
+                        location = mReversedFlow ? getRowMin(rowIndex + 1) : getRowMax(
+                                rowIndex + 1);
                     }
                 } else {
                     location = location + (mReversedFlow ? mSpacing : -mSpacing);
@@ -425,6 +431,4 @@
             rowIndex = mNumRows - 1;
         }
     }
-
-
 }
diff --git a/leanback/leanback/src/main/java/androidx/leanback/widget/VerticalGridView.java b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/VerticalGridView.java
similarity index 76%
rename from leanback/leanback/src/main/java/androidx/leanback/widget/VerticalGridView.java
rename to leanback/leanback-grid/src/main/java/androidx/leanback/widget/VerticalGridView.java
index 44a38d6..8f69a4e 100644
--- a/leanback/leanback/src/main/java/androidx/leanback/widget/VerticalGridView.java
+++ b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/VerticalGridView.java
@@ -1,15 +1,17 @@
 /*
- * Copyright (C) 2014 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. You may obtain a copy of the License at
+ * 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
+ *      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.
+ * 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.leanback.widget;
 
@@ -19,8 +21,9 @@
 import android.util.AttributeSet;
 import android.util.TypedValue;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.core.view.ViewCompat;
-import androidx.leanback.R;
 import androidx.recyclerview.widget.RecyclerView;
 
 /**
@@ -42,22 +45,22 @@
  */
 public class VerticalGridView extends BaseGridView {
 
-    public VerticalGridView(Context context) {
+    public VerticalGridView(@NonNull Context context) {
         this(context, null);
     }
 
-    public VerticalGridView(Context context, AttributeSet attrs) {
+    public VerticalGridView(@NonNull Context context, @Nullable AttributeSet attrs) {
         this(context, attrs, 0);
     }
 
-    public VerticalGridView(Context context, AttributeSet attrs, int defStyle) {
+    public VerticalGridView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
         mLayoutManager.setOrientation(RecyclerView.VERTICAL);
         initAttributes(context, attrs);
     }
 
     @SuppressLint("CustomViewStyleable")
-    protected void initAttributes(Context context, AttributeSet attrs) {
+    protected void initAttributes(@NonNull Context context, @Nullable AttributeSet attrs) {
         initBaseGridViewAttributes(context, attrs);
         TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.lbVerticalGridView);
         ViewCompat.saveAttributeDataForStyleable(
diff --git a/datastore/datastore-core/src/main/java/androidx/datastore/core/StorageException.kt b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/ViewHolderTask.java
similarity index 64%
rename from datastore/datastore-core/src/main/java/androidx/datastore/core/StorageException.kt
rename to leanback/leanback-grid/src/main/java/androidx/leanback/widget/ViewHolderTask.java
index c43f04a..0c1b7f3 100644
--- a/datastore/datastore-core/src/main/java/androidx/datastore/core/StorageException.kt
+++ b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/ViewHolderTask.java
@@ -13,16 +13,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package androidx.leanback.widget;
 
-package androidx.datastore.core
-
-import java.io.IOException
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
 
 /**
- * Exception for storage-related errors. Defined as a subclass of {@link IOException} on Android and
- * JRE.
- *
- * @param message the detail message.
- * @param cause the cause.
+ * Interface for schedule task on a ViewHolder.
  */
-open class StorageException(message: String, cause: Throwable? = null) : IOException(message, cause)
+public interface ViewHolderTask {
+    /**
+     * Runs the task.
+     */
+    void run(@NonNull RecyclerView.ViewHolder viewHolder);
+}
diff --git a/leanback/leanback/src/main/java/androidx/leanback/widget/ViewsStateBundle.java b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/ViewsStateBundle.java
similarity index 73%
rename from leanback/leanback/src/main/java/androidx/leanback/widget/ViewsStateBundle.java
rename to leanback/leanback-grid/src/main/java/androidx/leanback/widget/ViewsStateBundle.java
index bc0666c..eba060a 100644
--- a/leanback/leanback/src/main/java/androidx/leanback/widget/ViewsStateBundle.java
+++ b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/ViewsStateBundle.java
@@ -1,15 +1,17 @@
 /*
- * Copyright (C) 2014 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. You may obtain a copy of the License at
+ * 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
+ *      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.
+ * 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.leanback.widget;
 
@@ -40,28 +42,28 @@
  * The class is currently used within {@link GridLayoutManager}, but it might be used by other
  * ViewGroup.
  */
-class ViewsStateBundle {
+final class ViewsStateBundle {
 
-    public static final int LIMIT_DEFAULT = 100;
-    public static final int UNLIMITED = Integer.MAX_VALUE;
+    private static final int LIMIT_DEFAULT = 100;
+    private static final int UNLIMITED = Integer.MAX_VALUE;
 
     private int mSavePolicy;
     private int mLimitNumber;
 
     private LruCache<String, SparseArray<Parcelable>> mChildStates;
 
-    public ViewsStateBundle() {
+    ViewsStateBundle() {
         mSavePolicy = SAVE_NO_CHILD;
         mLimitNumber = LIMIT_DEFAULT;
     }
 
-    public void clear() {
+    void clear() {
         if (mChildStates != null) {
             mChildStates.evictAll();
         }
     }
 
-    public void remove(int id) {
+    void remove(int id) {
         if (mChildStates != null && mChildStates.size() != 0) {
             mChildStates.remove(getSaveStatesKey(id));
         }
@@ -70,7 +72,7 @@
     /**
      * @return the saved views states
      */
-    public final Bundle saveAsBundle() {
+    Bundle saveAsBundle() {
         if (mChildStates == null || mChildStates.size() == 0) {
             return null;
         }
@@ -84,7 +86,7 @@
         return bundle;
     }
 
-    public final void loadFromBundle(Bundle savedBundle) {
+    void loadFromBundle(Bundle savedBundle) {
         if (mChildStates != null && savedBundle != null) {
             mChildStates.evictAll();
             for (Iterator<String> i = savedBundle.keySet().iterator(); i.hasNext(); ) {
@@ -96,24 +98,24 @@
 
     /**
      * @return the savePolicy, see {@link #SAVE_NO_CHILD} {@link #SAVE_ON_SCREEN_CHILD}
-     *         {@link #SAVE_LIMITED_CHILD} {@link #SAVE_ALL_CHILD}
+     * {@link #SAVE_LIMITED_CHILD} {@link #SAVE_ALL_CHILD}
      */
-    public final int getSavePolicy() {
+    int getSavePolicy() {
         return mSavePolicy;
     }
 
     /**
      * @return the limitNumber, only works when {@link #getSavePolicy()} is
-     *         {@link #SAVE_LIMITED_CHILD}
+     * {@link #SAVE_LIMITED_CHILD}
      */
-    public final int getLimitNumber() {
+    int getLimitNumber() {
         return mLimitNumber;
     }
 
     /**
      * @see ViewsStateBundle#getSavePolicy()
      */
-    public final void setSavePolicy(int savePolicy) {
+    void setSavePolicy(int savePolicy) {
         this.mSavePolicy = savePolicy;
         applyPolicyChanges();
     }
@@ -121,35 +123,18 @@
     /**
      * @see ViewsStateBundle#getLimitNumber()
      */
-    public final void setLimitNumber(int limitNumber) {
+    void setLimitNumber(int limitNumber) {
         this.mLimitNumber = limitNumber;
         applyPolicyChanges();
     }
 
-    protected void applyPolicyChanges() {
-        if (mSavePolicy == SAVE_LIMITED_CHILD) {
-            if (mLimitNumber <= 0) {
-                throw new IllegalArgumentException();
-            }
-            if (mChildStates == null || mChildStates.maxSize() != mLimitNumber) {
-                mChildStates = new LruCache<String, SparseArray<Parcelable>>(mLimitNumber);
-            }
-        } else if (mSavePolicy == SAVE_ALL_CHILD || mSavePolicy == SAVE_ON_SCREEN_CHILD) {
-            if (mChildStates == null || mChildStates.maxSize() != UNLIMITED) {
-                mChildStates = new LruCache<String, SparseArray<Parcelable>>(UNLIMITED);
-            }
-        } else {
-            mChildStates = null;
-        }
-    }
-
     /**
      * Load view from states, it's none operation if the there is no state associated with the id.
      *
      * @param view view where loads into
-     * @param id unique id for the view within this ViewsStateBundle
+     * @param id   unique id for the view within this ViewsStateBundle
      */
-    public final void loadView(View view, int id) {
+    void loadView(View view, int id) {
         if (mChildStates != null) {
             String key = getSaveStatesKey(id);
             // Once loaded the state, do not keep the state of child. The child state will
@@ -162,32 +147,17 @@
     }
 
     /**
-     * Save views regardless what's the current policy is.
-     *
-     * @param view view to save
-     * @param id unique id for the view within this ViewsStateBundle
-     */
-    protected final void saveViewUnchecked(View view, int id) {
-        if (mChildStates != null) {
-            String key = getSaveStatesKey(id);
-            SparseArray<Parcelable> container = new SparseArray<Parcelable>();
-            view.saveHierarchyState(container);
-            mChildStates.put(key, container);
-        }
-    }
-
-    /**
      * The on screen view is saved when policy is not {@link #SAVE_NO_CHILD}.
      *
-     * @param bundle   Bundle where we save the on screen view state.  If null,
-     *                 a new Bundle is created and returned.
-     * @param view     The view to save.
-     * @param id       Id of the view.
+     * @param bundle Bundle where we save the on screen view state.  If null,
+     *               a new Bundle is created and returned.
+     * @param view   The view to save.
+     * @param id     Id of the view.
      */
-    public final Bundle saveOnScreenView(Bundle bundle, View view, int id) {
+    Bundle saveOnScreenView(Bundle bundle, View view, int id) {
         if (mSavePolicy != SAVE_NO_CHILD) {
             String key = getSaveStatesKey(id);
-            SparseArray<Parcelable> container = new SparseArray<Parcelable>();
+            SparseArray<Parcelable> container = new SparseArray<>();
             view.saveHierarchyState(container);
             if (bundle == null) {
                 bundle = new Bundle();
@@ -201,9 +171,9 @@
      * Save off screen views according to policy.
      *
      * @param view view to save
-     * @param id unique id for the view within this ViewsStateBundle
+     * @param id   unique id for the view within this ViewsStateBundle
      */
-    public final void saveOffscreenView(View view, int id) {
+    void saveOffscreenView(View view, int id) {
         switch (mSavePolicy) {
             case SAVE_LIMITED_CHILD:
             case SAVE_ALL_CHILD:
@@ -217,6 +187,38 @@
         }
     }
 
+    private void applyPolicyChanges() {
+        if (mSavePolicy == SAVE_LIMITED_CHILD) {
+            if (mLimitNumber <= 0) {
+                throw new IllegalArgumentException();
+            }
+            if (mChildStates == null || mChildStates.maxSize() != mLimitNumber) {
+                mChildStates = new LruCache<>(mLimitNumber);
+            }
+        } else if (mSavePolicy == SAVE_ALL_CHILD || mSavePolicy == SAVE_ON_SCREEN_CHILD) {
+            if (mChildStates == null || mChildStates.maxSize() != UNLIMITED) {
+                mChildStates = new LruCache<>(UNLIMITED);
+            }
+        } else {
+            mChildStates = null;
+        }
+    }
+
+    /**
+     * Save views regardless what's the current policy is.
+     *
+     * @param view view to save
+     * @param id   unique id for the view within this ViewsStateBundle
+     */
+    private void saveViewUnchecked(View view, int id) {
+        if (mChildStates != null) {
+            String key = getSaveStatesKey(id);
+            SparseArray<Parcelable> container = new SparseArray<>();
+            view.saveHierarchyState(container);
+            mChildStates.put(key, container);
+        }
+    }
+
     static String getSaveStatesKey(int id) {
         return Integer.toString(id);
     }
diff --git a/leanback/leanback/src/main/java/androidx/leanback/widget/Visibility.java b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/Visibility.java
similarity index 91%
rename from leanback/leanback/src/main/java/androidx/leanback/widget/Visibility.java
rename to leanback/leanback-grid/src/main/java/androidx/leanback/widget/Visibility.java
index 04730fb..fbe077b 100644
--- a/leanback/leanback/src/main/java/androidx/leanback/widget/Visibility.java
+++ b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/Visibility.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 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.
@@ -30,4 +30,5 @@
 @RestrictTo(LIBRARY_GROUP_PREFIX)
 @IntDef({View.VISIBLE, View.INVISIBLE, View.GONE})
 @Retention(RetentionPolicy.SOURCE)
-public @interface Visibility {}
+public @interface Visibility {
+}
diff --git a/leanback/leanback/src/main/java/androidx/leanback/widget/WindowAlignment.java b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/WindowAlignment.java
similarity index 82%
rename from leanback/leanback/src/main/java/androidx/leanback/widget/WindowAlignment.java
rename to leanback/leanback-grid/src/main/java/androidx/leanback/widget/WindowAlignment.java
index 99e8b83..a3b5e63 100644
--- a/leanback/leanback/src/main/java/androidx/leanback/widget/WindowAlignment.java
+++ b/leanback/leanback-grid/src/main/java/androidx/leanback/widget/WindowAlignment.java
@@ -1,15 +1,17 @@
 /*
- * Copyright (C) 2014 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. You may obtain a copy of the License at
+ * 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
+ *      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.
+ * 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.leanback.widget;
@@ -23,12 +25,16 @@
 /**
  * Maintains Window Alignment information of two axis.
  */
-class WindowAlignment {
+final class WindowAlignment {
 
     /**
      * Maintains alignment information in one direction.
      */
-    public static class Axis {
+    static final class Axis {
+
+        private static final int PF_KEYLINE_OVER_LOW_EDGE = 1;
+        private static final int PF_KEYLINE_OVER_HIGH_EDGE = 1 << 1;
+
         /**
          * Right or bottom edge of last child.
          */
@@ -46,9 +52,6 @@
          */
         private int mMinScroll;
 
-        static final int PF_KEYLINE_OVER_LOW_EDGE = 1;
-        static final int PF_KEYLINE_OVER_HIGH_EDGE = 1 << 1;
-
         /**
          * By default we prefer low edge over keyline, prefer keyline over high edge.
          */
@@ -74,47 +77,47 @@
 
         private boolean mReversedFlow;
 
-        public Axis(String name) {
+        Axis(String name) {
             reset();
         }
 
-        public final int getWindowAlignment() {
+        public int getWindowAlignment() {
             return mWindowAlignment;
         }
 
-        public final void setWindowAlignment(int windowAlignment) {
+        public void setWindowAlignment(int windowAlignment) {
             mWindowAlignment = windowAlignment;
         }
 
-        final void setPreferKeylineOverLowEdge(boolean keylineOverLowEdge) {
+        void setPreferKeylineOverLowEdge(boolean keylineOverLowEdge) {
             mPreferredKeyLine = keylineOverLowEdge
                     ? mPreferredKeyLine | PF_KEYLINE_OVER_LOW_EDGE
                     : mPreferredKeyLine & ~PF_KEYLINE_OVER_LOW_EDGE;
         }
 
-        final void setPreferKeylineOverHighEdge(boolean keylineOverHighEdge) {
+        void setPreferKeylineOverHighEdge(boolean keylineOverHighEdge) {
             mPreferredKeyLine = keylineOverHighEdge
                     ? mPreferredKeyLine | PF_KEYLINE_OVER_HIGH_EDGE
                     : mPreferredKeyLine & ~PF_KEYLINE_OVER_HIGH_EDGE;
         }
 
-        final boolean isPreferKeylineOverHighEdge() {
+        boolean isPreferKeylineOverHighEdge() {
             return (mPreferredKeyLine & PF_KEYLINE_OVER_HIGH_EDGE) != 0;
         }
 
-        final boolean isPreferKeylineOverLowEdge() {
+        boolean isPreferKeylineOverLowEdge() {
             return (mPreferredKeyLine & PF_KEYLINE_OVER_LOW_EDGE) != 0;
         }
 
-        public final int getWindowAlignmentOffset() {
+        public int getWindowAlignmentOffset() {
             return mWindowAlignmentOffset;
         }
 
-        public final void setWindowAlignmentOffset(int offset) {
+        public void setWindowAlignmentOffset(int offset) {
             mWindowAlignmentOffset = offset;
         }
 
-        public final void setWindowAlignmentOffsetPercent(float percent) {
+        public void setWindowAlignmentOffsetPercent(float percent) {
             if ((percent < 0 || percent > 100)
                     && percent != WINDOW_ALIGN_OFFSET_PERCENT_DISABLED) {
                 throw new IllegalArgumentException();
@@ -122,18 +125,18 @@
             mWindowAlignmentOffsetPercent = percent;
         }
 
-        public final float getWindowAlignmentOffsetPercent() {
+        public float getWindowAlignmentOffsetPercent() {
             return mWindowAlignmentOffsetPercent;
         }
 
         /**
          * Returns scroll distance to align min child.
          */
-        public final int getMinScroll() {
+        public int getMinScroll() {
             return mMinScroll;
         }
 
-        public final void invalidateScrollMin() {
+        public void invalidateScrollMin() {
             mMinEdge = Integer.MIN_VALUE;
             mMinScroll = Integer.MIN_VALUE;
         }
@@ -141,11 +144,11 @@
         /**
          * Returns scroll distance to align max child.
          */
-        public final int getMaxScroll() {
+        public int getMaxScroll() {
             return mMaxScroll;
         }
 
-        public final void invalidateScrollMax() {
+        public void invalidateScrollMax() {
             mMaxEdge = Integer.MAX_VALUE;
             mMaxScroll = Integer.MAX_VALUE;
         }
@@ -155,40 +158,40 @@
             mMaxEdge = Integer.MAX_VALUE;
         }
 
-        public final boolean isMinUnknown() {
+        public boolean isMinUnknown() {
             return mMinEdge == Integer.MIN_VALUE;
         }
 
-        public final boolean isMaxUnknown() {
+        public boolean isMaxUnknown() {
             return mMaxEdge == Integer.MAX_VALUE;
         }
 
-        public final void setSize(int size) {
+        public void setSize(int size) {
             mSize = size;
         }
 
-        public final int getSize() {
+        public int getSize() {
             return mSize;
         }
 
-        public final void setPadding(int paddingMin, int paddingMax) {
+        public void setPadding(int paddingMin, int paddingMax) {
             mPaddingMin = paddingMin;
             mPaddingMax = paddingMax;
         }
 
-        public final int getPaddingMin() {
+        public int getPaddingMin() {
             return mPaddingMin;
         }
 
-        public final int getPaddingMax() {
+        public int getPaddingMax() {
             return mPaddingMax;
         }
 
-        public final int getClientSize() {
+        public int getClientSize() {
             return mSize - mPaddingMin - mPaddingMax;
         }
 
-        final int calculateKeyline() {
+        int calculateKeyline() {
             int keyLine;
             if (!mReversedFlow) {
                 if (mWindowAlignmentOffset >= 0) {
@@ -215,14 +218,14 @@
         /**
          * Returns scroll distance to move viewCenterPosition to keyLine.
          */
-        final int calculateScrollToKeyLine(int viewCenterPosition, int keyLine) {
+        int calculateScrollToKeyLine(int viewCenterPosition, int keyLine) {
             return viewCenterPosition - keyLine;
         }
 
         /**
          * Update {@link #getMinScroll()} and {@link #getMaxScroll()}
          */
-        public final void updateMinMax(int minEdge, int maxEdge,
+        public void updateMinMax(int minEdge, int maxEdge,
                 int minChildViewCenter, int maxChildViewCenter) {
             mMinEdge = minEdge;
             mMaxEdge = maxEdge;
@@ -235,7 +238,7 @@
                         : (mWindowAlignment & WINDOW_ALIGN_HIGH_EDGE) != 0) {
                     // calculate scroll distance to move current mMinEdge to padding at min edge
                     mMinScroll = mMinEdge - mPaddingMin;
-                } else  {
+                } else {
                     // calculate scroll distance to move min child center to key line
                     mMinScroll = calculateScrollToKeyLine(minChildViewCenter, keyLine);
                 }
@@ -245,7 +248,7 @@
                         : (mWindowAlignment & WINDOW_ALIGN_LOW_EDGE) != 0) {
                     // calculate scroll distance to move current mMaxEdge to padding at max edge
                     mMaxScroll = mMaxEdge - mPaddingMin - clientSize;
-                } else  {
+                } else {
                     // calculate scroll distance to move max child center to key line
                     mMaxScroll = calculateScrollToKeyLine(maxChildViewCenter, keyLine);
                 }
@@ -300,7 +303,7 @@
          * item should be aligned to key line). The scroll distance will be capped by
          * {@link #getMinScroll()} and {@link #getMaxScroll()}.
          */
-        public final int getScroll(int viewCenter) {
+        public int getScroll(int viewCenter) {
             final int size = getSize();
             final int keyLine = calculateKeyline();
             final boolean isMinUnknown = isMinUnknown();
@@ -308,7 +311,7 @@
             if (!isMinUnknown) {
                 final int keyLineToMinEdge = keyLine - mPaddingMin;
                 if ((!mReversedFlow ? (mWindowAlignment & WINDOW_ALIGN_LOW_EDGE) != 0
-                     : (mWindowAlignment & WINDOW_ALIGN_HIGH_EDGE) != 0)
+                        : (mWindowAlignment & WINDOW_ALIGN_HIGH_EDGE) != 0)
                         && (viewCenter - mMinEdge <= keyLineToMinEdge)) {
                     // view center is before key line: align the min edge (first child) to padding.
                     int alignToMin = mMinEdge - mPaddingMin;
@@ -337,7 +340,7 @@
             return calculateScrollToKeyLine(viewCenter, keyLine);
         }
 
-        public final void setReversedFlow(boolean reversedFlow) {
+        public void setReversedFlow(boolean reversedFlow) {
             mReversedFlow = reversedFlow;
         }
 
@@ -358,15 +361,15 @@
 
     private Axis mSecondAxis = vertical;
 
-    public final Axis mainAxis() {
+    public Axis mainAxis() {
         return mMainAxis;
     }
 
-    public final Axis secondAxis() {
+    public Axis secondAxis() {
         return mSecondAxis;
     }
 
-    public final void setOrientation(int orientation) {
+    public void setOrientation(int orientation) {
         mOrientation = orientation;
         if (mOrientation == HORIZONTAL) {
             mMainAxis = horizontal;
@@ -377,11 +380,11 @@
         }
     }
 
-    public final int getOrientation() {
+    public int getOrientation() {
         return mOrientation;
     }
 
-    public final void reset() {
+    public void reset() {
         mainAxis().reset();
     }
 
@@ -389,5 +392,4 @@
     public String toString() {
         return "horizontal=" + horizontal + "; vertical=" + vertical;
     }
-
 }
diff --git a/leanback/leanback-grid/src/main/res/values/attrs.xml b/leanback/leanback-grid/src/main/res/values/attrs.xml
new file mode 100644
index 0000000..73e706e0
--- /dev/null
+++ b/leanback/leanback-grid/src/main/res/values/attrs.xml
@@ -0,0 +1,60 @@
+<?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.
+  -->
+
+<resources>
+    <declare-styleable name="lbBaseGridView">
+        <!-- Allow DPAD key to navigate out at the front of the View (where position = 0),
+             default is false  -->
+        <attr name="focusOutFront" format="boolean" />
+        <!-- Allow DPAD key to navigate out at the end of the view, default is false -->
+        <attr name="focusOutEnd" format="boolean" />
+        <!-- Allow DPAD key to navigate out of first row, for HorizontalGridView, it's the
+             top edge, for VerticalGridView it's the "start" edge.  Default value is true.  -->
+        <attr name="focusOutSideStart" format="boolean" />
+        <!-- Allow DPAD key to navigate out of last row, for HorizontalGridView, it's the
+             bottom edge, for VerticalGridView it's the "end" edge.  Default value is true.  -->
+        <attr name="focusOutSideEnd" format="boolean" />
+        <!-- Deprecated, use android:horizontalSpacing -->
+        <attr name="horizontalMargin" format="dimension" />
+        <!-- Deprecated, use android:verticalSpacing -->
+        <attr name="verticalMargin" format="dimension" />
+        <!-- Defining space between two items horizontally -->
+        <attr name="android:horizontalSpacing" />
+        <!-- Defining space between two items vertically -->
+        <attr name="android:verticalSpacing" />
+        <!-- Defining gravity of child view -->
+        <attr name="android:gravity" />
+    </declare-styleable>
+
+    <declare-styleable name="lbHorizontalGridView">
+        <!-- Defining height of each row of HorizontalGridView -->
+        <attr name="rowHeight" format="dimension" >
+            <enum name="wrap_content" value="-2" />
+        </attr>
+        <!-- Defining number of rows -->
+        <attr name="numberOfRows" format="integer" />
+    </declare-styleable>
+
+    <declare-styleable name="lbVerticalGridView">
+        <!-- Defining width of each column of VerticalGridView -->
+        <attr name="columnWidth" format="dimension" >
+            <enum name="wrap_content" value="-2" />
+        </attr>
+        <!-- Defining number of columns -->
+        <attr name="numberOfColumns" format="integer" />
+    </declare-styleable>
+</resources>
\ No newline at end of file
diff --git a/leanback/leanback/api/current.ignore b/leanback/leanback/api/current.ignore
new file mode 100644
index 0000000..27e9b7a
--- /dev/null
+++ b/leanback/leanback/api/current.ignore
@@ -0,0 +1,29 @@
+// Baseline format: 1.0
+RemovedClass: androidx.leanback.widget.BaseGridView:
+    Removed class androidx.leanback.widget.BaseGridView
+RemovedClass: androidx.leanback.widget.HorizontalGridView:
+    Removed class androidx.leanback.widget.HorizontalGridView
+RemovedClass: androidx.leanback.widget.ItemAlignmentFacet:
+    Removed class androidx.leanback.widget.ItemAlignmentFacet
+RemovedClass: androidx.leanback.widget.OnChildViewHolderSelectedListener:
+    Removed class androidx.leanback.widget.OnChildViewHolderSelectedListener
+RemovedClass: androidx.leanback.widget.VerticalGridView:
+    Removed class androidx.leanback.widget.VerticalGridView
+
+
+RemovedInterface: androidx.leanback.widget.FacetProvider:
+    Removed class androidx.leanback.widget.FacetProvider
+RemovedInterface: androidx.leanback.widget.FacetProviderAdapter:
+    Removed class androidx.leanback.widget.FacetProviderAdapter
+RemovedInterface: androidx.leanback.widget.OnChildLaidOutListener:
+    Removed class androidx.leanback.widget.OnChildLaidOutListener
+RemovedInterface: androidx.leanback.widget.OnChildSelectedListener:
+    Removed deprecated class androidx.leanback.widget.OnChildSelectedListener
+RemovedInterface: androidx.leanback.widget.ViewHolderTask:
+    Removed class androidx.leanback.widget.ViewHolderTask
+
+
+RemovedMethod: androidx.leanback.widget.FacetProvider#getFacet(Class<?>):
+    Removed method androidx.leanback.widget.FacetProvider.getFacet(Class<?>)
+RemovedMethod: androidx.leanback.widget.FacetProviderAdapter#getFacetProvider(int):
+    Removed method androidx.leanback.widget.FacetProviderAdapter.getFacetProvider(int)
diff --git a/leanback/leanback/api/current.txt b/leanback/leanback/api/current.txt
index de3d795..bdf0261 100644
--- a/leanback/leanback/api/current.txt
+++ b/leanback/leanback/api/current.txt
@@ -1534,121 +1534,6 @@
     field public int viewType;
   }
 
-  public abstract class BaseGridView extends androidx.recyclerview.widget.RecyclerView {
-    method public void addOnChildViewHolderSelectedListener(androidx.leanback.widget.OnChildViewHolderSelectedListener!);
-    method public final void addOnLayoutCompletedListener(androidx.leanback.widget.BaseGridView.OnLayoutCompletedListener);
-    method public void animateIn();
-    method public void animateOut();
-    method public int getChildDrawingOrder(int, int);
-    method @Deprecated public int getHorizontalMargin();
-    method public int getHorizontalSpacing();
-    method public int getInitialPrefetchItemCount();
-    method public int getItemAlignmentOffset();
-    method public float getItemAlignmentOffsetPercent();
-    method public int getItemAlignmentViewId();
-    method public androidx.leanback.widget.BaseGridView.OnUnhandledKeyListener! getOnUnhandledKeyListener();
-    method public final int getSaveChildrenLimitNumber();
-    method public final int getSaveChildrenPolicy();
-    method public int getSelectedPosition();
-    method public androidx.leanback.widget.BaseGridView.SmoothScrollByBehavior? getSmoothScrollByBehavior();
-    method public final int getSmoothScrollMaxPendingMoves();
-    method public final float getSmoothScrollSpeedFactor();
-    method @Deprecated public int getVerticalMargin();
-    method public int getVerticalSpacing();
-    method public void getViewSelectedOffsets(android.view.View!, int[]!);
-    method public int getWindowAlignment();
-    method public int getWindowAlignmentOffset();
-    method public float getWindowAlignmentOffsetPercent();
-    method public boolean hasPreviousViewInSameRow(int);
-    method public boolean isChildLayoutAnimated();
-    method public boolean isFocusDrawingOrderEnabled();
-    method public final boolean isFocusSearchDisabled();
-    method public boolean isItemAlignmentOffsetWithPadding();
-    method public boolean isScrollEnabled();
-    method public boolean isWindowAlignmentPreferKeyLineOverHighEdge();
-    method public boolean isWindowAlignmentPreferKeyLineOverLowEdge();
-    method public boolean onRequestFocusInDescendants(int, android.graphics.Rect!);
-    method public void removeOnChildViewHolderSelectedListener(androidx.leanback.widget.OnChildViewHolderSelectedListener!);
-    method public final void removeOnLayoutCompletedListener(androidx.leanback.widget.BaseGridView.OnLayoutCompletedListener);
-    method public void setAnimateChildLayout(boolean);
-    method public void setChildrenVisibility(int);
-    method public void setFocusDrawingOrderEnabled(boolean);
-    method public final void setFocusSearchDisabled(boolean);
-    method public void setGravity(int);
-    method public void setHasOverlappingRendering(boolean);
-    method @Deprecated public void setHorizontalMargin(int);
-    method public void setHorizontalSpacing(int);
-    method public void setInitialPrefetchItemCount(int);
-    method public void setItemAlignmentOffset(int);
-    method public void setItemAlignmentOffsetPercent(float);
-    method public void setItemAlignmentOffsetWithPadding(boolean);
-    method public void setItemAlignmentViewId(int);
-    method @Deprecated public void setItemMargin(int);
-    method public void setItemSpacing(int);
-    method public void setLayoutEnabled(boolean);
-    method public void setOnChildLaidOutListener(androidx.leanback.widget.OnChildLaidOutListener!);
-    method public void setOnChildSelectedListener(androidx.leanback.widget.OnChildSelectedListener!);
-    method public void setOnChildViewHolderSelectedListener(androidx.leanback.widget.OnChildViewHolderSelectedListener!);
-    method public void setOnKeyInterceptListener(androidx.leanback.widget.BaseGridView.OnKeyInterceptListener!);
-    method public void setOnMotionInterceptListener(androidx.leanback.widget.BaseGridView.OnMotionInterceptListener!);
-    method public void setOnTouchInterceptListener(androidx.leanback.widget.BaseGridView.OnTouchInterceptListener!);
-    method public void setOnUnhandledKeyListener(androidx.leanback.widget.BaseGridView.OnUnhandledKeyListener!);
-    method public void setPruneChild(boolean);
-    method public final void setSaveChildrenLimitNumber(int);
-    method public final void setSaveChildrenPolicy(int);
-    method public void setScrollEnabled(boolean);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, int);
-    method public void setSelectedPosition(int, androidx.leanback.widget.ViewHolderTask!);
-    method public void setSelectedPositionSmooth(int);
-    method public void setSelectedPositionSmooth(int, androidx.leanback.widget.ViewHolderTask!);
-    method public final void setSmoothScrollByBehavior(androidx.leanback.widget.BaseGridView.SmoothScrollByBehavior?);
-    method public final void setSmoothScrollMaxPendingMoves(int);
-    method public final void setSmoothScrollSpeedFactor(float);
-    method @Deprecated public void setVerticalMargin(int);
-    method public void setVerticalSpacing(int);
-    method public void setWindowAlignment(int);
-    method public void setWindowAlignmentOffset(int);
-    method public void setWindowAlignmentOffsetPercent(float);
-    method public void setWindowAlignmentPreferKeyLineOverHighEdge(boolean);
-    method public void setWindowAlignmentPreferKeyLineOverLowEdge(boolean);
-    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
-    field public static final int SAVE_ALL_CHILD = 3; // 0x3
-    field public static final int SAVE_LIMITED_CHILD = 2; // 0x2
-    field public static final int SAVE_NO_CHILD = 0; // 0x0
-    field public static final int SAVE_ON_SCREEN_CHILD = 1; // 0x1
-    field public static final int WINDOW_ALIGN_BOTH_EDGE = 3; // 0x3
-    field public static final int WINDOW_ALIGN_HIGH_EDGE = 2; // 0x2
-    field public static final int WINDOW_ALIGN_LOW_EDGE = 1; // 0x1
-    field public static final int WINDOW_ALIGN_NO_EDGE = 0; // 0x0
-    field public static final float WINDOW_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
-  }
-
-  public static interface BaseGridView.OnKeyInterceptListener {
-    method public boolean onInterceptKeyEvent(android.view.KeyEvent!);
-  }
-
-  public static interface BaseGridView.OnLayoutCompletedListener {
-    method public void onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State);
-  }
-
-  public static interface BaseGridView.OnMotionInterceptListener {
-    method public boolean onInterceptMotionEvent(android.view.MotionEvent!);
-  }
-
-  public static interface BaseGridView.OnTouchInterceptListener {
-    method public boolean onInterceptTouchEvent(android.view.MotionEvent!);
-  }
-
-  public static interface BaseGridView.OnUnhandledKeyListener {
-    method public boolean onUnhandledKey(android.view.KeyEvent!);
-  }
-
-  public static interface BaseGridView.SmoothScrollByBehavior {
-    method public int configSmoothScrollByDuration(int, int);
-    method public android.view.animation.Interpolator? configSmoothScrollByInterpolator(int, int);
-  }
-
   public interface BaseOnItemViewClickedListener<T> {
     method public void onItemClicked(androidx.leanback.widget.Presenter.ViewHolder!, Object!, androidx.leanback.widget.RowPresenter.ViewHolder!, T!);
   }
@@ -1799,14 +1684,6 @@
     method public final boolean isRenderedAsRowView();
   }
 
-  public interface FacetProvider {
-    method public Object! getFacet(Class<?>!);
-  }
-
-  public interface FacetProviderAdapter {
-    method public androidx.leanback.widget.FacetProvider! getFacetProvider(int);
-  }
-
   public interface FocusHighlight {
     field public static final int ZOOM_FACTOR_LARGE = 3; // 0x3
     field public static final int ZOOM_FACTOR_MEDIUM = 2; // 0x2
@@ -1891,12 +1768,6 @@
     method public void startPostponedEnterTransition();
   }
 
-  public final class GridLayoutManager extends androidx.recyclerview.widget.RecyclerView.LayoutManager {
-    ctor public GridLayoutManager();
-    method public androidx.recyclerview.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method public void setOrientation(int);
-  }
-
   public class GuidanceStylist implements androidx.leanback.widget.FragmentAnimationProvider {
     ctor public GuidanceStylist();
     method public android.widget.TextView! getBreadcrumbView();
@@ -2139,27 +2010,6 @@
     method public void setDescription(CharSequence!);
   }
 
-  public class HorizontalGridView extends androidx.leanback.widget.BaseGridView {
-    ctor public HorizontalGridView(android.content.Context!);
-    ctor public HorizontalGridView(android.content.Context!, android.util.AttributeSet!);
-    ctor public HorizontalGridView(android.content.Context!, android.util.AttributeSet!, int);
-    method public final boolean getFadingLeftEdge();
-    method public final int getFadingLeftEdgeLength();
-    method public final int getFadingLeftEdgeOffset();
-    method public final boolean getFadingRightEdge();
-    method public final int getFadingRightEdgeLength();
-    method public final int getFadingRightEdgeOffset();
-    method protected void initAttributes(android.content.Context!, android.util.AttributeSet!);
-    method public final void setFadingLeftEdge(boolean);
-    method public final void setFadingLeftEdgeLength(int);
-    method public final void setFadingLeftEdgeOffset(int);
-    method public final void setFadingRightEdge(boolean);
-    method public final void setFadingRightEdgeLength(int);
-    method public final void setFadingRightEdgeOffset(int);
-    method public void setNumRows(int);
-    method public void setRowHeight(int);
-  }
-
   public final class HorizontalHoverCardSwitcher extends androidx.leanback.widget.PresenterSwitcher {
     ctor public HorizontalHoverCardSwitcher();
     method protected void insertView(android.view.View!);
@@ -2202,30 +2052,6 @@
     method public boolean onKeyPreIme(android.widget.EditText!, int, android.view.KeyEvent!);
   }
 
-  public final class ItemAlignmentFacet {
-    ctor public ItemAlignmentFacet();
-    method public androidx.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef![]! getAlignmentDefs();
-    method public boolean isMultiAlignment();
-    method public void setAlignmentDefs(androidx.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef![]!);
-    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
-  }
-
-  public static class ItemAlignmentFacet.ItemAlignmentDef {
-    ctor public ItemAlignmentFacet.ItemAlignmentDef();
-    method public final int getItemAlignmentFocusViewId();
-    method public final int getItemAlignmentOffset();
-    method public final float getItemAlignmentOffsetPercent();
-    method public final int getItemAlignmentViewId();
-    method public boolean isAlignedToTextViewBaseLine();
-    method public final boolean isItemAlignmentOffsetWithPadding();
-    method public final void setAlignedToTextViewBaseline(boolean);
-    method public final void setItemAlignmentFocusViewId(int);
-    method public final void setItemAlignmentOffset(int);
-    method public final void setItemAlignmentOffsetPercent(float);
-    method public final void setItemAlignmentOffsetWithPadding(boolean);
-    method public final void setItemAlignmentViewId(int);
-  }
-
   public class ItemBridgeAdapter extends androidx.recyclerview.widget.RecyclerView.Adapter implements androidx.leanback.widget.FacetProviderAdapter {
     ctor public ItemBridgeAdapter(androidx.leanback.widget.ObjectAdapter!, androidx.leanback.widget.PresenterSelector!);
     ctor public ItemBridgeAdapter(androidx.leanback.widget.ObjectAdapter!);
@@ -2420,20 +2246,6 @@
     method public void onActionClicked(androidx.leanback.widget.Action!);
   }
 
-  public interface OnChildLaidOutListener {
-    method public void onChildLaidOut(android.view.ViewGroup!, android.view.View!, int, long);
-  }
-
-  @Deprecated public interface OnChildSelectedListener {
-    method @Deprecated public void onChildSelected(android.view.ViewGroup!, android.view.View!, int, long);
-  }
-
-  public abstract class OnChildViewHolderSelectedListener {
-    ctor public OnChildViewHolderSelectedListener();
-    method public void onChildViewHolderSelected(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int);
-    method public void onChildViewHolderSelectedAndPositioned(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int);
-  }
-
   public interface OnItemViewClickedListener extends androidx.leanback.widget.BaseOnItemViewClickedListener<androidx.leanback.widget.Row> {
   }
 
@@ -3163,19 +2975,6 @@
     method public androidx.leanback.widget.VerticalGridView! getGridView();
   }
 
-  public class VerticalGridView extends androidx.leanback.widget.BaseGridView {
-    ctor public VerticalGridView(android.content.Context!);
-    ctor public VerticalGridView(android.content.Context!, android.util.AttributeSet!);
-    ctor public VerticalGridView(android.content.Context!, android.util.AttributeSet!, int);
-    method protected void initAttributes(android.content.Context!, android.util.AttributeSet!);
-    method public void setColumnWidth(int);
-    method public void setNumColumns(int);
-  }
-
-  public interface ViewHolderTask {
-    method public void run(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
-  }
-
 }
 
 package androidx.leanback.widget.picker {
diff --git a/leanback/leanback/api/public_plus_experimental_current.txt b/leanback/leanback/api/public_plus_experimental_current.txt
index de3d795..bdf0261 100644
--- a/leanback/leanback/api/public_plus_experimental_current.txt
+++ b/leanback/leanback/api/public_plus_experimental_current.txt
@@ -1534,121 +1534,6 @@
     field public int viewType;
   }
 
-  public abstract class BaseGridView extends androidx.recyclerview.widget.RecyclerView {
-    method public void addOnChildViewHolderSelectedListener(androidx.leanback.widget.OnChildViewHolderSelectedListener!);
-    method public final void addOnLayoutCompletedListener(androidx.leanback.widget.BaseGridView.OnLayoutCompletedListener);
-    method public void animateIn();
-    method public void animateOut();
-    method public int getChildDrawingOrder(int, int);
-    method @Deprecated public int getHorizontalMargin();
-    method public int getHorizontalSpacing();
-    method public int getInitialPrefetchItemCount();
-    method public int getItemAlignmentOffset();
-    method public float getItemAlignmentOffsetPercent();
-    method public int getItemAlignmentViewId();
-    method public androidx.leanback.widget.BaseGridView.OnUnhandledKeyListener! getOnUnhandledKeyListener();
-    method public final int getSaveChildrenLimitNumber();
-    method public final int getSaveChildrenPolicy();
-    method public int getSelectedPosition();
-    method public androidx.leanback.widget.BaseGridView.SmoothScrollByBehavior? getSmoothScrollByBehavior();
-    method public final int getSmoothScrollMaxPendingMoves();
-    method public final float getSmoothScrollSpeedFactor();
-    method @Deprecated public int getVerticalMargin();
-    method public int getVerticalSpacing();
-    method public void getViewSelectedOffsets(android.view.View!, int[]!);
-    method public int getWindowAlignment();
-    method public int getWindowAlignmentOffset();
-    method public float getWindowAlignmentOffsetPercent();
-    method public boolean hasPreviousViewInSameRow(int);
-    method public boolean isChildLayoutAnimated();
-    method public boolean isFocusDrawingOrderEnabled();
-    method public final boolean isFocusSearchDisabled();
-    method public boolean isItemAlignmentOffsetWithPadding();
-    method public boolean isScrollEnabled();
-    method public boolean isWindowAlignmentPreferKeyLineOverHighEdge();
-    method public boolean isWindowAlignmentPreferKeyLineOverLowEdge();
-    method public boolean onRequestFocusInDescendants(int, android.graphics.Rect!);
-    method public void removeOnChildViewHolderSelectedListener(androidx.leanback.widget.OnChildViewHolderSelectedListener!);
-    method public final void removeOnLayoutCompletedListener(androidx.leanback.widget.BaseGridView.OnLayoutCompletedListener);
-    method public void setAnimateChildLayout(boolean);
-    method public void setChildrenVisibility(int);
-    method public void setFocusDrawingOrderEnabled(boolean);
-    method public final void setFocusSearchDisabled(boolean);
-    method public void setGravity(int);
-    method public void setHasOverlappingRendering(boolean);
-    method @Deprecated public void setHorizontalMargin(int);
-    method public void setHorizontalSpacing(int);
-    method public void setInitialPrefetchItemCount(int);
-    method public void setItemAlignmentOffset(int);
-    method public void setItemAlignmentOffsetPercent(float);
-    method public void setItemAlignmentOffsetWithPadding(boolean);
-    method public void setItemAlignmentViewId(int);
-    method @Deprecated public void setItemMargin(int);
-    method public void setItemSpacing(int);
-    method public void setLayoutEnabled(boolean);
-    method public void setOnChildLaidOutListener(androidx.leanback.widget.OnChildLaidOutListener!);
-    method public void setOnChildSelectedListener(androidx.leanback.widget.OnChildSelectedListener!);
-    method public void setOnChildViewHolderSelectedListener(androidx.leanback.widget.OnChildViewHolderSelectedListener!);
-    method public void setOnKeyInterceptListener(androidx.leanback.widget.BaseGridView.OnKeyInterceptListener!);
-    method public void setOnMotionInterceptListener(androidx.leanback.widget.BaseGridView.OnMotionInterceptListener!);
-    method public void setOnTouchInterceptListener(androidx.leanback.widget.BaseGridView.OnTouchInterceptListener!);
-    method public void setOnUnhandledKeyListener(androidx.leanback.widget.BaseGridView.OnUnhandledKeyListener!);
-    method public void setPruneChild(boolean);
-    method public final void setSaveChildrenLimitNumber(int);
-    method public final void setSaveChildrenPolicy(int);
-    method public void setScrollEnabled(boolean);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, int);
-    method public void setSelectedPosition(int, androidx.leanback.widget.ViewHolderTask!);
-    method public void setSelectedPositionSmooth(int);
-    method public void setSelectedPositionSmooth(int, androidx.leanback.widget.ViewHolderTask!);
-    method public final void setSmoothScrollByBehavior(androidx.leanback.widget.BaseGridView.SmoothScrollByBehavior?);
-    method public final void setSmoothScrollMaxPendingMoves(int);
-    method public final void setSmoothScrollSpeedFactor(float);
-    method @Deprecated public void setVerticalMargin(int);
-    method public void setVerticalSpacing(int);
-    method public void setWindowAlignment(int);
-    method public void setWindowAlignmentOffset(int);
-    method public void setWindowAlignmentOffsetPercent(float);
-    method public void setWindowAlignmentPreferKeyLineOverHighEdge(boolean);
-    method public void setWindowAlignmentPreferKeyLineOverLowEdge(boolean);
-    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
-    field public static final int SAVE_ALL_CHILD = 3; // 0x3
-    field public static final int SAVE_LIMITED_CHILD = 2; // 0x2
-    field public static final int SAVE_NO_CHILD = 0; // 0x0
-    field public static final int SAVE_ON_SCREEN_CHILD = 1; // 0x1
-    field public static final int WINDOW_ALIGN_BOTH_EDGE = 3; // 0x3
-    field public static final int WINDOW_ALIGN_HIGH_EDGE = 2; // 0x2
-    field public static final int WINDOW_ALIGN_LOW_EDGE = 1; // 0x1
-    field public static final int WINDOW_ALIGN_NO_EDGE = 0; // 0x0
-    field public static final float WINDOW_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
-  }
-
-  public static interface BaseGridView.OnKeyInterceptListener {
-    method public boolean onInterceptKeyEvent(android.view.KeyEvent!);
-  }
-
-  public static interface BaseGridView.OnLayoutCompletedListener {
-    method public void onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State);
-  }
-
-  public static interface BaseGridView.OnMotionInterceptListener {
-    method public boolean onInterceptMotionEvent(android.view.MotionEvent!);
-  }
-
-  public static interface BaseGridView.OnTouchInterceptListener {
-    method public boolean onInterceptTouchEvent(android.view.MotionEvent!);
-  }
-
-  public static interface BaseGridView.OnUnhandledKeyListener {
-    method public boolean onUnhandledKey(android.view.KeyEvent!);
-  }
-
-  public static interface BaseGridView.SmoothScrollByBehavior {
-    method public int configSmoothScrollByDuration(int, int);
-    method public android.view.animation.Interpolator? configSmoothScrollByInterpolator(int, int);
-  }
-
   public interface BaseOnItemViewClickedListener<T> {
     method public void onItemClicked(androidx.leanback.widget.Presenter.ViewHolder!, Object!, androidx.leanback.widget.RowPresenter.ViewHolder!, T!);
   }
@@ -1799,14 +1684,6 @@
     method public final boolean isRenderedAsRowView();
   }
 
-  public interface FacetProvider {
-    method public Object! getFacet(Class<?>!);
-  }
-
-  public interface FacetProviderAdapter {
-    method public androidx.leanback.widget.FacetProvider! getFacetProvider(int);
-  }
-
   public interface FocusHighlight {
     field public static final int ZOOM_FACTOR_LARGE = 3; // 0x3
     field public static final int ZOOM_FACTOR_MEDIUM = 2; // 0x2
@@ -1891,12 +1768,6 @@
     method public void startPostponedEnterTransition();
   }
 
-  public final class GridLayoutManager extends androidx.recyclerview.widget.RecyclerView.LayoutManager {
-    ctor public GridLayoutManager();
-    method public androidx.recyclerview.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method public void setOrientation(int);
-  }
-
   public class GuidanceStylist implements androidx.leanback.widget.FragmentAnimationProvider {
     ctor public GuidanceStylist();
     method public android.widget.TextView! getBreadcrumbView();
@@ -2139,27 +2010,6 @@
     method public void setDescription(CharSequence!);
   }
 
-  public class HorizontalGridView extends androidx.leanback.widget.BaseGridView {
-    ctor public HorizontalGridView(android.content.Context!);
-    ctor public HorizontalGridView(android.content.Context!, android.util.AttributeSet!);
-    ctor public HorizontalGridView(android.content.Context!, android.util.AttributeSet!, int);
-    method public final boolean getFadingLeftEdge();
-    method public final int getFadingLeftEdgeLength();
-    method public final int getFadingLeftEdgeOffset();
-    method public final boolean getFadingRightEdge();
-    method public final int getFadingRightEdgeLength();
-    method public final int getFadingRightEdgeOffset();
-    method protected void initAttributes(android.content.Context!, android.util.AttributeSet!);
-    method public final void setFadingLeftEdge(boolean);
-    method public final void setFadingLeftEdgeLength(int);
-    method public final void setFadingLeftEdgeOffset(int);
-    method public final void setFadingRightEdge(boolean);
-    method public final void setFadingRightEdgeLength(int);
-    method public final void setFadingRightEdgeOffset(int);
-    method public void setNumRows(int);
-    method public void setRowHeight(int);
-  }
-
   public final class HorizontalHoverCardSwitcher extends androidx.leanback.widget.PresenterSwitcher {
     ctor public HorizontalHoverCardSwitcher();
     method protected void insertView(android.view.View!);
@@ -2202,30 +2052,6 @@
     method public boolean onKeyPreIme(android.widget.EditText!, int, android.view.KeyEvent!);
   }
 
-  public final class ItemAlignmentFacet {
-    ctor public ItemAlignmentFacet();
-    method public androidx.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef![]! getAlignmentDefs();
-    method public boolean isMultiAlignment();
-    method public void setAlignmentDefs(androidx.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef![]!);
-    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
-  }
-
-  public static class ItemAlignmentFacet.ItemAlignmentDef {
-    ctor public ItemAlignmentFacet.ItemAlignmentDef();
-    method public final int getItemAlignmentFocusViewId();
-    method public final int getItemAlignmentOffset();
-    method public final float getItemAlignmentOffsetPercent();
-    method public final int getItemAlignmentViewId();
-    method public boolean isAlignedToTextViewBaseLine();
-    method public final boolean isItemAlignmentOffsetWithPadding();
-    method public final void setAlignedToTextViewBaseline(boolean);
-    method public final void setItemAlignmentFocusViewId(int);
-    method public final void setItemAlignmentOffset(int);
-    method public final void setItemAlignmentOffsetPercent(float);
-    method public final void setItemAlignmentOffsetWithPadding(boolean);
-    method public final void setItemAlignmentViewId(int);
-  }
-
   public class ItemBridgeAdapter extends androidx.recyclerview.widget.RecyclerView.Adapter implements androidx.leanback.widget.FacetProviderAdapter {
     ctor public ItemBridgeAdapter(androidx.leanback.widget.ObjectAdapter!, androidx.leanback.widget.PresenterSelector!);
     ctor public ItemBridgeAdapter(androidx.leanback.widget.ObjectAdapter!);
@@ -2420,20 +2246,6 @@
     method public void onActionClicked(androidx.leanback.widget.Action!);
   }
 
-  public interface OnChildLaidOutListener {
-    method public void onChildLaidOut(android.view.ViewGroup!, android.view.View!, int, long);
-  }
-
-  @Deprecated public interface OnChildSelectedListener {
-    method @Deprecated public void onChildSelected(android.view.ViewGroup!, android.view.View!, int, long);
-  }
-
-  public abstract class OnChildViewHolderSelectedListener {
-    ctor public OnChildViewHolderSelectedListener();
-    method public void onChildViewHolderSelected(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int);
-    method public void onChildViewHolderSelectedAndPositioned(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int);
-  }
-
   public interface OnItemViewClickedListener extends androidx.leanback.widget.BaseOnItemViewClickedListener<androidx.leanback.widget.Row> {
   }
 
@@ -3163,19 +2975,6 @@
     method public androidx.leanback.widget.VerticalGridView! getGridView();
   }
 
-  public class VerticalGridView extends androidx.leanback.widget.BaseGridView {
-    ctor public VerticalGridView(android.content.Context!);
-    ctor public VerticalGridView(android.content.Context!, android.util.AttributeSet!);
-    ctor public VerticalGridView(android.content.Context!, android.util.AttributeSet!, int);
-    method protected void initAttributes(android.content.Context!, android.util.AttributeSet!);
-    method public void setColumnWidth(int);
-    method public void setNumColumns(int);
-  }
-
-  public interface ViewHolderTask {
-    method public void run(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
-  }
-
 }
 
 package androidx.leanback.widget.picker {
diff --git a/leanback/leanback/api/restricted_current.ignore b/leanback/leanback/api/restricted_current.ignore
new file mode 100644
index 0000000..2ac34c7
--- /dev/null
+++ b/leanback/leanback/api/restricted_current.ignore
@@ -0,0 +1,31 @@
+// Baseline format: 1.0
+RemovedClass: androidx.leanback.widget.BaseGridView:
+    Removed class androidx.leanback.widget.BaseGridView
+RemovedClass: androidx.leanback.widget.HorizontalGridView:
+    Removed class androidx.leanback.widget.HorizontalGridView
+RemovedClass: androidx.leanback.widget.ItemAlignmentFacet:
+    Removed class androidx.leanback.widget.ItemAlignmentFacet
+RemovedClass: androidx.leanback.widget.OnChildViewHolderSelectedListener:
+    Removed class androidx.leanback.widget.OnChildViewHolderSelectedListener
+RemovedClass: androidx.leanback.widget.VerticalGridView:
+    Removed class androidx.leanback.widget.VerticalGridView
+RemovedClass: androidx.leanback.widget.Visibility:
+    Removed class androidx.leanback.widget.Visibility
+
+
+RemovedInterface: androidx.leanback.widget.FacetProvider:
+    Removed class androidx.leanback.widget.FacetProvider
+RemovedInterface: androidx.leanback.widget.FacetProviderAdapter:
+    Removed class androidx.leanback.widget.FacetProviderAdapter
+RemovedInterface: androidx.leanback.widget.OnChildLaidOutListener:
+    Removed class androidx.leanback.widget.OnChildLaidOutListener
+RemovedInterface: androidx.leanback.widget.OnChildSelectedListener:
+    Removed deprecated class androidx.leanback.widget.OnChildSelectedListener
+RemovedInterface: androidx.leanback.widget.ViewHolderTask:
+    Removed class androidx.leanback.widget.ViewHolderTask
+
+
+RemovedMethod: androidx.leanback.widget.FacetProvider#getFacet(Class<?>):
+    Removed method androidx.leanback.widget.FacetProvider.getFacet(Class<?>)
+RemovedMethod: androidx.leanback.widget.FacetProviderAdapter#getFacetProvider(int):
+    Removed method androidx.leanback.widget.FacetProviderAdapter.getFacetProvider(int)
diff --git a/leanback/leanback/api/restricted_current.txt b/leanback/leanback/api/restricted_current.txt
index 5ca4b08..cfa193a 100644
--- a/leanback/leanback/api/restricted_current.txt
+++ b/leanback/leanback/api/restricted_current.txt
@@ -1689,132 +1689,6 @@
     field public int viewType;
   }
 
-  public abstract class BaseGridView extends androidx.recyclerview.widget.RecyclerView {
-    method public void addOnChildViewHolderSelectedListener(androidx.leanback.widget.OnChildViewHolderSelectedListener!);
-    method public final void addOnLayoutCompletedListener(androidx.leanback.widget.BaseGridView.OnLayoutCompletedListener);
-    method public void animateIn();
-    method public void animateOut();
-    method public int getChildDrawingOrder(int, int);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getExtraLayoutSpace();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getFocusScrollStrategy();
-    method @Deprecated public int getHorizontalMargin();
-    method public int getHorizontalSpacing();
-    method public int getInitialPrefetchItemCount();
-    method public int getItemAlignmentOffset();
-    method public float getItemAlignmentOffsetPercent();
-    method public int getItemAlignmentViewId();
-    method public androidx.leanback.widget.BaseGridView.OnUnhandledKeyListener! getOnUnhandledKeyListener();
-    method public final int getSaveChildrenLimitNumber();
-    method public final int getSaveChildrenPolicy();
-    method public int getSelectedPosition();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getSelectedSubPosition();
-    method public androidx.leanback.widget.BaseGridView.SmoothScrollByBehavior? getSmoothScrollByBehavior();
-    method public final int getSmoothScrollMaxPendingMoves();
-    method public final float getSmoothScrollSpeedFactor();
-    method @Deprecated public int getVerticalMargin();
-    method public int getVerticalSpacing();
-    method public void getViewSelectedOffsets(android.view.View!, int[]!);
-    method public int getWindowAlignment();
-    method public int getWindowAlignmentOffset();
-    method public float getWindowAlignmentOffsetPercent();
-    method public boolean hasPreviousViewInSameRow(int);
-    method public boolean isChildLayoutAnimated();
-    method public boolean isFocusDrawingOrderEnabled();
-    method public final boolean isFocusSearchDisabled();
-    method public boolean isItemAlignmentOffsetWithPadding();
-    method public boolean isScrollEnabled();
-    method public boolean isWindowAlignmentPreferKeyLineOverHighEdge();
-    method public boolean isWindowAlignmentPreferKeyLineOverLowEdge();
-    method public boolean onRequestFocusInDescendants(int, android.graphics.Rect!);
-    method public void removeOnChildViewHolderSelectedListener(androidx.leanback.widget.OnChildViewHolderSelectedListener!);
-    method public final void removeOnLayoutCompletedListener(androidx.leanback.widget.BaseGridView.OnLayoutCompletedListener);
-    method public void setAnimateChildLayout(boolean);
-    method public void setChildrenVisibility(int);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setExtraLayoutSpace(int);
-    method public void setFocusDrawingOrderEnabled(boolean);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setFocusScrollStrategy(int);
-    method public final void setFocusSearchDisabled(boolean);
-    method public void setGravity(int);
-    method public void setHasOverlappingRendering(boolean);
-    method @Deprecated public void setHorizontalMargin(int);
-    method public void setHorizontalSpacing(int);
-    method public void setInitialPrefetchItemCount(int);
-    method public void setItemAlignmentOffset(int);
-    method public void setItemAlignmentOffsetPercent(float);
-    method public void setItemAlignmentOffsetWithPadding(boolean);
-    method public void setItemAlignmentViewId(int);
-    method @Deprecated public void setItemMargin(int);
-    method public void setItemSpacing(int);
-    method public void setLayoutEnabled(boolean);
-    method public void setOnChildLaidOutListener(androidx.leanback.widget.OnChildLaidOutListener!);
-    method public void setOnChildSelectedListener(androidx.leanback.widget.OnChildSelectedListener!);
-    method public void setOnChildViewHolderSelectedListener(androidx.leanback.widget.OnChildViewHolderSelectedListener!);
-    method public void setOnKeyInterceptListener(androidx.leanback.widget.BaseGridView.OnKeyInterceptListener!);
-    method public void setOnMotionInterceptListener(androidx.leanback.widget.BaseGridView.OnMotionInterceptListener!);
-    method public void setOnTouchInterceptListener(androidx.leanback.widget.BaseGridView.OnTouchInterceptListener!);
-    method public void setOnUnhandledKeyListener(androidx.leanback.widget.BaseGridView.OnUnhandledKeyListener!);
-    method public void setPruneChild(boolean);
-    method public final void setSaveChildrenLimitNumber(int);
-    method public final void setSaveChildrenPolicy(int);
-    method public void setScrollEnabled(boolean);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, int);
-    method public void setSelectedPosition(int, androidx.leanback.widget.ViewHolderTask!);
-    method public void setSelectedPositionSmooth(int);
-    method public void setSelectedPositionSmooth(int, androidx.leanback.widget.ViewHolderTask!);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSelectedPositionSmoothWithSub(int, int);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSelectedPositionWithSub(int, int);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSelectedPositionWithSub(int, int, int);
-    method public final void setSmoothScrollByBehavior(androidx.leanback.widget.BaseGridView.SmoothScrollByBehavior?);
-    method public final void setSmoothScrollMaxPendingMoves(int);
-    method public final void setSmoothScrollSpeedFactor(float);
-    method @Deprecated public void setVerticalMargin(int);
-    method public void setVerticalSpacing(int);
-    method public void setWindowAlignment(int);
-    method public void setWindowAlignmentOffset(int);
-    method public void setWindowAlignmentOffsetPercent(float);
-    method public void setWindowAlignmentPreferKeyLineOverHighEdge(boolean);
-    method public void setWindowAlignmentPreferKeyLineOverLowEdge(boolean);
-    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final int FOCUS_SCROLL_ALIGNED = 0; // 0x0
-    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final int FOCUS_SCROLL_ITEM = 1; // 0x1
-    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final int FOCUS_SCROLL_PAGE = 2; // 0x2
-    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
-    field public static final int SAVE_ALL_CHILD = 3; // 0x3
-    field public static final int SAVE_LIMITED_CHILD = 2; // 0x2
-    field public static final int SAVE_NO_CHILD = 0; // 0x0
-    field public static final int SAVE_ON_SCREEN_CHILD = 1; // 0x1
-    field public static final int WINDOW_ALIGN_BOTH_EDGE = 3; // 0x3
-    field public static final int WINDOW_ALIGN_HIGH_EDGE = 2; // 0x2
-    field public static final int WINDOW_ALIGN_LOW_EDGE = 1; // 0x1
-    field public static final int WINDOW_ALIGN_NO_EDGE = 0; // 0x0
-    field public static final float WINDOW_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
-  }
-
-  public static interface BaseGridView.OnKeyInterceptListener {
-    method public boolean onInterceptKeyEvent(android.view.KeyEvent!);
-  }
-
-  public static interface BaseGridView.OnLayoutCompletedListener {
-    method public void onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State);
-  }
-
-  public static interface BaseGridView.OnMotionInterceptListener {
-    method public boolean onInterceptMotionEvent(android.view.MotionEvent!);
-  }
-
-  public static interface BaseGridView.OnTouchInterceptListener {
-    method public boolean onInterceptTouchEvent(android.view.MotionEvent!);
-  }
-
-  public static interface BaseGridView.OnUnhandledKeyListener {
-    method public boolean onUnhandledKey(android.view.KeyEvent!);
-  }
-
-  public static interface BaseGridView.SmoothScrollByBehavior {
-    method public int configSmoothScrollByDuration(int, int);
-    method public android.view.animation.Interpolator? configSmoothScrollByInterpolator(int, int);
-  }
-
   public interface BaseOnItemViewClickedListener<T> {
     method public void onItemClicked(androidx.leanback.widget.Presenter.ViewHolder!, Object!, androidx.leanback.widget.RowPresenter.ViewHolder!, T!);
   }
@@ -1972,14 +1846,6 @@
     method public final boolean isRenderedAsRowView();
   }
 
-  public interface FacetProvider {
-    method public Object! getFacet(Class<?>!);
-  }
-
-  public interface FacetProviderAdapter {
-    method public androidx.leanback.widget.FacetProvider! getFacetProvider(int);
-  }
-
   public interface FocusHighlight {
     field public static final int ZOOM_FACTOR_LARGE = 3; // 0x3
     field public static final int ZOOM_FACTOR_MEDIUM = 2; // 0x2
@@ -2064,12 +1930,6 @@
     method public void startPostponedEnterTransition();
   }
 
-  public final class GridLayoutManager extends androidx.recyclerview.widget.RecyclerView.LayoutManager {
-    ctor public GridLayoutManager();
-    method public androidx.recyclerview.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method public void setOrientation(@androidx.recyclerview.widget.RecyclerView.Orientation int);
-  }
-
   public class GuidanceStylist implements androidx.leanback.widget.FragmentAnimationProvider {
     ctor public GuidanceStylist();
     method public android.widget.TextView! getBreadcrumbView();
@@ -2358,27 +2218,6 @@
     method public void setDescription(CharSequence!);
   }
 
-  public class HorizontalGridView extends androidx.leanback.widget.BaseGridView {
-    ctor public HorizontalGridView(android.content.Context!);
-    ctor public HorizontalGridView(android.content.Context!, android.util.AttributeSet!);
-    ctor public HorizontalGridView(android.content.Context!, android.util.AttributeSet!, int);
-    method public final boolean getFadingLeftEdge();
-    method public final int getFadingLeftEdgeLength();
-    method public final int getFadingLeftEdgeOffset();
-    method public final boolean getFadingRightEdge();
-    method public final int getFadingRightEdgeLength();
-    method public final int getFadingRightEdgeOffset();
-    method protected void initAttributes(android.content.Context!, android.util.AttributeSet!);
-    method public final void setFadingLeftEdge(boolean);
-    method public final void setFadingLeftEdgeLength(int);
-    method public final void setFadingLeftEdgeOffset(int);
-    method public final void setFadingRightEdge(boolean);
-    method public final void setFadingRightEdgeLength(int);
-    method public final void setFadingRightEdgeOffset(int);
-    method public void setNumRows(int);
-    method public void setRowHeight(int);
-  }
-
   public final class HorizontalHoverCardSwitcher extends androidx.leanback.widget.PresenterSwitcher {
     ctor public HorizontalHoverCardSwitcher();
     method protected void insertView(android.view.View!);
@@ -2426,30 +2265,6 @@
     method protected androidx.leanback.widget.RowPresenter.ViewHolder! createRowViewHolder(android.view.ViewGroup!);
   }
 
-  public final class ItemAlignmentFacet {
-    ctor public ItemAlignmentFacet();
-    method public androidx.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef![]! getAlignmentDefs();
-    method public boolean isMultiAlignment();
-    method public void setAlignmentDefs(androidx.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef![]!);
-    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
-  }
-
-  public static class ItemAlignmentFacet.ItemAlignmentDef {
-    ctor public ItemAlignmentFacet.ItemAlignmentDef();
-    method public final int getItemAlignmentFocusViewId();
-    method public final int getItemAlignmentOffset();
-    method public final float getItemAlignmentOffsetPercent();
-    method public final int getItemAlignmentViewId();
-    method public boolean isAlignedToTextViewBaseLine();
-    method public final boolean isItemAlignmentOffsetWithPadding();
-    method public final void setAlignedToTextViewBaseline(boolean);
-    method public final void setItemAlignmentFocusViewId(int);
-    method public final void setItemAlignmentOffset(int);
-    method public final void setItemAlignmentOffsetPercent(float);
-    method public final void setItemAlignmentOffsetWithPadding(boolean);
-    method public final void setItemAlignmentViewId(int);
-  }
-
   public class ItemBridgeAdapter extends androidx.recyclerview.widget.RecyclerView.Adapter implements androidx.leanback.widget.FacetProviderAdapter {
     ctor public ItemBridgeAdapter(androidx.leanback.widget.ObjectAdapter!, androidx.leanback.widget.PresenterSelector!);
     ctor public ItemBridgeAdapter(androidx.leanback.widget.ObjectAdapter!);
@@ -2657,20 +2472,6 @@
     method public void onActionClicked(androidx.leanback.widget.Action!);
   }
 
-  public interface OnChildLaidOutListener {
-    method public void onChildLaidOut(android.view.ViewGroup!, android.view.View!, int, long);
-  }
-
-  @Deprecated public interface OnChildSelectedListener {
-    method @Deprecated public void onChildSelected(android.view.ViewGroup!, android.view.View!, int, long);
-  }
-
-  public abstract class OnChildViewHolderSelectedListener {
-    ctor public OnChildViewHolderSelectedListener();
-    method public void onChildViewHolderSelected(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int);
-    method public void onChildViewHolderSelectedAndPositioned(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int);
-  }
-
   public interface OnItemViewClickedListener extends androidx.leanback.widget.BaseOnItemViewClickedListener<androidx.leanback.widget.Row> {
   }
 
@@ -3484,22 +3285,6 @@
     method public androidx.leanback.widget.VerticalGridView! getGridView();
   }
 
-  public class VerticalGridView extends androidx.leanback.widget.BaseGridView {
-    ctor public VerticalGridView(android.content.Context!);
-    ctor public VerticalGridView(android.content.Context!, android.util.AttributeSet!);
-    ctor public VerticalGridView(android.content.Context!, android.util.AttributeSet!, int);
-    method protected void initAttributes(android.content.Context!, android.util.AttributeSet!);
-    method public void setColumnWidth(int);
-    method public void setNumColumns(int);
-  }
-
-  public interface ViewHolderTask {
-    method public void run(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
-  }
-
-  @IntDef({android.view.View.VISIBLE, android.view.View.INVISIBLE, android.view.View.GONE}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public @interface Visibility {
-  }
-
 }
 
 package androidx.leanback.widget.picker {
diff --git a/leanback/leanback/build.gradle b/leanback/leanback/build.gradle
index 8da3f9a..7db8f34 100644
--- a/leanback/leanback/build.gradle
+++ b/leanback/leanback/build.gradle
@@ -17,7 +17,7 @@
     api("androidx.annotation:annotation:1.1.0")
     api("androidx.interpolator:interpolator:1.0.0")
     api("androidx.core:core:1.1.0")
-    implementation("androidx.collection:collection:1.0.0")
+    api(project(":leanback:leanback-grid"))
     api("androidx.media:media:1.0.0")
     api("androidx.fragment:fragment:1.0.0")
     api("androidx.recyclerview:recyclerview:1.2.0-rc01")
@@ -58,8 +58,8 @@
 androidx {
     name = "Android Support Leanback v17"
     publish = Publish.SNAPSHOT_AND_RELEASE
-    mavenVersion = LibraryVersions.LEANBACK
     mavenGroup = LibraryGroups.LEANBACK
+    mavenVersion = LibraryVersions.LEANBACK
     inceptionYear = "2014"
     description = "Android Support Leanback v17"
     failOnDeprecationWarnings = false
diff --git a/leanback/leanback/src/androidTest/java/androidx/leanback/app/DetailsFragmentTest.java b/leanback/leanback/src/androidTest/java/androidx/leanback/app/DetailsFragmentTest.java
index 2c342b4..4f7cb7e 100644
--- a/leanback/leanback/src/androidTest/java/androidx/leanback/app/DetailsFragmentTest.java
+++ b/leanback/leanback/src/androidTest/java/androidx/leanback/app/DetailsFragmentTest.java
@@ -18,12 +18,15 @@
  */
 package androidx.leanback.app;
 
+import static android.os.Build.VERSION.SDK_INT;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 import android.animation.PropertyValuesHolder;
+import android.app.UiAutomation;
 import android.content.Context;
 import android.content.Intent;
 import android.graphics.Bitmap;
@@ -61,6 +64,8 @@
 import androidx.test.filters.SdkSuppress;
 import androidx.test.platform.app.InstrumentationRegistry;
 
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -126,6 +131,29 @@
         }
     }
 
+    @BeforeClass
+    public static void setUp() {
+        if (SDK_INT >= 31) {
+            UiAutomation uiAutomation =
+                    InstrumentationRegistry.getInstrumentation().getUiAutomation();
+            uiAutomation.adoptShellPermissionIdentity("android.permission.WRITE_SECURE_SETTINGS");
+            uiAutomation.executeShellCommand("settings put secure immersive_mode_confirmations "
+                    + "confirmed");
+            uiAutomation.dropShellPermissionIdentity();
+        }
+    }
+
+    @AfterClass
+    public static void tearDown() {
+        if (SDK_INT >= 31) {
+            UiAutomation uiAutomation =
+                    InstrumentationRegistry.getInstrumentation().getUiAutomation();
+            uiAutomation.adoptShellPermissionIdentity("android.permission.WRITE_SECURE_SETTINGS");
+            uiAutomation.executeShellCommand("settings delete secure immersive_mode_confirmations");
+            uiAutomation.dropShellPermissionIdentity();
+        }
+    }
+
     @Test
     public void parallaxSetupTest() {
         SingleFragmentTestActivity activity =
@@ -1138,7 +1166,7 @@
                 (DetailsFragmentEntranceTransition)
                         activity.getTestFragment();
 
-        if (Build.VERSION.SDK_INT < 21) {
+        if (SDK_INT < 21) {
             // when enter transition is not supported, mCanUseHost is immmediately true
             assertTrue(detailsFragment.mDetailsBackgroundController.mCanUseHost);
         } else {
diff --git a/leanback/leanback/src/androidTest/java/androidx/leanback/app/DetailsSupportFragmentTest.java b/leanback/leanback/src/androidTest/java/androidx/leanback/app/DetailsSupportFragmentTest.java
index 0f63d6d..13d62fb 100644
--- a/leanback/leanback/src/androidTest/java/androidx/leanback/app/DetailsSupportFragmentTest.java
+++ b/leanback/leanback/src/androidTest/java/androidx/leanback/app/DetailsSupportFragmentTest.java
@@ -15,12 +15,15 @@
  */
 package androidx.leanback.app;
 
+import static android.os.Build.VERSION.SDK_INT;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 import android.animation.PropertyValuesHolder;
+import android.app.UiAutomation;
 import android.content.Context;
 import android.content.Intent;
 import android.graphics.Bitmap;
@@ -58,6 +61,8 @@
 import androidx.test.filters.SdkSuppress;
 import androidx.test.platform.app.InstrumentationRegistry;
 
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -123,6 +128,29 @@
         }
     }
 
+    @BeforeClass
+    public static void setUp() {
+        if (SDK_INT >= 31) {
+            UiAutomation uiAutomation =
+                    InstrumentationRegistry.getInstrumentation().getUiAutomation();
+            uiAutomation.adoptShellPermissionIdentity("android.permission.WRITE_SECURE_SETTINGS");
+            uiAutomation.executeShellCommand("settings put secure immersive_mode_confirmations "
+                    + "confirmed");
+            uiAutomation.dropShellPermissionIdentity();
+        }
+    }
+
+    @AfterClass
+    public static void tearDown() {
+        if (SDK_INT >= 31) {
+            UiAutomation uiAutomation =
+                    InstrumentationRegistry.getInstrumentation().getUiAutomation();
+            uiAutomation.adoptShellPermissionIdentity("android.permission.WRITE_SECURE_SETTINGS");
+            uiAutomation.executeShellCommand("settings delete secure immersive_mode_confirmations");
+            uiAutomation.dropShellPermissionIdentity();
+        }
+    }
+
     @Test
     public void parallaxSetupTest() {
         SingleSupportFragmentTestActivity activity =
diff --git a/leanback/leanback/src/androidTest/java/androidx/leanback/widget/GridWidgetTest.java b/leanback/leanback/src/androidTest/java/androidx/leanback/widget/GridWidgetTest.java
index ce23b2f..c7c70fd 100644
--- a/leanback/leanback/src/androidTest/java/androidx/leanback/widget/GridWidgetTest.java
+++ b/leanback/leanback/src/androidTest/java/androidx/leanback/widget/GridWidgetTest.java
@@ -2824,6 +2824,7 @@
         testRemoveVisibleItemsInSmoothScrollingBackward(/*focusOnGridView=*/ false);
     }
 
+    @FlakyTest(bugId = 186848347)
     @Test
     public void testPendingSmoothScrollAndRemove() throws Throwable {
         Intent intent = new Intent();
diff --git a/leanback/leanback/src/androidTest/java/androidx/leanback/widget/StaggeredGridDefaultTest.java b/leanback/leanback/src/androidTest/java/androidx/leanback/widget/StaggeredGridDefaultTest.java
index 3c04e3e..ce6a00d 100644
--- a/leanback/leanback/src/androidTest/java/androidx/leanback/widget/StaggeredGridDefaultTest.java
+++ b/leanback/leanback/src/androidTest/java/androidx/leanback/widget/StaggeredGridDefaultTest.java
@@ -48,7 +48,7 @@
         mStaggeredGrid.appendVisibleItems(100000);
         assertEquals(dump(mStaggeredGrid) + " Should fill 9 items",
                 9, mStaggeredGrid.mLocations.size());
-        int row_result1 = mStaggeredGrid.getLocation(8).row;
+        int row_result1 = mStaggeredGrid.getLocation(8).mRow;
         assertEquals(dump(mStaggeredGrid) + " last item should be placed on row 1",
                 1, row_result1);
 
@@ -60,7 +60,7 @@
         mStaggeredGrid.appendVisibleItems(100000);
         assertEquals(dump(mStaggeredGrid) + " should fill 9 items",
                 9, mStaggeredGrid.mLocations.size());
-        int row_result2 = mStaggeredGrid.getLocation(8).row;
+        int row_result2 = mStaggeredGrid.getLocation(8).mRow;
 
         assertEquals(dump(mStaggeredGrid) + " last item should be placed on row 1",
                 1, row_result2);
diff --git a/leanback/leanback/src/main/java/androidx/leanback/package-info.java b/leanback/leanback/src/main/java/androidx/leanback/package-info.java
index 50abba9..53fd315 100644
--- a/leanback/leanback/src/main/java/androidx/leanback/package-info.java
+++ b/leanback/leanback/src/main/java/androidx/leanback/package-info.java
@@ -49,12 +49,6 @@
  * {@link androidx.leanback.media.PlaybackTransportControlGlue} and
  * {@link androidx.leanback.app.PlaybackSupportFragmentGlueHost}.
  * </p>
- * <p>
- * Many lower level building blocks are also provided in the {@link androidx.leanback.widget} package.
- * These allow applications to easily incorporate Leanback look and feel while allowing for a
- * high degree of customization.  Primary examples include the UI widget
- * {@link androidx.leanback.widget.HorizontalGridView} and
- * {@link androidx.leanback.widget.VerticalGridView}.
  */
 
 package androidx.leanback;
\ No newline at end of file
diff --git a/leanback/leanback/src/main/java/androidx/leanback/widget/FacetProviderAdapter.java b/leanback/leanback/src/main/java/androidx/leanback/widget/FacetProviderAdapter.java
deleted file mode 100644
index 7afbc61..0000000
--- a/leanback/leanback/src/main/java/androidx/leanback/widget/FacetProviderAdapter.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2015 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.leanback.widget;
-
-import androidx.recyclerview.widget.RecyclerView;
-
-/**
- * Optional interface that implemented by {@link RecyclerView.Adapter} to
- * query {@link FacetProvider} for a given item view type within Adapter.  Note that
- * {@link RecyclerView.ViewHolder} may also implement {@link FacetProvider} which
- * has a higher priority than the one returned from{@link #getFacetProvider(int)}.
- * <p>
- * A typical use case of {@link FacetProvider} is that VerticalGridView/HorizontalGridView retrieves
- * {@link ItemAlignmentFacet} for a ViewHolder or a item view type.
- * <p>
- * App does not need implement FacetProviderAdapter when using {@link ObjectAdapter},
- * {@link Presenter} and {@link ItemBridgeAdapter}. {@link ItemBridgeAdapter} implemented
- * FacetProviderAdapter, it returns the FacetProvider implemented by {@link Presenter} which is
- * mapped to the item view type.
- * <p>
- * For example, app calls presenter.setFacet(ItemAlignmentFacet.class, itemAlignmentFacet) to
- * set alignment of the ViewHolders created by this Presenter.
- * </p>
- */
-public interface FacetProviderAdapter {
-
-    /**
-     * Queries {@link FacetProvider} for a given type within Adapter.
-     * @param type        type of the item.
-     * @return Facet provider for the type.
-     */
-    public FacetProvider getFacetProvider(int type);
-
-}
diff --git a/leanback/leanback/src/main/java/androidx/leanback/widget/OnChildLaidOutListener.java b/leanback/leanback/src/main/java/androidx/leanback/widget/OnChildLaidOutListener.java
deleted file mode 100644
index c9186d4..0000000
--- a/leanback/leanback/src/main/java/androidx/leanback/widget/OnChildLaidOutListener.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2015 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.leanback.widget;
-
-import android.view.View;
-import android.view.ViewGroup;
-
-/**
- * Interface for receiving notification when a child of this
- * ViewGroup has been laid out.
- */
-public interface OnChildLaidOutListener {
-    /**
-     * Callback method to be invoked when a child of this ViewGroup has been
-     * added to the view hierarchy and has been laid out.
-     *
-     * @param parent The ViewGroup where the layout happened.
-     * @param view The view within the ViewGroup that was laid out.
-     * @param position The position of the view in the adapter.
-     * @param id The id of the child.
-     */
-    void onChildLaidOut(ViewGroup parent, View view, int position, long id);
-}
diff --git a/leanback/leanback/src/main/java/androidx/leanback/widget/OnChildSelectedListener.java b/leanback/leanback/src/main/java/androidx/leanback/widget/OnChildSelectedListener.java
deleted file mode 100644
index 9daf1dd..0000000
--- a/leanback/leanback/src/main/java/androidx/leanback/widget/OnChildSelectedListener.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2014 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.leanback.widget;
-
-import android.view.View;
-import android.view.ViewGroup;
-
-/**
- * Interface for receiving notification when a child of this
- * ViewGroup has been selected.
- * @deprecated Use {@link OnChildViewHolderSelectedListener}
- */
-@Deprecated
-public interface OnChildSelectedListener {
-    /**
-     * Callback method to be invoked when a child of this ViewGroup has been
-     * selected.
-     *
-     * @param parent The ViewGroup where the selection happened.
-     * @param view The view within the ViewGroup that is selected, or null if no
-     *        view is selected.
-     * @param position The position of the view in the adapter, or NO_POSITION
-     *        if no view is selected.
-     * @param id The id of the child that is selected, or NO_ID if no view is
-     *        selected.
-     */
-    void onChildSelected(ViewGroup parent, View view, int position, long id);
-}
diff --git a/leanback/leanback/src/main/java/androidx/leanback/widget/OnChildViewHolderSelectedListener.java b/leanback/leanback/src/main/java/androidx/leanback/widget/OnChildViewHolderSelectedListener.java
deleted file mode 100644
index d636008..0000000
--- a/leanback/leanback/src/main/java/androidx/leanback/widget/OnChildViewHolderSelectedListener.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2014 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.leanback.widget;
-
-import androidx.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef;
-import androidx.recyclerview.widget.RecyclerView;
-
-/**
- * Interface for receiving notification when a child of this ViewGroup has been selected.
- * There are two methods:
- * <ul>
- * <li>
- *     {link {@link #onChildViewHolderSelected(RecyclerView, RecyclerView.ViewHolder, int, int)}}
- *     is called when the view holder is about to be selected.  The listener could change size
- *     of the view holder in this callback.
- * </li>
- * <li>
- *     {link {@link #onChildViewHolderSelectedAndPositioned(RecyclerView, RecyclerView.ViewHolder,
- *     int, int)} is called when view holder has been selected and laid out in RecyclerView.
- *
- * </li>
- * </ul>
- */
-public abstract class OnChildViewHolderSelectedListener {
-    /**
-     * Callback method to be invoked when a child of this ViewGroup has been selected. Listener
-     * might change the size of the child and the position of the child is not finalized. To get
-     * the final layout position of child, overide {@link #onChildViewHolderSelectedAndPositioned(
-     * RecyclerView, RecyclerView.ViewHolder, int, int)}.
-     *
-     * @param parent The RecyclerView where the selection happened.
-     * @param child The ViewHolder within the RecyclerView that is selected, or null if no
-     *        view is selected.
-     * @param position The position of the view in the adapter, or NO_POSITION
-     *        if no view is selected.
-     * @param subposition The index of which {@link ItemAlignmentDef} being used,
-     *                    0 if there is no ItemAlignmentDef defined for the item.
-     */
-    public void onChildViewHolderSelected(RecyclerView parent, RecyclerView.ViewHolder child,
-            int position, int subposition) {
-    }
-
-    /**
-     * Callback method to be invoked when a child of this ViewGroup has been selected and
-     * positioned.
-     *
-     * @param parent The RecyclerView where the selection happened.
-     * @param child The ViewHolder within the RecyclerView that is selected, or null if no
-     *        view is selected.
-     * @param position The position of the view in the adapter, or NO_POSITION
-     *        if no view is selected.
-     * @param subposition The index of which {@link ItemAlignmentDef} being used,
-     *                    0 if there is no ItemAlignmentDef defined for the item.
-     */
-    public void onChildViewHolderSelectedAndPositioned(RecyclerView parent,
-            RecyclerView.ViewHolder child, int position, int subposition) {
-    }
-
-}
diff --git a/leanback/leanback/src/main/java/androidx/leanback/widget/ViewHolderTask.java b/leanback/leanback/src/main/java/androidx/leanback/widget/ViewHolderTask.java
deleted file mode 100644
index fa65677..0000000
--- a/leanback/leanback/src/main/java/androidx/leanback/widget/ViewHolderTask.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2015 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.leanback.widget;
-
-import androidx.recyclerview.widget.RecyclerView;
-
-/**
- * Interface for schedule task on a ViewHolder.
- */
-public interface ViewHolderTask {
-    public void run(RecyclerView.ViewHolder viewHolder);
-}
\ No newline at end of file
diff --git a/leanback/leanback/src/main/res/values/attrs.xml b/leanback/leanback/src/main/res/values/attrs.xml
index 92d92bb..5ecfac1 100644
--- a/leanback/leanback/src/main/res/values/attrs.xml
+++ b/leanback/leanback/src/main/res/values/attrs.xml
@@ -16,48 +16,6 @@
 -->
 
 <resources>
-    <declare-styleable name="lbBaseGridView">
-        <!-- Allow DPAD key to navigate out at the front of the View (where position = 0),
-             default is false  -->
-        <attr name="focusOutFront" format="boolean" />
-        <!-- Allow DPAD key to navigate out at the end of the view, default is false -->
-        <attr name="focusOutEnd" format="boolean" />
-        <!-- Allow DPAD key to navigate out of first row, for HorizontalGridView, it's the
-             top edge, for VerticalGridView it's the "start" edge.  Default value is true.  -->
-        <attr name="focusOutSideStart" format="boolean" />
-        <!-- Allow DPAD key to navigate out of last row, for HorizontalGridView, it's the
-             bottom edge, for VerticalGridView it's the "end" edge.  Default value is true.  -->
-        <attr name="focusOutSideEnd" format="boolean" />
-        <!-- Deprecated, use android:horizontalSpacing -->
-        <attr name="horizontalMargin" format="dimension" />
-        <!-- Deprecated, use android:verticalSpacing -->
-        <attr name="verticalMargin" format="dimension" />
-        <!-- Defining space between two items horizontally -->
-        <attr name="android:horizontalSpacing" />
-        <!-- Defining space between two items vertically -->
-        <attr name="android:verticalSpacing" />
-        <!-- Defining gravity of child view -->
-        <attr name="android:gravity" />
-    </declare-styleable>
-
-    <declare-styleable name="lbHorizontalGridView">
-        <!-- Defining height of each row of HorizontalGridView -->
-        <attr name="rowHeight" format="dimension" >
-            <enum name="wrap_content" value="-2" />
-        </attr>
-        <!-- Defining number of rows -->
-        <attr name="numberOfRows" format="integer" />
-    </declare-styleable>
-
-    <declare-styleable name="lbVerticalGridView">
-        <!-- Defining width of each column of VerticalGridView -->
-        <attr name="columnWidth" format="dimension" >
-            <enum name="wrap_content" value="-2" />
-        </attr>
-        <!-- Defining number of columns -->
-        <attr name="numberOfColumns" format="integer" />
-    </declare-styleable>
-
     <declare-styleable name="lbBaseCardView">
         <!-- Defines the background of card -->
         <attr name="cardForeground" format="reference|color"/>
diff --git a/lifecycle/lifecycle-runtime-testing/api/current.txt b/lifecycle/lifecycle-runtime-testing/api/current.txt
index 2161789..8209a73 100644
--- a/lifecycle/lifecycle-runtime-testing/api/current.txt
+++ b/lifecycle/lifecycle-runtime-testing/api/current.txt
@@ -4,6 +4,7 @@
   public final class TestLifecycleOwner implements androidx.lifecycle.LifecycleOwner {
     ctor public TestLifecycleOwner(optional androidx.lifecycle.Lifecycle.State initialState, optional kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
     ctor public TestLifecycleOwner(optional androidx.lifecycle.Lifecycle.State initialState);
+    ctor public TestLifecycleOwner();
     method public androidx.lifecycle.Lifecycle.State getCurrentState();
     method public androidx.lifecycle.LifecycleRegistry getLifecycle();
     method public int getObserverCount();
diff --git a/lifecycle/lifecycle-runtime-testing/api/public_plus_experimental_current.txt b/lifecycle/lifecycle-runtime-testing/api/public_plus_experimental_current.txt
index 2161789..8209a73 100644
--- a/lifecycle/lifecycle-runtime-testing/api/public_plus_experimental_current.txt
+++ b/lifecycle/lifecycle-runtime-testing/api/public_plus_experimental_current.txt
@@ -4,6 +4,7 @@
   public final class TestLifecycleOwner implements androidx.lifecycle.LifecycleOwner {
     ctor public TestLifecycleOwner(optional androidx.lifecycle.Lifecycle.State initialState, optional kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
     ctor public TestLifecycleOwner(optional androidx.lifecycle.Lifecycle.State initialState);
+    ctor public TestLifecycleOwner();
     method public androidx.lifecycle.Lifecycle.State getCurrentState();
     method public androidx.lifecycle.LifecycleRegistry getLifecycle();
     method public int getObserverCount();
diff --git a/lifecycle/lifecycle-runtime-testing/api/restricted_current.txt b/lifecycle/lifecycle-runtime-testing/api/restricted_current.txt
index 2161789..8209a73 100644
--- a/lifecycle/lifecycle-runtime-testing/api/restricted_current.txt
+++ b/lifecycle/lifecycle-runtime-testing/api/restricted_current.txt
@@ -4,6 +4,7 @@
   public final class TestLifecycleOwner implements androidx.lifecycle.LifecycleOwner {
     ctor public TestLifecycleOwner(optional androidx.lifecycle.Lifecycle.State initialState, optional kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
     ctor public TestLifecycleOwner(optional androidx.lifecycle.Lifecycle.State initialState);
+    ctor public TestLifecycleOwner();
     method public androidx.lifecycle.Lifecycle.State getCurrentState();
     method public androidx.lifecycle.LifecycleRegistry getLifecycle();
     method public int getObserverCount();
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/api/current.txt b/lifecycle/lifecycle-viewmodel-savedstate/api/current.txt
index ab2236a..de219db 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/api/current.txt
+++ b/lifecycle/lifecycle-viewmodel-savedstate/api/current.txt
@@ -2,6 +2,7 @@
 package androidx.lifecycle {
 
   public abstract class AbstractSavedStateViewModelFactory implements androidx.lifecycle.ViewModelProvider.Factory {
+    ctor public AbstractSavedStateViewModelFactory();
     ctor public AbstractSavedStateViewModelFactory(androidx.savedstate.SavedStateRegistryOwner, android.os.Bundle?);
     method public final <T extends androidx.lifecycle.ViewModel> T create(Class<T!>, androidx.lifecycle.viewmodel.CreationExtras);
     method public final <T extends androidx.lifecycle.ViewModel> T create(Class<T!>);
@@ -22,7 +23,16 @@
     method @MainThread public void setSavedStateProvider(String, androidx.savedstate.SavedStateRegistry.SavedStateProvider);
   }
 
+  public final class SavedStateHandleSupport {
+    method @MainThread public static androidx.lifecycle.SavedStateHandle createSavedStateHandle(androidx.lifecycle.viewmodel.CreationExtras);
+    method @MainThread public static <T extends androidx.savedstate.SavedStateRegistryOwner & androidx.lifecycle.ViewModelStoreOwner> void enableSavedStateHandles(T);
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<android.os.Bundle> DEFAULT_ARGS_KEY;
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<androidx.savedstate.SavedStateRegistryOwner> SAVED_STATE_REGISTRY_OWNER_KEY;
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<androidx.lifecycle.ViewModelStoreOwner> VIEW_MODEL_STORE_OWNER_KEY;
+  }
+
   public final class SavedStateViewModelFactory implements androidx.lifecycle.ViewModelProvider.Factory {
+    ctor public SavedStateViewModelFactory();
     ctor public SavedStateViewModelFactory(android.app.Application?, androidx.savedstate.SavedStateRegistryOwner);
     ctor public SavedStateViewModelFactory(android.app.Application?, androidx.savedstate.SavedStateRegistryOwner, android.os.Bundle?);
     method public <T extends androidx.lifecycle.ViewModel> T create(String, Class<T!>);
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/api/public_plus_experimental_current.txt b/lifecycle/lifecycle-viewmodel-savedstate/api/public_plus_experimental_current.txt
index ab2236a..de219db 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/api/public_plus_experimental_current.txt
+++ b/lifecycle/lifecycle-viewmodel-savedstate/api/public_plus_experimental_current.txt
@@ -2,6 +2,7 @@
 package androidx.lifecycle {
 
   public abstract class AbstractSavedStateViewModelFactory implements androidx.lifecycle.ViewModelProvider.Factory {
+    ctor public AbstractSavedStateViewModelFactory();
     ctor public AbstractSavedStateViewModelFactory(androidx.savedstate.SavedStateRegistryOwner, android.os.Bundle?);
     method public final <T extends androidx.lifecycle.ViewModel> T create(Class<T!>, androidx.lifecycle.viewmodel.CreationExtras);
     method public final <T extends androidx.lifecycle.ViewModel> T create(Class<T!>);
@@ -22,7 +23,16 @@
     method @MainThread public void setSavedStateProvider(String, androidx.savedstate.SavedStateRegistry.SavedStateProvider);
   }
 
+  public final class SavedStateHandleSupport {
+    method @MainThread public static androidx.lifecycle.SavedStateHandle createSavedStateHandle(androidx.lifecycle.viewmodel.CreationExtras);
+    method @MainThread public static <T extends androidx.savedstate.SavedStateRegistryOwner & androidx.lifecycle.ViewModelStoreOwner> void enableSavedStateHandles(T);
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<android.os.Bundle> DEFAULT_ARGS_KEY;
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<androidx.savedstate.SavedStateRegistryOwner> SAVED_STATE_REGISTRY_OWNER_KEY;
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<androidx.lifecycle.ViewModelStoreOwner> VIEW_MODEL_STORE_OWNER_KEY;
+  }
+
   public final class SavedStateViewModelFactory implements androidx.lifecycle.ViewModelProvider.Factory {
+    ctor public SavedStateViewModelFactory();
     ctor public SavedStateViewModelFactory(android.app.Application?, androidx.savedstate.SavedStateRegistryOwner);
     ctor public SavedStateViewModelFactory(android.app.Application?, androidx.savedstate.SavedStateRegistryOwner, android.os.Bundle?);
     method public <T extends androidx.lifecycle.ViewModel> T create(String, Class<T!>);
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_current.txt b/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_current.txt
index e4ba839..1b4d3d2 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_current.txt
+++ b/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_current.txt
@@ -2,6 +2,7 @@
 package androidx.lifecycle {
 
   public abstract class AbstractSavedStateViewModelFactory extends androidx.lifecycle.ViewModelProvider.OnRequeryFactory implements androidx.lifecycle.ViewModelProvider.Factory {
+    ctor public AbstractSavedStateViewModelFactory();
     ctor public AbstractSavedStateViewModelFactory(androidx.savedstate.SavedStateRegistryOwner, android.os.Bundle?);
     method public final <T extends androidx.lifecycle.ViewModel> T create(Class<T!>, androidx.lifecycle.viewmodel.CreationExtras);
     method public final <T extends androidx.lifecycle.ViewModel> T create(Class<T!>);
@@ -22,7 +23,16 @@
     method @MainThread public void setSavedStateProvider(String, androidx.savedstate.SavedStateRegistry.SavedStateProvider);
   }
 
+  public final class SavedStateHandleSupport {
+    method @MainThread public static androidx.lifecycle.SavedStateHandle createSavedStateHandle(androidx.lifecycle.viewmodel.CreationExtras);
+    method @MainThread public static <T extends androidx.savedstate.SavedStateRegistryOwner & androidx.lifecycle.ViewModelStoreOwner> void enableSavedStateHandles(T);
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<android.os.Bundle> DEFAULT_ARGS_KEY;
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<androidx.savedstate.SavedStateRegistryOwner> SAVED_STATE_REGISTRY_OWNER_KEY;
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<androidx.lifecycle.ViewModelStoreOwner> VIEW_MODEL_STORE_OWNER_KEY;
+  }
+
   public final class SavedStateViewModelFactory extends androidx.lifecycle.ViewModelProvider.OnRequeryFactory implements androidx.lifecycle.ViewModelProvider.Factory {
+    ctor public SavedStateViewModelFactory();
     ctor public SavedStateViewModelFactory(android.app.Application?, androidx.savedstate.SavedStateRegistryOwner);
     ctor public SavedStateViewModelFactory(android.app.Application?, androidx.savedstate.SavedStateRegistryOwner, android.os.Bundle?);
     method public <T extends androidx.lifecycle.ViewModel> T create(String, Class<T!>);
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/build.gradle b/lifecycle/lifecycle-viewmodel-savedstate/build.gradle
index 7f9470d..924d139 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/build.gradle
+++ b/lifecycle/lifecycle-viewmodel-savedstate/build.gradle
@@ -17,6 +17,7 @@
 
 import androidx.build.LibraryGroups
 import androidx.build.Publish
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
 plugins {
     id("AndroidXPlugin")
@@ -35,6 +36,7 @@
     api("androidx.savedstate:savedstate:1.0.0")
     api(projectOrArtifact(":lifecycle:lifecycle-livedata-core"))
     api(projectOrArtifact(":lifecycle:lifecycle-viewmodel"))
+    api(libs.kotlinStdlib)
 
     androidTestImplementation projectOrArtifact(":lifecycle:lifecycle-runtime")
     androidTestImplementation projectOrArtifact(":lifecycle:lifecycle-livedata-core")
@@ -68,3 +70,11 @@
     inceptionYear = "2018"
     description = "Android Lifecycle ViewModel"
 }
+
+tasks.withType(KotlinCompile).configureEach {
+    kotlinOptions {
+        freeCompilerArgs += [
+                "-Xjvm-default=all",
+        ]
+    }
+}
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/SavedStateFactoryTest.kt b/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/SavedStateFactoryTest.kt
index ee5f16f..a39c427 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/SavedStateFactoryTest.kt
+++ b/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/SavedStateFactoryTest.kt
@@ -20,11 +20,16 @@
 import androidx.fragment.app.FragmentActivity
 import androidx.lifecycle.AbstractSavedStateViewModelFactory
 import androidx.lifecycle.AndroidViewModel
+import androidx.lifecycle.SAVED_STATE_REGISTRY_OWNER_KEY
 import androidx.lifecycle.SavedStateHandle
 import androidx.lifecycle.SavedStateViewModelFactory
+import androidx.lifecycle.VIEW_MODEL_STORE_OWNER_KEY
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion.APPLICATION_KEY
 import androidx.lifecycle.ViewModelStore
+import androidx.lifecycle.enableSavedStateHandles
+import androidx.lifecycle.viewmodel.MutableCreationExtras
 import androidx.test.annotation.UiThreadTest
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
@@ -44,26 +49,39 @@
 
     @UiThreadTest
     @Test
-    fun testCreateAndroidVM() {
+    fun testLegacyCreateAndroidVM() {
         val savedStateVMFactory = SavedStateViewModelFactory(
             activityRule.activity.application,
             activityRule.activity
         )
         val vm = ViewModelProvider(ViewModelStore(), savedStateVMFactory)
-        assertThat(vm.get(MyAndroidViewModel::class.java).handle).isNotNull()
-        assertThat(vm.get(MyViewModel::class.java).handle).isNotNull()
+        assertThat(vm[MyAndroidViewModel::class.java].handle).isNotNull()
+        assertThat(vm[MyViewModel::class.java].handle).isNotNull()
     }
 
     @UiThreadTest
     @Test
-    fun testCreateFailAndroidVM() {
+    fun testCreateAndroidVM() {
+        val savedStateVMFactory = SavedStateViewModelFactory()
+        val component = TestComponent()
+        component.enableSavedStateHandles()
+        val extras = component.extras
+        extras[APPLICATION_KEY] = activityRule.activity.application
+        val vm = ViewModelProvider(component.viewModelStore, savedStateVMFactory, extras)
+        assertThat(vm[MyAndroidViewModel::class.java].handle).isNotNull()
+        assertThat(vm[MyViewModel::class.java].handle).isNotNull()
+    }
+
+    @UiThreadTest
+    @Test
+    fun testLegacyCreateFailAndroidVM() {
         val savedStateVMFactory = SavedStateViewModelFactory(
             null,
             activityRule.activity
         )
         val vm = ViewModelProvider(ViewModelStore(), savedStateVMFactory)
         try {
-            vm.get(MyAndroidViewModel::class.java)
+            vm[MyAndroidViewModel::class.java]
             fail("Creating an AndroidViewModel should fail when no Application is provided")
         } catch (e: RuntimeException) {
             assertThat(e).hasMessageThat().isEqualTo(
@@ -71,12 +89,27 @@
                     MyAndroidViewModel::class.java
             )
         }
-        assertThat(vm.get(MyViewModel::class.java).handle).isNotNull()
+        assertThat(vm[MyViewModel::class.java].handle).isNotNull()
     }
 
     @UiThreadTest
     @Test
-    fun testCreateAndroidAbstractVM() {
+    fun testCreateFailAndroidVM() {
+        val savedStateVMFactory = SavedStateViewModelFactory()
+        val component = TestComponent()
+        component.enableSavedStateHandles()
+        val vm = ViewModelProvider(component.viewModelStore, savedStateVMFactory, component.extras)
+        try {
+            vm[MyAndroidViewModel::class.java]
+            fail("Creating an AndroidViewModel should fail when no Application extras is provided")
+        } catch (e: RuntimeException) {
+        }
+        assertThat(vm[MyViewModel::class.java].handle).isNotNull()
+    }
+
+    @UiThreadTest
+    @Test
+    fun testLegacyCreateAndroidAbstractVM() {
         val activity = activityRule.activity
         val app = activity.application
         val savedStateVMFactory = object : AbstractSavedStateViewModelFactory(
@@ -91,7 +124,37 @@
             }
         }
         val vm = ViewModelProvider(ViewModelStore(), savedStateVMFactory)
-        assertThat(vm.get(MyAndroidViewModel::class.java).handle).isNotNull()
+        assertThat(vm[MyAndroidViewModel::class.java].handle).isNotNull()
+    }
+
+    @UiThreadTest
+    @Test
+    fun testLegacyMethodsWithEmptyConstructor() {
+        val factory = SavedStateViewModelFactory()
+        try {
+            factory.create(MyViewModel::class.java)
+            fail()
+        } catch (e: UnsupportedOperationException) {
+        }
+
+        try {
+            factory.create("a", MyViewModel::class.java)
+            fail()
+        } catch (e: UnsupportedOperationException) {
+        }
+
+        val absFactory = object : AbstractSavedStateViewModelFactory() {
+            override fun <T : ViewModel?> create(
+                key: String,
+                modelClass: Class<T>,
+                handle: SavedStateHandle
+            ): T = create(modelClass)
+        }
+        try {
+            absFactory.create(MyViewModel::class.java)
+            fail()
+        } catch (e: UnsupportedOperationException) {
+        }
     }
 
     internal class MyAndroidViewModel(app: Application, val handle: SavedStateHandle) :
@@ -100,4 +163,12 @@
     internal class MyViewModel(val handle: SavedStateHandle) : ViewModel()
 
     class MyActivity : FragmentActivity()
-}
+
+    val TestComponent.extras: MutableCreationExtras
+        get() {
+            val extras = MutableCreationExtras()
+            extras[SAVED_STATE_REGISTRY_OWNER_KEY] = this
+            extras[VIEW_MODEL_STORE_OWNER_KEY] = this
+            return extras
+        }
+}
\ No newline at end of file
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/SavedStateHandleSupportTest.kt b/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/SavedStateHandleSupportTest.kt
new file mode 100644
index 0000000..04426af
--- /dev/null
+++ b/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/SavedStateHandleSupportTest.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.lifecycle.viewmodel.savedstate
+
+import android.os.Bundle
+import androidx.lifecycle.enableSavedStateHandles
+import androidx.test.annotation.UiThreadTest
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assert
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class SavedStateHandleSupportTest {
+
+    @UiThreadTest
+    @Test
+    fun testSavedStateHandleSupport() {
+        val component = TestComponent()
+        component.enableSavedStateHandles()
+        val handle = component.createSavedStateHandle("test")
+        component.resume()
+        handle.set("a", "1")
+
+        val recreated = component.recreate(keepingViewModels = false)
+        recreated.enableSavedStateHandles()
+        val restoredHandle = recreated.createSavedStateHandle("test")
+
+        assertThat(restoredHandle.get<String>("a")).isEqualTo("1")
+    }
+
+    @UiThreadTest
+    @Test
+    fun testSavedStateHandleSupportWithConfigChange() {
+        val component = TestComponent()
+        component.enableSavedStateHandles()
+        val handle = component.createSavedStateHandle("test")
+        component.resume()
+        handle.set("a", "1")
+        val interim = component.recreate(keepingViewModels = true)
+        handle.set("b", "2")
+        interim.resume()
+
+        val recreated = interim.recreate(keepingViewModels = false)
+        recreated.enableSavedStateHandles()
+        val restoredHandle = recreated.createSavedStateHandle("test")
+
+        assertThat(restoredHandle.get<String>("a")).isEqualTo("1")
+        assertThat(restoredHandle.get<String>("b")).isEqualTo("2")
+    }
+
+    @UiThreadTest
+    @Test
+    fun failWithNoInstallation() {
+        val component = TestComponent()
+        try {
+            component.createSavedStateHandle("key")
+            Assert.fail("createSavedStateHandle should fail when install() wasn't called")
+        } catch (e: IllegalStateException) {
+        }
+    }
+
+    @UiThreadTest
+    @Test
+    fun defaultArgs() {
+        val component = TestComponent()
+        component.enableSavedStateHandles()
+        val bundle = Bundle()
+        bundle.putString("key", "value")
+        val handle = component.createSavedStateHandle("test", bundle)
+        assertThat(handle.get<String>("key")).isEqualTo("value")
+    }
+}
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/TestComponent.kt b/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/TestComponent.kt
new file mode 100644
index 0000000..156a52c
--- /dev/null
+++ b/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/TestComponent.kt
@@ -0,0 +1,75 @@
+/*
+ * 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.lifecycle.viewmodel.savedstate
+
+import android.os.Bundle
+import androidx.lifecycle.DEFAULT_ARGS_KEY
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.LifecycleOwner
+import androidx.lifecycle.LifecycleRegistry
+import androidx.lifecycle.SAVED_STATE_REGISTRY_OWNER_KEY
+import androidx.lifecycle.SavedStateHandle
+import androidx.lifecycle.VIEW_MODEL_STORE_OWNER_KEY
+import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.ViewModelStore
+import androidx.lifecycle.ViewModelStoreOwner
+import androidx.lifecycle.createSavedStateHandle
+import androidx.lifecycle.viewmodel.MutableCreationExtras
+import androidx.savedstate.SavedStateRegistry
+import androidx.savedstate.SavedStateRegistryController
+import androidx.savedstate.SavedStateRegistryOwner
+
+class TestComponent(
+    val vmStore: ViewModelStore = ViewModelStore(),
+    bundle: Bundle? = null,
+) : SavedStateRegistryOwner, LifecycleOwner, ViewModelStoreOwner {
+
+    private val lifecycleRegistry = LifecycleRegistry(this)
+    private val savedStateController = SavedStateRegistryController.create(this)
+
+    init {
+        savedStateController.performRestore(bundle)
+    }
+
+    override fun getLifecycle(): Lifecycle = lifecycleRegistry
+    override fun getSavedStateRegistry(): SavedStateRegistry =
+        savedStateController.savedStateRegistry
+
+    override fun getViewModelStore(): ViewModelStore = vmStore
+
+    fun resume() {
+        lifecycleRegistry.currentState = Lifecycle.State.RESUMED
+    }
+
+    fun recreate(keepingViewModels: Boolean): TestComponent {
+        val bundle = Bundle()
+        lifecycleRegistry.currentState = Lifecycle.State.CREATED
+        savedStateController.performSave(bundle)
+        lifecycleRegistry.currentState = Lifecycle.State.DESTROYED
+        if (!keepingViewModels) vmStore.clear()
+        return TestComponent(vmStore.takeIf { keepingViewModels } ?: ViewModelStore(), bundle)
+    }
+
+    fun createSavedStateHandle(key: String, bundle: Bundle? = null): SavedStateHandle {
+        val extras = MutableCreationExtras()
+        extras[VIEW_MODEL_STORE_OWNER_KEY] = this
+        extras[SAVED_STATE_REGISTRY_OWNER_KEY] = this
+        extras[ViewModelProvider.NewInstanceFactory.VIEW_MODEL_KEY] = key
+        if (bundle != null) extras[DEFAULT_ARGS_KEY] = bundle
+        return extras.createSavedStateHandle()
+    }
+}
\ No newline at end of file
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/ViewModelsWithStateTest.kt b/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/ViewModelsWithStateTest.kt
index bb6605f..c9d5d4e 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/ViewModelsWithStateTest.kt
+++ b/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/ViewModelsWithStateTest.kt
@@ -21,13 +21,19 @@
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.FragmentActivity
 import androidx.lifecycle.AbstractSavedStateViewModelFactory
+import androidx.lifecycle.HasDefaultViewModelProviderFactory
 import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.SAVED_STATE_REGISTRY_OWNER_KEY
 import androidx.lifecycle.SavedStateHandle
 import androidx.lifecycle.SavedStateViewModelFactory
+import androidx.lifecycle.VIEW_MODEL_STORE_OWNER_KEY
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.ViewModelProvider.Factory
 import androidx.lifecycle.ViewModelStoreOwner
+import androidx.lifecycle.enableSavedStateHandles
+import androidx.lifecycle.viewmodel.CreationExtras
+import androidx.lifecycle.viewmodel.MutableCreationExtras
 import androidx.savedstate.SavedStateRegistryOwner
 import androidx.test.core.app.ActivityScenario
 import androidx.test.filters.MediumTest
@@ -40,8 +46,10 @@
 internal const val FRAGMENT_MODE = "fragment"
 internal const val ACTIVITY_MODE = "activity"
 
-internal const val ABSTRACT_FACTORY_MODE = "abstract"
+internal const val LEGACY_ABSTRACT_FACTORY_MODE = "legacy_abstract"
+internal const val LEGACY_SAVEDSTATE_FACTORY_MODE = "legacy_non_abstract"
 internal const val SAVEDSTATE_FACTORY_MODE = "non_abstract"
+internal const val ABSTRACT_FACTORY_MODE = "abstract"
 
 @RunWith(Parameterized::class)
 @MediumTest
@@ -53,10 +61,14 @@
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
         fun initParameters(): Array<Any> = arrayOf(
+            Mode(FRAGMENT_MODE, LEGACY_SAVEDSTATE_FACTORY_MODE),
             Mode(FRAGMENT_MODE, SAVEDSTATE_FACTORY_MODE),
+            Mode(FRAGMENT_MODE, LEGACY_ABSTRACT_FACTORY_MODE),
             Mode(FRAGMENT_MODE, ABSTRACT_FACTORY_MODE),
+            Mode(ACTIVITY_MODE, LEGACY_SAVEDSTATE_FACTORY_MODE),
             Mode(ACTIVITY_MODE, SAVEDSTATE_FACTORY_MODE),
-            Mode(ACTIVITY_MODE, ABSTRACT_FACTORY_MODE)
+            Mode(ACTIVITY_MODE, LEGACY_ABSTRACT_FACTORY_MODE),
+            Mode(ACTIVITY_MODE, ABSTRACT_FACTORY_MODE),
         )
     }
 
@@ -147,22 +159,40 @@
 
         val savedStateOwner = owner as SavedStateRegistryOwner
 
-        val factory = if (mode.factoryMode == SAVEDSTATE_FACTORY_MODE) {
-            // otherwise common type of factory is package private KeyedFactory
-            @Suppress("USELESS_CAST")
-            SavedStateViewModelFactory(activity.application, savedStateOwner) as Factory
-        } else {
-            object : AbstractSavedStateViewModelFactory(savedStateOwner, null) {
-                override fun <T : ViewModel> create(
-                    key: String,
-                    modelClass: Class<T>,
-                    handle: SavedStateHandle
-                ): T {
-                    return modelClass.cast(VM(handle))!!
+        val factory: Factory = when (mode.factoryMode) {
+            LEGACY_SAVEDSTATE_FACTORY_MODE -> {
+                // otherwise common type of factory is package private KeyedFactory
+                SavedStateViewModelFactory(activity.application, savedStateOwner)
+            }
+            SAVEDSTATE_FACTORY_MODE -> {
+                SavedStateViewModelFactory()
+            }
+            LEGACY_ABSTRACT_FACTORY_MODE -> {
+                object : AbstractSavedStateViewModelFactory(savedStateOwner, null) {
+                    override fun <T : ViewModel> create(
+                        key: String,
+                        modelClass: Class<T>,
+                        handle: SavedStateHandle
+                    ): T {
+                        return modelClass.cast(VM(handle))!!
+                    }
+                }
+            }
+            else -> {
+                object : AbstractSavedStateViewModelFactory() {
+                    override fun <T : ViewModel> create(
+                        key: String,
+                        modelClass: Class<T>,
+                        handle: SavedStateHandle
+                    ): T {
+                        return modelClass.cast(VM(handle))!!
+                    }
                 }
             }
         }
-        return ViewModelProvider(owner, factory)
+        return if (mode.factoryMode in setOf(ABSTRACT_FACTORY_MODE, SAVEDSTATE_FACTORY_MODE))
+            ViewModelProvider(DecorateWithCreationExtras(savedStateOwner, owner), factory)
+        else ViewModelProvider(owner, factory)
     }
 
     class VM(handle: SavedStateHandle) : ViewModel() {
@@ -194,8 +224,10 @@
     override fun onCreate(savedInstanceState: Bundle?) {
         val alternativeState = savedInstanceState ?: fakeSavedState()
         super.onCreate(alternativeState)
+        enableSavedStateHandles()
         if (alternativeState == null) {
-            supportFragmentManager.beginTransaction().add(Fragment(), FRAGMENT_TAG).commitNow()
+            supportFragmentManager.beginTransaction()
+                .add(FragmentWithSavedStateHandleSupport(), FRAGMENT_TAG).commitNow()
         }
     }
 
@@ -204,3 +236,29 @@
         savedState = outState
     }
 }
+
+class FragmentWithSavedStateHandleSupport : Fragment() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        enableSavedStateHandles()
+    }
+}
+
+class DecorateWithCreationExtras(
+    val ssrOwner: SavedStateRegistryOwner,
+    val vmOwner: ViewModelStoreOwner
+) : ViewModelStoreOwner by vmOwner,
+    SavedStateRegistryOwner by ssrOwner,
+    HasDefaultViewModelProviderFactory {
+
+    override fun getDefaultViewModelProviderFactory(): Factory {
+        throw UnsupportedOperationException()
+    }
+
+    override fun getDefaultViewModelCreationExtras(): CreationExtras {
+        val extras = MutableCreationExtras()
+        extras[SAVED_STATE_REGISTRY_OWNER_KEY] = this
+        extras[VIEW_MODEL_STORE_OWNER_KEY] = this
+        return extras
+    }
+}
\ No newline at end of file
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateViewModelFactory.java b/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateViewModelFactory.java
index 9ef64fe..dad9f6f 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateViewModelFactory.java
+++ b/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateViewModelFactory.java
@@ -16,9 +16,10 @@
 
 package androidx.lifecycle;
 
-import static androidx.lifecycle.SavedStateHandleController.attachHandleIfNeeded;
+import static androidx.lifecycle.LegacySavedStateHandleController.attachHandleIfNeeded;
 import static androidx.lifecycle.ViewModelProvider.NewInstanceFactory.VIEW_MODEL_KEY;
 
+import android.annotation.SuppressLint;
 import android.os.Bundle;
 
 import androidx.annotation.NonNull;
@@ -38,9 +39,21 @@
         implements ViewModelProvider.Factory {
     static final String TAG_SAVED_STATE_HANDLE_CONTROLLER = "androidx.lifecycle.savedstate.vm.tag";
 
-    private final SavedStateRegistry mSavedStateRegistry;
-    private final Lifecycle mLifecycle;
-    private final Bundle mDefaultArgs;
+    private SavedStateRegistry mSavedStateRegistry;
+    private Lifecycle mLifecycle;
+    private Bundle mDefaultArgs;
+
+    /**
+     * Constructs this factory.
+     * <p>
+     * When a factory is constructed this way, a component for which {@link SavedStateHandle} is
+     * scoped must have called
+     * {@link SavedStateHandleSupport#enableSavedStateHandles(SavedStateRegistryOwner)}.
+     * See {@link SavedStateHandleSupport#createSavedStateHandle(CreationExtras)} docs for more
+     * details.
+     */
+    public AbstractSavedStateViewModelFactory() {
+    }
 
     /**
      * Constructs this factory.
@@ -52,6 +65,7 @@
      *                    if there is no previously saved state
      *                    or previously saved state misses a value by such key
      */
+    @SuppressLint("LambdaLast")
     public AbstractSavedStateViewModelFactory(@NonNull SavedStateRegistryOwner owner,
             @Nullable Bundle defaultArgs) {
         mSavedStateRegistry = owner.getSavedStateRegistry();
@@ -68,13 +82,18 @@
             throw new IllegalStateException(
                     "VIEW_MODEL_KEY must always be provided by ViewModelProvider");
         }
-        return create(key, modelClass);
+        // if a factory constructed in the old way use the old infra to create SavedStateHandle
+        if (mSavedStateRegistry != null) {
+            return create(key, modelClass);
+        } else {
+            return create(key, modelClass, SavedStateHandleSupport.createSavedStateHandle(extras));
+        }
     }
 
     @NonNull
     private <T extends ViewModel> T create(@NonNull String key, @NonNull Class<T> modelClass) {
-        SavedStateHandleController controller = SavedStateHandleController.create(
-                mSavedStateRegistry, mLifecycle, key, mDefaultArgs);
+        SavedStateHandleController controller = LegacySavedStateHandleController
+                .create(mSavedStateRegistry, mLifecycle, key, mDefaultArgs);
         T viewmodel = create(key, modelClass, controller.getHandle());
         viewmodel.setTagIfAbsent(TAG_SAVED_STATE_HANDLE_CONTROLLER, controller);
         return viewmodel;
@@ -90,6 +109,13 @@
         if (canonicalName == null) {
             throw new IllegalArgumentException("Local and anonymous classes can not be ViewModels");
         }
+        if (mLifecycle == null) {
+            throw new UnsupportedOperationException(
+                    "AbstractSavedStateViewModelFactory constructed "
+                            + "with empty constructor supports only calls to "
+                            +   "create(modelClass: Class<T>, extras: CreationExtras)."
+            );
+        }
         return create(canonicalName, modelClass);
     }
 
@@ -113,7 +139,10 @@
     @Override
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public void onRequery(@NonNull ViewModel viewModel) {
-        attachHandleIfNeeded(viewModel, mSavedStateRegistry, mLifecycle);
+        // is need only for legacy path
+        if (mSavedStateRegistry != null) {
+            attachHandleIfNeeded(viewModel, mSavedStateRegistry, mLifecycle);
+        }
     }
 }
 
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/LegacySavedStateHandleController.java b/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/LegacySavedStateHandleController.java
new file mode 100644
index 0000000..f7f9033
--- /dev/null
+++ b/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/LegacySavedStateHandleController.java
@@ -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.lifecycle;
+
+import static androidx.lifecycle.Lifecycle.State.INITIALIZED;
+import static androidx.lifecycle.Lifecycle.State.STARTED;
+
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+import androidx.savedstate.SavedStateRegistry;
+import androidx.savedstate.SavedStateRegistryOwner;
+
+class LegacySavedStateHandleController {
+
+    private LegacySavedStateHandleController() {}
+
+    static final String TAG_SAVED_STATE_HANDLE_CONTROLLER = "androidx.lifecycle.savedstate.vm.tag";
+
+    static SavedStateHandleController create(SavedStateRegistry registry, Lifecycle lifecycle,
+            String key, Bundle defaultArgs) {
+        Bundle restoredState = registry.consumeRestoredStateForKey(key);
+        SavedStateHandle handle = SavedStateHandle.createHandle(restoredState, defaultArgs);
+        SavedStateHandleController controller = new SavedStateHandleController(key, handle);
+        controller.attachToLifecycle(registry, lifecycle);
+        tryToAddRecreator(registry, lifecycle);
+        return controller;
+    }
+
+    static final class OnRecreation implements SavedStateRegistry.AutoRecreated {
+
+        @Override
+        public void onRecreated(@NonNull SavedStateRegistryOwner owner) {
+            if (!(owner instanceof ViewModelStoreOwner)) {
+                throw new IllegalStateException(
+                        "Internal error: OnRecreation should be registered only on components"
+                                + " that implement ViewModelStoreOwner");
+            }
+            ViewModelStore viewModelStore = ((ViewModelStoreOwner) owner).getViewModelStore();
+            SavedStateRegistry savedStateRegistry = owner.getSavedStateRegistry();
+            for (String key : viewModelStore.keys()) {
+                ViewModel viewModel = viewModelStore.get(key);
+                attachHandleIfNeeded(viewModel, savedStateRegistry, owner.getLifecycle());
+            }
+            if (!viewModelStore.keys().isEmpty()) {
+                savedStateRegistry.runOnNextRecreation(OnRecreation.class);
+            }
+        }
+    }
+
+    static void attachHandleIfNeeded(ViewModel viewModel, SavedStateRegistry registry,
+            Lifecycle lifecycle) {
+        SavedStateHandleController controller = viewModel.getTag(
+                TAG_SAVED_STATE_HANDLE_CONTROLLER);
+        if (controller != null && !controller.isAttached()) {
+            controller.attachToLifecycle(registry, lifecycle);
+            tryToAddRecreator(registry, lifecycle);
+        }
+    }
+
+    private static void tryToAddRecreator(SavedStateRegistry registry, Lifecycle lifecycle) {
+        Lifecycle.State currentState = lifecycle.getCurrentState();
+        if (currentState == INITIALIZED || currentState.isAtLeast(STARTED)) {
+            registry.runOnNextRecreation(OnRecreation.class);
+        } else {
+            lifecycle.addObserver(new LifecycleEventObserver() {
+                @Override
+                public void onStateChanged(@NonNull LifecycleOwner source,
+                        @NonNull Lifecycle.Event event) {
+                    if (event == Lifecycle.Event.ON_START) {
+                        lifecycle.removeObserver(this);
+                        registry.runOnNextRecreation(OnRecreation.class);
+                    }
+                }
+            });
+        }
+    }
+}
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateHandleController.java b/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateHandleController.java
index 777356a..33797c7 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateHandleController.java
+++ b/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateHandleController.java
@@ -16,18 +16,10 @@
 
 package androidx.lifecycle;
 
-import static androidx.lifecycle.Lifecycle.State.INITIALIZED;
-import static androidx.lifecycle.Lifecycle.State.STARTED;
-
-import android.os.Bundle;
-
 import androidx.annotation.NonNull;
 import androidx.savedstate.SavedStateRegistry;
-import androidx.savedstate.SavedStateRegistryOwner;
 
 final class SavedStateHandleController implements LifecycleEventObserver {
-    static final String TAG_SAVED_STATE_HANDLE_CONTROLLER = "androidx.lifecycle.savedstate.vm.tag";
-
     private final String mKey;
     private boolean mIsAttached = false;
     private final SavedStateHandle mHandle;
@@ -61,63 +53,4 @@
     SavedStateHandle getHandle() {
         return mHandle;
     }
-
-    static SavedStateHandleController create(SavedStateRegistry registry, Lifecycle lifecycle,
-            String key, Bundle defaultArgs) {
-        Bundle restoredState = registry.consumeRestoredStateForKey(key);
-        SavedStateHandle handle = SavedStateHandle.createHandle(restoredState, defaultArgs);
-        SavedStateHandleController controller = new SavedStateHandleController(key, handle);
-        controller.attachToLifecycle(registry, lifecycle);
-        tryToAddRecreator(registry, lifecycle);
-        return controller;
-    }
-
-    static final class OnRecreation implements SavedStateRegistry.AutoRecreated {
-
-        @Override
-        public void onRecreated(@NonNull SavedStateRegistryOwner owner) {
-            if (!(owner instanceof ViewModelStoreOwner)) {
-                throw new IllegalStateException(
-                        "Internal error: OnRecreation should be registered only on components"
-                                + "that implement ViewModelStoreOwner");
-            }
-            ViewModelStore viewModelStore = ((ViewModelStoreOwner) owner).getViewModelStore();
-            SavedStateRegistry savedStateRegistry = owner.getSavedStateRegistry();
-            for (String key : viewModelStore.keys()) {
-                ViewModel viewModel = viewModelStore.get(key);
-                attachHandleIfNeeded(viewModel, savedStateRegistry, owner.getLifecycle());
-            }
-            if (!viewModelStore.keys().isEmpty()) {
-                savedStateRegistry.runOnNextRecreation(OnRecreation.class);
-            }
-        }
-    }
-
-    static void attachHandleIfNeeded(ViewModel viewModel, SavedStateRegistry registry,
-            Lifecycle lifecycle) {
-        SavedStateHandleController controller = viewModel.getTag(
-                TAG_SAVED_STATE_HANDLE_CONTROLLER);
-        if (controller != null && !controller.isAttached()) {
-            controller.attachToLifecycle(registry, lifecycle);
-            tryToAddRecreator(registry, lifecycle);
-        }
-    }
-
-    private static void tryToAddRecreator(SavedStateRegistry registry, Lifecycle lifecycle) {
-        Lifecycle.State currentState = lifecycle.getCurrentState();
-        if (currentState == INITIALIZED || currentState.isAtLeast(STARTED)) {
-            registry.runOnNextRecreation(OnRecreation.class);
-        } else {
-            lifecycle.addObserver(new LifecycleEventObserver() {
-                @Override
-                public void onStateChanged(@NonNull LifecycleOwner source,
-                        @NonNull Lifecycle.Event event) {
-                    if (event == Lifecycle.Event.ON_START) {
-                        lifecycle.removeObserver(this);
-                        registry.runOnNextRecreation(OnRecreation.class);
-                    }
-                }
-            });
-        }
-    }
 }
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateHandleSupport.kt b/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateHandleSupport.kt
new file mode 100644
index 0000000..42401de
--- /dev/null
+++ b/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateHandleSupport.kt
@@ -0,0 +1,162 @@
+/*
+ * 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.
+ */
+
+@file:JvmName("SavedStateHandleSupport")
+
+package androidx.lifecycle
+
+import android.os.Bundle
+import androidx.annotation.MainThread
+import androidx.lifecycle.ViewModelProvider.NewInstanceFactory.Companion.VIEW_MODEL_KEY
+import androidx.lifecycle.viewmodel.CreationExtras
+import androidx.savedstate.SavedStateRegistry
+import androidx.savedstate.SavedStateRegistryOwner
+
+private const val VIEWMODEL_KEY = "androidx.lifecycle.internal.SavedStateHandlesVM"
+
+/**
+ * Enables the support of [SavedStateHandle] in a component.
+ *
+ * After this method, [createSavedStateHandle] can be called on [CreationExtras] containing this
+ * [SavedStateRegistryOwner] / [ViewModelStoreOwner].
+ *
+ * Must be called while component is in `INITIALIZED` or `CREATED` state and before
+ * a [ViewModel] with [SavedStateHandle] is requested.
+ */
+@MainThread
+fun <T> T.enableSavedStateHandles()
+    where T : SavedStateRegistryOwner, T : ViewModelStoreOwner {
+    val currentState = lifecycle.currentState
+    require(
+        currentState == Lifecycle.State.INITIALIZED || currentState == Lifecycle.State.CREATED
+    )
+
+    // make sure that SavedStateHandlesVM is created.
+    ViewModelProvider(this, object : ViewModelProvider.Factory {
+        override fun <T : ViewModel> create(modelClass: Class<T>): T {
+            @Suppress("UNCHECKED_CAST")
+            return SavedStateHandlesVM() as T
+        }
+    })[VIEWMODEL_KEY, SavedStateHandlesVM::class.java]
+
+    savedStateRegistry.runOnNextRecreation(SavedStateHandleAttacher::class.java)
+}
+
+private fun createSavedStateHandle(
+    savedStateRegistryOwner: SavedStateRegistryOwner,
+    viewModelStoreOwner: ViewModelStoreOwner,
+    key: String,
+    defaultArgs: Bundle?
+): SavedStateHandle {
+    val vm = viewModelStoreOwner.savedStateHandlesVM
+    val savedStateRegistry = savedStateRegistryOwner.savedStateRegistry
+    val handle = SavedStateHandle.createHandle(
+        savedStateRegistry.consumeRestoredStateForKey(key), defaultArgs
+    )
+    val controller = SavedStateHandleController(key, handle)
+    controller.attachToLifecycle(savedStateRegistry, savedStateRegistryOwner.lifecycle)
+    vm.controllers.add(controller)
+
+    return handle
+}
+
+/**
+ * Creates `SavedStateHandle` that can be used in your ViewModels
+ *
+ * This function requires `this.installSavedStateHandleSupport()` call during the component
+ * initialization. Latest versions of androidx components like `ComponentActivity`, `Fragment`,
+ * `NavBackStackEntry` makes this call automatically.
+ *
+ * This [CreationExtras] must contain [SAVED_STATE_REGISTRY_OWNER_KEY],
+ * [VIEW_MODEL_STORE_OWNER_KEY] and [VIEW_MODEL_KEY].
+ *
+ * @throws IllegalArgumentException if this `CreationExtras` are missing required keys:
+ * `ViewModelStoreOwnerKey`, `SavedStateRegistryOwnerKey`, `VIEW_MODEL_KEY`
+ */
+@MainThread
+public fun CreationExtras.createSavedStateHandle(): SavedStateHandle {
+    val savedStateRegistryOwner = this[SAVED_STATE_REGISTRY_OWNER_KEY]
+        ?: throw IllegalArgumentException(
+            "CreationExtras must have a value by `SAVED_STATE_REGISTRY_OWNER_KEY`"
+        )
+    val viewModelStateRegistryOwner = this[VIEW_MODEL_STORE_OWNER_KEY]
+        ?: throw IllegalArgumentException(
+            "CreationExtras must have a value by `VIEW_MODEL_STORE_OWNER_KEY`"
+        )
+
+    val defaultArgs = this[DEFAULT_ARGS_KEY]
+    val key = this[VIEW_MODEL_KEY] ?: throw IllegalArgumentException(
+        "CreationExtras must have a value by `VIEW_MODEL_KEY`"
+    )
+    return createSavedStateHandle(
+        savedStateRegistryOwner, viewModelStateRegistryOwner, key, defaultArgs
+    )
+}
+
+internal object ThrowingFactory : ViewModelProvider.Factory {
+    override fun <T : ViewModel> create(modelClass: Class<T>): T {
+        throw IllegalStateException(
+            "installSavedStateHandleSupport() wasn't called " +
+                "prior to createSavedStateHandle() call"
+        )
+    }
+}
+
+internal val ViewModelStoreOwner.savedStateHandlesVM: SavedStateHandlesVM
+    get() =
+        ViewModelProvider(this, ThrowingFactory)[VIEWMODEL_KEY, SavedStateHandlesVM::class.java]
+
+internal class SavedStateHandlesVM : ViewModel() {
+    val controllers = mutableListOf<SavedStateHandleController>()
+}
+
+// it reconnects existent SavedStateHandles to SavedStateRegistryOwner when it is recreated
+internal class SavedStateHandleAttacher : SavedStateRegistry.AutoRecreated {
+    override fun onRecreated(owner: SavedStateRegistryOwner) {
+        if (owner !is ViewModelStoreOwner) {
+            throw java.lang.IllegalStateException(
+                "Internal error: SavedStateHandleAttacher should be registered only on components" +
+                    "that implement ViewModelStoreOwner"
+            )
+        }
+        val viewModelStore = (owner as ViewModelStoreOwner).viewModelStore
+        // if savedStateHandlesVM wasn't created previously, we shouldn't trigger a creation of it
+        if (!viewModelStore.keys().contains(VIEWMODEL_KEY)) return
+        owner.savedStateHandlesVM.controllers.forEach {
+            it.attachToLifecycle(owner.savedStateRegistry, owner.lifecycle)
+        }
+        owner.savedStateRegistry.runOnNextRecreation(SavedStateHandleAttacher::class.java)
+    }
+}
+
+/**
+ * A key for [SavedStateRegistryOwner] that corresponds to [ViewModelStoreOwner]
+ * of a [ViewModel] that is being created.
+ */
+@JvmField
+val SAVED_STATE_REGISTRY_OWNER_KEY = object : CreationExtras.Key<SavedStateRegistryOwner> {}
+
+/**
+ * A key for [ViewModelStoreOwner] that is an owner of a [ViewModel] that is being created.
+ */
+@JvmField
+val VIEW_MODEL_STORE_OWNER_KEY = object : CreationExtras.Key<ViewModelStoreOwner> {}
+
+/**
+ * A key for default arguments that should be passed to [SavedStateHandle] if needed.
+ */
+@JvmField
+val DEFAULT_ARGS_KEY = object : CreationExtras.Key<Bundle> {}
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateViewModelFactory.java b/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateViewModelFactory.java
index 6a79f98..879a338 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateViewModelFactory.java
+++ b/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateViewModelFactory.java
@@ -17,7 +17,8 @@
 package androidx.lifecycle;
 
 import static androidx.lifecycle.AbstractSavedStateViewModelFactory.TAG_SAVED_STATE_HANDLE_CONTROLLER;
-import static androidx.lifecycle.SavedStateHandleController.attachHandleIfNeeded;
+import static androidx.lifecycle.LegacySavedStateHandleController.attachHandleIfNeeded;
+import static androidx.lifecycle.SavedStateHandleSupport.createSavedStateHandle;
 import static androidx.lifecycle.ViewModelProvider.NewInstanceFactory.VIEW_MODEL_KEY;
 
 import android.annotation.SuppressLint;
@@ -27,6 +28,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
+import androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory;
 import androidx.lifecycle.viewmodel.CreationExtras;
 import androidx.savedstate.SavedStateRegistry;
 import androidx.savedstate.SavedStateRegistryOwner;
@@ -48,11 +50,24 @@
  */
 public final class SavedStateViewModelFactory extends ViewModelProvider.OnRequeryFactory
         implements ViewModelProvider.Factory {
-    private final Application mApplication;
+    private Application mApplication;
     private final ViewModelProvider.Factory mFactory;
-    private final Bundle mDefaultArgs;
-    private final Lifecycle mLifecycle;
-    private final SavedStateRegistry mSavedStateRegistry;
+    private Bundle mDefaultArgs;
+    private Lifecycle mLifecycle;
+    private SavedStateRegistry mSavedStateRegistry;
+
+    /**
+     * Constructs this factory.
+     * <p>
+     * When a factory is constructed this way, a component for which {@link SavedStateHandle} is
+     * scoped must have called
+     * {@link SavedStateHandleSupport#enableSavedStateHandles(SavedStateRegistryOwner)}.
+     * See {@link SavedStateHandleSupport#createSavedStateHandle(CreationExtras)} docs for more
+     * details.
+     */
+    public SavedStateViewModelFactory() {
+        mFactory = new AndroidViewModelFactory();
+    }
 
     /**
      * Creates {@link SavedStateViewModelFactory}.
@@ -66,7 +81,7 @@
      *                                                   created
      *                    {@link androidx.lifecycle.ViewModel ViewModels}
      */
-    public SavedStateViewModelFactory(@Nullable  Application application,
+    public SavedStateViewModelFactory(@Nullable Application application,
             @NonNull SavedStateRegistryOwner owner) {
         this(application, owner, null);
     }
@@ -96,7 +111,7 @@
         mDefaultArgs = defaultArgs;
         mApplication = application;
         mFactory = application != null
-                ? ViewModelProvider.AndroidViewModelFactory.getInstance(application)
+                ? AndroidViewModelFactory.getInstance(application)
                 : ViewModelProvider.NewInstanceFactory.getInstance();
     }
 
@@ -109,7 +124,31 @@
             throw new IllegalStateException(
                     "VIEW_MODEL_KEY must always be provided by ViewModelProvider");
         }
-        return create(key, modelClass);
+        // legacy constructor was called
+        if (mLifecycle != null) {
+            return create(key, modelClass);
+        }
+        Application application = extras.get(AndroidViewModelFactory.APPLICATION_KEY);
+        Constructor<T> constructor;
+        boolean isAndroidViewModel = AndroidViewModel.class.isAssignableFrom(modelClass);
+        if (isAndroidViewModel && application != null) {
+            constructor = findMatchingConstructor(modelClass, ANDROID_VIEWMODEL_SIGNATURE);
+        } else {
+            constructor = findMatchingConstructor(modelClass, VIEWMODEL_SIGNATURE);
+        }
+        // doesn't need SavedStateHandle
+        if (constructor == null) {
+            return mFactory.create(modelClass, extras);
+        }
+
+        T viewmodel;
+        if (isAndroidViewModel && application != null) {
+            viewmodel = newInstance(modelClass, constructor, application,
+                    createSavedStateHandle(extras));
+        } else {
+            viewmodel = newInstance(modelClass, constructor, createSavedStateHandle(extras));
+        }
+        return viewmodel;
     }
 
     /**
@@ -121,6 +160,15 @@
      */
     @NonNull
     public <T extends ViewModel> T create(@NonNull String key, @NonNull Class<T> modelClass) {
+        // empty constructor was called.
+        if (mLifecycle == null) {
+            throw new UnsupportedOperationException(
+                    "SavedStateViewModelFactory constructed "
+                            + "with empty constructor supports only calls to "
+                            + "create(modelClass: Class<T>, extras: CreationExtras)."
+            );
+        }
+
         boolean isAndroidViewModel = AndroidViewModel.class.isAssignableFrom(modelClass);
         Constructor<T> constructor;
         if (isAndroidViewModel && mApplication != null) {
@@ -133,17 +181,22 @@
             return mFactory.create(modelClass);
         }
 
-        SavedStateHandleController controller = SavedStateHandleController.create(
+        SavedStateHandleController controller = LegacySavedStateHandleController.create(
                 mSavedStateRegistry, mLifecycle, key, mDefaultArgs);
+        T viewmodel;
+        if (isAndroidViewModel && mApplication != null) {
+            viewmodel = newInstance(modelClass, constructor, mApplication, controller.getHandle());
+        } else {
+            viewmodel = newInstance(modelClass, constructor, controller.getHandle());
+        }
+        viewmodel.setTagIfAbsent(TAG_SAVED_STATE_HANDLE_CONTROLLER, controller);
+        return viewmodel;
+    }
+
+    private static <T extends ViewModel> T newInstance(@NonNull Class<T> modelClass,
+            Constructor<T> constructor, Object... params) {
         try {
-            T viewmodel;
-            if (isAndroidViewModel && mApplication != null) {
-                viewmodel = constructor.newInstance(mApplication, controller.getHandle());
-            } else {
-                viewmodel = constructor.newInstance(controller.getHandle());
-            }
-            viewmodel.setTagIfAbsent(TAG_SAVED_STATE_HANDLE_CONTROLLER, controller);
-            return viewmodel;
+            return constructor.newInstance(params);
         } catch (IllegalAccessException e) {
             throw new RuntimeException("Failed to access " + modelClass, e);
         } catch (InstantiationException e) {
@@ -171,6 +224,8 @@
             SavedStateHandle.class};
     private static final Class<?>[] VIEWMODEL_SIGNATURE = new Class[]{SavedStateHandle.class};
 
+    // it is done instead of getConstructor(), because getConstructor() throws an exception
+    // if there is no such constructor, which is expensive
     @SuppressWarnings("unchecked")
     private static <T> Constructor<T> findMatchingConstructor(Class<T> modelClass,
             Class<?>[] signature) {
@@ -189,6 +244,9 @@
     @Override
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     public void onRequery(@NonNull ViewModel viewModel) {
-        attachHandleIfNeeded(viewModel, mSavedStateRegistry, mLifecycle);
+        // needed only for legacy path
+        if (mLifecycle != null) {
+            attachHandleIfNeeded(viewModel, mSavedStateRegistry, mLifecycle);
+        }
     }
 }
diff --git a/lifecycle/lifecycle-viewmodel/api/current.txt b/lifecycle/lifecycle-viewmodel/api/current.txt
index d63c190..2d1338d 100644
--- a/lifecycle/lifecycle-viewmodel/api/current.txt
+++ b/lifecycle/lifecycle-viewmodel/api/current.txt
@@ -7,6 +7,7 @@
   }
 
   public interface HasDefaultViewModelProviderFactory {
+    method public default androidx.lifecycle.viewmodel.CreationExtras getDefaultViewModelCreationExtras();
     method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
   }
 
@@ -23,6 +24,7 @@
   }
 
   public class ViewModelProvider {
+    ctor public ViewModelProvider(androidx.lifecycle.ViewModelStore store, androidx.lifecycle.ViewModelProvider.Factory factory, optional androidx.lifecycle.viewmodel.CreationExtras defaultCreationExtras);
     ctor public ViewModelProvider(androidx.lifecycle.ViewModelStore store, androidx.lifecycle.ViewModelProvider.Factory factory);
     ctor public ViewModelProvider(androidx.lifecycle.ViewModelStoreOwner owner);
     ctor public ViewModelProvider(androidx.lifecycle.ViewModelStoreOwner owner, androidx.lifecycle.ViewModelProvider.Factory factory);
@@ -31,8 +33,10 @@
   }
 
   public static class ViewModelProvider.AndroidViewModelFactory extends androidx.lifecycle.ViewModelProvider.NewInstanceFactory {
+    ctor public ViewModelProvider.AndroidViewModelFactory();
     ctor public ViewModelProvider.AndroidViewModelFactory(android.app.Application application);
     method public static final androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory getInstance(android.app.Application application);
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<android.app.Application> APPLICATION_KEY;
     field public static final androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion Companion;
   }
 
@@ -84,6 +88,11 @@
     method public operator <T> T? get(androidx.lifecycle.viewmodel.CreationExtras.Key<T> key);
   }
 
+  public static final class CreationExtras.Empty implements androidx.lifecycle.viewmodel.CreationExtras {
+    method public <T> T? get(androidx.lifecycle.viewmodel.CreationExtras.Key<T> key);
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Empty INSTANCE;
+  }
+
   public static interface CreationExtras.Key<T> {
   }
 
diff --git a/lifecycle/lifecycle-viewmodel/api/public_plus_experimental_current.txt b/lifecycle/lifecycle-viewmodel/api/public_plus_experimental_current.txt
index d63c190..2d1338d 100644
--- a/lifecycle/lifecycle-viewmodel/api/public_plus_experimental_current.txt
+++ b/lifecycle/lifecycle-viewmodel/api/public_plus_experimental_current.txt
@@ -7,6 +7,7 @@
   }
 
   public interface HasDefaultViewModelProviderFactory {
+    method public default androidx.lifecycle.viewmodel.CreationExtras getDefaultViewModelCreationExtras();
     method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
   }
 
@@ -23,6 +24,7 @@
   }
 
   public class ViewModelProvider {
+    ctor public ViewModelProvider(androidx.lifecycle.ViewModelStore store, androidx.lifecycle.ViewModelProvider.Factory factory, optional androidx.lifecycle.viewmodel.CreationExtras defaultCreationExtras);
     ctor public ViewModelProvider(androidx.lifecycle.ViewModelStore store, androidx.lifecycle.ViewModelProvider.Factory factory);
     ctor public ViewModelProvider(androidx.lifecycle.ViewModelStoreOwner owner);
     ctor public ViewModelProvider(androidx.lifecycle.ViewModelStoreOwner owner, androidx.lifecycle.ViewModelProvider.Factory factory);
@@ -31,8 +33,10 @@
   }
 
   public static class ViewModelProvider.AndroidViewModelFactory extends androidx.lifecycle.ViewModelProvider.NewInstanceFactory {
+    ctor public ViewModelProvider.AndroidViewModelFactory();
     ctor public ViewModelProvider.AndroidViewModelFactory(android.app.Application application);
     method public static final androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory getInstance(android.app.Application application);
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<android.app.Application> APPLICATION_KEY;
     field public static final androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion Companion;
   }
 
@@ -84,6 +88,11 @@
     method public operator <T> T? get(androidx.lifecycle.viewmodel.CreationExtras.Key<T> key);
   }
 
+  public static final class CreationExtras.Empty implements androidx.lifecycle.viewmodel.CreationExtras {
+    method public <T> T? get(androidx.lifecycle.viewmodel.CreationExtras.Key<T> key);
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Empty INSTANCE;
+  }
+
   public static interface CreationExtras.Key<T> {
   }
 
diff --git a/lifecycle/lifecycle-viewmodel/api/restricted_current.txt b/lifecycle/lifecycle-viewmodel/api/restricted_current.txt
index d63c190..2d1338d 100644
--- a/lifecycle/lifecycle-viewmodel/api/restricted_current.txt
+++ b/lifecycle/lifecycle-viewmodel/api/restricted_current.txt
@@ -7,6 +7,7 @@
   }
 
   public interface HasDefaultViewModelProviderFactory {
+    method public default androidx.lifecycle.viewmodel.CreationExtras getDefaultViewModelCreationExtras();
     method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
   }
 
@@ -23,6 +24,7 @@
   }
 
   public class ViewModelProvider {
+    ctor public ViewModelProvider(androidx.lifecycle.ViewModelStore store, androidx.lifecycle.ViewModelProvider.Factory factory, optional androidx.lifecycle.viewmodel.CreationExtras defaultCreationExtras);
     ctor public ViewModelProvider(androidx.lifecycle.ViewModelStore store, androidx.lifecycle.ViewModelProvider.Factory factory);
     ctor public ViewModelProvider(androidx.lifecycle.ViewModelStoreOwner owner);
     ctor public ViewModelProvider(androidx.lifecycle.ViewModelStoreOwner owner, androidx.lifecycle.ViewModelProvider.Factory factory);
@@ -31,8 +33,10 @@
   }
 
   public static class ViewModelProvider.AndroidViewModelFactory extends androidx.lifecycle.ViewModelProvider.NewInstanceFactory {
+    ctor public ViewModelProvider.AndroidViewModelFactory();
     ctor public ViewModelProvider.AndroidViewModelFactory(android.app.Application application);
     method public static final androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory getInstance(android.app.Application application);
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<android.app.Application> APPLICATION_KEY;
     field public static final androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion Companion;
   }
 
@@ -84,6 +88,11 @@
     method public operator <T> T? get(androidx.lifecycle.viewmodel.CreationExtras.Key<T> key);
   }
 
+  public static final class CreationExtras.Empty implements androidx.lifecycle.viewmodel.CreationExtras {
+    method public <T> T? get(androidx.lifecycle.viewmodel.CreationExtras.Key<T> key);
+    field public static final androidx.lifecycle.viewmodel.CreationExtras.Empty INSTANCE;
+  }
+
   public static interface CreationExtras.Key<T> {
   }
 
diff --git a/lifecycle/lifecycle-viewmodel/src/androidTest/java/androidx/lifecycle/AndroidViewModelFactoryTest.kt b/lifecycle/lifecycle-viewmodel/src/androidTest/java/androidx/lifecycle/AndroidViewModelFactoryTest.kt
new file mode 100644
index 0000000..520d13d
--- /dev/null
+++ b/lifecycle/lifecycle-viewmodel/src/androidTest/java/androidx/lifecycle/AndroidViewModelFactoryTest.kt
@@ -0,0 +1,84 @@
+/*
+ * 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.lifecycle
+
+import android.app.Application
+import androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory
+import androidx.lifecycle.viewmodel.CreationExtras
+import androidx.lifecycle.viewmodel.MutableCreationExtras
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
+import com.google.common.truth.Truth.assertThat
+import org.junit.Assert
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class AndroidViewModelFactoryTest {
+
+    @Test
+    fun testEmptyConstructorAndExtras() {
+        val factory = AndroidViewModelFactory()
+        val extras = MutableCreationExtras()
+        extras[AndroidViewModelFactory.APPLICATION_KEY] = queryApplication()
+        val vm = factory.create(VM::class.java, extras)
+        assertThat(vm).isNotNull()
+    }
+
+    @Test
+    fun testEmptyConstructorAndEmptyExtras() {
+        val factory = AndroidViewModelFactory()
+        try {
+            factory.create(VM::class.java, CreationExtras.Empty)
+            Assert.fail()
+        } catch (e: IllegalArgumentException) {
+        }
+    }
+
+    @Test
+    fun testEmptyConstructorAndNoExtras() {
+        val factory = AndroidViewModelFactory()
+        try {
+            factory.create(VM::class.java)
+            Assert.fail()
+        } catch (e: UnsupportedOperationException) {
+        }
+    }
+
+    @Test
+    fun testAppConstructorAndEmptyExtras() {
+        val factory = AndroidViewModelFactory(queryApplication())
+        val vm = factory.create(VM::class.java, CreationExtras.Empty)
+        assertThat(vm).isNotNull()
+    }
+
+    @Test
+    fun testAppConstructorAndNoExtras() {
+        val factory = AndroidViewModelFactory(queryApplication())
+        val vm = factory.create(VM::class.java)
+        assertThat(vm).isNotNull()
+    }
+}
+
+class VM(application: Application) : AndroidViewModel(application)
+
+private fun queryApplication(): Application {
+    val context = InstrumentationRegistry.getInstrumentation().context.applicationContext
+    return context as? Application ?: throw IllegalStateException("Failed to get an application")
+}
\ No newline at end of file
diff --git a/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/HasDefaultViewModelProviderFactory.java b/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/HasDefaultViewModelProviderFactory.java
index dea6695..ff7539a 100644
--- a/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/HasDefaultViewModelProviderFactory.java
+++ b/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/HasDefaultViewModelProviderFactory.java
@@ -17,6 +17,7 @@
 package androidx.lifecycle;
 
 import androidx.annotation.NonNull;
+import androidx.lifecycle.viewmodel.CreationExtras;
 
 /**
  * Interface that marks a {@link ViewModelStoreOwner} as having a default
@@ -33,4 +34,15 @@
      */
     @NonNull
     ViewModelProvider.Factory getDefaultViewModelProviderFactory();
+
+    /**
+     * Returns the default {@link CreationExtras} that should be passed into the
+     * {@link ViewModelProvider.Factory#create(Class, CreationExtras)} when no overriding
+     * {@link CreationExtras} were passed to the
+     * {@link androidx.lifecycle.ViewModelProvider} constructors.
+     */
+    @NonNull
+    default CreationExtras getDefaultViewModelCreationExtras() {
+        return CreationExtras.Empty.INSTANCE;
+    }
 }
diff --git a/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelProvider.kt b/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelProvider.kt
index 1999706..a43835b 100644
--- a/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelProvider.kt
+++ b/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelProvider.kt
@@ -22,26 +22,33 @@
 import androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion.defaultFactory
 import androidx.lifecycle.viewmodel.CreationExtras.Key
 import androidx.lifecycle.ViewModelProvider.NewInstanceFactory.Companion.VIEW_MODEL_KEY
+import androidx.lifecycle.viewmodel.CombinedCreationExtras
 import androidx.lifecycle.viewmodel.CreationExtras
 import androidx.lifecycle.viewmodel.MutableCreationExtras
 import java.lang.IllegalArgumentException
 import java.lang.RuntimeException
-import java.lang.UnsupportedOperationException
 import java.lang.reflect.InvocationTargetException
+import kotlin.UnsupportedOperationException
 
 /**
  * An utility class that provides `ViewModels` for a scope.
  *
  * Default `ViewModelProvider` for an `Activity` or a `Fragment` can be obtained
  * by passing it to the constructor: `ViewModelProvider(myFragment)`
- *
- * @param store  `ViewModelStore` where ViewModels will be stored.
- * @param factory factory a `Factory` which will be used to instantiate
- * new `ViewModels`
  */
-public open class ViewModelProvider(
+public open class ViewModelProvider
+/**
+ * Creates a ViewModelProvider
+ *
+ * @param store `ViewModelStore` where ViewModels will be stored.
+ * @param factory factory a `Factory` which will be used to instantiate new `ViewModels`
+ * @param defaultCreationExtras extras to pass to a factory
+ */
+@JvmOverloads
+constructor(
     private val store: ViewModelStore,
-    private val factory: Factory
+    private val factory: Factory,
+    private val defaultCreationExtras: CreationExtras = CreationExtras.Empty,
 ) {
     /**
      * Implementations of `Factory` interface are responsible to instantiate ViewModels.
@@ -93,7 +100,7 @@
      */
     public constructor(
         owner: ViewModelStoreOwner
-    ) : this(owner.viewModelStore, defaultFactory(owner))
+    ) : this(owner.viewModelStore, defaultFactory(owner), defaultCreationExtras(owner))
 
     /**
      * Creates `ViewModelProvider`, which will create `ViewModels` via the given
@@ -106,7 +113,8 @@
      */
     public constructor(owner: ViewModelStoreOwner, factory: Factory) : this(
         owner.viewModelStore,
-        factory
+        factory,
+        defaultCreationExtras(owner)
     )
 
     /**
@@ -158,7 +166,10 @@
         }
         val extras = MutableCreationExtras()
         extras[VIEW_MODEL_KEY] = key
-        return factory.create(modelClass, extras).also { store.put(key, it) }
+        return factory.create(
+            modelClass,
+            CombinedCreationExtras(extras, defaultCreationExtras)
+        ).also { store.put(key, it) }
     }
 
     /**
@@ -218,14 +229,61 @@
      *
      * @param application an application to pass in [AndroidViewModel]
      */
-    public open class AndroidViewModelFactory(
-        private val application: Application
+    public open class AndroidViewModelFactory
+    private constructor(
+        private val application: Application?,
+        // parameter to avoid clash between constructors with nullable and non-nullable
+        // Application
+        @Suppress("UNUSED_PARAMETER") unused: Int,
     ) : NewInstanceFactory() {
+
+        /**
+         * Constructs this factory.
+         * When a factory is constructed this way, a component for which [ViewModel] is created
+         * must provide an [Application] by [APPLICATION_KEY] in [CreationExtras], otherwise
+         *  [IllegalArgumentException] will be thrown from [create] method.
+         */
+        @Suppress("SingletonConstructor")
+        public constructor() : this(null, 0)
+
+        /**
+         * Constructs this factory.
+         *
+         * @param application an application to pass in [AndroidViewModel]
+         */
+        @Suppress("SingletonConstructor")
+        public constructor(application: Application) : this(application, 0)
+
+        @Suppress("DocumentExceptions")
+        override fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T {
+            return if (application != null) {
+                create(modelClass, application)
+            } else {
+                val application = extras[APPLICATION_KEY] ?: throw IllegalArgumentException(
+                    "CreationExtras mush have an application by `APPLICATION_KEY`"
+                )
+                create(modelClass, application)
+            }
+        }
+
         @Suppress("DocumentExceptions")
         override fun <T : ViewModel> create(modelClass: Class<T>): T {
+            return if (application == null) {
+                throw UnsupportedOperationException(
+                    "AndroidViewModelFactory constructed " +
+                        "with empty constructor works only with " +
+                        "create(modelClass: Class<T>, extras: CreationExtras)."
+                )
+            } else {
+                create(modelClass, application)
+            }
+        }
+
+        @Suppress("DocumentExceptions")
+        private fun <T : ViewModel> create(modelClass: Class<T>, app: Application): T {
             return if (AndroidViewModel::class.java.isAssignableFrom(modelClass)) {
                 try {
-                    modelClass.getConstructor(Application::class.java).newInstance(application)
+                    modelClass.getConstructor(Application::class.java).newInstance(app)
                 } catch (e: NoSuchMethodException) {
                     throw RuntimeException("Cannot create an instance of $modelClass", e)
                 } catch (e: IllegalAccessException) {
@@ -260,10 +318,24 @@
                 }
                 return sInstance!!
             }
+
+            private object ApplicationKeyImpl : Key<Application>
+
+            /**
+             * A [CreationExtras.Key] to query an application in which ViewModel is being created.
+             */
+            @JvmField
+            val APPLICATION_KEY: Key<Application> = ApplicationKeyImpl
         }
     }
 }
 
+internal fun defaultCreationExtras(owner: ViewModelStoreOwner): CreationExtras {
+    return if (owner is HasDefaultViewModelProviderFactory) {
+        owner.defaultViewModelCreationExtras
+    } else CreationExtras.Empty
+}
+
 /**
  * Returns an existing ViewModel or creates a new one in the scope (usually, a fragment or
  * an activity), associated with this `ViewModelProvider`.
@@ -271,4 +343,4 @@
  * @see ViewModelProvider.get(Class)
  */
 @MainThread
-public inline fun <reified VM : ViewModel> ViewModelProvider.get(): VM = get(VM::class.java)
+public inline fun <reified VM : ViewModel> ViewModelProvider.get(): VM = get(VM::class.java)
\ No newline at end of file
diff --git a/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/viewmodel/CreationExtras.kt b/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/viewmodel/CreationExtras.kt
index ceb94a4..bccf2bf 100644
--- a/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/viewmodel/CreationExtras.kt
+++ b/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/viewmodel/CreationExtras.kt
@@ -33,6 +33,13 @@
      * Returns an element associated with the given [key]
      */
     public operator fun <T> get(key: Key<T>): T?
+
+    /**
+     * Empty [CreationExtras]
+     */
+    object Empty : CreationExtras {
+        override fun <T> get(key: Key<T>): T? = null
+    }
 }
 
 /**
@@ -53,3 +60,12 @@
         return map[key] as T?
     }
 }
+
+internal class CombinedCreationExtras(
+    val first: CreationExtras,
+    val second: CreationExtras
+) : CreationExtras {
+    override fun <T> get(key: CreationExtras.Key<T>): T? {
+        return first[key] ?: second[key]
+    }
+}
\ No newline at end of file
diff --git a/lifecycle/lifecycle-viewmodel/src/test/java/androidx/lifecycle/ViewModelProviderTest.java b/lifecycle/lifecycle-viewmodel/src/test/java/androidx/lifecycle/ViewModelProviderTest.java
index 349589f..60a2b97 100644
--- a/lifecycle/lifecycle-viewmodel/src/test/java/androidx/lifecycle/ViewModelProviderTest.java
+++ b/lifecycle/lifecycle-viewmodel/src/test/java/androidx/lifecycle/ViewModelProviderTest.java
@@ -17,6 +17,8 @@
 package androidx.lifecycle;
 
 import static androidx.lifecycle.ViewModelProvider.NewInstanceFactory.VIEW_MODEL_KEY;
+import static androidx.lifecycle.ViewModelProviderTest.ViewModelStoreOwnerWithCreationExtras.TEST_KEY;
+import static androidx.lifecycle.ViewModelProviderTest.ViewModelStoreOwnerWithCreationExtras.TEST_VALUE;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.notNullValue;
@@ -25,6 +27,8 @@
 import androidx.annotation.NonNull;
 import androidx.lifecycle.ViewModelProvider.NewInstanceFactory;
 import androidx.lifecycle.viewmodel.CreationExtras;
+import androidx.lifecycle.viewmodel.CreationExtras.Key;
+import androidx.lifecycle.viewmodel.MutableCreationExtras;
 
 import org.junit.Assert;
 import org.junit.Before;
@@ -125,6 +129,36 @@
         new ViewModelProvider(owner, implicitlyKeyed).get("customkey", ViewModel1.class);
     }
 
+    @Test
+    public void testDefaultCreationExtras() {
+        ViewModelStoreOwnerWithCreationExtras owner = new ViewModelStoreOwnerWithCreationExtras();
+        boolean[] wasCalled = new boolean[1];
+        ViewModelProvider.Factory testFactory = new ViewModelProvider.Factory() {
+            @SuppressWarnings("unchecked")
+            @NonNull
+            @Override
+            public <T extends ViewModel> T create(@NonNull Class<T> modelClass,
+                    @NonNull CreationExtras extras) {
+                String key = extras.get(VIEW_MODEL_KEY);
+                assertThat(key, is("customkey"));
+                assertThat(extras.get(TEST_KEY), is(TEST_VALUE));
+                wasCalled[0] = true;
+                return (T) new ViewModel1();
+            }
+        };
+        new ViewModelProvider(owner, testFactory).get("customkey", ViewModel1.class);
+        assertThat(wasCalled[0], is(true));
+        wasCalled[0] = false;
+        new ViewModelProvider(new ViewModelStoreOwnerWithCreationExtras() {
+            @NonNull
+            @Override
+            public ViewModelProvider.Factory getDefaultViewModelProviderFactory() {
+                return testFactory;
+            }
+        }).get("customkey", ViewModel1.class);
+        assertThat(wasCalled[0], is(true));
+    }
+
     public static class ViewModelStoreOwnerWithFactory implements
             ViewModelStoreOwner, HasDefaultViewModelProviderFactory {
         private final ViewModelStore mStore;
@@ -171,4 +205,32 @@
             return super.create(modelClass);
         }
     }
+
+    static class ViewModelStoreOwnerWithCreationExtras implements
+            ViewModelStoreOwner, HasDefaultViewModelProviderFactory {
+        private final ViewModelStore mViewModelStore = new ViewModelStore();
+        static final Key<String> TEST_KEY = new Key<String>() {
+        };
+        static final String TEST_VALUE = "test_value";
+
+        @NonNull
+        @Override
+        public ViewModelProvider.Factory getDefaultViewModelProviderFactory() {
+            throw new UnsupportedOperationException();
+        }
+
+        @NonNull
+        @Override
+        public CreationExtras getDefaultViewModelCreationExtras() {
+            MutableCreationExtras extras = new MutableCreationExtras();
+            extras.set(TEST_KEY, TEST_VALUE);
+            return extras;
+        }
+
+        @NonNull
+        @Override
+        public ViewModelStore getViewModelStore() {
+            return mViewModelStore;
+        }
+    }
 }
diff --git a/lint-checks/integration-tests/src/main/java/androidx/RequiresApiJava.java b/lint-checks/integration-tests/src/main/java/androidx/RequiresApiJava.java
new file mode 100644
index 0000000..f90b49b
--- /dev/null
+++ b/lint-checks/integration-tests/src/main/java/androidx/RequiresApiJava.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;
+
+import androidx.annotation.RequiresApi;
+
+/**
+ * Character.isSurrogate requires API 19. Prior to addressing b/202415535, lint did not detect the
+ * presence of @RequiresApi annotation in an outer class, and incorrectly flagged MyStaticClass
+ * as needing a @RequiresApi annotation.
+ */
+@RequiresApi(19)
+final class RequiresApiJava {
+
+    // RequiresApi annotation should not be needed here; already present in containing class
+    // @RequiresApi(19)
+    public static final class MyStaticClass {
+
+        private MyStaticClass() {
+            // Not instantiable.
+        }
+
+        static int myStaticMethod(char c) {
+            Character.isSurrogate(c);
+            return 0;
+        }
+    }
+}
diff --git a/lint-checks/integration-tests/src/main/java/androidx/RequiresApiKotlin.kt b/lint-checks/integration-tests/src/main/java/androidx/RequiresApiKotlin.kt
new file mode 100644
index 0000000..5bbd9c6
--- /dev/null
+++ b/lint-checks/integration-tests/src/main/java/androidx/RequiresApiKotlin.kt
@@ -0,0 +1,102 @@
+/*
+ * 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
+
+import androidx.annotation.RequiresApi
+
+/*
+ * Character.isSurrogate requires API 19. Prior to addressing b/202415535, the
+ * ClassVerificationFailure detector only checked for the @RequiresApi annotation on a method's
+ * immediate containing class, and did not factor in @RequiresApi annotations on outer class(es).
+ *
+ * This sample file covers various cases of nested @RequiresApi usage.
+ */
+
+// RequiresApi annotation not needed on MyStaticClass since it's already present in containing class
+@RequiresApi(19)
+internal class RequiresApiKotlinOuter19Passes {
+    object MyStaticClass {
+        fun MyStaticMethod(c: Char): Int {
+            Character.isSurrogate(c)
+            return 0
+        }
+    }
+}
+
+// @RequiresApi declaration on MyStaticMethod's immediate containing class
+internal class RequiresApiKotlinInner19Passes {
+     @RequiresApi(19)
+    object MyStaticClass {
+        fun MyStaticMethod(c: Char): Int {
+            Character.isSurrogate(c)
+            return 0
+        }
+    }
+}
+
+// Even though MyStaticClass declares a @RequiresApi that is too low, the outer containing class's
+// definition of 19 will override it.
+@RequiresApi(19)
+internal class RequiresApiKotlinInner16Outer19Passes {
+    @RequiresApi(16)
+    object MyStaticClass {
+        fun MyStaticMethod(c: Char): Int {
+            Character.isSurrogate(c)
+            return 0
+        }
+    }
+}
+
+internal class RequiresApiKotlinNoAnnotationFails {
+    object MyStaticClass {
+        fun MyStaticMethod(c: Char): Int {
+            Character.isSurrogate(c)
+            return 0
+        }
+    }
+}
+
+@RequiresApi(16)
+internal class RequiresApiKotlinOuter16Fails {
+    object MyStaticClass {
+        fun MyStaticMethod(c: Char): Int {
+            Character.isSurrogate(c)
+            return 0
+        }
+    }
+}
+
+internal class RequiresApiKotlinInner16Fails {
+    @RequiresApi(16)
+    object MyStaticClass {
+        fun MyStaticMethod(c: Char): Int {
+            Character.isSurrogate(c)
+            return 0
+        }
+    }
+}
+
+@RequiresApi(16)
+internal class RequiresApiKotlinInner16Outer16Fails {
+    @RequiresApi(16)
+    object MyStaticClass {
+        fun MyStaticMethod(c: Char): Int {
+            Character.isSurrogate(c)
+            return 0
+        }
+    }
+}
\ No newline at end of file
diff --git a/lint-checks/src/main/java/androidx/build/lint/ClassVerificationFailureDetector.kt b/lint-checks/src/main/java/androidx/build/lint/ClassVerificationFailureDetector.kt
index c728b3f..ce45bd2 100644
--- a/lint-checks/src/main/java/androidx/build/lint/ClassVerificationFailureDetector.kt
+++ b/lint-checks/src/main/java/androidx/build/lint/ClassVerificationFailureDetector.kt
@@ -485,28 +485,33 @@
             location: Location
         ) {
             call ?: return
+            var classUnderInspection: UClass? = call.getContainingUClass() ?: return
 
-            if (call.getContainingUClass() == null) {
-                // Can't verify if containing class is annotated with @RequiresApi
-                return
-            }
-            val potentialRequiresApiVersion = getRequiresApiFromAnnotations(
-                call.getContainingUClass()!!.javaPsi
-            )
-            if (potentialRequiresApiVersion == NO_API_REQUIREMENT ||
-                api > potentialRequiresApiVersion
-            ) {
-                val containingClassName = call.getContainingUClass()!!.qualifiedName.toString()
-                val fix = createLintFix(method, call, api)
-
-                context.report(
-                    ISSUE, reference, location,
-                    "This call references a method added in API level $api; however, the " +
-                        "containing class $containingClassName is reachable from earlier API " +
-                        "levels and will fail run-time class verification.",
-                    fix,
+            // Walk up class hierarchy to find if there is any RequiresApi annotation that fulfills
+            // the API requirements
+            while (classUnderInspection != null) {
+                val potentialRequiresApiVersion = getRequiresApiFromAnnotations(
+                    classUnderInspection.javaPsi
                 )
+
+                if (potentialRequiresApiVersion >= api) {
+                    return
+                }
+
+                classUnderInspection = classUnderInspection.getContainingUClass()
             }
+
+            // call.getContainingUClass()!! refers to the direct parent class of this method
+            val containingClassName = call.getContainingUClass()!!.qualifiedName.toString()
+            val fix = createLintFix(method, call, api)
+
+            context.report(
+                ISSUE, reference, location,
+                "This call references a method added in API level $api; however, the " +
+                    "containing class $containingClassName is reachable from earlier API " +
+                    "levels and will fail run-time class verification.",
+                fix,
+            )
         }
 
         /**
diff --git a/lint-checks/src/test/java/androidx/build/lint/BanConcurrentHashMapTest.kt b/lint-checks/src/test/java/androidx/build/lint/BanConcurrentHashMapTest.kt
index 48d4b37..5044469 100644
--- a/lint-checks/src/test/java/androidx/build/lint/BanConcurrentHashMapTest.kt
+++ b/lint-checks/src/test/java/androidx/build/lint/BanConcurrentHashMapTest.kt
@@ -18,6 +18,7 @@
 
 package androidx.build.lint
 
+import com.android.tools.lint.checks.infrastructure.TestMode
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
@@ -61,6 +62,13 @@
         """.trimIndent()
         /* ktlint-enable max-line-length */
 
-        check(*input).expect(expected)
+        lint()
+            .files(
+                *stubs,
+                *input
+            )
+            .skipTestModes(TestMode.IMPORT_ALIAS) // b/203124716
+            .run()
+            .expect(expected)
     }
 }
\ No newline at end of file
diff --git a/lint-checks/src/test/java/androidx/build/lint/ClassVerificationFailureDetectorTest.kt b/lint-checks/src/test/java/androidx/build/lint/ClassVerificationFailureDetectorTest.kt
index 4a8de17..4b11cd9 100644
--- a/lint-checks/src/test/java/androidx/build/lint/ClassVerificationFailureDetectorTest.kt
+++ b/lint-checks/src/test/java/androidx/build/lint/ClassVerificationFailureDetectorTest.kt
@@ -151,6 +151,50 @@
     }
 
     @Test
+    fun `Detection of RequiresApi annotation in outer class in Java source`() {
+        val input = arrayOf(
+            javaSample("androidx.RequiresApiJava"),
+            RequiresApi
+        )
+
+        /* ktlint-disable max-line-length */
+        val expected = """
+No warnings.
+        """.trimIndent()
+        /* ktlint-enable max-line-length */
+
+        check(*input).expect(expected)
+    }
+
+    @Test
+    fun `Detection of RequiresApi annotation in outer class in Kotlin source`() {
+        val input = arrayOf(
+            ktSample("androidx.RequiresApiKotlin"),
+            RequiresApi
+        )
+
+        /* ktlint-disable max-line-length */
+        val expected = """
+src/androidx/RequiresApiKotlinOuter19Passes.kt:67: Error: This call references a method added in API level 19; however, the containing class androidx.RequiresApiKotlinNoAnnotationFails.MyStaticClass is reachable from earlier API levels and will fail run-time class verification. [ClassVerificationFailure]
+            Character.isSurrogate(c)
+                      ~~~~~~~~~~~
+src/androidx/RequiresApiKotlinOuter19Passes.kt:77: Error: This call references a method added in API level 19; however, the containing class androidx.RequiresApiKotlinOuter16Fails.MyStaticClass is reachable from earlier API levels and will fail run-time class verification. [ClassVerificationFailure]
+            Character.isSurrogate(c)
+                      ~~~~~~~~~~~
+src/androidx/RequiresApiKotlinOuter19Passes.kt:87: Error: This call references a method added in API level 19; however, the containing class androidx.RequiresApiKotlinInner16Fails.MyStaticClass is reachable from earlier API levels and will fail run-time class verification. [ClassVerificationFailure]
+            Character.isSurrogate(c)
+                      ~~~~~~~~~~~
+src/androidx/RequiresApiKotlinOuter19Passes.kt:98: Error: This call references a method added in API level 19; however, the containing class androidx.RequiresApiKotlinInner16Outer16Fails.MyStaticClass is reachable from earlier API levels and will fail run-time class verification. [ClassVerificationFailure]
+            Character.isSurrogate(c)
+                      ~~~~~~~~~~~
+4 errors, 0 warnings
+        """.trimIndent()
+        /* ktlint-enable max-line-length */
+
+        check(*input).expect(expected)
+    }
+
+    @Test
     fun `Auto-fix unsafe void-type method reference in Java source`() {
         val input = arrayOf(
             javaSample("androidx.AutofixUnsafeVoidMethodReferenceJava"),
diff --git a/media/OWNERS b/media/OWNERS
index 35b2d68..6456ac8 100644
--- a/media/OWNERS
+++ b/media/OWNERS
@@ -5,3 +5,8 @@
 jaewan@google.com
 jinpark@google.com
 sungsoo@google.com
+olly@google.com
+tonihei@google.com
+christosts@google.com
+bachinger@google.com
+ibaker@google.com
diff --git a/media2/OWNERS b/media2/OWNERS
index 4b983fcb..afe4bcd 100644
--- a/media2/OWNERS
+++ b/media2/OWNERS
@@ -6,4 +6,9 @@
 jaewan@google.com
 jinpark@google.com
 sungsoo@google.com
+olly@google.com
+tonihei@google.com
+christosts@google.com
+bachinger@google.com
+ibaker@google.com
 
diff --git a/media2/media2-session/src/androidTest/java/androidx/media2/session/MediaBrowserLegacyTest.java b/media2/media2-session/src/androidTest/java/androidx/media2/session/MediaBrowserLegacyTest.java
index bc7b684..e021880 100644
--- a/media2/media2-session/src/androidTest/java/androidx/media2/session/MediaBrowserLegacyTest.java
+++ b/media2/media2-session/src/androidTest/java/androidx/media2/session/MediaBrowserLegacyTest.java
@@ -62,7 +62,6 @@
 @RunWith(AndroidJUnit4.class)
 @LargeTest
 public class MediaBrowserLegacyTest extends MediaSessionTestBase {
-    private static final String TAG = "MediaBrowserLegacyTest";
 
     @Override
     MediaController onCreateController(@NonNull final SessionToken token,
diff --git a/media2/media2-session/src/main/java/androidx/media2/session/MediaSession.java b/media2/media2-session/src/main/java/androidx/media2/session/MediaSession.java
index 5572e7d..ed8fd9a 100644
--- a/media2/media2-session/src/main/java/androidx/media2/session/MediaSession.java
+++ b/media2/media2-session/src/main/java/androidx/media2/session/MediaSession.java
@@ -168,7 +168,6 @@
  * @see MediaSessionService
  */
 public class MediaSession implements Closeable {
-    static final String TAG = "MediaSession";
 
     // It's better to have private static lock instead of using MediaSession.class because the
     // private lock object isn't exposed.
diff --git a/mediarouter/OWNERS b/mediarouter/OWNERS
index ec7a0e2..5ac7be6 100644
--- a/mediarouter/OWNERS
+++ b/mediarouter/OWNERS
@@ -6,3 +6,8 @@
 jinpark@google.com
 klhyun@google.com
 sungsoo@google.com
+olly@google.com
+tonihei@google.com
+christosts@google.com
+bachinger@google.com
+ibaker@google.com
diff --git a/navigation/navigation-common-ktx/api/2.4.0-beta02.txt b/navigation/navigation-common-ktx/api/2.4.0-beta02.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/navigation/navigation-common-ktx/api/2.4.0-beta02.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/navigation/navigation-common-ktx/api/public_plus_experimental_2.4.0-beta02.txt b/navigation/navigation-common-ktx/api/public_plus_experimental_2.4.0-beta02.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/navigation/navigation-common-ktx/api/public_plus_experimental_2.4.0-beta02.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/navigation/navigation-common-ktx/api/res-2.4.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to navigation/navigation-common-ktx/api/res-2.4.0-beta02.txt
diff --git a/navigation/navigation-common-ktx/api/restricted_2.4.0-beta02.txt b/navigation/navigation-common-ktx/api/restricted_2.4.0-beta02.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/navigation/navigation-common-ktx/api/restricted_2.4.0-beta02.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/navigation/navigation-common/api/2.4.0-beta01.txt b/navigation/navigation-common/api/2.4.0-beta01.txt
index a169ec7..1402d24d 100644
--- a/navigation/navigation-common/api/2.4.0-beta01.txt
+++ b/navigation/navigation-common/api/2.4.0-beta01.txt
@@ -235,7 +235,6 @@
   public static final class NavDestination.Companion {
     method public kotlin.sequences.Sequence<androidx.navigation.NavDestination> getHierarchy(androidx.navigation.NavDestination);
     method protected <C> Class<? extends C> parseClassFromName(android.content.Context context, String name, Class<? extends C> expectedClassType);
-    property public final kotlin.sequences.Sequence<androidx.navigation.NavDestination> hierarchy;
   }
 
   @androidx.navigation.NavDestinationDsl public class NavDestinationBuilder<D extends androidx.navigation.NavDestination> {
@@ -497,7 +496,7 @@
     ctor public NavigatorState();
     method public abstract androidx.navigation.NavBackStackEntry createBackStackEntry(androidx.navigation.NavDestination destination, android.os.Bundle? arguments);
     method public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> getBackStack();
-    method public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> getTransitionsInProgress();
+    method public final kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.navigation.NavBackStackEntry>> getTransitionsInProgress();
     method public void markTransitionComplete(androidx.navigation.NavBackStackEntry entry);
     method @CallSuper public void onLaunchSingleTop(androidx.navigation.NavBackStackEntry backStackEntry);
     method public void pop(androidx.navigation.NavBackStackEntry popUpTo, boolean saveState);
@@ -505,7 +504,7 @@
     method public void push(androidx.navigation.NavBackStackEntry backStackEntry);
     method public void pushWithTransition(androidx.navigation.NavBackStackEntry backStackEntry);
     property public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> backStack;
-    property public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> transitionsInProgress;
+    property public final kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.navigation.NavBackStackEntry>> transitionsInProgress;
   }
 
   @androidx.navigation.NavOptionsDsl public final class PopUpToBuilder {
diff --git a/navigation/navigation-common/api/2.4.0-beta02.txt b/navigation/navigation-common/api/2.4.0-beta02.txt
new file mode 100644
index 0000000..1402d24d
--- /dev/null
+++ b/navigation/navigation-common/api/2.4.0-beta02.txt
@@ -0,0 +1,521 @@
+// Signature format: 4.0
+package androidx.navigation {
+
+  public final class ActionOnlyNavDirections implements androidx.navigation.NavDirections {
+    ctor public ActionOnlyNavDirections(int actionId);
+    method public int component1();
+    method public androidx.navigation.ActionOnlyNavDirections copy(int actionId);
+    method public int getActionId();
+    method public android.os.Bundle getArguments();
+    property public int actionId;
+    property public android.os.Bundle arguments;
+  }
+
+  @androidx.navigation.NavOptionsDsl public final class AnimBuilder {
+    ctor public AnimBuilder();
+    method public int getEnter();
+    method public int getExit();
+    method public int getPopEnter();
+    method public int getPopExit();
+    method public void setEnter(int enter);
+    method public void setExit(int exit);
+    method public void setPopEnter(int popEnter);
+    method public void setPopExit(int popExit);
+    property public final int enter;
+    property public final int exit;
+    property public final int popEnter;
+    property public final int popExit;
+  }
+
+  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 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);
+    ctor public NavAction(@IdRes int destinationId);
+    method public android.os.Bundle? getDefaultArguments();
+    method public int getDestinationId();
+    method public androidx.navigation.NavOptions? getNavOptions();
+    method public void setDefaultArguments(android.os.Bundle? defaultArguments);
+    method public void setNavOptions(androidx.navigation.NavOptions? navOptions);
+    property public final android.os.Bundle? defaultArguments;
+    property public final int destinationId;
+    property public final androidx.navigation.NavOptions? navOptions;
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class NavActionBuilder {
+    ctor public NavActionBuilder();
+    method public java.util.Map<java.lang.String,java.lang.Object> getDefaultArguments();
+    method public int getDestinationId();
+    method public void navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
+    method public void setDestinationId(int destinationId);
+    property public final java.util.Map<java.lang.String,java.lang.Object> defaultArguments;
+    property public final int destinationId;
+  }
+
+  public interface NavArgs {
+  }
+
+  public final class NavArgsLazy<Args extends androidx.navigation.NavArgs> implements kotlin.Lazy<Args> {
+    ctor public NavArgsLazy(kotlin.reflect.KClass<Args> navArgsClass, kotlin.jvm.functions.Function0<android.os.Bundle> argumentProducer);
+    method public Args getValue();
+    method public boolean isInitialized();
+    property public Args value;
+  }
+
+  public final class NavArgsLazyKt {
+  }
+
+  public final class NavArgument {
+    method public Object? getDefaultValue();
+    method public androidx.navigation.NavType<java.lang.Object> getType();
+    method public boolean isDefaultValuePresent();
+    method public boolean isNullable();
+    property public final Object? defaultValue;
+    property public final boolean isDefaultValuePresent;
+    property public final boolean isNullable;
+    property public final androidx.navigation.NavType<java.lang.Object> type;
+  }
+
+  public static final class NavArgument.Builder {
+    ctor public NavArgument.Builder();
+    method public androidx.navigation.NavArgument build();
+    method public androidx.navigation.NavArgument.Builder setDefaultValue(Object? defaultValue);
+    method public androidx.navigation.NavArgument.Builder setIsNullable(boolean isNullable);
+    method public <T> androidx.navigation.NavArgument.Builder setType(androidx.navigation.NavType<T> type);
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class NavArgumentBuilder {
+    ctor public NavArgumentBuilder();
+    method public androidx.navigation.NavArgument build();
+    method public Object? getDefaultValue();
+    method public boolean getNullable();
+    method public androidx.navigation.NavType<?> getType();
+    method public void setDefaultValue(Object? value);
+    method public void setNullable(boolean value);
+    method public void setType(androidx.navigation.NavType<?> value);
+    property public final Object? defaultValue;
+    property public final boolean nullable;
+    property public final androidx.navigation.NavType<?> type;
+  }
+
+  public final class NavBackStackEntry implements androidx.lifecycle.HasDefaultViewModelProviderFactory androidx.lifecycle.LifecycleOwner androidx.savedstate.SavedStateRegistryOwner androidx.lifecycle.ViewModelStoreOwner {
+    method public android.os.Bundle? getArguments();
+    method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
+    method public androidx.navigation.NavDestination getDestination();
+    method public String getId();
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method public androidx.lifecycle.SavedStateHandle getSavedStateHandle();
+    method public androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+    method public androidx.lifecycle.ViewModelStore getViewModelStore();
+    property public final android.os.Bundle? arguments;
+    property public final androidx.navigation.NavDestination destination;
+    property public final String id;
+    property public final androidx.lifecycle.SavedStateHandle savedStateHandle;
+  }
+
+  public final class NavDeepLink {
+    method public String? getAction();
+    method public String? getMimeType();
+    method public String? getUriPattern();
+    property public final String? action;
+    property public final String? mimeType;
+    property public final String? uriPattern;
+  }
+
+  public static final class NavDeepLink.Builder {
+    method public androidx.navigation.NavDeepLink build();
+    method public static androidx.navigation.NavDeepLink.Builder fromAction(String action);
+    method public static androidx.navigation.NavDeepLink.Builder fromMimeType(String mimeType);
+    method public static androidx.navigation.NavDeepLink.Builder fromUriPattern(String uriPattern);
+    method public androidx.navigation.NavDeepLink.Builder setAction(String action);
+    method public androidx.navigation.NavDeepLink.Builder setMimeType(String mimeType);
+    method public androidx.navigation.NavDeepLink.Builder setUriPattern(String uriPattern);
+  }
+
+  @kotlin.DslMarker public @interface NavDeepLinkDsl {
+  }
+
+  @androidx.navigation.NavDeepLinkDsl public final class NavDeepLinkDslBuilder {
+    ctor public NavDeepLinkDslBuilder();
+    method public String? getAction();
+    method public String? getMimeType();
+    method public String? getUriPattern();
+    method public void setAction(String? p);
+    method public void setMimeType(String? mimeType);
+    method public void setUriPattern(String? uriPattern);
+    property public final String? action;
+    property public final String? mimeType;
+    property public final String? uriPattern;
+  }
+
+  public final class NavDeepLinkDslBuilderKt {
+    method public static androidx.navigation.NavDeepLink navDeepLink(kotlin.jvm.functions.Function1<? super androidx.navigation.NavDeepLinkDslBuilder,kotlin.Unit> deepLinkBuilder);
+  }
+
+  public class NavDeepLinkRequest {
+    method public String? getAction();
+    method public String? getMimeType();
+    method public android.net.Uri? getUri();
+    property public String? action;
+    property public String? mimeType;
+    property public android.net.Uri? uri;
+  }
+
+  public static final class NavDeepLinkRequest.Builder {
+    method public androidx.navigation.NavDeepLinkRequest build();
+    method public static androidx.navigation.NavDeepLinkRequest.Builder fromAction(String action);
+    method public static androidx.navigation.NavDeepLinkRequest.Builder fromMimeType(String mimeType);
+    method public static androidx.navigation.NavDeepLinkRequest.Builder fromUri(android.net.Uri uri);
+    method public androidx.navigation.NavDeepLinkRequest.Builder setAction(String action);
+    method public androidx.navigation.NavDeepLinkRequest.Builder setMimeType(String mimeType);
+    method public androidx.navigation.NavDeepLinkRequest.Builder setUri(android.net.Uri uri);
+    field public static final androidx.navigation.NavDeepLinkRequest.Builder.Companion Companion;
+  }
+
+  public static final class NavDeepLinkRequest.Builder.Companion {
+    method public androidx.navigation.NavDeepLinkRequest.Builder fromAction(String action);
+    method public androidx.navigation.NavDeepLinkRequest.Builder fromMimeType(String mimeType);
+    method public androidx.navigation.NavDeepLinkRequest.Builder fromUri(android.net.Uri uri);
+  }
+
+  public class NavDestination {
+    ctor public NavDestination(String navigatorName);
+    ctor public NavDestination(androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+    method public final void addArgument(String argumentName, androidx.navigation.NavArgument argument);
+    method public final void addDeepLink(String uriPattern);
+    method public final void addDeepLink(androidx.navigation.NavDeepLink navDeepLink);
+    method public final androidx.navigation.NavAction? getAction(@IdRes int id);
+    method public final java.util.Map<java.lang.String,androidx.navigation.NavArgument> getArguments();
+    method public static final kotlin.sequences.Sequence<androidx.navigation.NavDestination> getHierarchy(androidx.navigation.NavDestination);
+    method @IdRes public final int getId();
+    method public final CharSequence? getLabel();
+    method public final String getNavigatorName();
+    method public final androidx.navigation.NavGraph? getParent();
+    method public final String? getRoute();
+    method public boolean hasDeepLink(android.net.Uri deepLink);
+    method public boolean hasDeepLink(androidx.navigation.NavDeepLinkRequest deepLinkRequest);
+    method @CallSuper public void onInflate(android.content.Context context, android.util.AttributeSet attrs);
+    method protected static final <C> Class<? extends C> parseClassFromName(android.content.Context context, String name, Class<? extends C> expectedClassType);
+    method public final void putAction(@IdRes int actionId, @IdRes int destId);
+    method public final void putAction(@IdRes int actionId, androidx.navigation.NavAction action);
+    method public final void removeAction(@IdRes int actionId);
+    method public final void removeArgument(String argumentName);
+    method public final void setId(@IdRes int id);
+    method public final void setLabel(CharSequence? label);
+    method public final void setRoute(String? route);
+    property public final java.util.Map<java.lang.String,androidx.navigation.NavArgument> arguments;
+    property @IdRes public final int id;
+    property public final CharSequence? label;
+    property public final String navigatorName;
+    property public final androidx.navigation.NavGraph? parent;
+    property public final String? route;
+    field public static final androidx.navigation.NavDestination.Companion Companion;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public static @interface NavDestination.ClassType {
+    method public abstract kotlin.reflect.KClass<?> value();
+    property public abstract kotlin.reflect.KClass<?> value;
+  }
+
+  public static final class NavDestination.Companion {
+    method public kotlin.sequences.Sequence<androidx.navigation.NavDestination> getHierarchy(androidx.navigation.NavDestination);
+    method protected <C> Class<? extends C> parseClassFromName(android.content.Context context, String name, Class<? extends C> expectedClassType);
+  }
+
+  @androidx.navigation.NavDestinationDsl public class NavDestinationBuilder<D extends androidx.navigation.NavDestination> {
+    ctor @Deprecated public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, @IdRes int id);
+    ctor public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, String? route);
+    method @Deprecated public final void action(int actionId, kotlin.jvm.functions.Function1<? super androidx.navigation.NavActionBuilder,kotlin.Unit> actionBuilder);
+    method public final void argument(String name, kotlin.jvm.functions.Function1<? super androidx.navigation.NavArgumentBuilder,kotlin.Unit> argumentBuilder);
+    method public D build();
+    method public final void deepLink(String uriPattern);
+    method public final void deepLink(kotlin.jvm.functions.Function1<? super androidx.navigation.NavDeepLinkDslBuilder,kotlin.Unit> navDeepLink);
+    method public final int getId();
+    method public final CharSequence? getLabel();
+    method protected final androidx.navigation.Navigator<? extends D> getNavigator();
+    method public final String? getRoute();
+    method public final void setLabel(CharSequence? label);
+    property public final int id;
+    property public final CharSequence? label;
+    property protected final androidx.navigation.Navigator<? extends D> navigator;
+    property public final String? route;
+  }
+
+  @kotlin.DslMarker public @interface NavDestinationDsl {
+  }
+
+  public interface NavDirections {
+    method @IdRes public int getActionId();
+    method public android.os.Bundle getArguments();
+    property @IdRes public abstract int actionId;
+    property public abstract android.os.Bundle arguments;
+  }
+
+  public class NavGraph extends androidx.navigation.NavDestination implements java.lang.Iterable<androidx.navigation.NavDestination> kotlin.jvm.internal.markers.KMappedMarker {
+    ctor public NavGraph(androidx.navigation.Navigator<? extends androidx.navigation.NavGraph> navGraphNavigator);
+    method public final void addAll(androidx.navigation.NavGraph other);
+    method public final void addDestination(androidx.navigation.NavDestination node);
+    method public final void addDestinations(java.util.Collection<? extends androidx.navigation.NavDestination> nodes);
+    method public final void addDestinations(androidx.navigation.NavDestination... nodes);
+    method public final void clear();
+    method public final androidx.navigation.NavDestination? findNode(@IdRes int resId);
+    method public final androidx.navigation.NavDestination? findNode(String? route);
+    method public static final androidx.navigation.NavDestination findStartDestination(androidx.navigation.NavGraph);
+    method @Deprecated @IdRes public final int getStartDestination();
+    method @IdRes public final int getStartDestinationId();
+    method public final String? getStartDestinationRoute();
+    method public final java.util.Iterator<androidx.navigation.NavDestination> iterator();
+    method public final void remove(androidx.navigation.NavDestination node);
+    method public final void setStartDestination(int startDestId);
+    method public final void setStartDestination(String startDestRoute);
+    property @IdRes public final int startDestinationId;
+    property public final String? startDestinationRoute;
+    field public static final androidx.navigation.NavGraph.Companion Companion;
+  }
+
+  public static final class NavGraph.Companion {
+    method public androidx.navigation.NavDestination findStartDestination(androidx.navigation.NavGraph);
+  }
+
+  @androidx.navigation.NavDestinationDsl public class NavGraphBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.NavGraph> {
+    ctor @Deprecated public NavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
+    ctor public NavGraphBuilder(androidx.navigation.NavigatorProvider provider, String startDestination, String? route);
+    method public final void addDestination(androidx.navigation.NavDestination destination);
+    method public androidx.navigation.NavGraph build();
+    method public final <D extends androidx.navigation.NavDestination> void destination(androidx.navigation.NavDestinationBuilder<? extends D> navDestination);
+    method public final androidx.navigation.NavigatorProvider getProvider();
+    method public final operator void unaryPlus(androidx.navigation.NavDestination);
+    property public final androidx.navigation.NavigatorProvider provider;
+  }
+
+  public final class NavGraphBuilderKt {
+    method @Deprecated public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline void navigation(androidx.navigation.NavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method public static inline void navigation(androidx.navigation.NavGraphBuilder, String startDestination, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class NavGraphKt {
+    method public static operator boolean contains(androidx.navigation.NavGraph, @IdRes int id);
+    method public static operator boolean contains(androidx.navigation.NavGraph, String route);
+    method public static inline operator androidx.navigation.NavDestination get(androidx.navigation.NavGraph, @IdRes int id);
+    method public static inline operator androidx.navigation.NavDestination get(androidx.navigation.NavGraph, String route);
+    method public static inline operator void minusAssign(androidx.navigation.NavGraph, androidx.navigation.NavDestination node);
+    method public static inline operator void plusAssign(androidx.navigation.NavGraph, androidx.navigation.NavDestination node);
+    method public static inline operator void plusAssign(androidx.navigation.NavGraph, androidx.navigation.NavGraph other);
+  }
+
+  @androidx.navigation.Navigator.Name("navigation") public class NavGraphNavigator extends androidx.navigation.Navigator<androidx.navigation.NavGraph> {
+    ctor public NavGraphNavigator(androidx.navigation.NavigatorProvider navigatorProvider);
+    method public androidx.navigation.NavGraph createDestination();
+  }
+
+  public final class NavOptions {
+    method @AnimRes @AnimatorRes public int getEnterAnim();
+    method @AnimRes @AnimatorRes public int getExitAnim();
+    method @AnimRes @AnimatorRes public int getPopEnterAnim();
+    method @AnimRes @AnimatorRes public int getPopExitAnim();
+    method @Deprecated @IdRes public int getPopUpTo();
+    method @IdRes public int getPopUpToId();
+    method public String? getPopUpToRoute();
+    method public boolean isPopUpToInclusive();
+    method public boolean shouldLaunchSingleTop();
+    method public boolean shouldPopUpToSaveState();
+    method public boolean shouldRestoreState();
+    property @AnimRes @AnimatorRes public final int enterAnim;
+    property @AnimRes @AnimatorRes public final int exitAnim;
+    property @AnimRes @AnimatorRes public final int popEnterAnim;
+    property @AnimRes @AnimatorRes public final int popExitAnim;
+    property @IdRes public final int popUpToId;
+    property public final String? popUpToRoute;
+  }
+
+  public static final class NavOptions.Builder {
+    ctor public NavOptions.Builder();
+    method public androidx.navigation.NavOptions build();
+    method public androidx.navigation.NavOptions.Builder setEnterAnim(@AnimRes @AnimatorRes int enterAnim);
+    method public androidx.navigation.NavOptions.Builder setExitAnim(@AnimRes @AnimatorRes int exitAnim);
+    method public androidx.navigation.NavOptions.Builder setLaunchSingleTop(boolean singleTop);
+    method public androidx.navigation.NavOptions.Builder setPopEnterAnim(@AnimRes @AnimatorRes int popEnterAnim);
+    method public androidx.navigation.NavOptions.Builder setPopExitAnim(@AnimRes @AnimatorRes int popExitAnim);
+    method public androidx.navigation.NavOptions.Builder setPopUpTo(@IdRes int destinationId, boolean inclusive, optional boolean saveState);
+    method public androidx.navigation.NavOptions.Builder setPopUpTo(@IdRes int destinationId, boolean inclusive);
+    method public androidx.navigation.NavOptions.Builder setPopUpTo(String? route, boolean inclusive, optional boolean saveState);
+    method public androidx.navigation.NavOptions.Builder setPopUpTo(String? route, boolean inclusive);
+    method public androidx.navigation.NavOptions.Builder setRestoreState(boolean restoreState);
+  }
+
+  @androidx.navigation.NavOptionsDsl public final class NavOptionsBuilder {
+    ctor public NavOptionsBuilder();
+    method public void anim(kotlin.jvm.functions.Function1<? super androidx.navigation.AnimBuilder,kotlin.Unit> animBuilder);
+    method public boolean getLaunchSingleTop();
+    method @Deprecated public int getPopUpTo();
+    method public int getPopUpToId();
+    method public String? getPopUpToRoute();
+    method public boolean getRestoreState();
+    method public void popUpTo(@IdRes int id, optional kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,kotlin.Unit> popUpToBuilder);
+    method public void popUpTo(String route, optional kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,kotlin.Unit> popUpToBuilder);
+    method public void setLaunchSingleTop(boolean launchSingleTop);
+    method @Deprecated public void setPopUpTo(int value);
+    method public void setRestoreState(boolean restoreState);
+    property public final boolean launchSingleTop;
+    property @Deprecated public final int popUpTo;
+    property public final int popUpToId;
+    property public final String? popUpToRoute;
+    property public final boolean restoreState;
+  }
+
+  public final class NavOptionsBuilderKt {
+    method public static androidx.navigation.NavOptions navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
+  }
+
+  @kotlin.DslMarker public @interface NavOptionsDsl {
+  }
+
+  public abstract class NavType<T> {
+    ctor public NavType(boolean isNullableAllowed);
+    method public static androidx.navigation.NavType<?> fromArgType(String? type, String? packageName);
+    method public abstract operator T? get(android.os.Bundle bundle, String key);
+    method public String getName();
+    method public boolean isNullableAllowed();
+    method public abstract T! parseValue(String value);
+    method public abstract void put(android.os.Bundle bundle, String key, T? value);
+    property public boolean isNullableAllowed;
+    property public String name;
+    field public static final androidx.navigation.NavType<boolean[]> BoolArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Boolean> BoolType;
+    field public static final androidx.navigation.NavType.Companion Companion;
+    field public static final androidx.navigation.NavType<float[]> FloatArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Float> FloatType;
+    field public static final androidx.navigation.NavType<int[]> IntArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Integer> IntType;
+    field public static final androidx.navigation.NavType<long[]> LongArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Long> LongType;
+    field public static final androidx.navigation.NavType<java.lang.Integer> ReferenceType;
+    field public static final androidx.navigation.NavType<java.lang.String[]> StringArrayType;
+    field public static final androidx.navigation.NavType<java.lang.String> StringType;
+  }
+
+  public static final class NavType.Companion {
+    method public androidx.navigation.NavType<?> fromArgType(String? type, String? packageName);
+  }
+
+  public static final class NavType.EnumType<D extends java.lang.Enum<?>> extends androidx.navigation.NavType.SerializableType<D> {
+    ctor public NavType.EnumType(Class<D> type);
+    property public String name;
+  }
+
+  public static final class NavType.ParcelableArrayType<D extends android.os.Parcelable> extends androidx.navigation.NavType<D[]> {
+    ctor public NavType.ParcelableArrayType(Class<D> type);
+    method public D![]? get(android.os.Bundle bundle, String key);
+    method public D![] parseValue(String value);
+    method public void put(android.os.Bundle bundle, String key, D![]? value);
+    property public String name;
+  }
+
+  public static final class NavType.ParcelableType<D> extends androidx.navigation.NavType<D> {
+    ctor public NavType.ParcelableType(Class<D> type);
+    method public D? get(android.os.Bundle bundle, String key);
+    method public D! parseValue(String value);
+    method public void put(android.os.Bundle bundle, String key, D? value);
+    property public String name;
+  }
+
+  public static final class NavType.SerializableArrayType<D extends java.io.Serializable> extends androidx.navigation.NavType<D[]> {
+    ctor public NavType.SerializableArrayType(Class<D> type);
+    method public D![]? get(android.os.Bundle bundle, String key);
+    method public D![] parseValue(String value);
+    method public void put(android.os.Bundle bundle, String key, D![]? value);
+    property public String name;
+  }
+
+  public static class NavType.SerializableType<D extends java.io.Serializable> extends androidx.navigation.NavType<D> {
+    ctor public NavType.SerializableType(Class<D> type);
+    method public D? get(android.os.Bundle bundle, String key);
+    method public D parseValue(String value);
+    method public void put(android.os.Bundle bundle, String key, D value);
+    property public String name;
+  }
+
+  public abstract class Navigator<D extends androidx.navigation.NavDestination> {
+    ctor public Navigator();
+    method public abstract D createDestination();
+    method protected final androidx.navigation.NavigatorState getState();
+    method public final boolean isAttached();
+    method public void navigate(java.util.List<androidx.navigation.NavBackStackEntry> entries, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
+    method public androidx.navigation.NavDestination? navigate(D destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
+    method @CallSuper public void onAttach(androidx.navigation.NavigatorState state);
+    method public void onLaunchSingleTop(androidx.navigation.NavBackStackEntry backStackEntry);
+    method public void onRestoreState(android.os.Bundle savedState);
+    method public android.os.Bundle? onSaveState();
+    method public void popBackStack(androidx.navigation.NavBackStackEntry popUpTo, boolean savedState);
+    method public boolean popBackStack();
+    property public final boolean isAttached;
+    property protected final androidx.navigation.NavigatorState state;
+  }
+
+  public static interface Navigator.Extras {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public static @interface Navigator.Name {
+    method public abstract String value();
+    property public abstract String value;
+  }
+
+  public class NavigatorProvider {
+    ctor public NavigatorProvider();
+    method public final androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? addNavigator(androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+    method @CallSuper public androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? addNavigator(String name, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+    method public final <T extends androidx.navigation.Navigator<?>> T getNavigator(Class<T> navigatorClass);
+    method @CallSuper public <T extends androidx.navigation.Navigator<?>> T getNavigator(String name);
+  }
+
+  public final class NavigatorProviderKt {
+    method public static inline operator <T extends androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>> T get(androidx.navigation.NavigatorProvider, String name);
+    method public static inline operator <T extends androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>> T get(androidx.navigation.NavigatorProvider, kotlin.reflect.KClass<T> clazz);
+    method public static inline operator void plusAssign(androidx.navigation.NavigatorProvider, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+    method public static inline operator androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? set(androidx.navigation.NavigatorProvider, String name, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+  }
+
+  public abstract class NavigatorState {
+    ctor public NavigatorState();
+    method public abstract androidx.navigation.NavBackStackEntry createBackStackEntry(androidx.navigation.NavDestination destination, android.os.Bundle? arguments);
+    method public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> getBackStack();
+    method public final kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.navigation.NavBackStackEntry>> getTransitionsInProgress();
+    method public void markTransitionComplete(androidx.navigation.NavBackStackEntry entry);
+    method @CallSuper public void onLaunchSingleTop(androidx.navigation.NavBackStackEntry backStackEntry);
+    method public void pop(androidx.navigation.NavBackStackEntry popUpTo, boolean saveState);
+    method public void popWithTransition(androidx.navigation.NavBackStackEntry popUpTo, boolean saveState);
+    method public void push(androidx.navigation.NavBackStackEntry backStackEntry);
+    method public void pushWithTransition(androidx.navigation.NavBackStackEntry backStackEntry);
+    property public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> backStack;
+    property public final kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.navigation.NavBackStackEntry>> transitionsInProgress;
+  }
+
+  @androidx.navigation.NavOptionsDsl public final class PopUpToBuilder {
+    ctor public PopUpToBuilder();
+    method public boolean getInclusive();
+    method public boolean getSaveState();
+    method public void setInclusive(boolean inclusive);
+    method public void setSaveState(boolean saveState);
+    property public final boolean inclusive;
+    property public final boolean saveState;
+  }
+
+}
+
diff --git a/navigation/navigation-common/api/current.txt b/navigation/navigation-common/api/current.txt
index a169ec7..1402d24d 100644
--- a/navigation/navigation-common/api/current.txt
+++ b/navigation/navigation-common/api/current.txt
@@ -235,7 +235,6 @@
   public static final class NavDestination.Companion {
     method public kotlin.sequences.Sequence<androidx.navigation.NavDestination> getHierarchy(androidx.navigation.NavDestination);
     method protected <C> Class<? extends C> parseClassFromName(android.content.Context context, String name, Class<? extends C> expectedClassType);
-    property public final kotlin.sequences.Sequence<androidx.navigation.NavDestination> hierarchy;
   }
 
   @androidx.navigation.NavDestinationDsl public class NavDestinationBuilder<D extends androidx.navigation.NavDestination> {
@@ -497,7 +496,7 @@
     ctor public NavigatorState();
     method public abstract androidx.navigation.NavBackStackEntry createBackStackEntry(androidx.navigation.NavDestination destination, android.os.Bundle? arguments);
     method public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> getBackStack();
-    method public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> getTransitionsInProgress();
+    method public final kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.navigation.NavBackStackEntry>> getTransitionsInProgress();
     method public void markTransitionComplete(androidx.navigation.NavBackStackEntry entry);
     method @CallSuper public void onLaunchSingleTop(androidx.navigation.NavBackStackEntry backStackEntry);
     method public void pop(androidx.navigation.NavBackStackEntry popUpTo, boolean saveState);
@@ -505,7 +504,7 @@
     method public void push(androidx.navigation.NavBackStackEntry backStackEntry);
     method public void pushWithTransition(androidx.navigation.NavBackStackEntry backStackEntry);
     property public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> backStack;
-    property public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> transitionsInProgress;
+    property public final kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.navigation.NavBackStackEntry>> transitionsInProgress;
   }
 
   @androidx.navigation.NavOptionsDsl public final class PopUpToBuilder {
diff --git a/navigation/navigation-common/api/public_plus_experimental_2.4.0-beta01.txt b/navigation/navigation-common/api/public_plus_experimental_2.4.0-beta01.txt
index a169ec7..1402d24d 100644
--- a/navigation/navigation-common/api/public_plus_experimental_2.4.0-beta01.txt
+++ b/navigation/navigation-common/api/public_plus_experimental_2.4.0-beta01.txt
@@ -235,7 +235,6 @@
   public static final class NavDestination.Companion {
     method public kotlin.sequences.Sequence<androidx.navigation.NavDestination> getHierarchy(androidx.navigation.NavDestination);
     method protected <C> Class<? extends C> parseClassFromName(android.content.Context context, String name, Class<? extends C> expectedClassType);
-    property public final kotlin.sequences.Sequence<androidx.navigation.NavDestination> hierarchy;
   }
 
   @androidx.navigation.NavDestinationDsl public class NavDestinationBuilder<D extends androidx.navigation.NavDestination> {
@@ -497,7 +496,7 @@
     ctor public NavigatorState();
     method public abstract androidx.navigation.NavBackStackEntry createBackStackEntry(androidx.navigation.NavDestination destination, android.os.Bundle? arguments);
     method public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> getBackStack();
-    method public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> getTransitionsInProgress();
+    method public final kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.navigation.NavBackStackEntry>> getTransitionsInProgress();
     method public void markTransitionComplete(androidx.navigation.NavBackStackEntry entry);
     method @CallSuper public void onLaunchSingleTop(androidx.navigation.NavBackStackEntry backStackEntry);
     method public void pop(androidx.navigation.NavBackStackEntry popUpTo, boolean saveState);
@@ -505,7 +504,7 @@
     method public void push(androidx.navigation.NavBackStackEntry backStackEntry);
     method public void pushWithTransition(androidx.navigation.NavBackStackEntry backStackEntry);
     property public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> backStack;
-    property public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> transitionsInProgress;
+    property public final kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.navigation.NavBackStackEntry>> transitionsInProgress;
   }
 
   @androidx.navigation.NavOptionsDsl public final class PopUpToBuilder {
diff --git a/navigation/navigation-common/api/public_plus_experimental_2.4.0-beta02.txt b/navigation/navigation-common/api/public_plus_experimental_2.4.0-beta02.txt
new file mode 100644
index 0000000..1402d24d
--- /dev/null
+++ b/navigation/navigation-common/api/public_plus_experimental_2.4.0-beta02.txt
@@ -0,0 +1,521 @@
+// Signature format: 4.0
+package androidx.navigation {
+
+  public final class ActionOnlyNavDirections implements androidx.navigation.NavDirections {
+    ctor public ActionOnlyNavDirections(int actionId);
+    method public int component1();
+    method public androidx.navigation.ActionOnlyNavDirections copy(int actionId);
+    method public int getActionId();
+    method public android.os.Bundle getArguments();
+    property public int actionId;
+    property public android.os.Bundle arguments;
+  }
+
+  @androidx.navigation.NavOptionsDsl public final class AnimBuilder {
+    ctor public AnimBuilder();
+    method public int getEnter();
+    method public int getExit();
+    method public int getPopEnter();
+    method public int getPopExit();
+    method public void setEnter(int enter);
+    method public void setExit(int exit);
+    method public void setPopEnter(int popEnter);
+    method public void setPopExit(int popExit);
+    property public final int enter;
+    property public final int exit;
+    property public final int popEnter;
+    property public final int popExit;
+  }
+
+  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 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);
+    ctor public NavAction(@IdRes int destinationId);
+    method public android.os.Bundle? getDefaultArguments();
+    method public int getDestinationId();
+    method public androidx.navigation.NavOptions? getNavOptions();
+    method public void setDefaultArguments(android.os.Bundle? defaultArguments);
+    method public void setNavOptions(androidx.navigation.NavOptions? navOptions);
+    property public final android.os.Bundle? defaultArguments;
+    property public final int destinationId;
+    property public final androidx.navigation.NavOptions? navOptions;
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class NavActionBuilder {
+    ctor public NavActionBuilder();
+    method public java.util.Map<java.lang.String,java.lang.Object> getDefaultArguments();
+    method public int getDestinationId();
+    method public void navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
+    method public void setDestinationId(int destinationId);
+    property public final java.util.Map<java.lang.String,java.lang.Object> defaultArguments;
+    property public final int destinationId;
+  }
+
+  public interface NavArgs {
+  }
+
+  public final class NavArgsLazy<Args extends androidx.navigation.NavArgs> implements kotlin.Lazy<Args> {
+    ctor public NavArgsLazy(kotlin.reflect.KClass<Args> navArgsClass, kotlin.jvm.functions.Function0<android.os.Bundle> argumentProducer);
+    method public Args getValue();
+    method public boolean isInitialized();
+    property public Args value;
+  }
+
+  public final class NavArgsLazyKt {
+  }
+
+  public final class NavArgument {
+    method public Object? getDefaultValue();
+    method public androidx.navigation.NavType<java.lang.Object> getType();
+    method public boolean isDefaultValuePresent();
+    method public boolean isNullable();
+    property public final Object? defaultValue;
+    property public final boolean isDefaultValuePresent;
+    property public final boolean isNullable;
+    property public final androidx.navigation.NavType<java.lang.Object> type;
+  }
+
+  public static final class NavArgument.Builder {
+    ctor public NavArgument.Builder();
+    method public androidx.navigation.NavArgument build();
+    method public androidx.navigation.NavArgument.Builder setDefaultValue(Object? defaultValue);
+    method public androidx.navigation.NavArgument.Builder setIsNullable(boolean isNullable);
+    method public <T> androidx.navigation.NavArgument.Builder setType(androidx.navigation.NavType<T> type);
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class NavArgumentBuilder {
+    ctor public NavArgumentBuilder();
+    method public androidx.navigation.NavArgument build();
+    method public Object? getDefaultValue();
+    method public boolean getNullable();
+    method public androidx.navigation.NavType<?> getType();
+    method public void setDefaultValue(Object? value);
+    method public void setNullable(boolean value);
+    method public void setType(androidx.navigation.NavType<?> value);
+    property public final Object? defaultValue;
+    property public final boolean nullable;
+    property public final androidx.navigation.NavType<?> type;
+  }
+
+  public final class NavBackStackEntry implements androidx.lifecycle.HasDefaultViewModelProviderFactory androidx.lifecycle.LifecycleOwner androidx.savedstate.SavedStateRegistryOwner androidx.lifecycle.ViewModelStoreOwner {
+    method public android.os.Bundle? getArguments();
+    method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
+    method public androidx.navigation.NavDestination getDestination();
+    method public String getId();
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method public androidx.lifecycle.SavedStateHandle getSavedStateHandle();
+    method public androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+    method public androidx.lifecycle.ViewModelStore getViewModelStore();
+    property public final android.os.Bundle? arguments;
+    property public final androidx.navigation.NavDestination destination;
+    property public final String id;
+    property public final androidx.lifecycle.SavedStateHandle savedStateHandle;
+  }
+
+  public final class NavDeepLink {
+    method public String? getAction();
+    method public String? getMimeType();
+    method public String? getUriPattern();
+    property public final String? action;
+    property public final String? mimeType;
+    property public final String? uriPattern;
+  }
+
+  public static final class NavDeepLink.Builder {
+    method public androidx.navigation.NavDeepLink build();
+    method public static androidx.navigation.NavDeepLink.Builder fromAction(String action);
+    method public static androidx.navigation.NavDeepLink.Builder fromMimeType(String mimeType);
+    method public static androidx.navigation.NavDeepLink.Builder fromUriPattern(String uriPattern);
+    method public androidx.navigation.NavDeepLink.Builder setAction(String action);
+    method public androidx.navigation.NavDeepLink.Builder setMimeType(String mimeType);
+    method public androidx.navigation.NavDeepLink.Builder setUriPattern(String uriPattern);
+  }
+
+  @kotlin.DslMarker public @interface NavDeepLinkDsl {
+  }
+
+  @androidx.navigation.NavDeepLinkDsl public final class NavDeepLinkDslBuilder {
+    ctor public NavDeepLinkDslBuilder();
+    method public String? getAction();
+    method public String? getMimeType();
+    method public String? getUriPattern();
+    method public void setAction(String? p);
+    method public void setMimeType(String? mimeType);
+    method public void setUriPattern(String? uriPattern);
+    property public final String? action;
+    property public final String? mimeType;
+    property public final String? uriPattern;
+  }
+
+  public final class NavDeepLinkDslBuilderKt {
+    method public static androidx.navigation.NavDeepLink navDeepLink(kotlin.jvm.functions.Function1<? super androidx.navigation.NavDeepLinkDslBuilder,kotlin.Unit> deepLinkBuilder);
+  }
+
+  public class NavDeepLinkRequest {
+    method public String? getAction();
+    method public String? getMimeType();
+    method public android.net.Uri? getUri();
+    property public String? action;
+    property public String? mimeType;
+    property public android.net.Uri? uri;
+  }
+
+  public static final class NavDeepLinkRequest.Builder {
+    method public androidx.navigation.NavDeepLinkRequest build();
+    method public static androidx.navigation.NavDeepLinkRequest.Builder fromAction(String action);
+    method public static androidx.navigation.NavDeepLinkRequest.Builder fromMimeType(String mimeType);
+    method public static androidx.navigation.NavDeepLinkRequest.Builder fromUri(android.net.Uri uri);
+    method public androidx.navigation.NavDeepLinkRequest.Builder setAction(String action);
+    method public androidx.navigation.NavDeepLinkRequest.Builder setMimeType(String mimeType);
+    method public androidx.navigation.NavDeepLinkRequest.Builder setUri(android.net.Uri uri);
+    field public static final androidx.navigation.NavDeepLinkRequest.Builder.Companion Companion;
+  }
+
+  public static final class NavDeepLinkRequest.Builder.Companion {
+    method public androidx.navigation.NavDeepLinkRequest.Builder fromAction(String action);
+    method public androidx.navigation.NavDeepLinkRequest.Builder fromMimeType(String mimeType);
+    method public androidx.navigation.NavDeepLinkRequest.Builder fromUri(android.net.Uri uri);
+  }
+
+  public class NavDestination {
+    ctor public NavDestination(String navigatorName);
+    ctor public NavDestination(androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+    method public final void addArgument(String argumentName, androidx.navigation.NavArgument argument);
+    method public final void addDeepLink(String uriPattern);
+    method public final void addDeepLink(androidx.navigation.NavDeepLink navDeepLink);
+    method public final androidx.navigation.NavAction? getAction(@IdRes int id);
+    method public final java.util.Map<java.lang.String,androidx.navigation.NavArgument> getArguments();
+    method public static final kotlin.sequences.Sequence<androidx.navigation.NavDestination> getHierarchy(androidx.navigation.NavDestination);
+    method @IdRes public final int getId();
+    method public final CharSequence? getLabel();
+    method public final String getNavigatorName();
+    method public final androidx.navigation.NavGraph? getParent();
+    method public final String? getRoute();
+    method public boolean hasDeepLink(android.net.Uri deepLink);
+    method public boolean hasDeepLink(androidx.navigation.NavDeepLinkRequest deepLinkRequest);
+    method @CallSuper public void onInflate(android.content.Context context, android.util.AttributeSet attrs);
+    method protected static final <C> Class<? extends C> parseClassFromName(android.content.Context context, String name, Class<? extends C> expectedClassType);
+    method public final void putAction(@IdRes int actionId, @IdRes int destId);
+    method public final void putAction(@IdRes int actionId, androidx.navigation.NavAction action);
+    method public final void removeAction(@IdRes int actionId);
+    method public final void removeArgument(String argumentName);
+    method public final void setId(@IdRes int id);
+    method public final void setLabel(CharSequence? label);
+    method public final void setRoute(String? route);
+    property public final java.util.Map<java.lang.String,androidx.navigation.NavArgument> arguments;
+    property @IdRes public final int id;
+    property public final CharSequence? label;
+    property public final String navigatorName;
+    property public final androidx.navigation.NavGraph? parent;
+    property public final String? route;
+    field public static final androidx.navigation.NavDestination.Companion Companion;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public static @interface NavDestination.ClassType {
+    method public abstract kotlin.reflect.KClass<?> value();
+    property public abstract kotlin.reflect.KClass<?> value;
+  }
+
+  public static final class NavDestination.Companion {
+    method public kotlin.sequences.Sequence<androidx.navigation.NavDestination> getHierarchy(androidx.navigation.NavDestination);
+    method protected <C> Class<? extends C> parseClassFromName(android.content.Context context, String name, Class<? extends C> expectedClassType);
+  }
+
+  @androidx.navigation.NavDestinationDsl public class NavDestinationBuilder<D extends androidx.navigation.NavDestination> {
+    ctor @Deprecated public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, @IdRes int id);
+    ctor public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, String? route);
+    method @Deprecated public final void action(int actionId, kotlin.jvm.functions.Function1<? super androidx.navigation.NavActionBuilder,kotlin.Unit> actionBuilder);
+    method public final void argument(String name, kotlin.jvm.functions.Function1<? super androidx.navigation.NavArgumentBuilder,kotlin.Unit> argumentBuilder);
+    method public D build();
+    method public final void deepLink(String uriPattern);
+    method public final void deepLink(kotlin.jvm.functions.Function1<? super androidx.navigation.NavDeepLinkDslBuilder,kotlin.Unit> navDeepLink);
+    method public final int getId();
+    method public final CharSequence? getLabel();
+    method protected final androidx.navigation.Navigator<? extends D> getNavigator();
+    method public final String? getRoute();
+    method public final void setLabel(CharSequence? label);
+    property public final int id;
+    property public final CharSequence? label;
+    property protected final androidx.navigation.Navigator<? extends D> navigator;
+    property public final String? route;
+  }
+
+  @kotlin.DslMarker public @interface NavDestinationDsl {
+  }
+
+  public interface NavDirections {
+    method @IdRes public int getActionId();
+    method public android.os.Bundle getArguments();
+    property @IdRes public abstract int actionId;
+    property public abstract android.os.Bundle arguments;
+  }
+
+  public class NavGraph extends androidx.navigation.NavDestination implements java.lang.Iterable<androidx.navigation.NavDestination> kotlin.jvm.internal.markers.KMappedMarker {
+    ctor public NavGraph(androidx.navigation.Navigator<? extends androidx.navigation.NavGraph> navGraphNavigator);
+    method public final void addAll(androidx.navigation.NavGraph other);
+    method public final void addDestination(androidx.navigation.NavDestination node);
+    method public final void addDestinations(java.util.Collection<? extends androidx.navigation.NavDestination> nodes);
+    method public final void addDestinations(androidx.navigation.NavDestination... nodes);
+    method public final void clear();
+    method public final androidx.navigation.NavDestination? findNode(@IdRes int resId);
+    method public final androidx.navigation.NavDestination? findNode(String? route);
+    method public static final androidx.navigation.NavDestination findStartDestination(androidx.navigation.NavGraph);
+    method @Deprecated @IdRes public final int getStartDestination();
+    method @IdRes public final int getStartDestinationId();
+    method public final String? getStartDestinationRoute();
+    method public final java.util.Iterator<androidx.navigation.NavDestination> iterator();
+    method public final void remove(androidx.navigation.NavDestination node);
+    method public final void setStartDestination(int startDestId);
+    method public final void setStartDestination(String startDestRoute);
+    property @IdRes public final int startDestinationId;
+    property public final String? startDestinationRoute;
+    field public static final androidx.navigation.NavGraph.Companion Companion;
+  }
+
+  public static final class NavGraph.Companion {
+    method public androidx.navigation.NavDestination findStartDestination(androidx.navigation.NavGraph);
+  }
+
+  @androidx.navigation.NavDestinationDsl public class NavGraphBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.NavGraph> {
+    ctor @Deprecated public NavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
+    ctor public NavGraphBuilder(androidx.navigation.NavigatorProvider provider, String startDestination, String? route);
+    method public final void addDestination(androidx.navigation.NavDestination destination);
+    method public androidx.navigation.NavGraph build();
+    method public final <D extends androidx.navigation.NavDestination> void destination(androidx.navigation.NavDestinationBuilder<? extends D> navDestination);
+    method public final androidx.navigation.NavigatorProvider getProvider();
+    method public final operator void unaryPlus(androidx.navigation.NavDestination);
+    property public final androidx.navigation.NavigatorProvider provider;
+  }
+
+  public final class NavGraphBuilderKt {
+    method @Deprecated public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline void navigation(androidx.navigation.NavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method public static inline void navigation(androidx.navigation.NavGraphBuilder, String startDestination, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class NavGraphKt {
+    method public static operator boolean contains(androidx.navigation.NavGraph, @IdRes int id);
+    method public static operator boolean contains(androidx.navigation.NavGraph, String route);
+    method public static inline operator androidx.navigation.NavDestination get(androidx.navigation.NavGraph, @IdRes int id);
+    method public static inline operator androidx.navigation.NavDestination get(androidx.navigation.NavGraph, String route);
+    method public static inline operator void minusAssign(androidx.navigation.NavGraph, androidx.navigation.NavDestination node);
+    method public static inline operator void plusAssign(androidx.navigation.NavGraph, androidx.navigation.NavDestination node);
+    method public static inline operator void plusAssign(androidx.navigation.NavGraph, androidx.navigation.NavGraph other);
+  }
+
+  @androidx.navigation.Navigator.Name("navigation") public class NavGraphNavigator extends androidx.navigation.Navigator<androidx.navigation.NavGraph> {
+    ctor public NavGraphNavigator(androidx.navigation.NavigatorProvider navigatorProvider);
+    method public androidx.navigation.NavGraph createDestination();
+  }
+
+  public final class NavOptions {
+    method @AnimRes @AnimatorRes public int getEnterAnim();
+    method @AnimRes @AnimatorRes public int getExitAnim();
+    method @AnimRes @AnimatorRes public int getPopEnterAnim();
+    method @AnimRes @AnimatorRes public int getPopExitAnim();
+    method @Deprecated @IdRes public int getPopUpTo();
+    method @IdRes public int getPopUpToId();
+    method public String? getPopUpToRoute();
+    method public boolean isPopUpToInclusive();
+    method public boolean shouldLaunchSingleTop();
+    method public boolean shouldPopUpToSaveState();
+    method public boolean shouldRestoreState();
+    property @AnimRes @AnimatorRes public final int enterAnim;
+    property @AnimRes @AnimatorRes public final int exitAnim;
+    property @AnimRes @AnimatorRes public final int popEnterAnim;
+    property @AnimRes @AnimatorRes public final int popExitAnim;
+    property @IdRes public final int popUpToId;
+    property public final String? popUpToRoute;
+  }
+
+  public static final class NavOptions.Builder {
+    ctor public NavOptions.Builder();
+    method public androidx.navigation.NavOptions build();
+    method public androidx.navigation.NavOptions.Builder setEnterAnim(@AnimRes @AnimatorRes int enterAnim);
+    method public androidx.navigation.NavOptions.Builder setExitAnim(@AnimRes @AnimatorRes int exitAnim);
+    method public androidx.navigation.NavOptions.Builder setLaunchSingleTop(boolean singleTop);
+    method public androidx.navigation.NavOptions.Builder setPopEnterAnim(@AnimRes @AnimatorRes int popEnterAnim);
+    method public androidx.navigation.NavOptions.Builder setPopExitAnim(@AnimRes @AnimatorRes int popExitAnim);
+    method public androidx.navigation.NavOptions.Builder setPopUpTo(@IdRes int destinationId, boolean inclusive, optional boolean saveState);
+    method public androidx.navigation.NavOptions.Builder setPopUpTo(@IdRes int destinationId, boolean inclusive);
+    method public androidx.navigation.NavOptions.Builder setPopUpTo(String? route, boolean inclusive, optional boolean saveState);
+    method public androidx.navigation.NavOptions.Builder setPopUpTo(String? route, boolean inclusive);
+    method public androidx.navigation.NavOptions.Builder setRestoreState(boolean restoreState);
+  }
+
+  @androidx.navigation.NavOptionsDsl public final class NavOptionsBuilder {
+    ctor public NavOptionsBuilder();
+    method public void anim(kotlin.jvm.functions.Function1<? super androidx.navigation.AnimBuilder,kotlin.Unit> animBuilder);
+    method public boolean getLaunchSingleTop();
+    method @Deprecated public int getPopUpTo();
+    method public int getPopUpToId();
+    method public String? getPopUpToRoute();
+    method public boolean getRestoreState();
+    method public void popUpTo(@IdRes int id, optional kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,kotlin.Unit> popUpToBuilder);
+    method public void popUpTo(String route, optional kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,kotlin.Unit> popUpToBuilder);
+    method public void setLaunchSingleTop(boolean launchSingleTop);
+    method @Deprecated public void setPopUpTo(int value);
+    method public void setRestoreState(boolean restoreState);
+    property public final boolean launchSingleTop;
+    property @Deprecated public final int popUpTo;
+    property public final int popUpToId;
+    property public final String? popUpToRoute;
+    property public final boolean restoreState;
+  }
+
+  public final class NavOptionsBuilderKt {
+    method public static androidx.navigation.NavOptions navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
+  }
+
+  @kotlin.DslMarker public @interface NavOptionsDsl {
+  }
+
+  public abstract class NavType<T> {
+    ctor public NavType(boolean isNullableAllowed);
+    method public static androidx.navigation.NavType<?> fromArgType(String? type, String? packageName);
+    method public abstract operator T? get(android.os.Bundle bundle, String key);
+    method public String getName();
+    method public boolean isNullableAllowed();
+    method public abstract T! parseValue(String value);
+    method public abstract void put(android.os.Bundle bundle, String key, T? value);
+    property public boolean isNullableAllowed;
+    property public String name;
+    field public static final androidx.navigation.NavType<boolean[]> BoolArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Boolean> BoolType;
+    field public static final androidx.navigation.NavType.Companion Companion;
+    field public static final androidx.navigation.NavType<float[]> FloatArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Float> FloatType;
+    field public static final androidx.navigation.NavType<int[]> IntArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Integer> IntType;
+    field public static final androidx.navigation.NavType<long[]> LongArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Long> LongType;
+    field public static final androidx.navigation.NavType<java.lang.Integer> ReferenceType;
+    field public static final androidx.navigation.NavType<java.lang.String[]> StringArrayType;
+    field public static final androidx.navigation.NavType<java.lang.String> StringType;
+  }
+
+  public static final class NavType.Companion {
+    method public androidx.navigation.NavType<?> fromArgType(String? type, String? packageName);
+  }
+
+  public static final class NavType.EnumType<D extends java.lang.Enum<?>> extends androidx.navigation.NavType.SerializableType<D> {
+    ctor public NavType.EnumType(Class<D> type);
+    property public String name;
+  }
+
+  public static final class NavType.ParcelableArrayType<D extends android.os.Parcelable> extends androidx.navigation.NavType<D[]> {
+    ctor public NavType.ParcelableArrayType(Class<D> type);
+    method public D![]? get(android.os.Bundle bundle, String key);
+    method public D![] parseValue(String value);
+    method public void put(android.os.Bundle bundle, String key, D![]? value);
+    property public String name;
+  }
+
+  public static final class NavType.ParcelableType<D> extends androidx.navigation.NavType<D> {
+    ctor public NavType.ParcelableType(Class<D> type);
+    method public D? get(android.os.Bundle bundle, String key);
+    method public D! parseValue(String value);
+    method public void put(android.os.Bundle bundle, String key, D? value);
+    property public String name;
+  }
+
+  public static final class NavType.SerializableArrayType<D extends java.io.Serializable> extends androidx.navigation.NavType<D[]> {
+    ctor public NavType.SerializableArrayType(Class<D> type);
+    method public D![]? get(android.os.Bundle bundle, String key);
+    method public D![] parseValue(String value);
+    method public void put(android.os.Bundle bundle, String key, D![]? value);
+    property public String name;
+  }
+
+  public static class NavType.SerializableType<D extends java.io.Serializable> extends androidx.navigation.NavType<D> {
+    ctor public NavType.SerializableType(Class<D> type);
+    method public D? get(android.os.Bundle bundle, String key);
+    method public D parseValue(String value);
+    method public void put(android.os.Bundle bundle, String key, D value);
+    property public String name;
+  }
+
+  public abstract class Navigator<D extends androidx.navigation.NavDestination> {
+    ctor public Navigator();
+    method public abstract D createDestination();
+    method protected final androidx.navigation.NavigatorState getState();
+    method public final boolean isAttached();
+    method public void navigate(java.util.List<androidx.navigation.NavBackStackEntry> entries, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
+    method public androidx.navigation.NavDestination? navigate(D destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
+    method @CallSuper public void onAttach(androidx.navigation.NavigatorState state);
+    method public void onLaunchSingleTop(androidx.navigation.NavBackStackEntry backStackEntry);
+    method public void onRestoreState(android.os.Bundle savedState);
+    method public android.os.Bundle? onSaveState();
+    method public void popBackStack(androidx.navigation.NavBackStackEntry popUpTo, boolean savedState);
+    method public boolean popBackStack();
+    property public final boolean isAttached;
+    property protected final androidx.navigation.NavigatorState state;
+  }
+
+  public static interface Navigator.Extras {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public static @interface Navigator.Name {
+    method public abstract String value();
+    property public abstract String value;
+  }
+
+  public class NavigatorProvider {
+    ctor public NavigatorProvider();
+    method public final androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? addNavigator(androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+    method @CallSuper public androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? addNavigator(String name, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+    method public final <T extends androidx.navigation.Navigator<?>> T getNavigator(Class<T> navigatorClass);
+    method @CallSuper public <T extends androidx.navigation.Navigator<?>> T getNavigator(String name);
+  }
+
+  public final class NavigatorProviderKt {
+    method public static inline operator <T extends androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>> T get(androidx.navigation.NavigatorProvider, String name);
+    method public static inline operator <T extends androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>> T get(androidx.navigation.NavigatorProvider, kotlin.reflect.KClass<T> clazz);
+    method public static inline operator void plusAssign(androidx.navigation.NavigatorProvider, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+    method public static inline operator androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? set(androidx.navigation.NavigatorProvider, String name, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+  }
+
+  public abstract class NavigatorState {
+    ctor public NavigatorState();
+    method public abstract androidx.navigation.NavBackStackEntry createBackStackEntry(androidx.navigation.NavDestination destination, android.os.Bundle? arguments);
+    method public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> getBackStack();
+    method public final kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.navigation.NavBackStackEntry>> getTransitionsInProgress();
+    method public void markTransitionComplete(androidx.navigation.NavBackStackEntry entry);
+    method @CallSuper public void onLaunchSingleTop(androidx.navigation.NavBackStackEntry backStackEntry);
+    method public void pop(androidx.navigation.NavBackStackEntry popUpTo, boolean saveState);
+    method public void popWithTransition(androidx.navigation.NavBackStackEntry popUpTo, boolean saveState);
+    method public void push(androidx.navigation.NavBackStackEntry backStackEntry);
+    method public void pushWithTransition(androidx.navigation.NavBackStackEntry backStackEntry);
+    property public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> backStack;
+    property public final kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.navigation.NavBackStackEntry>> transitionsInProgress;
+  }
+
+  @androidx.navigation.NavOptionsDsl public final class PopUpToBuilder {
+    ctor public PopUpToBuilder();
+    method public boolean getInclusive();
+    method public boolean getSaveState();
+    method public void setInclusive(boolean inclusive);
+    method public void setSaveState(boolean saveState);
+    property public final boolean inclusive;
+    property public final boolean saveState;
+  }
+
+}
+
diff --git a/navigation/navigation-common/api/public_plus_experimental_current.txt b/navigation/navigation-common/api/public_plus_experimental_current.txt
index a169ec7..1402d24d 100644
--- a/navigation/navigation-common/api/public_plus_experimental_current.txt
+++ b/navigation/navigation-common/api/public_plus_experimental_current.txt
@@ -235,7 +235,6 @@
   public static final class NavDestination.Companion {
     method public kotlin.sequences.Sequence<androidx.navigation.NavDestination> getHierarchy(androidx.navigation.NavDestination);
     method protected <C> Class<? extends C> parseClassFromName(android.content.Context context, String name, Class<? extends C> expectedClassType);
-    property public final kotlin.sequences.Sequence<androidx.navigation.NavDestination> hierarchy;
   }
 
   @androidx.navigation.NavDestinationDsl public class NavDestinationBuilder<D extends androidx.navigation.NavDestination> {
@@ -497,7 +496,7 @@
     ctor public NavigatorState();
     method public abstract androidx.navigation.NavBackStackEntry createBackStackEntry(androidx.navigation.NavDestination destination, android.os.Bundle? arguments);
     method public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> getBackStack();
-    method public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> getTransitionsInProgress();
+    method public final kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.navigation.NavBackStackEntry>> getTransitionsInProgress();
     method public void markTransitionComplete(androidx.navigation.NavBackStackEntry entry);
     method @CallSuper public void onLaunchSingleTop(androidx.navigation.NavBackStackEntry backStackEntry);
     method public void pop(androidx.navigation.NavBackStackEntry popUpTo, boolean saveState);
@@ -505,7 +504,7 @@
     method public void push(androidx.navigation.NavBackStackEntry backStackEntry);
     method public void pushWithTransition(androidx.navigation.NavBackStackEntry backStackEntry);
     property public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> backStack;
-    property public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> transitionsInProgress;
+    property public final kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.navigation.NavBackStackEntry>> transitionsInProgress;
   }
 
   @androidx.navigation.NavOptionsDsl public final class PopUpToBuilder {
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/navigation/navigation-common/api/res-2.4.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to navigation/navigation-common/api/res-2.4.0-beta02.txt
diff --git a/navigation/navigation-common/api/restricted_2.4.0-beta01.txt b/navigation/navigation-common/api/restricted_2.4.0-beta01.txt
index a169ec7..1402d24d 100644
--- a/navigation/navigation-common/api/restricted_2.4.0-beta01.txt
+++ b/navigation/navigation-common/api/restricted_2.4.0-beta01.txt
@@ -235,7 +235,6 @@
   public static final class NavDestination.Companion {
     method public kotlin.sequences.Sequence<androidx.navigation.NavDestination> getHierarchy(androidx.navigation.NavDestination);
     method protected <C> Class<? extends C> parseClassFromName(android.content.Context context, String name, Class<? extends C> expectedClassType);
-    property public final kotlin.sequences.Sequence<androidx.navigation.NavDestination> hierarchy;
   }
 
   @androidx.navigation.NavDestinationDsl public class NavDestinationBuilder<D extends androidx.navigation.NavDestination> {
@@ -497,7 +496,7 @@
     ctor public NavigatorState();
     method public abstract androidx.navigation.NavBackStackEntry createBackStackEntry(androidx.navigation.NavDestination destination, android.os.Bundle? arguments);
     method public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> getBackStack();
-    method public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> getTransitionsInProgress();
+    method public final kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.navigation.NavBackStackEntry>> getTransitionsInProgress();
     method public void markTransitionComplete(androidx.navigation.NavBackStackEntry entry);
     method @CallSuper public void onLaunchSingleTop(androidx.navigation.NavBackStackEntry backStackEntry);
     method public void pop(androidx.navigation.NavBackStackEntry popUpTo, boolean saveState);
@@ -505,7 +504,7 @@
     method public void push(androidx.navigation.NavBackStackEntry backStackEntry);
     method public void pushWithTransition(androidx.navigation.NavBackStackEntry backStackEntry);
     property public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> backStack;
-    property public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> transitionsInProgress;
+    property public final kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.navigation.NavBackStackEntry>> transitionsInProgress;
   }
 
   @androidx.navigation.NavOptionsDsl public final class PopUpToBuilder {
diff --git a/navigation/navigation-common/api/restricted_2.4.0-beta02.txt b/navigation/navigation-common/api/restricted_2.4.0-beta02.txt
new file mode 100644
index 0000000..1402d24d
--- /dev/null
+++ b/navigation/navigation-common/api/restricted_2.4.0-beta02.txt
@@ -0,0 +1,521 @@
+// Signature format: 4.0
+package androidx.navigation {
+
+  public final class ActionOnlyNavDirections implements androidx.navigation.NavDirections {
+    ctor public ActionOnlyNavDirections(int actionId);
+    method public int component1();
+    method public androidx.navigation.ActionOnlyNavDirections copy(int actionId);
+    method public int getActionId();
+    method public android.os.Bundle getArguments();
+    property public int actionId;
+    property public android.os.Bundle arguments;
+  }
+
+  @androidx.navigation.NavOptionsDsl public final class AnimBuilder {
+    ctor public AnimBuilder();
+    method public int getEnter();
+    method public int getExit();
+    method public int getPopEnter();
+    method public int getPopExit();
+    method public void setEnter(int enter);
+    method public void setExit(int exit);
+    method public void setPopEnter(int popEnter);
+    method public void setPopExit(int popExit);
+    property public final int enter;
+    property public final int exit;
+    property public final int popEnter;
+    property public final int popExit;
+  }
+
+  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 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);
+    ctor public NavAction(@IdRes int destinationId);
+    method public android.os.Bundle? getDefaultArguments();
+    method public int getDestinationId();
+    method public androidx.navigation.NavOptions? getNavOptions();
+    method public void setDefaultArguments(android.os.Bundle? defaultArguments);
+    method public void setNavOptions(androidx.navigation.NavOptions? navOptions);
+    property public final android.os.Bundle? defaultArguments;
+    property public final int destinationId;
+    property public final androidx.navigation.NavOptions? navOptions;
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class NavActionBuilder {
+    ctor public NavActionBuilder();
+    method public java.util.Map<java.lang.String,java.lang.Object> getDefaultArguments();
+    method public int getDestinationId();
+    method public void navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
+    method public void setDestinationId(int destinationId);
+    property public final java.util.Map<java.lang.String,java.lang.Object> defaultArguments;
+    property public final int destinationId;
+  }
+
+  public interface NavArgs {
+  }
+
+  public final class NavArgsLazy<Args extends androidx.navigation.NavArgs> implements kotlin.Lazy<Args> {
+    ctor public NavArgsLazy(kotlin.reflect.KClass<Args> navArgsClass, kotlin.jvm.functions.Function0<android.os.Bundle> argumentProducer);
+    method public Args getValue();
+    method public boolean isInitialized();
+    property public Args value;
+  }
+
+  public final class NavArgsLazyKt {
+  }
+
+  public final class NavArgument {
+    method public Object? getDefaultValue();
+    method public androidx.navigation.NavType<java.lang.Object> getType();
+    method public boolean isDefaultValuePresent();
+    method public boolean isNullable();
+    property public final Object? defaultValue;
+    property public final boolean isDefaultValuePresent;
+    property public final boolean isNullable;
+    property public final androidx.navigation.NavType<java.lang.Object> type;
+  }
+
+  public static final class NavArgument.Builder {
+    ctor public NavArgument.Builder();
+    method public androidx.navigation.NavArgument build();
+    method public androidx.navigation.NavArgument.Builder setDefaultValue(Object? defaultValue);
+    method public androidx.navigation.NavArgument.Builder setIsNullable(boolean isNullable);
+    method public <T> androidx.navigation.NavArgument.Builder setType(androidx.navigation.NavType<T> type);
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class NavArgumentBuilder {
+    ctor public NavArgumentBuilder();
+    method public androidx.navigation.NavArgument build();
+    method public Object? getDefaultValue();
+    method public boolean getNullable();
+    method public androidx.navigation.NavType<?> getType();
+    method public void setDefaultValue(Object? value);
+    method public void setNullable(boolean value);
+    method public void setType(androidx.navigation.NavType<?> value);
+    property public final Object? defaultValue;
+    property public final boolean nullable;
+    property public final androidx.navigation.NavType<?> type;
+  }
+
+  public final class NavBackStackEntry implements androidx.lifecycle.HasDefaultViewModelProviderFactory androidx.lifecycle.LifecycleOwner androidx.savedstate.SavedStateRegistryOwner androidx.lifecycle.ViewModelStoreOwner {
+    method public android.os.Bundle? getArguments();
+    method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
+    method public androidx.navigation.NavDestination getDestination();
+    method public String getId();
+    method public androidx.lifecycle.Lifecycle getLifecycle();
+    method public androidx.lifecycle.SavedStateHandle getSavedStateHandle();
+    method public androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+    method public androidx.lifecycle.ViewModelStore getViewModelStore();
+    property public final android.os.Bundle? arguments;
+    property public final androidx.navigation.NavDestination destination;
+    property public final String id;
+    property public final androidx.lifecycle.SavedStateHandle savedStateHandle;
+  }
+
+  public final class NavDeepLink {
+    method public String? getAction();
+    method public String? getMimeType();
+    method public String? getUriPattern();
+    property public final String? action;
+    property public final String? mimeType;
+    property public final String? uriPattern;
+  }
+
+  public static final class NavDeepLink.Builder {
+    method public androidx.navigation.NavDeepLink build();
+    method public static androidx.navigation.NavDeepLink.Builder fromAction(String action);
+    method public static androidx.navigation.NavDeepLink.Builder fromMimeType(String mimeType);
+    method public static androidx.navigation.NavDeepLink.Builder fromUriPattern(String uriPattern);
+    method public androidx.navigation.NavDeepLink.Builder setAction(String action);
+    method public androidx.navigation.NavDeepLink.Builder setMimeType(String mimeType);
+    method public androidx.navigation.NavDeepLink.Builder setUriPattern(String uriPattern);
+  }
+
+  @kotlin.DslMarker public @interface NavDeepLinkDsl {
+  }
+
+  @androidx.navigation.NavDeepLinkDsl public final class NavDeepLinkDslBuilder {
+    ctor public NavDeepLinkDslBuilder();
+    method public String? getAction();
+    method public String? getMimeType();
+    method public String? getUriPattern();
+    method public void setAction(String? p);
+    method public void setMimeType(String? mimeType);
+    method public void setUriPattern(String? uriPattern);
+    property public final String? action;
+    property public final String? mimeType;
+    property public final String? uriPattern;
+  }
+
+  public final class NavDeepLinkDslBuilderKt {
+    method public static androidx.navigation.NavDeepLink navDeepLink(kotlin.jvm.functions.Function1<? super androidx.navigation.NavDeepLinkDslBuilder,kotlin.Unit> deepLinkBuilder);
+  }
+
+  public class NavDeepLinkRequest {
+    method public String? getAction();
+    method public String? getMimeType();
+    method public android.net.Uri? getUri();
+    property public String? action;
+    property public String? mimeType;
+    property public android.net.Uri? uri;
+  }
+
+  public static final class NavDeepLinkRequest.Builder {
+    method public androidx.navigation.NavDeepLinkRequest build();
+    method public static androidx.navigation.NavDeepLinkRequest.Builder fromAction(String action);
+    method public static androidx.navigation.NavDeepLinkRequest.Builder fromMimeType(String mimeType);
+    method public static androidx.navigation.NavDeepLinkRequest.Builder fromUri(android.net.Uri uri);
+    method public androidx.navigation.NavDeepLinkRequest.Builder setAction(String action);
+    method public androidx.navigation.NavDeepLinkRequest.Builder setMimeType(String mimeType);
+    method public androidx.navigation.NavDeepLinkRequest.Builder setUri(android.net.Uri uri);
+    field public static final androidx.navigation.NavDeepLinkRequest.Builder.Companion Companion;
+  }
+
+  public static final class NavDeepLinkRequest.Builder.Companion {
+    method public androidx.navigation.NavDeepLinkRequest.Builder fromAction(String action);
+    method public androidx.navigation.NavDeepLinkRequest.Builder fromMimeType(String mimeType);
+    method public androidx.navigation.NavDeepLinkRequest.Builder fromUri(android.net.Uri uri);
+  }
+
+  public class NavDestination {
+    ctor public NavDestination(String navigatorName);
+    ctor public NavDestination(androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+    method public final void addArgument(String argumentName, androidx.navigation.NavArgument argument);
+    method public final void addDeepLink(String uriPattern);
+    method public final void addDeepLink(androidx.navigation.NavDeepLink navDeepLink);
+    method public final androidx.navigation.NavAction? getAction(@IdRes int id);
+    method public final java.util.Map<java.lang.String,androidx.navigation.NavArgument> getArguments();
+    method public static final kotlin.sequences.Sequence<androidx.navigation.NavDestination> getHierarchy(androidx.navigation.NavDestination);
+    method @IdRes public final int getId();
+    method public final CharSequence? getLabel();
+    method public final String getNavigatorName();
+    method public final androidx.navigation.NavGraph? getParent();
+    method public final String? getRoute();
+    method public boolean hasDeepLink(android.net.Uri deepLink);
+    method public boolean hasDeepLink(androidx.navigation.NavDeepLinkRequest deepLinkRequest);
+    method @CallSuper public void onInflate(android.content.Context context, android.util.AttributeSet attrs);
+    method protected static final <C> Class<? extends C> parseClassFromName(android.content.Context context, String name, Class<? extends C> expectedClassType);
+    method public final void putAction(@IdRes int actionId, @IdRes int destId);
+    method public final void putAction(@IdRes int actionId, androidx.navigation.NavAction action);
+    method public final void removeAction(@IdRes int actionId);
+    method public final void removeArgument(String argumentName);
+    method public final void setId(@IdRes int id);
+    method public final void setLabel(CharSequence? label);
+    method public final void setRoute(String? route);
+    property public final java.util.Map<java.lang.String,androidx.navigation.NavArgument> arguments;
+    property @IdRes public final int id;
+    property public final CharSequence? label;
+    property public final String navigatorName;
+    property public final androidx.navigation.NavGraph? parent;
+    property public final String? route;
+    field public static final androidx.navigation.NavDestination.Companion Companion;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public static @interface NavDestination.ClassType {
+    method public abstract kotlin.reflect.KClass<?> value();
+    property public abstract kotlin.reflect.KClass<?> value;
+  }
+
+  public static final class NavDestination.Companion {
+    method public kotlin.sequences.Sequence<androidx.navigation.NavDestination> getHierarchy(androidx.navigation.NavDestination);
+    method protected <C> Class<? extends C> parseClassFromName(android.content.Context context, String name, Class<? extends C> expectedClassType);
+  }
+
+  @androidx.navigation.NavDestinationDsl public class NavDestinationBuilder<D extends androidx.navigation.NavDestination> {
+    ctor @Deprecated public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, @IdRes int id);
+    ctor public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, String? route);
+    method @Deprecated public final void action(int actionId, kotlin.jvm.functions.Function1<? super androidx.navigation.NavActionBuilder,kotlin.Unit> actionBuilder);
+    method public final void argument(String name, kotlin.jvm.functions.Function1<? super androidx.navigation.NavArgumentBuilder,kotlin.Unit> argumentBuilder);
+    method public D build();
+    method public final void deepLink(String uriPattern);
+    method public final void deepLink(kotlin.jvm.functions.Function1<? super androidx.navigation.NavDeepLinkDslBuilder,kotlin.Unit> navDeepLink);
+    method public final int getId();
+    method public final CharSequence? getLabel();
+    method protected final androidx.navigation.Navigator<? extends D> getNavigator();
+    method public final String? getRoute();
+    method public final void setLabel(CharSequence? label);
+    property public final int id;
+    property public final CharSequence? label;
+    property protected final androidx.navigation.Navigator<? extends D> navigator;
+    property public final String? route;
+  }
+
+  @kotlin.DslMarker public @interface NavDestinationDsl {
+  }
+
+  public interface NavDirections {
+    method @IdRes public int getActionId();
+    method public android.os.Bundle getArguments();
+    property @IdRes public abstract int actionId;
+    property public abstract android.os.Bundle arguments;
+  }
+
+  public class NavGraph extends androidx.navigation.NavDestination implements java.lang.Iterable<androidx.navigation.NavDestination> kotlin.jvm.internal.markers.KMappedMarker {
+    ctor public NavGraph(androidx.navigation.Navigator<? extends androidx.navigation.NavGraph> navGraphNavigator);
+    method public final void addAll(androidx.navigation.NavGraph other);
+    method public final void addDestination(androidx.navigation.NavDestination node);
+    method public final void addDestinations(java.util.Collection<? extends androidx.navigation.NavDestination> nodes);
+    method public final void addDestinations(androidx.navigation.NavDestination... nodes);
+    method public final void clear();
+    method public final androidx.navigation.NavDestination? findNode(@IdRes int resId);
+    method public final androidx.navigation.NavDestination? findNode(String? route);
+    method public static final androidx.navigation.NavDestination findStartDestination(androidx.navigation.NavGraph);
+    method @Deprecated @IdRes public final int getStartDestination();
+    method @IdRes public final int getStartDestinationId();
+    method public final String? getStartDestinationRoute();
+    method public final java.util.Iterator<androidx.navigation.NavDestination> iterator();
+    method public final void remove(androidx.navigation.NavDestination node);
+    method public final void setStartDestination(int startDestId);
+    method public final void setStartDestination(String startDestRoute);
+    property @IdRes public final int startDestinationId;
+    property public final String? startDestinationRoute;
+    field public static final androidx.navigation.NavGraph.Companion Companion;
+  }
+
+  public static final class NavGraph.Companion {
+    method public androidx.navigation.NavDestination findStartDestination(androidx.navigation.NavGraph);
+  }
+
+  @androidx.navigation.NavDestinationDsl public class NavGraphBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.NavGraph> {
+    ctor @Deprecated public NavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
+    ctor public NavGraphBuilder(androidx.navigation.NavigatorProvider provider, String startDestination, String? route);
+    method public final void addDestination(androidx.navigation.NavDestination destination);
+    method public androidx.navigation.NavGraph build();
+    method public final <D extends androidx.navigation.NavDestination> void destination(androidx.navigation.NavDestinationBuilder<? extends D> navDestination);
+    method public final androidx.navigation.NavigatorProvider getProvider();
+    method public final operator void unaryPlus(androidx.navigation.NavDestination);
+    property public final androidx.navigation.NavigatorProvider provider;
+  }
+
+  public final class NavGraphBuilderKt {
+    method @Deprecated public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline void navigation(androidx.navigation.NavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method public static inline void navigation(androidx.navigation.NavGraphBuilder, String startDestination, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class NavGraphKt {
+    method public static operator boolean contains(androidx.navigation.NavGraph, @IdRes int id);
+    method public static operator boolean contains(androidx.navigation.NavGraph, String route);
+    method public static inline operator androidx.navigation.NavDestination get(androidx.navigation.NavGraph, @IdRes int id);
+    method public static inline operator androidx.navigation.NavDestination get(androidx.navigation.NavGraph, String route);
+    method public static inline operator void minusAssign(androidx.navigation.NavGraph, androidx.navigation.NavDestination node);
+    method public static inline operator void plusAssign(androidx.navigation.NavGraph, androidx.navigation.NavDestination node);
+    method public static inline operator void plusAssign(androidx.navigation.NavGraph, androidx.navigation.NavGraph other);
+  }
+
+  @androidx.navigation.Navigator.Name("navigation") public class NavGraphNavigator extends androidx.navigation.Navigator<androidx.navigation.NavGraph> {
+    ctor public NavGraphNavigator(androidx.navigation.NavigatorProvider navigatorProvider);
+    method public androidx.navigation.NavGraph createDestination();
+  }
+
+  public final class NavOptions {
+    method @AnimRes @AnimatorRes public int getEnterAnim();
+    method @AnimRes @AnimatorRes public int getExitAnim();
+    method @AnimRes @AnimatorRes public int getPopEnterAnim();
+    method @AnimRes @AnimatorRes public int getPopExitAnim();
+    method @Deprecated @IdRes public int getPopUpTo();
+    method @IdRes public int getPopUpToId();
+    method public String? getPopUpToRoute();
+    method public boolean isPopUpToInclusive();
+    method public boolean shouldLaunchSingleTop();
+    method public boolean shouldPopUpToSaveState();
+    method public boolean shouldRestoreState();
+    property @AnimRes @AnimatorRes public final int enterAnim;
+    property @AnimRes @AnimatorRes public final int exitAnim;
+    property @AnimRes @AnimatorRes public final int popEnterAnim;
+    property @AnimRes @AnimatorRes public final int popExitAnim;
+    property @IdRes public final int popUpToId;
+    property public final String? popUpToRoute;
+  }
+
+  public static final class NavOptions.Builder {
+    ctor public NavOptions.Builder();
+    method public androidx.navigation.NavOptions build();
+    method public androidx.navigation.NavOptions.Builder setEnterAnim(@AnimRes @AnimatorRes int enterAnim);
+    method public androidx.navigation.NavOptions.Builder setExitAnim(@AnimRes @AnimatorRes int exitAnim);
+    method public androidx.navigation.NavOptions.Builder setLaunchSingleTop(boolean singleTop);
+    method public androidx.navigation.NavOptions.Builder setPopEnterAnim(@AnimRes @AnimatorRes int popEnterAnim);
+    method public androidx.navigation.NavOptions.Builder setPopExitAnim(@AnimRes @AnimatorRes int popExitAnim);
+    method public androidx.navigation.NavOptions.Builder setPopUpTo(@IdRes int destinationId, boolean inclusive, optional boolean saveState);
+    method public androidx.navigation.NavOptions.Builder setPopUpTo(@IdRes int destinationId, boolean inclusive);
+    method public androidx.navigation.NavOptions.Builder setPopUpTo(String? route, boolean inclusive, optional boolean saveState);
+    method public androidx.navigation.NavOptions.Builder setPopUpTo(String? route, boolean inclusive);
+    method public androidx.navigation.NavOptions.Builder setRestoreState(boolean restoreState);
+  }
+
+  @androidx.navigation.NavOptionsDsl public final class NavOptionsBuilder {
+    ctor public NavOptionsBuilder();
+    method public void anim(kotlin.jvm.functions.Function1<? super androidx.navigation.AnimBuilder,kotlin.Unit> animBuilder);
+    method public boolean getLaunchSingleTop();
+    method @Deprecated public int getPopUpTo();
+    method public int getPopUpToId();
+    method public String? getPopUpToRoute();
+    method public boolean getRestoreState();
+    method public void popUpTo(@IdRes int id, optional kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,kotlin.Unit> popUpToBuilder);
+    method public void popUpTo(String route, optional kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,kotlin.Unit> popUpToBuilder);
+    method public void setLaunchSingleTop(boolean launchSingleTop);
+    method @Deprecated public void setPopUpTo(int value);
+    method public void setRestoreState(boolean restoreState);
+    property public final boolean launchSingleTop;
+    property @Deprecated public final int popUpTo;
+    property public final int popUpToId;
+    property public final String? popUpToRoute;
+    property public final boolean restoreState;
+  }
+
+  public final class NavOptionsBuilderKt {
+    method public static androidx.navigation.NavOptions navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
+  }
+
+  @kotlin.DslMarker public @interface NavOptionsDsl {
+  }
+
+  public abstract class NavType<T> {
+    ctor public NavType(boolean isNullableAllowed);
+    method public static androidx.navigation.NavType<?> fromArgType(String? type, String? packageName);
+    method public abstract operator T? get(android.os.Bundle bundle, String key);
+    method public String getName();
+    method public boolean isNullableAllowed();
+    method public abstract T! parseValue(String value);
+    method public abstract void put(android.os.Bundle bundle, String key, T? value);
+    property public boolean isNullableAllowed;
+    property public String name;
+    field public static final androidx.navigation.NavType<boolean[]> BoolArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Boolean> BoolType;
+    field public static final androidx.navigation.NavType.Companion Companion;
+    field public static final androidx.navigation.NavType<float[]> FloatArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Float> FloatType;
+    field public static final androidx.navigation.NavType<int[]> IntArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Integer> IntType;
+    field public static final androidx.navigation.NavType<long[]> LongArrayType;
+    field public static final androidx.navigation.NavType<java.lang.Long> LongType;
+    field public static final androidx.navigation.NavType<java.lang.Integer> ReferenceType;
+    field public static final androidx.navigation.NavType<java.lang.String[]> StringArrayType;
+    field public static final androidx.navigation.NavType<java.lang.String> StringType;
+  }
+
+  public static final class NavType.Companion {
+    method public androidx.navigation.NavType<?> fromArgType(String? type, String? packageName);
+  }
+
+  public static final class NavType.EnumType<D extends java.lang.Enum<?>> extends androidx.navigation.NavType.SerializableType<D> {
+    ctor public NavType.EnumType(Class<D> type);
+    property public String name;
+  }
+
+  public static final class NavType.ParcelableArrayType<D extends android.os.Parcelable> extends androidx.navigation.NavType<D[]> {
+    ctor public NavType.ParcelableArrayType(Class<D> type);
+    method public D![]? get(android.os.Bundle bundle, String key);
+    method public D![] parseValue(String value);
+    method public void put(android.os.Bundle bundle, String key, D![]? value);
+    property public String name;
+  }
+
+  public static final class NavType.ParcelableType<D> extends androidx.navigation.NavType<D> {
+    ctor public NavType.ParcelableType(Class<D> type);
+    method public D? get(android.os.Bundle bundle, String key);
+    method public D! parseValue(String value);
+    method public void put(android.os.Bundle bundle, String key, D? value);
+    property public String name;
+  }
+
+  public static final class NavType.SerializableArrayType<D extends java.io.Serializable> extends androidx.navigation.NavType<D[]> {
+    ctor public NavType.SerializableArrayType(Class<D> type);
+    method public D![]? get(android.os.Bundle bundle, String key);
+    method public D![] parseValue(String value);
+    method public void put(android.os.Bundle bundle, String key, D![]? value);
+    property public String name;
+  }
+
+  public static class NavType.SerializableType<D extends java.io.Serializable> extends androidx.navigation.NavType<D> {
+    ctor public NavType.SerializableType(Class<D> type);
+    method public D? get(android.os.Bundle bundle, String key);
+    method public D parseValue(String value);
+    method public void put(android.os.Bundle bundle, String key, D value);
+    property public String name;
+  }
+
+  public abstract class Navigator<D extends androidx.navigation.NavDestination> {
+    ctor public Navigator();
+    method public abstract D createDestination();
+    method protected final androidx.navigation.NavigatorState getState();
+    method public final boolean isAttached();
+    method public void navigate(java.util.List<androidx.navigation.NavBackStackEntry> entries, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
+    method public androidx.navigation.NavDestination? navigate(D destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
+    method @CallSuper public void onAttach(androidx.navigation.NavigatorState state);
+    method public void onLaunchSingleTop(androidx.navigation.NavBackStackEntry backStackEntry);
+    method public void onRestoreState(android.os.Bundle savedState);
+    method public android.os.Bundle? onSaveState();
+    method public void popBackStack(androidx.navigation.NavBackStackEntry popUpTo, boolean savedState);
+    method public boolean popBackStack();
+    property public final boolean isAttached;
+    property protected final androidx.navigation.NavigatorState state;
+  }
+
+  public static interface Navigator.Extras {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public static @interface Navigator.Name {
+    method public abstract String value();
+    property public abstract String value;
+  }
+
+  public class NavigatorProvider {
+    ctor public NavigatorProvider();
+    method public final androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? addNavigator(androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+    method @CallSuper public androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? addNavigator(String name, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+    method public final <T extends androidx.navigation.Navigator<?>> T getNavigator(Class<T> navigatorClass);
+    method @CallSuper public <T extends androidx.navigation.Navigator<?>> T getNavigator(String name);
+  }
+
+  public final class NavigatorProviderKt {
+    method public static inline operator <T extends androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>> T get(androidx.navigation.NavigatorProvider, String name);
+    method public static inline operator <T extends androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>> T get(androidx.navigation.NavigatorProvider, kotlin.reflect.KClass<T> clazz);
+    method public static inline operator void plusAssign(androidx.navigation.NavigatorProvider, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+    method public static inline operator androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? set(androidx.navigation.NavigatorProvider, String name, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+  }
+
+  public abstract class NavigatorState {
+    ctor public NavigatorState();
+    method public abstract androidx.navigation.NavBackStackEntry createBackStackEntry(androidx.navigation.NavDestination destination, android.os.Bundle? arguments);
+    method public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> getBackStack();
+    method public final kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.navigation.NavBackStackEntry>> getTransitionsInProgress();
+    method public void markTransitionComplete(androidx.navigation.NavBackStackEntry entry);
+    method @CallSuper public void onLaunchSingleTop(androidx.navigation.NavBackStackEntry backStackEntry);
+    method public void pop(androidx.navigation.NavBackStackEntry popUpTo, boolean saveState);
+    method public void popWithTransition(androidx.navigation.NavBackStackEntry popUpTo, boolean saveState);
+    method public void push(androidx.navigation.NavBackStackEntry backStackEntry);
+    method public void pushWithTransition(androidx.navigation.NavBackStackEntry backStackEntry);
+    property public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> backStack;
+    property public final kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.navigation.NavBackStackEntry>> transitionsInProgress;
+  }
+
+  @androidx.navigation.NavOptionsDsl public final class PopUpToBuilder {
+    ctor public PopUpToBuilder();
+    method public boolean getInclusive();
+    method public boolean getSaveState();
+    method public void setInclusive(boolean inclusive);
+    method public void setSaveState(boolean saveState);
+    property public final boolean inclusive;
+    property public final boolean saveState;
+  }
+
+}
+
diff --git a/navigation/navigation-common/api/restricted_current.txt b/navigation/navigation-common/api/restricted_current.txt
index a169ec7..1402d24d 100644
--- a/navigation/navigation-common/api/restricted_current.txt
+++ b/navigation/navigation-common/api/restricted_current.txt
@@ -235,7 +235,6 @@
   public static final class NavDestination.Companion {
     method public kotlin.sequences.Sequence<androidx.navigation.NavDestination> getHierarchy(androidx.navigation.NavDestination);
     method protected <C> Class<? extends C> parseClassFromName(android.content.Context context, String name, Class<? extends C> expectedClassType);
-    property public final kotlin.sequences.Sequence<androidx.navigation.NavDestination> hierarchy;
   }
 
   @androidx.navigation.NavDestinationDsl public class NavDestinationBuilder<D extends androidx.navigation.NavDestination> {
@@ -497,7 +496,7 @@
     ctor public NavigatorState();
     method public abstract androidx.navigation.NavBackStackEntry createBackStackEntry(androidx.navigation.NavDestination destination, android.os.Bundle? arguments);
     method public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> getBackStack();
-    method public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> getTransitionsInProgress();
+    method public final kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.navigation.NavBackStackEntry>> getTransitionsInProgress();
     method public void markTransitionComplete(androidx.navigation.NavBackStackEntry entry);
     method @CallSuper public void onLaunchSingleTop(androidx.navigation.NavBackStackEntry backStackEntry);
     method public void pop(androidx.navigation.NavBackStackEntry popUpTo, boolean saveState);
@@ -505,7 +504,7 @@
     method public void push(androidx.navigation.NavBackStackEntry backStackEntry);
     method public void pushWithTransition(androidx.navigation.NavBackStackEntry backStackEntry);
     property public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> backStack;
-    property public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> transitionsInProgress;
+    property public final kotlinx.coroutines.flow.StateFlow<java.util.Set<androidx.navigation.NavBackStackEntry>> transitionsInProgress;
   }
 
   @androidx.navigation.NavOptionsDsl public final class PopUpToBuilder {
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationAndroidTest.kt b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationAndroidTest.kt
index 5f4d540..0d7278f 100644
--- a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationAndroidTest.kt
+++ b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationAndroidTest.kt
@@ -93,6 +93,21 @@
     }
 
     @Test
+    fun addDeepLinkNullableArgumentNotRequired() {
+        val destination = NoOpNavigator().createDestination()
+        destination.addArgument("myArg", nullableStringArgument())
+        destination.addDeepLink("www.example.com/users?myArg={myArg}")
+
+        val match = destination.matchDeepLink(
+            Uri.parse("https://www.example.com/users?")
+        )
+
+        assertWithMessage("Deep link should match")
+            .that(match)
+            .isNotNull()
+    }
+
+    @Test
     fun matchDeepLink() {
         val destination = NoOpNavigator().createDestination()
         destination.addArgument("id", intArgument())
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavBackStackEntry.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavBackStackEntry.kt
index 9df286c..144263f 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavBackStackEntry.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavBackStackEntry.kt
@@ -55,7 +55,7 @@
      * @return The arguments used when this entry was created
      */
     public val arguments: Bundle? = null,
-    private val navControllerLifecycleOwner: LifecycleOwner? = null,
+    private var hostLifecycleState: Lifecycle.State = Lifecycle.State.CREATED,
     private val viewModelStoreProvider: NavViewModelStoreProvider? = null,
     /**
      * The unique ID that serves as the identity of this entry
@@ -73,7 +73,7 @@
         entry.context,
         entry.destination,
         arguments,
-        entry.navControllerLifecycleOwner,
+        entry.hostLifecycleState,
         entry.viewModelStoreProvider,
         entry.id,
         entry.savedState
@@ -95,19 +95,18 @@
             context: Context?,
             destination: NavDestination,
             arguments: Bundle? = null,
-            navControllerLifecycleOwner: LifecycleOwner? = null,
+            hostLifecycleState: Lifecycle.State = Lifecycle.State.CREATED,
             viewModelStoreProvider: NavViewModelStoreProvider? = null,
             id: String = UUID.randomUUID().toString(),
             savedState: Bundle? = null
         ): NavBackStackEntry = NavBackStackEntry(
             context, destination, arguments,
-            navControllerLifecycleOwner, viewModelStoreProvider, id, savedState
+            hostLifecycleState, viewModelStoreProvider, id, savedState
         )
     }
 
     private var lifecycle = LifecycleRegistry(this)
     private val savedStateRegistryController = SavedStateRegistryController.create(this)
-    private var hostLifecycleState = Lifecycle.State.CREATED
     private val defaultFactory by lazy {
         SavedStateViewModelFactory((context?.applicationContext as? Application), this, arguments)
     }
@@ -244,10 +243,4 @@
     }
 
     private class SavedStateViewModel(val handle: SavedStateHandle) : ViewModel()
-
-    init {
-        if (navControllerLifecycleOwner != null) {
-            hostLifecycleState = navControllerLifecycleOwner.lifecycle.currentState
-        }
-    }
 }
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 6c3f037..8c530e0 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLink.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLink.kt
@@ -49,10 +49,16 @@
 ) {
     private val arguments = mutableListOf<String>()
     private val paramArgMap = mutableMapOf<String, ParamQuery>()
-    private var pattern: Pattern? = null
+    private var patternFinalRegex: String? = null
+    private val pattern by lazy {
+        patternFinalRegex?.let { Pattern.compile(it, Pattern.CASE_INSENSITIVE) }
+    }
     private var isParameterizedQuery = false
 
-    private var mimeTypePattern: Pattern? = null
+    private var mimeTypeFinalRegex: String? = null
+    private val mimeTypePattern by lazy {
+        mimeTypeFinalRegex?.let { Pattern.compile(it) }
+    }
 
     /** Arguments present in the deep link, including both path and query arguments. */
     internal val argumentsNames: List<String>
@@ -454,8 +460,7 @@
             // Since we've used Pattern.quote() above, we need to
             // specifically escape any .* instances to ensure
             // they are still treated as wildcards in our final regex
-            val finalRegex = uriRegex.toString().replace(".*", "\\E.*\\Q")
-            pattern = Pattern.compile(finalRegex, Pattern.CASE_INSENSITIVE)
+            patternFinalRegex = uriRegex.toString().replace(".*", "\\E.*\\Q")
         }
         if (mimeType != null) {
             val mimeTypePattern = Pattern.compile("^[\\s\\S]+/[\\s\\S]+$")
@@ -473,8 +478,7 @@
             val mimeTypeRegex = "^(${splitMimeType.type}|[*]+)/(${splitMimeType.subType}|[*]+)$"
 
             // if the deep link type or subtype is wildcard, allow anything
-            val finalRegex = mimeTypeRegex.replace("*|[*]", "[\\s\\S]")
-            this.mimeTypePattern = Pattern.compile(finalRegex)
+            mimeTypeFinalRegex = mimeTypeRegex.replace("*|[*]", "[\\s\\S]")
         }
     }
 }
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 3a2663e..f96f6e8 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavDestination.kt
@@ -315,9 +315,10 @@
      * @see NavController.navigate
      */
     public fun addDeepLink(navDeepLink: NavDeepLink) {
-        val missingRequiredArguments = arguments.filterValues { !it.isDefaultValuePresent }
-            .keys
-            .filter { it !in navDeepLink.argumentsNames }
+        val missingRequiredArguments =
+            arguments.filterValues { !it.isNullable && !it.isDefaultValuePresent }
+                .keys
+                .filter { it !in navDeepLink.argumentsNames }
         require(missingRequiredArguments.isEmpty()) {
             "Deep link ${navDeepLink.uriPattern} can't be used to open destination $this.\n" +
                 "Following required arguments are missing: $missingRequiredArguments"
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavigatorState.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavigatorState.kt
index 9c0772b..a6e420d 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavigatorState.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavigatorState.kt
@@ -32,8 +32,8 @@
 public abstract class NavigatorState {
     private val backStackLock = ReentrantLock(true)
     private val _backStack: MutableStateFlow<List<NavBackStackEntry>> = MutableStateFlow(listOf())
-    private val _transitionsInProgress: MutableStateFlow<List<NavBackStackEntry>> =
-        MutableStateFlow(listOf())
+    private val _transitionsInProgress: MutableStateFlow<Set<NavBackStackEntry>> =
+        MutableStateFlow(setOf())
 
     /**
      * @hide
@@ -54,7 +54,7 @@
      * This is the set of currently running transitions. Use this set to retrieve the entry and call
      * [markTransitionComplete] once the transition is complete.
      */
-    public val transitionsInProgress: StateFlow<List<NavBackStackEntry>> =
+    public val transitionsInProgress: StateFlow<Set<NavBackStackEntry>> =
         _transitionsInProgress.asStateFlow()
 
     /**
diff --git a/navigation/navigation-compose/api/2.4.0-beta02.txt b/navigation/navigation-compose/api/2.4.0-beta02.txt
new file mode 100644
index 0000000..d46757e
--- /dev/null
+++ b/navigation/navigation-compose/api/2.4.0-beta02.txt
@@ -0,0 +1,47 @@
+// Signature format: 4.0
+package androidx.navigation.compose {
+
+  @androidx.navigation.Navigator.Name("composable") public final class ComposeNavigator extends androidx.navigation.Navigator<androidx.navigation.compose.ComposeNavigator.Destination> {
+    ctor public ComposeNavigator();
+    method public androidx.navigation.compose.ComposeNavigator.Destination createDestination();
+  }
+
+  @androidx.navigation.NavDestination.ClassType(Composable::class) public static final class ComposeNavigator.Destination extends androidx.navigation.NavDestination {
+    ctor public ComposeNavigator.Destination(androidx.navigation.compose.ComposeNavigator navigator, kotlin.jvm.functions.Function1<? super androidx.navigation.NavBackStackEntry,kotlin.Unit> content);
+  }
+
+  public final class DialogHostKt {
+    method @androidx.compose.runtime.Composable public static void DialogHost(androidx.navigation.compose.DialogNavigator dialogNavigator);
+  }
+
+  @androidx.navigation.Navigator.Name("dialog") public final class DialogNavigator extends androidx.navigation.Navigator<androidx.navigation.compose.DialogNavigator.Destination> {
+    ctor public DialogNavigator();
+    method public androidx.navigation.compose.DialogNavigator.Destination createDestination();
+  }
+
+  @androidx.navigation.NavDestination.ClassType(Composable::class) public static final class DialogNavigator.Destination extends androidx.navigation.NavDestination implements androidx.navigation.FloatingWindow {
+    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 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.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 {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.navigation.NavBackStackEntry> currentBackStackEntryAsState(androidx.navigation.NavController);
+    method @androidx.compose.runtime.Composable public static androidx.navigation.NavHostController rememberNavController(androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>... navigators);
+  }
+
+  public final class NavHostKt {
+    method @androidx.compose.runtime.Composable public static void NavHost(androidx.navigation.NavHostController navController, String startDestination, optional androidx.compose.ui.Modifier modifier, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method @androidx.compose.runtime.Composable public static void NavHost(androidx.navigation.NavHostController navController, androidx.navigation.NavGraph graph, optional androidx.compose.ui.Modifier modifier);
+  }
+
+}
+
diff --git a/navigation/navigation-compose/api/public_plus_experimental_2.4.0-beta02.txt b/navigation/navigation-compose/api/public_plus_experimental_2.4.0-beta02.txt
new file mode 100644
index 0000000..d46757e
--- /dev/null
+++ b/navigation/navigation-compose/api/public_plus_experimental_2.4.0-beta02.txt
@@ -0,0 +1,47 @@
+// Signature format: 4.0
+package androidx.navigation.compose {
+
+  @androidx.navigation.Navigator.Name("composable") public final class ComposeNavigator extends androidx.navigation.Navigator<androidx.navigation.compose.ComposeNavigator.Destination> {
+    ctor public ComposeNavigator();
+    method public androidx.navigation.compose.ComposeNavigator.Destination createDestination();
+  }
+
+  @androidx.navigation.NavDestination.ClassType(Composable::class) public static final class ComposeNavigator.Destination extends androidx.navigation.NavDestination {
+    ctor public ComposeNavigator.Destination(androidx.navigation.compose.ComposeNavigator navigator, kotlin.jvm.functions.Function1<? super androidx.navigation.NavBackStackEntry,kotlin.Unit> content);
+  }
+
+  public final class DialogHostKt {
+    method @androidx.compose.runtime.Composable public static void DialogHost(androidx.navigation.compose.DialogNavigator dialogNavigator);
+  }
+
+  @androidx.navigation.Navigator.Name("dialog") public final class DialogNavigator extends androidx.navigation.Navigator<androidx.navigation.compose.DialogNavigator.Destination> {
+    ctor public DialogNavigator();
+    method public androidx.navigation.compose.DialogNavigator.Destination createDestination();
+  }
+
+  @androidx.navigation.NavDestination.ClassType(Composable::class) public static final class DialogNavigator.Destination extends androidx.navigation.NavDestination implements androidx.navigation.FloatingWindow {
+    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 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.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 {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.navigation.NavBackStackEntry> currentBackStackEntryAsState(androidx.navigation.NavController);
+    method @androidx.compose.runtime.Composable public static androidx.navigation.NavHostController rememberNavController(androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>... navigators);
+  }
+
+  public final class NavHostKt {
+    method @androidx.compose.runtime.Composable public static void NavHost(androidx.navigation.NavHostController navController, String startDestination, optional androidx.compose.ui.Modifier modifier, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method @androidx.compose.runtime.Composable public static void NavHost(androidx.navigation.NavHostController navController, androidx.navigation.NavGraph graph, optional androidx.compose.ui.Modifier modifier);
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/navigation/navigation-compose/api/res-2.4.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to navigation/navigation-compose/api/res-2.4.0-beta02.txt
diff --git a/navigation/navigation-compose/api/restricted_2.4.0-beta02.txt b/navigation/navigation-compose/api/restricted_2.4.0-beta02.txt
new file mode 100644
index 0000000..d46757e
--- /dev/null
+++ b/navigation/navigation-compose/api/restricted_2.4.0-beta02.txt
@@ -0,0 +1,47 @@
+// Signature format: 4.0
+package androidx.navigation.compose {
+
+  @androidx.navigation.Navigator.Name("composable") public final class ComposeNavigator extends androidx.navigation.Navigator<androidx.navigation.compose.ComposeNavigator.Destination> {
+    ctor public ComposeNavigator();
+    method public androidx.navigation.compose.ComposeNavigator.Destination createDestination();
+  }
+
+  @androidx.navigation.NavDestination.ClassType(Composable::class) public static final class ComposeNavigator.Destination extends androidx.navigation.NavDestination {
+    ctor public ComposeNavigator.Destination(androidx.navigation.compose.ComposeNavigator navigator, kotlin.jvm.functions.Function1<? super androidx.navigation.NavBackStackEntry,kotlin.Unit> content);
+  }
+
+  public final class DialogHostKt {
+    method @androidx.compose.runtime.Composable public static void DialogHost(androidx.navigation.compose.DialogNavigator dialogNavigator);
+  }
+
+  @androidx.navigation.Navigator.Name("dialog") public final class DialogNavigator extends androidx.navigation.Navigator<androidx.navigation.compose.DialogNavigator.Destination> {
+    ctor public DialogNavigator();
+    method public androidx.navigation.compose.DialogNavigator.Destination createDestination();
+  }
+
+  @androidx.navigation.NavDestination.ClassType(Composable::class) public static final class DialogNavigator.Destination extends androidx.navigation.NavDestination implements androidx.navigation.FloatingWindow {
+    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 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.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 {
+    method @androidx.compose.runtime.Composable public static androidx.compose.runtime.State<androidx.navigation.NavBackStackEntry> currentBackStackEntryAsState(androidx.navigation.NavController);
+    method @androidx.compose.runtime.Composable public static androidx.navigation.NavHostController rememberNavController(androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>... navigators);
+  }
+
+  public final class NavHostKt {
+    method @androidx.compose.runtime.Composable public static void NavHost(androidx.navigation.NavHostController navController, String startDestination, optional androidx.compose.ui.Modifier modifier, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method @androidx.compose.runtime.Composable public static void NavHost(androidx.navigation.NavHostController navController, androidx.navigation.NavGraph graph, optional androidx.compose.ui.Modifier modifier);
+  }
+
+}
+
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 71864d2..cf2bcd8 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
@@ -32,6 +32,7 @@
 import androidx.compose.material.Text
 import androidx.compose.material.TextField
 import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
@@ -40,11 +41,13 @@
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.platform.LocalLifecycleOwner
 import androidx.compose.ui.platform.LocalSavedStateRegistryOwner
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithText
 import androidx.compose.ui.test.performClick
 import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.LifecycleEventObserver
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.testing.TestLifecycleOwner
@@ -755,6 +758,38 @@
         assertThat(onBackPressedDispatcher.hasEnabledCallbacks()).isFalse()
     }
 
+    @Test
+    fun navBackStackEntryLifecycleTest() {
+        var stopCount = 0
+        lateinit var navController: NavHostController
+        composeTestRule.setContent {
+            navController = rememberNavController()
+            NavHost(navController, startDestination = "First") {
+                composable("First") {
+                    val lifecycleOwner = LocalLifecycleOwner.current
+                    DisposableEffect(lifecycleOwner) {
+                        val observer = LifecycleEventObserver { _, event ->
+                            if (event == Lifecycle.Event.ON_STOP) {
+                                stopCount++
+                            }
+                        }
+                        lifecycleOwner.lifecycle.addObserver(observer)
+
+                        onDispose {
+                            lifecycleOwner.lifecycle.removeObserver(observer)
+                        }
+                    }
+                }
+            }
+        }
+
+        composeTestRule.runOnIdle {
+            assertWithMessage("Lifecycle should not have been stopped")
+                .that(stopCount)
+                .isEqualTo(0)
+        }
+    }
+
     private fun createNavController(context: Context): TestNavHostController {
         val navController = TestNavHostController(context)
         val navigator = TestNavigator()
diff --git a/navigation/navigation-dynamic-features-fragment/api/2.4.0-beta01.txt b/navigation/navigation-dynamic-features-fragment/api/2.4.0-beta01.txt
index 9271a05..d481c6e6 100644
--- a/navigation/navigation-dynamic-features-fragment/api/2.4.0-beta01.txt
+++ b/navigation/navigation-dynamic-features-fragment/api/2.4.0-beta01.txt
@@ -26,8 +26,8 @@
   public final class DynamicFragmentNavigatorDestinationBuilderKt {
     method @Deprecated public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
     method public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
   }
diff --git a/navigation/navigation-dynamic-features-fragment/api/2.4.0-beta02.txt b/navigation/navigation-dynamic-features-fragment/api/2.4.0-beta02.txt
new file mode 100644
index 0000000..d481c6e6
--- /dev/null
+++ b/navigation/navigation-dynamic-features-fragment/api/2.4.0-beta02.txt
@@ -0,0 +1,69 @@
+// Signature format: 4.0
+package androidx.navigation.dynamicfeatures.fragment {
+
+  @androidx.navigation.Navigator.Name("fragment") public final class DynamicFragmentNavigator extends androidx.navigation.fragment.FragmentNavigator {
+    ctor public DynamicFragmentNavigator(android.content.Context context, androidx.fragment.app.FragmentManager manager, int containerId, androidx.navigation.dynamicfeatures.DynamicInstallManager installManager);
+    method public androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator.Destination createDestination();
+  }
+
+  public static final class DynamicFragmentNavigator.Destination extends androidx.navigation.fragment.FragmentNavigator.Destination {
+    ctor public DynamicFragmentNavigator.Destination(androidx.navigation.NavigatorProvider navigatorProvider);
+    ctor public DynamicFragmentNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination> fragmentNavigator);
+    method public String? getModuleName();
+    method public void setModuleName(String? moduleName);
+    property public final String? moduleName;
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class DynamicFragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.FragmentNavigator.Destination> {
+    ctor @Deprecated public DynamicFragmentNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator navigator, @IdRes int id, String fragmentClassName);
+    ctor public DynamicFragmentNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator navigator, String route, String fragmentClassName);
+    method public androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator.Destination build();
+    method public String? getModuleName();
+    method public void setModuleName(String? moduleName);
+    property public final String? moduleName;
+  }
+
+  public final class DynamicFragmentNavigatorDestinationBuilderKt {
+    method @Deprecated public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+  }
+
+  public class DynamicNavHostFragment extends androidx.navigation.fragment.NavHostFragment {
+    ctor public DynamicNavHostFragment();
+    method public static final androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId, optional android.os.Bundle? startDestinationArgs);
+    method public static final androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId);
+    method protected com.google.android.play.core.splitinstall.SplitInstallManager createSplitInstallManager();
+    field public static final androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment.Companion Companion;
+  }
+
+  public static final class DynamicNavHostFragment.Companion {
+    method public androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId, optional android.os.Bundle? startDestinationArgs);
+    method public androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId);
+  }
+
+}
+
+package androidx.navigation.dynamicfeatures.fragment.ui {
+
+  public abstract class AbstractProgressFragment extends androidx.fragment.app.Fragment {
+    ctor public AbstractProgressFragment();
+    ctor public AbstractProgressFragment(int contentLayoutId);
+    method protected abstract void onCancelled();
+    method protected abstract void onFailed(@com.google.android.play.core.splitinstall.model.SplitInstallErrorCode int errorCode);
+    method protected void onInstalled();
+    method protected abstract void onProgress(@com.google.android.play.core.splitinstall.model.SplitInstallSessionStatus int status, long bytesDownloaded, long bytesTotal);
+  }
+
+  public final class DefaultProgressFragment extends androidx.navigation.dynamicfeatures.fragment.ui.AbstractProgressFragment {
+    ctor public DefaultProgressFragment();
+    method protected void onCancelled();
+    method protected void onFailed(@com.google.android.play.core.splitinstall.model.SplitInstallErrorCode int errorCode);
+    method protected void onProgress(int status, long bytesDownloaded, long bytesTotal);
+  }
+
+}
+
diff --git a/navigation/navigation-dynamic-features-fragment/api/current.txt b/navigation/navigation-dynamic-features-fragment/api/current.txt
index 9271a05..d481c6e6 100644
--- a/navigation/navigation-dynamic-features-fragment/api/current.txt
+++ b/navigation/navigation-dynamic-features-fragment/api/current.txt
@@ -26,8 +26,8 @@
   public final class DynamicFragmentNavigatorDestinationBuilderKt {
     method @Deprecated public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
     method public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
   }
diff --git a/navigation/navigation-dynamic-features-fragment/api/public_plus_experimental_2.4.0-beta01.txt b/navigation/navigation-dynamic-features-fragment/api/public_plus_experimental_2.4.0-beta01.txt
index 9271a05..d481c6e6 100644
--- a/navigation/navigation-dynamic-features-fragment/api/public_plus_experimental_2.4.0-beta01.txt
+++ b/navigation/navigation-dynamic-features-fragment/api/public_plus_experimental_2.4.0-beta01.txt
@@ -26,8 +26,8 @@
   public final class DynamicFragmentNavigatorDestinationBuilderKt {
     method @Deprecated public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
     method public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
   }
diff --git a/navigation/navigation-dynamic-features-fragment/api/public_plus_experimental_2.4.0-beta02.txt b/navigation/navigation-dynamic-features-fragment/api/public_plus_experimental_2.4.0-beta02.txt
new file mode 100644
index 0000000..d481c6e6
--- /dev/null
+++ b/navigation/navigation-dynamic-features-fragment/api/public_plus_experimental_2.4.0-beta02.txt
@@ -0,0 +1,69 @@
+// Signature format: 4.0
+package androidx.navigation.dynamicfeatures.fragment {
+
+  @androidx.navigation.Navigator.Name("fragment") public final class DynamicFragmentNavigator extends androidx.navigation.fragment.FragmentNavigator {
+    ctor public DynamicFragmentNavigator(android.content.Context context, androidx.fragment.app.FragmentManager manager, int containerId, androidx.navigation.dynamicfeatures.DynamicInstallManager installManager);
+    method public androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator.Destination createDestination();
+  }
+
+  public static final class DynamicFragmentNavigator.Destination extends androidx.navigation.fragment.FragmentNavigator.Destination {
+    ctor public DynamicFragmentNavigator.Destination(androidx.navigation.NavigatorProvider navigatorProvider);
+    ctor public DynamicFragmentNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination> fragmentNavigator);
+    method public String? getModuleName();
+    method public void setModuleName(String? moduleName);
+    property public final String? moduleName;
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class DynamicFragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.FragmentNavigator.Destination> {
+    ctor @Deprecated public DynamicFragmentNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator navigator, @IdRes int id, String fragmentClassName);
+    ctor public DynamicFragmentNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator navigator, String route, String fragmentClassName);
+    method public androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator.Destination build();
+    method public String? getModuleName();
+    method public void setModuleName(String? moduleName);
+    property public final String? moduleName;
+  }
+
+  public final class DynamicFragmentNavigatorDestinationBuilderKt {
+    method @Deprecated public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+  }
+
+  public class DynamicNavHostFragment extends androidx.navigation.fragment.NavHostFragment {
+    ctor public DynamicNavHostFragment();
+    method public static final androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId, optional android.os.Bundle? startDestinationArgs);
+    method public static final androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId);
+    method protected com.google.android.play.core.splitinstall.SplitInstallManager createSplitInstallManager();
+    field public static final androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment.Companion Companion;
+  }
+
+  public static final class DynamicNavHostFragment.Companion {
+    method public androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId, optional android.os.Bundle? startDestinationArgs);
+    method public androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId);
+  }
+
+}
+
+package androidx.navigation.dynamicfeatures.fragment.ui {
+
+  public abstract class AbstractProgressFragment extends androidx.fragment.app.Fragment {
+    ctor public AbstractProgressFragment();
+    ctor public AbstractProgressFragment(int contentLayoutId);
+    method protected abstract void onCancelled();
+    method protected abstract void onFailed(@com.google.android.play.core.splitinstall.model.SplitInstallErrorCode int errorCode);
+    method protected void onInstalled();
+    method protected abstract void onProgress(@com.google.android.play.core.splitinstall.model.SplitInstallSessionStatus int status, long bytesDownloaded, long bytesTotal);
+  }
+
+  public final class DefaultProgressFragment extends androidx.navigation.dynamicfeatures.fragment.ui.AbstractProgressFragment {
+    ctor public DefaultProgressFragment();
+    method protected void onCancelled();
+    method protected void onFailed(@com.google.android.play.core.splitinstall.model.SplitInstallErrorCode int errorCode);
+    method protected void onProgress(int status, long bytesDownloaded, long bytesTotal);
+  }
+
+}
+
diff --git a/navigation/navigation-dynamic-features-fragment/api/public_plus_experimental_current.txt b/navigation/navigation-dynamic-features-fragment/api/public_plus_experimental_current.txt
index 9271a05..d481c6e6 100644
--- a/navigation/navigation-dynamic-features-fragment/api/public_plus_experimental_current.txt
+++ b/navigation/navigation-dynamic-features-fragment/api/public_plus_experimental_current.txt
@@ -26,8 +26,8 @@
   public final class DynamicFragmentNavigatorDestinationBuilderKt {
     method @Deprecated public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
     method public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
   }
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/navigation/navigation-dynamic-features-fragment/api/res-2.4.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to navigation/navigation-dynamic-features-fragment/api/res-2.4.0-beta02.txt
diff --git a/navigation/navigation-dynamic-features-fragment/api/restricted_2.4.0-beta01.txt b/navigation/navigation-dynamic-features-fragment/api/restricted_2.4.0-beta01.txt
index 9271a05..d481c6e6 100644
--- a/navigation/navigation-dynamic-features-fragment/api/restricted_2.4.0-beta01.txt
+++ b/navigation/navigation-dynamic-features-fragment/api/restricted_2.4.0-beta01.txt
@@ -26,8 +26,8 @@
   public final class DynamicFragmentNavigatorDestinationBuilderKt {
     method @Deprecated public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
     method public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
   }
diff --git a/navigation/navigation-dynamic-features-fragment/api/restricted_2.4.0-beta02.txt b/navigation/navigation-dynamic-features-fragment/api/restricted_2.4.0-beta02.txt
new file mode 100644
index 0000000..d481c6e6
--- /dev/null
+++ b/navigation/navigation-dynamic-features-fragment/api/restricted_2.4.0-beta02.txt
@@ -0,0 +1,69 @@
+// Signature format: 4.0
+package androidx.navigation.dynamicfeatures.fragment {
+
+  @androidx.navigation.Navigator.Name("fragment") public final class DynamicFragmentNavigator extends androidx.navigation.fragment.FragmentNavigator {
+    ctor public DynamicFragmentNavigator(android.content.Context context, androidx.fragment.app.FragmentManager manager, int containerId, androidx.navigation.dynamicfeatures.DynamicInstallManager installManager);
+    method public androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator.Destination createDestination();
+  }
+
+  public static final class DynamicFragmentNavigator.Destination extends androidx.navigation.fragment.FragmentNavigator.Destination {
+    ctor public DynamicFragmentNavigator.Destination(androidx.navigation.NavigatorProvider navigatorProvider);
+    ctor public DynamicFragmentNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination> fragmentNavigator);
+    method public String? getModuleName();
+    method public void setModuleName(String? moduleName);
+    property public final String? moduleName;
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class DynamicFragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.FragmentNavigator.Destination> {
+    ctor @Deprecated public DynamicFragmentNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator navigator, @IdRes int id, String fragmentClassName);
+    ctor public DynamicFragmentNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator navigator, String route, String fragmentClassName);
+    method public androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigator.Destination build();
+    method public String? getModuleName();
+    method public void setModuleName(String? moduleName);
+    property public final String? moduleName;
+  }
+
+  public final class DynamicFragmentNavigatorDestinationBuilderKt {
+    method @Deprecated public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+  }
+
+  public class DynamicNavHostFragment extends androidx.navigation.fragment.NavHostFragment {
+    ctor public DynamicNavHostFragment();
+    method public static final androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId, optional android.os.Bundle? startDestinationArgs);
+    method public static final androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId);
+    method protected com.google.android.play.core.splitinstall.SplitInstallManager createSplitInstallManager();
+    field public static final androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment.Companion Companion;
+  }
+
+  public static final class DynamicNavHostFragment.Companion {
+    method public androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId, optional android.os.Bundle? startDestinationArgs);
+    method public androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId);
+  }
+
+}
+
+package androidx.navigation.dynamicfeatures.fragment.ui {
+
+  public abstract class AbstractProgressFragment extends androidx.fragment.app.Fragment {
+    ctor public AbstractProgressFragment();
+    ctor public AbstractProgressFragment(int contentLayoutId);
+    method protected abstract void onCancelled();
+    method protected abstract void onFailed(@com.google.android.play.core.splitinstall.model.SplitInstallErrorCode int errorCode);
+    method protected void onInstalled();
+    method protected abstract void onProgress(@com.google.android.play.core.splitinstall.model.SplitInstallSessionStatus int status, long bytesDownloaded, long bytesTotal);
+  }
+
+  public final class DefaultProgressFragment extends androidx.navigation.dynamicfeatures.fragment.ui.AbstractProgressFragment {
+    ctor public DefaultProgressFragment();
+    method protected void onCancelled();
+    method protected void onFailed(@com.google.android.play.core.splitinstall.model.SplitInstallErrorCode int errorCode);
+    method protected void onProgress(int status, long bytesDownloaded, long bytesTotal);
+  }
+
+}
+
diff --git a/navigation/navigation-dynamic-features-fragment/api/restricted_current.txt b/navigation/navigation-dynamic-features-fragment/api/restricted_current.txt
index 9271a05..d481c6e6 100644
--- a/navigation/navigation-dynamic-features-fragment/api/restricted_current.txt
+++ b/navigation/navigation-dynamic-features-fragment/api/restricted_current.txt
@@ -26,8 +26,8 @@
   public final class DynamicFragmentNavigatorDestinationBuilderKt {
     method @Deprecated public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
     method public static inline void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String fragmentClassName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.fragment.DynamicFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
   }
diff --git a/navigation/navigation-dynamic-features-runtime/api/2.4.0-beta01.txt b/navigation/navigation-dynamic-features-runtime/api/2.4.0-beta01.txt
index 842d76f..a79e3b7 100644
--- a/navigation/navigation-dynamic-features-runtime/api/2.4.0-beta01.txt
+++ b/navigation/navigation-dynamic-features-runtime/api/2.4.0-beta01.txt
@@ -46,6 +46,7 @@
   public final class DynamicExtras implements androidx.navigation.Navigator.Extras {
     ctor public DynamicExtras(optional androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor, optional androidx.navigation.Navigator.Extras? destinationExtras);
     ctor public DynamicExtras(optional androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor);
+    ctor public DynamicExtras();
     method public androidx.navigation.Navigator.Extras? getDestinationExtras();
     method public androidx.navigation.dynamicfeatures.DynamicInstallMonitor? getInstallMonitor();
     property public final androidx.navigation.Navigator.Extras? destinationExtras;
diff --git a/navigation/navigation-dynamic-features-runtime/api/2.4.0-beta02.txt b/navigation/navigation-dynamic-features-runtime/api/2.4.0-beta02.txt
new file mode 100644
index 0000000..a79e3b7
--- /dev/null
+++ b/navigation/navigation-dynamic-features-runtime/api/2.4.0-beta02.txt
@@ -0,0 +1,154 @@
+// Signature format: 4.0
+package androidx.navigation.dynamicfeatures {
+
+  @androidx.navigation.Navigator.Name("activity") public final class DynamicActivityNavigator extends androidx.navigation.ActivityNavigator {
+    ctor public DynamicActivityNavigator(android.content.Context context, androidx.navigation.dynamicfeatures.DynamicInstallManager installManager);
+    method public androidx.navigation.dynamicfeatures.DynamicActivityNavigator.Destination createDestination();
+  }
+
+  public static final class DynamicActivityNavigator.Destination extends androidx.navigation.ActivityNavigator.Destination {
+    ctor public DynamicActivityNavigator.Destination(androidx.navigation.NavigatorProvider navigatorProvider);
+    ctor public DynamicActivityNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.ActivityNavigator.Destination> activityNavigator);
+    method public String? getModuleName();
+    method public void setModuleName(String? moduleName);
+    property public final String? moduleName;
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class DynamicActivityNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.ActivityNavigator.Destination> {
+    ctor @Deprecated public DynamicActivityNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.DynamicActivityNavigator activityNavigator, @IdRes int id);
+    ctor public DynamicActivityNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.DynamicActivityNavigator activityNavigator, String route);
+    method public androidx.navigation.dynamicfeatures.DynamicActivityNavigator.Destination build();
+    method public String? getAction();
+    method public String? getActivityClassName();
+    method public android.net.Uri? getData();
+    method public String? getDataPattern();
+    method public String? getModuleName();
+    method public String? getTargetPackage();
+    method public void setAction(String? action);
+    method public void setActivityClassName(String? activityClassName);
+    method public void setData(android.net.Uri? data);
+    method public void setDataPattern(String? dataPattern);
+    method public void setModuleName(String? moduleName);
+    method public void setTargetPackage(String? targetPackage);
+    property public final String? action;
+    property public final String? activityClassName;
+    property public final android.net.Uri? data;
+    property public final String? dataPattern;
+    property public final String? moduleName;
+    property public final String? targetPackage;
+  }
+
+  public final class DynamicActivityNavigatorDestinationBuilderKt {
+    method @Deprecated public static inline void activity(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method public static inline void activity(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+  }
+
+  public final class DynamicExtras implements androidx.navigation.Navigator.Extras {
+    ctor public DynamicExtras(optional androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor, optional androidx.navigation.Navigator.Extras? destinationExtras);
+    ctor public DynamicExtras(optional androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor);
+    ctor public DynamicExtras();
+    method public androidx.navigation.Navigator.Extras? getDestinationExtras();
+    method public androidx.navigation.dynamicfeatures.DynamicInstallMonitor? getInstallMonitor();
+    property public final androidx.navigation.Navigator.Extras? destinationExtras;
+    property public final androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor;
+  }
+
+  @androidx.navigation.Navigator.Name("navigation") public final class DynamicGraphNavigator extends androidx.navigation.NavGraphNavigator {
+    ctor public DynamicGraphNavigator(androidx.navigation.NavigatorProvider navigatorProvider, androidx.navigation.dynamicfeatures.DynamicInstallManager installManager);
+    method public androidx.navigation.dynamicfeatures.DynamicGraphNavigator.DynamicNavGraph createDestination();
+    method public void installDefaultProgressDestination(kotlin.jvm.functions.Function0<? extends androidx.navigation.NavDestination> progressDestinationSupplier);
+  }
+
+  public static final class DynamicGraphNavigator.DynamicNavGraph extends androidx.navigation.NavGraph {
+    ctor public DynamicGraphNavigator.DynamicNavGraph(androidx.navigation.dynamicfeatures.DynamicGraphNavigator navGraphNavigator, androidx.navigation.NavigatorProvider navigatorProvider);
+    method public String? getModuleName();
+    method public int getProgressDestination();
+    method public void setModuleName(String? moduleName);
+    method public void setProgressDestination(int progressDestination);
+    property public final String? moduleName;
+    property public final int progressDestination;
+  }
+
+  @androidx.navigation.Navigator.Name("include-dynamic") public final class DynamicIncludeGraphNavigator extends androidx.navigation.Navigator<androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph> {
+    ctor public DynamicIncludeGraphNavigator(android.content.Context context, androidx.navigation.NavigatorProvider navigatorProvider, androidx.navigation.NavInflater navInflater, androidx.navigation.dynamicfeatures.DynamicInstallManager installManager);
+    method public androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph createDestination();
+  }
+
+  public static final class DynamicIncludeGraphNavigator.DynamicIncludeNavGraph extends androidx.navigation.NavDestination {
+    method public String? getGraphPackage();
+    method public String? getGraphResourceName();
+    method public String? getModuleName();
+    method public void setGraphPackage(String? graphPackage);
+    method public void setGraphResourceName(String? graphResourceName);
+    method public void setModuleName(String? moduleName);
+    property public final String? graphPackage;
+    property public final String? graphResourceName;
+    property public final String? moduleName;
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class DynamicIncludeNavGraphBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph> {
+    ctor @Deprecated public DynamicIncludeNavGraphBuilder(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator dynamicIncludeGraphNavigator, @IdRes int id, String moduleName, String graphResourceName);
+    ctor public DynamicIncludeNavGraphBuilder(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator dynamicIncludeGraphNavigator, String route, String moduleName, String graphResourceName);
+    method public androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph build();
+    method public String? getGraphPackage();
+    method public void setGraphPackage(String? graphPackage);
+    property public final String? graphPackage;
+  }
+
+  public final class DynamicIncludeNavGraphBuilderKt {
+    method @Deprecated public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String moduleName, String graphResourceName);
+    method @Deprecated public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String moduleName, String graphResourceName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicIncludeNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String moduleName, String graphResourceName);
+    method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String moduleName, String graphResourceName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicIncludeNavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public class DynamicInstallManager {
+    ctor public DynamicInstallManager(android.content.Context context, com.google.android.play.core.splitinstall.SplitInstallManager splitInstallManager);
+  }
+
+  public final class DynamicInstallMonitor {
+    ctor public DynamicInstallMonitor();
+    method public void cancelInstall();
+    method public Exception? getException();
+    method public int getSessionId();
+    method public androidx.lifecycle.LiveData<com.google.android.play.core.splitinstall.SplitInstallSessionState> getStatus();
+    method public boolean isInstallRequired();
+    property public final Exception? exception;
+    property public final boolean isInstallRequired;
+    property public final int sessionId;
+    property public final androidx.lifecycle.LiveData<com.google.android.play.core.splitinstall.SplitInstallSessionState> status;
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class DynamicNavGraphBuilder extends androidx.navigation.NavGraphBuilder {
+    ctor @Deprecated public DynamicNavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
+    ctor public DynamicNavGraphBuilder(androidx.navigation.NavigatorProvider provider, String startDestination, optional String? route);
+    method public String? getModuleName();
+    method public int getProgressDestination();
+    method public String? getProgressDestinationRoute();
+    method public void setModuleName(String? moduleName);
+    method public void setProgressDestination(int p);
+    method public void setProgressDestinationRoute(String? progDestRoute);
+    property public final String? moduleName;
+    property public final int progressDestination;
+    property public final String? progressDestinationRoute;
+  }
+
+  public final class DynamicNavGraphBuilderKt {
+    method @Deprecated public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline void navigation(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline void navigation(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String startDestination, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class NavControllerKt {
+    method @Deprecated public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class NavHostKt {
+    method @Deprecated public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+  }
+
+}
+
diff --git a/navigation/navigation-dynamic-features-runtime/api/current.txt b/navigation/navigation-dynamic-features-runtime/api/current.txt
index 842d76f..a79e3b7 100644
--- a/navigation/navigation-dynamic-features-runtime/api/current.txt
+++ b/navigation/navigation-dynamic-features-runtime/api/current.txt
@@ -46,6 +46,7 @@
   public final class DynamicExtras implements androidx.navigation.Navigator.Extras {
     ctor public DynamicExtras(optional androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor, optional androidx.navigation.Navigator.Extras? destinationExtras);
     ctor public DynamicExtras(optional androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor);
+    ctor public DynamicExtras();
     method public androidx.navigation.Navigator.Extras? getDestinationExtras();
     method public androidx.navigation.dynamicfeatures.DynamicInstallMonitor? getInstallMonitor();
     property public final androidx.navigation.Navigator.Extras? destinationExtras;
diff --git a/navigation/navigation-dynamic-features-runtime/api/public_plus_experimental_2.4.0-beta01.txt b/navigation/navigation-dynamic-features-runtime/api/public_plus_experimental_2.4.0-beta01.txt
index 842d76f..a79e3b7 100644
--- a/navigation/navigation-dynamic-features-runtime/api/public_plus_experimental_2.4.0-beta01.txt
+++ b/navigation/navigation-dynamic-features-runtime/api/public_plus_experimental_2.4.0-beta01.txt
@@ -46,6 +46,7 @@
   public final class DynamicExtras implements androidx.navigation.Navigator.Extras {
     ctor public DynamicExtras(optional androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor, optional androidx.navigation.Navigator.Extras? destinationExtras);
     ctor public DynamicExtras(optional androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor);
+    ctor public DynamicExtras();
     method public androidx.navigation.Navigator.Extras? getDestinationExtras();
     method public androidx.navigation.dynamicfeatures.DynamicInstallMonitor? getInstallMonitor();
     property public final androidx.navigation.Navigator.Extras? destinationExtras;
diff --git a/navigation/navigation-dynamic-features-runtime/api/public_plus_experimental_2.4.0-beta02.txt b/navigation/navigation-dynamic-features-runtime/api/public_plus_experimental_2.4.0-beta02.txt
new file mode 100644
index 0000000..a79e3b7
--- /dev/null
+++ b/navigation/navigation-dynamic-features-runtime/api/public_plus_experimental_2.4.0-beta02.txt
@@ -0,0 +1,154 @@
+// Signature format: 4.0
+package androidx.navigation.dynamicfeatures {
+
+  @androidx.navigation.Navigator.Name("activity") public final class DynamicActivityNavigator extends androidx.navigation.ActivityNavigator {
+    ctor public DynamicActivityNavigator(android.content.Context context, androidx.navigation.dynamicfeatures.DynamicInstallManager installManager);
+    method public androidx.navigation.dynamicfeatures.DynamicActivityNavigator.Destination createDestination();
+  }
+
+  public static final class DynamicActivityNavigator.Destination extends androidx.navigation.ActivityNavigator.Destination {
+    ctor public DynamicActivityNavigator.Destination(androidx.navigation.NavigatorProvider navigatorProvider);
+    ctor public DynamicActivityNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.ActivityNavigator.Destination> activityNavigator);
+    method public String? getModuleName();
+    method public void setModuleName(String? moduleName);
+    property public final String? moduleName;
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class DynamicActivityNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.ActivityNavigator.Destination> {
+    ctor @Deprecated public DynamicActivityNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.DynamicActivityNavigator activityNavigator, @IdRes int id);
+    ctor public DynamicActivityNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.DynamicActivityNavigator activityNavigator, String route);
+    method public androidx.navigation.dynamicfeatures.DynamicActivityNavigator.Destination build();
+    method public String? getAction();
+    method public String? getActivityClassName();
+    method public android.net.Uri? getData();
+    method public String? getDataPattern();
+    method public String? getModuleName();
+    method public String? getTargetPackage();
+    method public void setAction(String? action);
+    method public void setActivityClassName(String? activityClassName);
+    method public void setData(android.net.Uri? data);
+    method public void setDataPattern(String? dataPattern);
+    method public void setModuleName(String? moduleName);
+    method public void setTargetPackage(String? targetPackage);
+    property public final String? action;
+    property public final String? activityClassName;
+    property public final android.net.Uri? data;
+    property public final String? dataPattern;
+    property public final String? moduleName;
+    property public final String? targetPackage;
+  }
+
+  public final class DynamicActivityNavigatorDestinationBuilderKt {
+    method @Deprecated public static inline void activity(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method public static inline void activity(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+  }
+
+  public final class DynamicExtras implements androidx.navigation.Navigator.Extras {
+    ctor public DynamicExtras(optional androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor, optional androidx.navigation.Navigator.Extras? destinationExtras);
+    ctor public DynamicExtras(optional androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor);
+    ctor public DynamicExtras();
+    method public androidx.navigation.Navigator.Extras? getDestinationExtras();
+    method public androidx.navigation.dynamicfeatures.DynamicInstallMonitor? getInstallMonitor();
+    property public final androidx.navigation.Navigator.Extras? destinationExtras;
+    property public final androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor;
+  }
+
+  @androidx.navigation.Navigator.Name("navigation") public final class DynamicGraphNavigator extends androidx.navigation.NavGraphNavigator {
+    ctor public DynamicGraphNavigator(androidx.navigation.NavigatorProvider navigatorProvider, androidx.navigation.dynamicfeatures.DynamicInstallManager installManager);
+    method public androidx.navigation.dynamicfeatures.DynamicGraphNavigator.DynamicNavGraph createDestination();
+    method public void installDefaultProgressDestination(kotlin.jvm.functions.Function0<? extends androidx.navigation.NavDestination> progressDestinationSupplier);
+  }
+
+  public static final class DynamicGraphNavigator.DynamicNavGraph extends androidx.navigation.NavGraph {
+    ctor public DynamicGraphNavigator.DynamicNavGraph(androidx.navigation.dynamicfeatures.DynamicGraphNavigator navGraphNavigator, androidx.navigation.NavigatorProvider navigatorProvider);
+    method public String? getModuleName();
+    method public int getProgressDestination();
+    method public void setModuleName(String? moduleName);
+    method public void setProgressDestination(int progressDestination);
+    property public final String? moduleName;
+    property public final int progressDestination;
+  }
+
+  @androidx.navigation.Navigator.Name("include-dynamic") public final class DynamicIncludeGraphNavigator extends androidx.navigation.Navigator<androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph> {
+    ctor public DynamicIncludeGraphNavigator(android.content.Context context, androidx.navigation.NavigatorProvider navigatorProvider, androidx.navigation.NavInflater navInflater, androidx.navigation.dynamicfeatures.DynamicInstallManager installManager);
+    method public androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph createDestination();
+  }
+
+  public static final class DynamicIncludeGraphNavigator.DynamicIncludeNavGraph extends androidx.navigation.NavDestination {
+    method public String? getGraphPackage();
+    method public String? getGraphResourceName();
+    method public String? getModuleName();
+    method public void setGraphPackage(String? graphPackage);
+    method public void setGraphResourceName(String? graphResourceName);
+    method public void setModuleName(String? moduleName);
+    property public final String? graphPackage;
+    property public final String? graphResourceName;
+    property public final String? moduleName;
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class DynamicIncludeNavGraphBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph> {
+    ctor @Deprecated public DynamicIncludeNavGraphBuilder(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator dynamicIncludeGraphNavigator, @IdRes int id, String moduleName, String graphResourceName);
+    ctor public DynamicIncludeNavGraphBuilder(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator dynamicIncludeGraphNavigator, String route, String moduleName, String graphResourceName);
+    method public androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph build();
+    method public String? getGraphPackage();
+    method public void setGraphPackage(String? graphPackage);
+    property public final String? graphPackage;
+  }
+
+  public final class DynamicIncludeNavGraphBuilderKt {
+    method @Deprecated public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String moduleName, String graphResourceName);
+    method @Deprecated public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String moduleName, String graphResourceName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicIncludeNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String moduleName, String graphResourceName);
+    method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String moduleName, String graphResourceName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicIncludeNavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public class DynamicInstallManager {
+    ctor public DynamicInstallManager(android.content.Context context, com.google.android.play.core.splitinstall.SplitInstallManager splitInstallManager);
+  }
+
+  public final class DynamicInstallMonitor {
+    ctor public DynamicInstallMonitor();
+    method public void cancelInstall();
+    method public Exception? getException();
+    method public int getSessionId();
+    method public androidx.lifecycle.LiveData<com.google.android.play.core.splitinstall.SplitInstallSessionState> getStatus();
+    method public boolean isInstallRequired();
+    property public final Exception? exception;
+    property public final boolean isInstallRequired;
+    property public final int sessionId;
+    property public final androidx.lifecycle.LiveData<com.google.android.play.core.splitinstall.SplitInstallSessionState> status;
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class DynamicNavGraphBuilder extends androidx.navigation.NavGraphBuilder {
+    ctor @Deprecated public DynamicNavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
+    ctor public DynamicNavGraphBuilder(androidx.navigation.NavigatorProvider provider, String startDestination, optional String? route);
+    method public String? getModuleName();
+    method public int getProgressDestination();
+    method public String? getProgressDestinationRoute();
+    method public void setModuleName(String? moduleName);
+    method public void setProgressDestination(int p);
+    method public void setProgressDestinationRoute(String? progDestRoute);
+    property public final String? moduleName;
+    property public final int progressDestination;
+    property public final String? progressDestinationRoute;
+  }
+
+  public final class DynamicNavGraphBuilderKt {
+    method @Deprecated public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline void navigation(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline void navigation(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String startDestination, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class NavControllerKt {
+    method @Deprecated public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class NavHostKt {
+    method @Deprecated public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+  }
+
+}
+
diff --git a/navigation/navigation-dynamic-features-runtime/api/public_plus_experimental_current.txt b/navigation/navigation-dynamic-features-runtime/api/public_plus_experimental_current.txt
index 842d76f..a79e3b7 100644
--- a/navigation/navigation-dynamic-features-runtime/api/public_plus_experimental_current.txt
+++ b/navigation/navigation-dynamic-features-runtime/api/public_plus_experimental_current.txt
@@ -46,6 +46,7 @@
   public final class DynamicExtras implements androidx.navigation.Navigator.Extras {
     ctor public DynamicExtras(optional androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor, optional androidx.navigation.Navigator.Extras? destinationExtras);
     ctor public DynamicExtras(optional androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor);
+    ctor public DynamicExtras();
     method public androidx.navigation.Navigator.Extras? getDestinationExtras();
     method public androidx.navigation.dynamicfeatures.DynamicInstallMonitor? getInstallMonitor();
     property public final androidx.navigation.Navigator.Extras? destinationExtras;
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/navigation/navigation-dynamic-features-runtime/api/res-2.4.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to navigation/navigation-dynamic-features-runtime/api/res-2.4.0-beta02.txt
diff --git a/navigation/navigation-dynamic-features-runtime/api/restricted_2.4.0-beta01.txt b/navigation/navigation-dynamic-features-runtime/api/restricted_2.4.0-beta01.txt
index 842d76f..a79e3b7 100644
--- a/navigation/navigation-dynamic-features-runtime/api/restricted_2.4.0-beta01.txt
+++ b/navigation/navigation-dynamic-features-runtime/api/restricted_2.4.0-beta01.txt
@@ -46,6 +46,7 @@
   public final class DynamicExtras implements androidx.navigation.Navigator.Extras {
     ctor public DynamicExtras(optional androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor, optional androidx.navigation.Navigator.Extras? destinationExtras);
     ctor public DynamicExtras(optional androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor);
+    ctor public DynamicExtras();
     method public androidx.navigation.Navigator.Extras? getDestinationExtras();
     method public androidx.navigation.dynamicfeatures.DynamicInstallMonitor? getInstallMonitor();
     property public final androidx.navigation.Navigator.Extras? destinationExtras;
diff --git a/navigation/navigation-dynamic-features-runtime/api/restricted_2.4.0-beta02.txt b/navigation/navigation-dynamic-features-runtime/api/restricted_2.4.0-beta02.txt
new file mode 100644
index 0000000..a79e3b7
--- /dev/null
+++ b/navigation/navigation-dynamic-features-runtime/api/restricted_2.4.0-beta02.txt
@@ -0,0 +1,154 @@
+// Signature format: 4.0
+package androidx.navigation.dynamicfeatures {
+
+  @androidx.navigation.Navigator.Name("activity") public final class DynamicActivityNavigator extends androidx.navigation.ActivityNavigator {
+    ctor public DynamicActivityNavigator(android.content.Context context, androidx.navigation.dynamicfeatures.DynamicInstallManager installManager);
+    method public androidx.navigation.dynamicfeatures.DynamicActivityNavigator.Destination createDestination();
+  }
+
+  public static final class DynamicActivityNavigator.Destination extends androidx.navigation.ActivityNavigator.Destination {
+    ctor public DynamicActivityNavigator.Destination(androidx.navigation.NavigatorProvider navigatorProvider);
+    ctor public DynamicActivityNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.ActivityNavigator.Destination> activityNavigator);
+    method public String? getModuleName();
+    method public void setModuleName(String? moduleName);
+    property public final String? moduleName;
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class DynamicActivityNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.ActivityNavigator.Destination> {
+    ctor @Deprecated public DynamicActivityNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.DynamicActivityNavigator activityNavigator, @IdRes int id);
+    ctor public DynamicActivityNavigatorDestinationBuilder(androidx.navigation.dynamicfeatures.DynamicActivityNavigator activityNavigator, String route);
+    method public androidx.navigation.dynamicfeatures.DynamicActivityNavigator.Destination build();
+    method public String? getAction();
+    method public String? getActivityClassName();
+    method public android.net.Uri? getData();
+    method public String? getDataPattern();
+    method public String? getModuleName();
+    method public String? getTargetPackage();
+    method public void setAction(String? action);
+    method public void setActivityClassName(String? activityClassName);
+    method public void setData(android.net.Uri? data);
+    method public void setDataPattern(String? dataPattern);
+    method public void setModuleName(String? moduleName);
+    method public void setTargetPackage(String? targetPackage);
+    property public final String? action;
+    property public final String? activityClassName;
+    property public final android.net.Uri? data;
+    property public final String? dataPattern;
+    property public final String? moduleName;
+    property public final String? targetPackage;
+  }
+
+  public final class DynamicActivityNavigatorDestinationBuilderKt {
+    method @Deprecated public static inline void activity(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method public static inline void activity(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+  }
+
+  public final class DynamicExtras implements androidx.navigation.Navigator.Extras {
+    ctor public DynamicExtras(optional androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor, optional androidx.navigation.Navigator.Extras? destinationExtras);
+    ctor public DynamicExtras(optional androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor);
+    ctor public DynamicExtras();
+    method public androidx.navigation.Navigator.Extras? getDestinationExtras();
+    method public androidx.navigation.dynamicfeatures.DynamicInstallMonitor? getInstallMonitor();
+    property public final androidx.navigation.Navigator.Extras? destinationExtras;
+    property public final androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor;
+  }
+
+  @androidx.navigation.Navigator.Name("navigation") public final class DynamicGraphNavigator extends androidx.navigation.NavGraphNavigator {
+    ctor public DynamicGraphNavigator(androidx.navigation.NavigatorProvider navigatorProvider, androidx.navigation.dynamicfeatures.DynamicInstallManager installManager);
+    method public androidx.navigation.dynamicfeatures.DynamicGraphNavigator.DynamicNavGraph createDestination();
+    method public void installDefaultProgressDestination(kotlin.jvm.functions.Function0<? extends androidx.navigation.NavDestination> progressDestinationSupplier);
+  }
+
+  public static final class DynamicGraphNavigator.DynamicNavGraph extends androidx.navigation.NavGraph {
+    ctor public DynamicGraphNavigator.DynamicNavGraph(androidx.navigation.dynamicfeatures.DynamicGraphNavigator navGraphNavigator, androidx.navigation.NavigatorProvider navigatorProvider);
+    method public String? getModuleName();
+    method public int getProgressDestination();
+    method public void setModuleName(String? moduleName);
+    method public void setProgressDestination(int progressDestination);
+    property public final String? moduleName;
+    property public final int progressDestination;
+  }
+
+  @androidx.navigation.Navigator.Name("include-dynamic") public final class DynamicIncludeGraphNavigator extends androidx.navigation.Navigator<androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph> {
+    ctor public DynamicIncludeGraphNavigator(android.content.Context context, androidx.navigation.NavigatorProvider navigatorProvider, androidx.navigation.NavInflater navInflater, androidx.navigation.dynamicfeatures.DynamicInstallManager installManager);
+    method public androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph createDestination();
+  }
+
+  public static final class DynamicIncludeGraphNavigator.DynamicIncludeNavGraph extends androidx.navigation.NavDestination {
+    method public String? getGraphPackage();
+    method public String? getGraphResourceName();
+    method public String? getModuleName();
+    method public void setGraphPackage(String? graphPackage);
+    method public void setGraphResourceName(String? graphResourceName);
+    method public void setModuleName(String? moduleName);
+    property public final String? graphPackage;
+    property public final String? graphResourceName;
+    property public final String? moduleName;
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class DynamicIncludeNavGraphBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph> {
+    ctor @Deprecated public DynamicIncludeNavGraphBuilder(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator dynamicIncludeGraphNavigator, @IdRes int id, String moduleName, String graphResourceName);
+    ctor public DynamicIncludeNavGraphBuilder(androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator dynamicIncludeGraphNavigator, String route, String moduleName, String graphResourceName);
+    method public androidx.navigation.dynamicfeatures.DynamicIncludeGraphNavigator.DynamicIncludeNavGraph build();
+    method public String? getGraphPackage();
+    method public void setGraphPackage(String? graphPackage);
+    property public final String? graphPackage;
+  }
+
+  public final class DynamicIncludeNavGraphBuilderKt {
+    method @Deprecated public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String moduleName, String graphResourceName);
+    method @Deprecated public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, String moduleName, String graphResourceName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicIncludeNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String moduleName, String graphResourceName);
+    method public static inline void includeDynamic(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String route, String moduleName, String graphResourceName, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicIncludeNavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public class DynamicInstallManager {
+    ctor public DynamicInstallManager(android.content.Context context, com.google.android.play.core.splitinstall.SplitInstallManager splitInstallManager);
+  }
+
+  public final class DynamicInstallMonitor {
+    ctor public DynamicInstallMonitor();
+    method public void cancelInstall();
+    method public Exception? getException();
+    method public int getSessionId();
+    method public androidx.lifecycle.LiveData<com.google.android.play.core.splitinstall.SplitInstallSessionState> getStatus();
+    method public boolean isInstallRequired();
+    property public final Exception? exception;
+    property public final boolean isInstallRequired;
+    property public final int sessionId;
+    property public final androidx.lifecycle.LiveData<com.google.android.play.core.splitinstall.SplitInstallSessionState> status;
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class DynamicNavGraphBuilder extends androidx.navigation.NavGraphBuilder {
+    ctor @Deprecated public DynamicNavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
+    ctor public DynamicNavGraphBuilder(androidx.navigation.NavigatorProvider provider, String startDestination, optional String? route);
+    method public String? getModuleName();
+    method public int getProgressDestination();
+    method public String? getProgressDestinationRoute();
+    method public void setModuleName(String? moduleName);
+    method public void setProgressDestination(int p);
+    method public void setProgressDestinationRoute(String? progDestRoute);
+    property public final String? moduleName;
+    property public final int progressDestination;
+    property public final String? progressDestinationRoute;
+  }
+
+  public final class DynamicNavGraphBuilderKt {
+    method @Deprecated public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method @Deprecated public static inline void navigation(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline void navigation(androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder, String startDestination, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class NavControllerKt {
+    method @Deprecated public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class NavHostKt {
+    method @Deprecated public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.dynamicfeatures.DynamicNavGraphBuilder,kotlin.Unit> builder);
+  }
+
+}
+
diff --git a/navigation/navigation-dynamic-features-runtime/api/restricted_current.txt b/navigation/navigation-dynamic-features-runtime/api/restricted_current.txt
index 842d76f..a79e3b7 100644
--- a/navigation/navigation-dynamic-features-runtime/api/restricted_current.txt
+++ b/navigation/navigation-dynamic-features-runtime/api/restricted_current.txt
@@ -46,6 +46,7 @@
   public final class DynamicExtras implements androidx.navigation.Navigator.Extras {
     ctor public DynamicExtras(optional androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor, optional androidx.navigation.Navigator.Extras? destinationExtras);
     ctor public DynamicExtras(optional androidx.navigation.dynamicfeatures.DynamicInstallMonitor? installMonitor);
+    ctor public DynamicExtras();
     method public androidx.navigation.Navigator.Extras? getDestinationExtras();
     method public androidx.navigation.dynamicfeatures.DynamicInstallMonitor? getInstallMonitor();
     property public final androidx.navigation.Navigator.Extras? destinationExtras;
diff --git a/navigation/navigation-fragment-ktx/api/2.4.0-beta02.txt b/navigation/navigation-fragment-ktx/api/2.4.0-beta02.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/navigation/navigation-fragment-ktx/api/2.4.0-beta02.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/navigation/navigation-fragment-ktx/api/public_plus_experimental_2.4.0-beta02.txt b/navigation/navigation-fragment-ktx/api/public_plus_experimental_2.4.0-beta02.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/navigation/navigation-fragment-ktx/api/public_plus_experimental_2.4.0-beta02.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/navigation/navigation-fragment-ktx/api/res-2.4.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to navigation/navigation-fragment-ktx/api/res-2.4.0-beta02.txt
diff --git a/navigation/navigation-fragment-ktx/api/restricted_2.4.0-beta02.txt b/navigation/navigation-fragment-ktx/api/restricted_2.4.0-beta02.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/navigation/navigation-fragment-ktx/api/restricted_2.4.0-beta02.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/navigation/navigation-fragment/api/2.4.0-beta01.txt b/navigation/navigation-fragment/api/2.4.0-beta01.txt
index f2297ab..98ee0fc 100644
--- a/navigation/navigation-fragment/api/2.4.0-beta01.txt
+++ b/navigation/navigation-fragment/api/2.4.0-beta01.txt
@@ -43,8 +43,8 @@
   }
 
   public final class DialogFragmentNavigatorDestinationBuilderKt {
-    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id);
-    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
     method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, String route);
     method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
   }
@@ -90,8 +90,8 @@
   }
 
   public final class FragmentNavigatorDestinationBuilderKt {
-    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, String route);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
   }
diff --git a/navigation/navigation-fragment/api/2.4.0-beta02.txt b/navigation/navigation-fragment/api/2.4.0-beta02.txt
new file mode 100644
index 0000000..98ee0fc
--- /dev/null
+++ b/navigation/navigation-fragment/api/2.4.0-beta02.txt
@@ -0,0 +1,123 @@
+// Signature format: 4.0
+package androidx.navigation {
+
+  public final class NavGraphViewModelLazyKt {
+    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM>! navGraphViewModels(androidx.fragment.app.Fragment, @IdRes int navGraphId, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM>! navGraphViewModels(androidx.fragment.app.Fragment, String navGraphRoute, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+  }
+
+}
+
+package androidx.navigation.fragment {
+
+  public abstract class AbstractListDetailFragment extends androidx.fragment.app.Fragment {
+    ctor public AbstractListDetailFragment();
+    method public final androidx.navigation.fragment.NavHostFragment getDetailPaneNavHostFragment();
+    method public final androidx.slidingpanelayout.widget.SlidingPaneLayout getSlidingPaneLayout();
+    method public androidx.navigation.fragment.NavHostFragment onCreateDetailPaneNavHostFragment();
+    method public abstract android.view.View onCreateListPaneView(android.view.LayoutInflater inflater, android.view.ViewGroup? container, android.os.Bundle? savedInstanceState);
+    method @CallSuper public final android.view.View onCreateView(android.view.LayoutInflater inflater, android.view.ViewGroup? container, android.os.Bundle? savedInstanceState);
+    method public void onListPaneViewCreated(android.view.View view, android.os.Bundle? savedInstanceState);
+    method @CallSuper public final void onViewCreated(android.view.View view, android.os.Bundle? savedInstanceState);
+    property public final androidx.navigation.fragment.NavHostFragment detailPaneNavHostFragment;
+    property public final androidx.slidingpanelayout.widget.SlidingPaneLayout slidingPaneLayout;
+  }
+
+  @androidx.navigation.Navigator.Name("dialog") public final class DialogFragmentNavigator extends androidx.navigation.Navigator<androidx.navigation.fragment.DialogFragmentNavigator.Destination> {
+    ctor public DialogFragmentNavigator(android.content.Context context, androidx.fragment.app.FragmentManager fragmentManager);
+    method public androidx.navigation.fragment.DialogFragmentNavigator.Destination createDestination();
+  }
+
+  @androidx.navigation.NavDestination.ClassType(DialogFragment::class) public static class DialogFragmentNavigator.Destination extends androidx.navigation.NavDestination implements androidx.navigation.FloatingWindow {
+    ctor public DialogFragmentNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.fragment.DialogFragmentNavigator.Destination> fragmentNavigator);
+    ctor public DialogFragmentNavigator.Destination(androidx.navigation.NavigatorProvider navigatorProvider);
+    method public final String getClassName();
+    method public final androidx.navigation.fragment.DialogFragmentNavigator.Destination setClassName(String className);
+    property public final String className;
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class DialogFragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.DialogFragmentNavigator.Destination> {
+    ctor @Deprecated public DialogFragmentNavigatorDestinationBuilder(androidx.navigation.fragment.DialogFragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.DialogFragment> fragmentClass);
+    ctor public DialogFragmentNavigatorDestinationBuilder(androidx.navigation.fragment.DialogFragmentNavigator navigator, String route, kotlin.reflect.KClass<? extends androidx.fragment.app.DialogFragment> fragmentClass);
+    method public androidx.navigation.fragment.DialogFragmentNavigator.Destination build();
+  }
+
+  public final class DialogFragmentNavigatorDestinationBuilderKt {
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, String route);
+    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+  }
+
+  public final class FragmentKt {
+    method public static androidx.navigation.NavController findNavController(androidx.fragment.app.Fragment);
+  }
+
+  public final class FragmentNavArgsLazyKt {
+    method @MainThread public static inline <reified Args extends androidx.navigation.NavArgs> androidx.navigation.NavArgsLazy<Args>! navArgs(androidx.fragment.app.Fragment);
+  }
+
+  @androidx.navigation.Navigator.Name("fragment") public class FragmentNavigator extends androidx.navigation.Navigator<androidx.navigation.fragment.FragmentNavigator.Destination> {
+    ctor public FragmentNavigator(android.content.Context context, androidx.fragment.app.FragmentManager fragmentManager, int containerId);
+    method public androidx.navigation.fragment.FragmentNavigator.Destination createDestination();
+    method @Deprecated public androidx.fragment.app.Fragment instantiateFragment(android.content.Context context, androidx.fragment.app.FragmentManager fragmentManager, String className, android.os.Bundle? args);
+  }
+
+  @androidx.navigation.NavDestination.ClassType(Fragment::class) public static class FragmentNavigator.Destination extends androidx.navigation.NavDestination {
+    ctor public FragmentNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination> fragmentNavigator);
+    ctor public FragmentNavigator.Destination(androidx.navigation.NavigatorProvider navigatorProvider);
+    method public final String getClassName();
+    method public final androidx.navigation.fragment.FragmentNavigator.Destination setClassName(String className);
+    property public final String className;
+  }
+
+  public static final class FragmentNavigator.Extras implements androidx.navigation.Navigator.Extras {
+    method public java.util.Map<android.view.View,java.lang.String> getSharedElements();
+    property public final java.util.Map<android.view.View,java.lang.String> sharedElements;
+  }
+
+  public static final class FragmentNavigator.Extras.Builder {
+    ctor public FragmentNavigator.Extras.Builder();
+    method public androidx.navigation.fragment.FragmentNavigator.Extras.Builder addSharedElement(android.view.View sharedElement, String name);
+    method public androidx.navigation.fragment.FragmentNavigator.Extras.Builder addSharedElements(java.util.Map<android.view.View,java.lang.String> sharedElements);
+    method public androidx.navigation.fragment.FragmentNavigator.Extras build();
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class FragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.FragmentNavigator.Destination> {
+    ctor @Deprecated public FragmentNavigatorDestinationBuilder(androidx.navigation.fragment.FragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.Fragment> fragmentClass);
+    ctor public FragmentNavigatorDestinationBuilder(androidx.navigation.fragment.FragmentNavigator navigator, String route, kotlin.reflect.KClass<? extends androidx.fragment.app.Fragment> fragmentClass);
+    method public androidx.navigation.fragment.FragmentNavigator.Destination build();
+  }
+
+  public final class FragmentNavigatorDestinationBuilderKt {
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, String route);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+  }
+
+  public final class FragmentNavigatorExtrasKt {
+    method public static androidx.navigation.fragment.FragmentNavigator.Extras FragmentNavigatorExtras(kotlin.Pair<? extends android.view.View,java.lang.String>... sharedElements);
+  }
+
+  public class NavHostFragment extends androidx.fragment.app.Fragment implements androidx.navigation.NavHost {
+    ctor public NavHostFragment();
+    method public static final androidx.navigation.fragment.NavHostFragment create(@NavigationRes int graphResId, optional android.os.Bundle? startDestinationArgs);
+    method public static final androidx.navigation.fragment.NavHostFragment create(@NavigationRes int graphResId);
+    method @Deprecated protected androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination> createFragmentNavigator();
+    method public static final androidx.navigation.NavController findNavController(androidx.fragment.app.Fragment fragment);
+    method public final androidx.navigation.NavController getNavController();
+    method @Deprecated @CallSuper protected void onCreateNavController(androidx.navigation.NavController navController);
+    method @CallSuper protected void onCreateNavHostController(androidx.navigation.NavHostController navHostController);
+    property public final androidx.navigation.NavController navController;
+    field public static final androidx.navigation.fragment.NavHostFragment.Companion Companion;
+  }
+
+  public static final class NavHostFragment.Companion {
+    method public androidx.navigation.fragment.NavHostFragment create(@NavigationRes int graphResId, optional android.os.Bundle? startDestinationArgs);
+    method public androidx.navigation.fragment.NavHostFragment create(@NavigationRes int graphResId);
+    method public androidx.navigation.NavController findNavController(androidx.fragment.app.Fragment fragment);
+  }
+
+}
+
diff --git a/navigation/navigation-fragment/api/current.txt b/navigation/navigation-fragment/api/current.txt
index f2297ab..98ee0fc 100644
--- a/navigation/navigation-fragment/api/current.txt
+++ b/navigation/navigation-fragment/api/current.txt
@@ -43,8 +43,8 @@
   }
 
   public final class DialogFragmentNavigatorDestinationBuilderKt {
-    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id);
-    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
     method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, String route);
     method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
   }
@@ -90,8 +90,8 @@
   }
 
   public final class FragmentNavigatorDestinationBuilderKt {
-    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, String route);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
   }
diff --git a/navigation/navigation-fragment/api/public_plus_experimental_2.4.0-beta01.txt b/navigation/navigation-fragment/api/public_plus_experimental_2.4.0-beta01.txt
index f2297ab..98ee0fc 100644
--- a/navigation/navigation-fragment/api/public_plus_experimental_2.4.0-beta01.txt
+++ b/navigation/navigation-fragment/api/public_plus_experimental_2.4.0-beta01.txt
@@ -43,8 +43,8 @@
   }
 
   public final class DialogFragmentNavigatorDestinationBuilderKt {
-    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id);
-    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
     method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, String route);
     method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
   }
@@ -90,8 +90,8 @@
   }
 
   public final class FragmentNavigatorDestinationBuilderKt {
-    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, String route);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
   }
diff --git a/navigation/navigation-fragment/api/public_plus_experimental_2.4.0-beta02.txt b/navigation/navigation-fragment/api/public_plus_experimental_2.4.0-beta02.txt
new file mode 100644
index 0000000..98ee0fc
--- /dev/null
+++ b/navigation/navigation-fragment/api/public_plus_experimental_2.4.0-beta02.txt
@@ -0,0 +1,123 @@
+// Signature format: 4.0
+package androidx.navigation {
+
+  public final class NavGraphViewModelLazyKt {
+    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM>! navGraphViewModels(androidx.fragment.app.Fragment, @IdRes int navGraphId, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM>! navGraphViewModels(androidx.fragment.app.Fragment, String navGraphRoute, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+  }
+
+}
+
+package androidx.navigation.fragment {
+
+  public abstract class AbstractListDetailFragment extends androidx.fragment.app.Fragment {
+    ctor public AbstractListDetailFragment();
+    method public final androidx.navigation.fragment.NavHostFragment getDetailPaneNavHostFragment();
+    method public final androidx.slidingpanelayout.widget.SlidingPaneLayout getSlidingPaneLayout();
+    method public androidx.navigation.fragment.NavHostFragment onCreateDetailPaneNavHostFragment();
+    method public abstract android.view.View onCreateListPaneView(android.view.LayoutInflater inflater, android.view.ViewGroup? container, android.os.Bundle? savedInstanceState);
+    method @CallSuper public final android.view.View onCreateView(android.view.LayoutInflater inflater, android.view.ViewGroup? container, android.os.Bundle? savedInstanceState);
+    method public void onListPaneViewCreated(android.view.View view, android.os.Bundle? savedInstanceState);
+    method @CallSuper public final void onViewCreated(android.view.View view, android.os.Bundle? savedInstanceState);
+    property public final androidx.navigation.fragment.NavHostFragment detailPaneNavHostFragment;
+    property public final androidx.slidingpanelayout.widget.SlidingPaneLayout slidingPaneLayout;
+  }
+
+  @androidx.navigation.Navigator.Name("dialog") public final class DialogFragmentNavigator extends androidx.navigation.Navigator<androidx.navigation.fragment.DialogFragmentNavigator.Destination> {
+    ctor public DialogFragmentNavigator(android.content.Context context, androidx.fragment.app.FragmentManager fragmentManager);
+    method public androidx.navigation.fragment.DialogFragmentNavigator.Destination createDestination();
+  }
+
+  @androidx.navigation.NavDestination.ClassType(DialogFragment::class) public static class DialogFragmentNavigator.Destination extends androidx.navigation.NavDestination implements androidx.navigation.FloatingWindow {
+    ctor public DialogFragmentNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.fragment.DialogFragmentNavigator.Destination> fragmentNavigator);
+    ctor public DialogFragmentNavigator.Destination(androidx.navigation.NavigatorProvider navigatorProvider);
+    method public final String getClassName();
+    method public final androidx.navigation.fragment.DialogFragmentNavigator.Destination setClassName(String className);
+    property public final String className;
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class DialogFragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.DialogFragmentNavigator.Destination> {
+    ctor @Deprecated public DialogFragmentNavigatorDestinationBuilder(androidx.navigation.fragment.DialogFragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.DialogFragment> fragmentClass);
+    ctor public DialogFragmentNavigatorDestinationBuilder(androidx.navigation.fragment.DialogFragmentNavigator navigator, String route, kotlin.reflect.KClass<? extends androidx.fragment.app.DialogFragment> fragmentClass);
+    method public androidx.navigation.fragment.DialogFragmentNavigator.Destination build();
+  }
+
+  public final class DialogFragmentNavigatorDestinationBuilderKt {
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, String route);
+    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+  }
+
+  public final class FragmentKt {
+    method public static androidx.navigation.NavController findNavController(androidx.fragment.app.Fragment);
+  }
+
+  public final class FragmentNavArgsLazyKt {
+    method @MainThread public static inline <reified Args extends androidx.navigation.NavArgs> androidx.navigation.NavArgsLazy<Args>! navArgs(androidx.fragment.app.Fragment);
+  }
+
+  @androidx.navigation.Navigator.Name("fragment") public class FragmentNavigator extends androidx.navigation.Navigator<androidx.navigation.fragment.FragmentNavigator.Destination> {
+    ctor public FragmentNavigator(android.content.Context context, androidx.fragment.app.FragmentManager fragmentManager, int containerId);
+    method public androidx.navigation.fragment.FragmentNavigator.Destination createDestination();
+    method @Deprecated public androidx.fragment.app.Fragment instantiateFragment(android.content.Context context, androidx.fragment.app.FragmentManager fragmentManager, String className, android.os.Bundle? args);
+  }
+
+  @androidx.navigation.NavDestination.ClassType(Fragment::class) public static class FragmentNavigator.Destination extends androidx.navigation.NavDestination {
+    ctor public FragmentNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination> fragmentNavigator);
+    ctor public FragmentNavigator.Destination(androidx.navigation.NavigatorProvider navigatorProvider);
+    method public final String getClassName();
+    method public final androidx.navigation.fragment.FragmentNavigator.Destination setClassName(String className);
+    property public final String className;
+  }
+
+  public static final class FragmentNavigator.Extras implements androidx.navigation.Navigator.Extras {
+    method public java.util.Map<android.view.View,java.lang.String> getSharedElements();
+    property public final java.util.Map<android.view.View,java.lang.String> sharedElements;
+  }
+
+  public static final class FragmentNavigator.Extras.Builder {
+    ctor public FragmentNavigator.Extras.Builder();
+    method public androidx.navigation.fragment.FragmentNavigator.Extras.Builder addSharedElement(android.view.View sharedElement, String name);
+    method public androidx.navigation.fragment.FragmentNavigator.Extras.Builder addSharedElements(java.util.Map<android.view.View,java.lang.String> sharedElements);
+    method public androidx.navigation.fragment.FragmentNavigator.Extras build();
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class FragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.FragmentNavigator.Destination> {
+    ctor @Deprecated public FragmentNavigatorDestinationBuilder(androidx.navigation.fragment.FragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.Fragment> fragmentClass);
+    ctor public FragmentNavigatorDestinationBuilder(androidx.navigation.fragment.FragmentNavigator navigator, String route, kotlin.reflect.KClass<? extends androidx.fragment.app.Fragment> fragmentClass);
+    method public androidx.navigation.fragment.FragmentNavigator.Destination build();
+  }
+
+  public final class FragmentNavigatorDestinationBuilderKt {
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, String route);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+  }
+
+  public final class FragmentNavigatorExtrasKt {
+    method public static androidx.navigation.fragment.FragmentNavigator.Extras FragmentNavigatorExtras(kotlin.Pair<? extends android.view.View,java.lang.String>... sharedElements);
+  }
+
+  public class NavHostFragment extends androidx.fragment.app.Fragment implements androidx.navigation.NavHost {
+    ctor public NavHostFragment();
+    method public static final androidx.navigation.fragment.NavHostFragment create(@NavigationRes int graphResId, optional android.os.Bundle? startDestinationArgs);
+    method public static final androidx.navigation.fragment.NavHostFragment create(@NavigationRes int graphResId);
+    method @Deprecated protected androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination> createFragmentNavigator();
+    method public static final androidx.navigation.NavController findNavController(androidx.fragment.app.Fragment fragment);
+    method public final androidx.navigation.NavController getNavController();
+    method @Deprecated @CallSuper protected void onCreateNavController(androidx.navigation.NavController navController);
+    method @CallSuper protected void onCreateNavHostController(androidx.navigation.NavHostController navHostController);
+    property public final androidx.navigation.NavController navController;
+    field public static final androidx.navigation.fragment.NavHostFragment.Companion Companion;
+  }
+
+  public static final class NavHostFragment.Companion {
+    method public androidx.navigation.fragment.NavHostFragment create(@NavigationRes int graphResId, optional android.os.Bundle? startDestinationArgs);
+    method public androidx.navigation.fragment.NavHostFragment create(@NavigationRes int graphResId);
+    method public androidx.navigation.NavController findNavController(androidx.fragment.app.Fragment fragment);
+  }
+
+}
+
diff --git a/navigation/navigation-fragment/api/public_plus_experimental_current.txt b/navigation/navigation-fragment/api/public_plus_experimental_current.txt
index f2297ab..98ee0fc 100644
--- a/navigation/navigation-fragment/api/public_plus_experimental_current.txt
+++ b/navigation/navigation-fragment/api/public_plus_experimental_current.txt
@@ -43,8 +43,8 @@
   }
 
   public final class DialogFragmentNavigatorDestinationBuilderKt {
-    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id);
-    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
     method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, String route);
     method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
   }
@@ -90,8 +90,8 @@
   }
 
   public final class FragmentNavigatorDestinationBuilderKt {
-    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, String route);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
   }
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/navigation/navigation-fragment/api/res-2.4.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to navigation/navigation-fragment/api/res-2.4.0-beta02.txt
diff --git a/navigation/navigation-fragment/api/restricted_2.4.0-beta01.txt b/navigation/navigation-fragment/api/restricted_2.4.0-beta01.txt
index f2297ab..98ee0fc 100644
--- a/navigation/navigation-fragment/api/restricted_2.4.0-beta01.txt
+++ b/navigation/navigation-fragment/api/restricted_2.4.0-beta01.txt
@@ -43,8 +43,8 @@
   }
 
   public final class DialogFragmentNavigatorDestinationBuilderKt {
-    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id);
-    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
     method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, String route);
     method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
   }
@@ -90,8 +90,8 @@
   }
 
   public final class FragmentNavigatorDestinationBuilderKt {
-    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, String route);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
   }
diff --git a/navigation/navigation-fragment/api/restricted_2.4.0-beta02.txt b/navigation/navigation-fragment/api/restricted_2.4.0-beta02.txt
new file mode 100644
index 0000000..98ee0fc
--- /dev/null
+++ b/navigation/navigation-fragment/api/restricted_2.4.0-beta02.txt
@@ -0,0 +1,123 @@
+// Signature format: 4.0
+package androidx.navigation {
+
+  public final class NavGraphViewModelLazyKt {
+    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM>! navGraphViewModels(androidx.fragment.app.Fragment, @IdRes int navGraphId, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM>! navGraphViewModels(androidx.fragment.app.Fragment, String navGraphRoute, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+  }
+
+}
+
+package androidx.navigation.fragment {
+
+  public abstract class AbstractListDetailFragment extends androidx.fragment.app.Fragment {
+    ctor public AbstractListDetailFragment();
+    method public final androidx.navigation.fragment.NavHostFragment getDetailPaneNavHostFragment();
+    method public final androidx.slidingpanelayout.widget.SlidingPaneLayout getSlidingPaneLayout();
+    method public androidx.navigation.fragment.NavHostFragment onCreateDetailPaneNavHostFragment();
+    method public abstract android.view.View onCreateListPaneView(android.view.LayoutInflater inflater, android.view.ViewGroup? container, android.os.Bundle? savedInstanceState);
+    method @CallSuper public final android.view.View onCreateView(android.view.LayoutInflater inflater, android.view.ViewGroup? container, android.os.Bundle? savedInstanceState);
+    method public void onListPaneViewCreated(android.view.View view, android.os.Bundle? savedInstanceState);
+    method @CallSuper public final void onViewCreated(android.view.View view, android.os.Bundle? savedInstanceState);
+    property public final androidx.navigation.fragment.NavHostFragment detailPaneNavHostFragment;
+    property public final androidx.slidingpanelayout.widget.SlidingPaneLayout slidingPaneLayout;
+  }
+
+  @androidx.navigation.Navigator.Name("dialog") public final class DialogFragmentNavigator extends androidx.navigation.Navigator<androidx.navigation.fragment.DialogFragmentNavigator.Destination> {
+    ctor public DialogFragmentNavigator(android.content.Context context, androidx.fragment.app.FragmentManager fragmentManager);
+    method public androidx.navigation.fragment.DialogFragmentNavigator.Destination createDestination();
+  }
+
+  @androidx.navigation.NavDestination.ClassType(DialogFragment::class) public static class DialogFragmentNavigator.Destination extends androidx.navigation.NavDestination implements androidx.navigation.FloatingWindow {
+    ctor public DialogFragmentNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.fragment.DialogFragmentNavigator.Destination> fragmentNavigator);
+    ctor public DialogFragmentNavigator.Destination(androidx.navigation.NavigatorProvider navigatorProvider);
+    method public final String getClassName();
+    method public final androidx.navigation.fragment.DialogFragmentNavigator.Destination setClassName(String className);
+    property public final String className;
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class DialogFragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.DialogFragmentNavigator.Destination> {
+    ctor @Deprecated public DialogFragmentNavigatorDestinationBuilder(androidx.navigation.fragment.DialogFragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.DialogFragment> fragmentClass);
+    ctor public DialogFragmentNavigatorDestinationBuilder(androidx.navigation.fragment.DialogFragmentNavigator navigator, String route, kotlin.reflect.KClass<? extends androidx.fragment.app.DialogFragment> fragmentClass);
+    method public androidx.navigation.fragment.DialogFragmentNavigator.Destination build();
+  }
+
+  public final class DialogFragmentNavigatorDestinationBuilderKt {
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, String route);
+    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+  }
+
+  public final class FragmentKt {
+    method public static androidx.navigation.NavController findNavController(androidx.fragment.app.Fragment);
+  }
+
+  public final class FragmentNavArgsLazyKt {
+    method @MainThread public static inline <reified Args extends androidx.navigation.NavArgs> androidx.navigation.NavArgsLazy<Args>! navArgs(androidx.fragment.app.Fragment);
+  }
+
+  @androidx.navigation.Navigator.Name("fragment") public class FragmentNavigator extends androidx.navigation.Navigator<androidx.navigation.fragment.FragmentNavigator.Destination> {
+    ctor public FragmentNavigator(android.content.Context context, androidx.fragment.app.FragmentManager fragmentManager, int containerId);
+    method public androidx.navigation.fragment.FragmentNavigator.Destination createDestination();
+    method @Deprecated public androidx.fragment.app.Fragment instantiateFragment(android.content.Context context, androidx.fragment.app.FragmentManager fragmentManager, String className, android.os.Bundle? args);
+  }
+
+  @androidx.navigation.NavDestination.ClassType(Fragment::class) public static class FragmentNavigator.Destination extends androidx.navigation.NavDestination {
+    ctor public FragmentNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination> fragmentNavigator);
+    ctor public FragmentNavigator.Destination(androidx.navigation.NavigatorProvider navigatorProvider);
+    method public final String getClassName();
+    method public final androidx.navigation.fragment.FragmentNavigator.Destination setClassName(String className);
+    property public final String className;
+  }
+
+  public static final class FragmentNavigator.Extras implements androidx.navigation.Navigator.Extras {
+    method public java.util.Map<android.view.View,java.lang.String> getSharedElements();
+    property public final java.util.Map<android.view.View,java.lang.String> sharedElements;
+  }
+
+  public static final class FragmentNavigator.Extras.Builder {
+    ctor public FragmentNavigator.Extras.Builder();
+    method public androidx.navigation.fragment.FragmentNavigator.Extras.Builder addSharedElement(android.view.View sharedElement, String name);
+    method public androidx.navigation.fragment.FragmentNavigator.Extras.Builder addSharedElements(java.util.Map<android.view.View,java.lang.String> sharedElements);
+    method public androidx.navigation.fragment.FragmentNavigator.Extras build();
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class FragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.FragmentNavigator.Destination> {
+    ctor @Deprecated public FragmentNavigatorDestinationBuilder(androidx.navigation.fragment.FragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.Fragment> fragmentClass);
+    ctor public FragmentNavigatorDestinationBuilder(androidx.navigation.fragment.FragmentNavigator navigator, String route, kotlin.reflect.KClass<? extends androidx.fragment.app.Fragment> fragmentClass);
+    method public androidx.navigation.fragment.FragmentNavigator.Destination build();
+  }
+
+  public final class FragmentNavigatorDestinationBuilderKt {
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, String route);
+    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+  }
+
+  public final class FragmentNavigatorExtrasKt {
+    method public static androidx.navigation.fragment.FragmentNavigator.Extras FragmentNavigatorExtras(kotlin.Pair<? extends android.view.View,java.lang.String>... sharedElements);
+  }
+
+  public class NavHostFragment extends androidx.fragment.app.Fragment implements androidx.navigation.NavHost {
+    ctor public NavHostFragment();
+    method public static final androidx.navigation.fragment.NavHostFragment create(@NavigationRes int graphResId, optional android.os.Bundle? startDestinationArgs);
+    method public static final androidx.navigation.fragment.NavHostFragment create(@NavigationRes int graphResId);
+    method @Deprecated protected androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination> createFragmentNavigator();
+    method public static final androidx.navigation.NavController findNavController(androidx.fragment.app.Fragment fragment);
+    method public final androidx.navigation.NavController getNavController();
+    method @Deprecated @CallSuper protected void onCreateNavController(androidx.navigation.NavController navController);
+    method @CallSuper protected void onCreateNavHostController(androidx.navigation.NavHostController navHostController);
+    property public final androidx.navigation.NavController navController;
+    field public static final androidx.navigation.fragment.NavHostFragment.Companion Companion;
+  }
+
+  public static final class NavHostFragment.Companion {
+    method public androidx.navigation.fragment.NavHostFragment create(@NavigationRes int graphResId, optional android.os.Bundle? startDestinationArgs);
+    method public androidx.navigation.fragment.NavHostFragment create(@NavigationRes int graphResId);
+    method public androidx.navigation.NavController findNavController(androidx.fragment.app.Fragment fragment);
+  }
+
+}
+
diff --git a/navigation/navigation-fragment/api/restricted_current.txt b/navigation/navigation-fragment/api/restricted_current.txt
index f2297ab..98ee0fc 100644
--- a/navigation/navigation-fragment/api/restricted_current.txt
+++ b/navigation/navigation-fragment/api/restricted_current.txt
@@ -43,8 +43,8 @@
   }
 
   public final class DialogFragmentNavigatorDestinationBuilderKt {
-    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id);
-    method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
     method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, String route);
     method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
   }
@@ -90,8 +90,8 @@
   }
 
   public final class FragmentNavigatorDestinationBuilderKt {
-    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id);
-    method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id);
+    method @Deprecated public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, String route);
     method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,? extends kotlin.Unit> builder);
   }
diff --git a/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorTest.kt b/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorTest.kt
index 8162236..295a397 100644
--- a/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorTest.kt
+++ b/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorTest.kt
@@ -91,6 +91,34 @@
 
     @UiThreadTest
     @Test
+    fun testNavigateWithImmediatePop() {
+        lateinit var dialogFragment: DialogFragment
+        fragmentManager.fragmentFactory = object : FragmentFactory() {
+            override fun instantiate(classLoader: ClassLoader, className: String): Fragment {
+                return super.instantiate(classLoader, className).also { fragment ->
+                    if (fragment is DialogFragment) {
+                        dialogFragment = fragment
+                    }
+                }
+            }
+        }
+        val entry = createBackStackEntry()
+
+        dialogNavigator.navigate(listOf(entry), null, null)
+        assertThat(navigatorState.backStack.value)
+            .containsExactly(entry)
+        dialogNavigator.popBackStack(entry, false)
+        assertThat(navigatorState.backStack.value)
+            .isEmpty()
+
+        fragmentManager.executePendingTransactions()
+        assertWithMessage("Dialog should not be shown")
+            .that(dialogFragment.dialog)
+            .isNull()
+    }
+
+    @UiThreadTest
+    @Test
     fun testFindNavController() {
         val dialogFragment = EmptyDialogFragment()
         // Fake using a NavHostFragment and instead just manually show the DialogFragment
diff --git a/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/DialogFragmentNavigator.kt b/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/DialogFragmentNavigator.kt
index 286089b..59fcf37 100644
--- a/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/DialogFragmentNavigator.kt
+++ b/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/DialogFragmentNavigator.kt
@@ -45,7 +45,17 @@
 ) : Navigator<Destination>() {
     private val restoredTagsAwaitingAttach = mutableSetOf<String>()
     private val observer = LifecycleEventObserver { source, event ->
-        if (event == Lifecycle.Event.ON_STOP) {
+        if (event == Lifecycle.Event.ON_CREATE) {
+            val dialogFragment = source as DialogFragment
+            val dialogOnBackStack = state.backStack.value.any { it.id == dialogFragment.tag }
+            if (!dialogOnBackStack) {
+                // If the Fragment is no longer on the back stack, it must have been
+                // been popped before it was actually attached to the FragmentManager
+                // (i.e., popped in the same frame as the navigate() call that added it). For
+                // that case, we need to dismiss the dialog to ensure the states stay in sync
+                dialogFragment.dismiss()
+            }
+        } else if (event == Lifecycle.Event.ON_STOP) {
             val dialogFragment = source as DialogFragment
             if (!dialogFragment.requireDialog().isShowing) {
                 val beforePopList = state.backStack.value
diff --git a/navigation/navigation-runtime-ktx/api/2.4.0-beta02.txt b/navigation/navigation-runtime-ktx/api/2.4.0-beta02.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/navigation/navigation-runtime-ktx/api/2.4.0-beta02.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/navigation/navigation-runtime-ktx/api/public_plus_experimental_2.4.0-beta02.txt b/navigation/navigation-runtime-ktx/api/public_plus_experimental_2.4.0-beta02.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/navigation/navigation-runtime-ktx/api/public_plus_experimental_2.4.0-beta02.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/navigation/navigation-runtime-ktx/api/res-2.4.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to navigation/navigation-runtime-ktx/api/res-2.4.0-beta02.txt
diff --git a/navigation/navigation-runtime-ktx/api/restricted_2.4.0-beta02.txt b/navigation/navigation-runtime-ktx/api/restricted_2.4.0-beta02.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/navigation/navigation-runtime-ktx/api/restricted_2.4.0-beta02.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/navigation/navigation-runtime/api/2.4.0-beta02.txt b/navigation/navigation-runtime/api/2.4.0-beta02.txt
new file mode 100644
index 0000000..1b18046
--- /dev/null
+++ b/navigation/navigation-runtime/api/2.4.0-beta02.txt
@@ -0,0 +1,224 @@
+// Signature format: 4.0
+package androidx.navigation {
+
+  public final class ActivityKt {
+    method public static androidx.navigation.NavController findNavController(android.app.Activity, @IdRes int viewId);
+  }
+
+  public final class ActivityNavArgsLazyKt {
+    method @MainThread public static inline <reified Args extends androidx.navigation.NavArgs> androidx.navigation.NavArgsLazy<Args>! navArgs(android.app.Activity);
+  }
+
+  @androidx.navigation.Navigator.Name("activity") public class ActivityNavigator extends androidx.navigation.Navigator<androidx.navigation.ActivityNavigator.Destination> {
+    ctor public ActivityNavigator(android.content.Context context);
+    method public static final void applyPopAnimationsToPendingTransition(android.app.Activity activity);
+    method public androidx.navigation.ActivityNavigator.Destination createDestination();
+    method public androidx.navigation.NavDestination? navigate(androidx.navigation.ActivityNavigator.Destination destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
+    field public static final androidx.navigation.ActivityNavigator.Companion Companion;
+  }
+
+  public static final class ActivityNavigator.Companion {
+    method public void applyPopAnimationsToPendingTransition(android.app.Activity activity);
+  }
+
+  @androidx.navigation.NavDestination.ClassType(Activity::class) public static class ActivityNavigator.Destination extends androidx.navigation.NavDestination {
+    ctor public ActivityNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.ActivityNavigator.Destination> activityNavigator);
+    ctor public ActivityNavigator.Destination(androidx.navigation.NavigatorProvider navigatorProvider);
+    method public final String? getAction();
+    method public final android.content.ComponentName? getComponent();
+    method public final android.net.Uri? getData();
+    method public final String? getDataPattern();
+    method public final android.content.Intent? getIntent();
+    method public final String? getTargetPackage();
+    method public final androidx.navigation.ActivityNavigator.Destination setAction(String? action);
+    method public final androidx.navigation.ActivityNavigator.Destination setComponentName(android.content.ComponentName? name);
+    method public final androidx.navigation.ActivityNavigator.Destination setData(android.net.Uri? data);
+    method public final androidx.navigation.ActivityNavigator.Destination setDataPattern(String? dataPattern);
+    method public final androidx.navigation.ActivityNavigator.Destination setIntent(android.content.Intent? intent);
+    method public final androidx.navigation.ActivityNavigator.Destination setTargetPackage(String? packageName);
+    property public final String? action;
+    property public final android.content.ComponentName? component;
+    property public final android.net.Uri? data;
+    property public final String? dataPattern;
+    property public final android.content.Intent? intent;
+    property public final String? targetPackage;
+  }
+
+  public static final class ActivityNavigator.Extras implements androidx.navigation.Navigator.Extras {
+    method public androidx.core.app.ActivityOptionsCompat? getActivityOptions();
+    method public int getFlags();
+    property public final androidx.core.app.ActivityOptionsCompat? activityOptions;
+    property public final int flags;
+  }
+
+  public static final class ActivityNavigator.Extras.Builder {
+    ctor public ActivityNavigator.Extras.Builder();
+    method public androidx.navigation.ActivityNavigator.Extras.Builder addFlags(int flags);
+    method public androidx.navigation.ActivityNavigator.Extras build();
+    method public androidx.navigation.ActivityNavigator.Extras.Builder setActivityOptions(androidx.core.app.ActivityOptionsCompat activityOptions);
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class ActivityNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.ActivityNavigator.Destination> {
+    ctor @Deprecated public ActivityNavigatorDestinationBuilder(androidx.navigation.ActivityNavigator navigator, @IdRes int id);
+    ctor public ActivityNavigatorDestinationBuilder(androidx.navigation.ActivityNavigator navigator, String route);
+    method public androidx.navigation.ActivityNavigator.Destination build();
+    method public String? getAction();
+    method public kotlin.reflect.KClass<? extends android.app.Activity>? getActivityClass();
+    method public android.net.Uri? getData();
+    method public String? getDataPattern();
+    method public String? getTargetPackage();
+    method public void setAction(String? action);
+    method public void setActivityClass(kotlin.reflect.KClass<? extends android.app.Activity>? activityClass);
+    method public void setData(android.net.Uri? data);
+    method public void setDataPattern(String? dataPattern);
+    method public void setTargetPackage(String? targetPackage);
+    property public final String? action;
+    property public final kotlin.reflect.KClass<? extends android.app.Activity>? activityClass;
+    property public final android.net.Uri? data;
+    property public final String? dataPattern;
+    property public final String? targetPackage;
+  }
+
+  public final class ActivityNavigatorDestinationBuilderKt {
+    method @Deprecated public static inline void activity(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.ActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method public static inline void activity(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.ActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+  }
+
+  public final class ActivityNavigatorExtrasKt {
+    method public static androidx.navigation.ActivityNavigator.Extras ActivityNavigatorExtras(optional androidx.core.app.ActivityOptionsCompat? activityOptions, optional int flags);
+  }
+
+  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);
+    method public androidx.navigation.NavBackStackEntry? getCurrentBackStackEntry();
+    method public final kotlinx.coroutines.flow.Flow<androidx.navigation.NavBackStackEntry> getCurrentBackStackEntryFlow();
+    method public androidx.navigation.NavDestination? getCurrentDestination();
+    method @MainThread public androidx.navigation.NavGraph getGraph();
+    method public androidx.navigation.NavInflater getNavInflater();
+    method public androidx.navigation.NavigatorProvider getNavigatorProvider();
+    method public androidx.navigation.NavBackStackEntry? getPreviousBackStackEntry();
+    method public androidx.lifecycle.ViewModelStoreOwner getViewModelStoreOwner(@IdRes int navGraphId);
+    method public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> getVisibleEntries();
+    method @MainThread public boolean handleDeepLink(android.content.Intent? intent);
+    method @MainThread public void navigate(@IdRes int resId);
+    method @MainThread public void navigate(@IdRes int resId, android.os.Bundle? args);
+    method @MainThread public void navigate(@IdRes int resId, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions);
+    method @MainThread public void navigate(@IdRes int resId, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
+    method @MainThread public void navigate(android.net.Uri deepLink);
+    method @MainThread public void navigate(android.net.Uri deepLink, androidx.navigation.NavOptions? navOptions);
+    method @MainThread public void navigate(android.net.Uri deepLink, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
+    method @MainThread public void navigate(androidx.navigation.NavDeepLinkRequest request);
+    method @MainThread public void navigate(androidx.navigation.NavDeepLinkRequest request, androidx.navigation.NavOptions? navOptions);
+    method @MainThread public void navigate(androidx.navigation.NavDeepLinkRequest request, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
+    method @MainThread public void navigate(androidx.navigation.NavDirections directions);
+    method @MainThread public void navigate(androidx.navigation.NavDirections directions, androidx.navigation.NavOptions? navOptions);
+    method @MainThread public void navigate(androidx.navigation.NavDirections directions, androidx.navigation.Navigator.Extras navigatorExtras);
+    method public final void navigate(String route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> builder);
+    method public final void navigate(String route, optional androidx.navigation.NavOptions? navOptions, optional androidx.navigation.Navigator.Extras? navigatorExtras);
+    method public final void navigate(String route, optional androidx.navigation.NavOptions? navOptions);
+    method public final void navigate(String route);
+    method @MainThread public boolean navigateUp();
+    method @MainThread public boolean popBackStack();
+    method @MainThread public boolean popBackStack(@IdRes int destinationId, boolean inclusive);
+    method @MainThread public boolean popBackStack(@IdRes int destinationId, boolean inclusive, boolean saveState);
+    method @MainThread public final boolean popBackStack(String route, boolean inclusive, optional boolean saveState);
+    method @MainThread public final boolean popBackStack(String route, boolean inclusive);
+    method public void removeOnDestinationChangedListener(androidx.navigation.NavController.OnDestinationChangedListener listener);
+    method @CallSuper public void restoreState(android.os.Bundle? navState);
+    method @CallSuper public android.os.Bundle? saveState();
+    method @CallSuper @MainThread public void setGraph(androidx.navigation.NavGraph graph);
+    method @CallSuper @MainThread public void setGraph(@NavigationRes int graphResId);
+    method @CallSuper @MainThread public void setGraph(@NavigationRes int graphResId, android.os.Bundle? startDestinationArgs);
+    method @CallSuper @MainThread public void setGraph(androidx.navigation.NavGraph graph, android.os.Bundle? startDestinationArgs);
+    property public androidx.navigation.NavBackStackEntry? currentBackStackEntry;
+    property public final kotlinx.coroutines.flow.Flow<androidx.navigation.NavBackStackEntry> currentBackStackEntryFlow;
+    property public androidx.navigation.NavDestination? currentDestination;
+    property @MainThread public androidx.navigation.NavGraph graph;
+    property public androidx.navigation.NavInflater navInflater;
+    property public androidx.navigation.NavigatorProvider navigatorProvider;
+    property public androidx.navigation.NavBackStackEntry? previousBackStackEntry;
+    property public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> visibleEntries;
+    field public static final androidx.navigation.NavController.Companion Companion;
+    field public static final String KEY_DEEP_LINK_INTENT = "android-support-nav:controller:deepLinkIntent";
+  }
+
+  public static final class NavController.Companion {
+  }
+
+  public static fun interface NavController.OnDestinationChangedListener {
+    method public void onDestinationChanged(androidx.navigation.NavController controller, androidx.navigation.NavDestination destination, android.os.Bundle? arguments);
+  }
+
+  public final class NavControllerKt {
+    method @Deprecated public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class NavDeepLinkBuilder {
+    ctor public NavDeepLinkBuilder(android.content.Context context);
+    method public androidx.navigation.NavDeepLinkBuilder addDestination(@IdRes int destId, optional android.os.Bundle? args);
+    method public androidx.navigation.NavDeepLinkBuilder addDestination(@IdRes int destId);
+    method public androidx.navigation.NavDeepLinkBuilder addDestination(String route, optional android.os.Bundle? args);
+    method public androidx.navigation.NavDeepLinkBuilder addDestination(String route);
+    method public android.app.PendingIntent createPendingIntent();
+    method public androidx.core.app.TaskStackBuilder createTaskStackBuilder();
+    method public androidx.navigation.NavDeepLinkBuilder setArguments(android.os.Bundle? args);
+    method public androidx.navigation.NavDeepLinkBuilder setComponentName(Class<? extends android.app.Activity> activityClass);
+    method public androidx.navigation.NavDeepLinkBuilder setComponentName(android.content.ComponentName componentName);
+    method public androidx.navigation.NavDeepLinkBuilder setDestination(@IdRes int destId, optional android.os.Bundle? args);
+    method public androidx.navigation.NavDeepLinkBuilder setDestination(@IdRes int destId);
+    method public androidx.navigation.NavDeepLinkBuilder setDestination(String destRoute, optional android.os.Bundle? args);
+    method public androidx.navigation.NavDeepLinkBuilder setDestination(String destRoute);
+    method public androidx.navigation.NavDeepLinkBuilder setGraph(@NavigationRes int navGraphId);
+    method public androidx.navigation.NavDeepLinkBuilder setGraph(androidx.navigation.NavGraph navGraph);
+  }
+
+  public interface NavHost {
+    method public androidx.navigation.NavController getNavController();
+    property public abstract androidx.navigation.NavController navController;
+  }
+
+  public class NavHostController extends androidx.navigation.NavController {
+    ctor public NavHostController(android.content.Context context);
+    method public final void enableOnBackPressed(boolean enabled);
+    method public final void setLifecycleOwner(androidx.lifecycle.LifecycleOwner owner);
+    method public final void setOnBackPressedDispatcher(androidx.activity.OnBackPressedDispatcher dispatcher);
+    method public final void setViewModelStore(androidx.lifecycle.ViewModelStore viewModelStore);
+  }
+
+  public final class NavHostKt {
+    method @Deprecated public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class NavInflater {
+    ctor public NavInflater(android.content.Context context, androidx.navigation.NavigatorProvider navigatorProvider);
+    method public androidx.navigation.NavGraph inflate(@NavigationRes int graphResId);
+    field public static final androidx.navigation.NavInflater.Companion Companion;
+  }
+
+  public static final class NavInflater.Companion {
+  }
+
+  public final class Navigation {
+    method public static android.view.View.OnClickListener createNavigateOnClickListener(@IdRes int resId, optional android.os.Bundle? args);
+    method public static android.view.View.OnClickListener createNavigateOnClickListener(@IdRes int resId);
+    method public static android.view.View.OnClickListener createNavigateOnClickListener(androidx.navigation.NavDirections directions);
+    method public static androidx.navigation.NavController findNavController(android.app.Activity activity, @IdRes int viewId);
+    method public static androidx.navigation.NavController findNavController(android.view.View view);
+    method public static void setViewNavController(android.view.View view, androidx.navigation.NavController? controller);
+    field public static final androidx.navigation.Navigation INSTANCE;
+  }
+
+  public final class ViewKt {
+    method public static androidx.navigation.NavController findNavController(android.view.View);
+  }
+
+}
+
diff --git a/navigation/navigation-runtime/api/public_plus_experimental_2.4.0-beta02.txt b/navigation/navigation-runtime/api/public_plus_experimental_2.4.0-beta02.txt
new file mode 100644
index 0000000..34f5b9d
--- /dev/null
+++ b/navigation/navigation-runtime/api/public_plus_experimental_2.4.0-beta02.txt
@@ -0,0 +1,232 @@
+// Signature format: 4.0
+package androidx.navigation {
+
+  public final class ActivityKt {
+    method public static androidx.navigation.NavController findNavController(android.app.Activity, @IdRes int viewId);
+  }
+
+  public final class ActivityNavArgsLazyKt {
+    method @MainThread public static inline <reified Args extends androidx.navigation.NavArgs> androidx.navigation.NavArgsLazy<Args>! navArgs(android.app.Activity);
+  }
+
+  @androidx.navigation.Navigator.Name("activity") public class ActivityNavigator extends androidx.navigation.Navigator<androidx.navigation.ActivityNavigator.Destination> {
+    ctor public ActivityNavigator(android.content.Context context);
+    method public static final void applyPopAnimationsToPendingTransition(android.app.Activity activity);
+    method public androidx.navigation.ActivityNavigator.Destination createDestination();
+    method public androidx.navigation.NavDestination? navigate(androidx.navigation.ActivityNavigator.Destination destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
+    field public static final androidx.navigation.ActivityNavigator.Companion Companion;
+  }
+
+  public static final class ActivityNavigator.Companion {
+    method public void applyPopAnimationsToPendingTransition(android.app.Activity activity);
+  }
+
+  @androidx.navigation.NavDestination.ClassType(Activity::class) public static class ActivityNavigator.Destination extends androidx.navigation.NavDestination {
+    ctor public ActivityNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.ActivityNavigator.Destination> activityNavigator);
+    ctor public ActivityNavigator.Destination(androidx.navigation.NavigatorProvider navigatorProvider);
+    method public final String? getAction();
+    method public final android.content.ComponentName? getComponent();
+    method public final android.net.Uri? getData();
+    method public final String? getDataPattern();
+    method public final android.content.Intent? getIntent();
+    method public final String? getTargetPackage();
+    method public final androidx.navigation.ActivityNavigator.Destination setAction(String? action);
+    method public final androidx.navigation.ActivityNavigator.Destination setComponentName(android.content.ComponentName? name);
+    method public final androidx.navigation.ActivityNavigator.Destination setData(android.net.Uri? data);
+    method public final androidx.navigation.ActivityNavigator.Destination setDataPattern(String? dataPattern);
+    method public final androidx.navigation.ActivityNavigator.Destination setIntent(android.content.Intent? intent);
+    method public final androidx.navigation.ActivityNavigator.Destination setTargetPackage(String? packageName);
+    property public final String? action;
+    property public final android.content.ComponentName? component;
+    property public final android.net.Uri? data;
+    property public final String? dataPattern;
+    property public final android.content.Intent? intent;
+    property public final String? targetPackage;
+  }
+
+  public static final class ActivityNavigator.Extras implements androidx.navigation.Navigator.Extras {
+    method public androidx.core.app.ActivityOptionsCompat? getActivityOptions();
+    method public int getFlags();
+    property public final androidx.core.app.ActivityOptionsCompat? activityOptions;
+    property public final int flags;
+  }
+
+  public static final class ActivityNavigator.Extras.Builder {
+    ctor public ActivityNavigator.Extras.Builder();
+    method public androidx.navigation.ActivityNavigator.Extras.Builder addFlags(int flags);
+    method public androidx.navigation.ActivityNavigator.Extras build();
+    method public androidx.navigation.ActivityNavigator.Extras.Builder setActivityOptions(androidx.core.app.ActivityOptionsCompat activityOptions);
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class ActivityNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.ActivityNavigator.Destination> {
+    ctor @Deprecated public ActivityNavigatorDestinationBuilder(androidx.navigation.ActivityNavigator navigator, @IdRes int id);
+    ctor public ActivityNavigatorDestinationBuilder(androidx.navigation.ActivityNavigator navigator, String route);
+    method public androidx.navigation.ActivityNavigator.Destination build();
+    method public String? getAction();
+    method public kotlin.reflect.KClass<? extends android.app.Activity>? getActivityClass();
+    method public android.net.Uri? getData();
+    method public String? getDataPattern();
+    method public String? getTargetPackage();
+    method public void setAction(String? action);
+    method public void setActivityClass(kotlin.reflect.KClass<? extends android.app.Activity>? activityClass);
+    method public void setData(android.net.Uri? data);
+    method public void setDataPattern(String? dataPattern);
+    method public void setTargetPackage(String? targetPackage);
+    property public final String? action;
+    property public final kotlin.reflect.KClass<? extends android.app.Activity>? activityClass;
+    property public final android.net.Uri? data;
+    property public final String? dataPattern;
+    property public final String? targetPackage;
+  }
+
+  public final class ActivityNavigatorDestinationBuilderKt {
+    method @Deprecated public static inline void activity(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.ActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method public static inline void activity(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.ActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+  }
+
+  public final class ActivityNavigatorExtrasKt {
+    method public static androidx.navigation.ActivityNavigator.Extras ActivityNavigatorExtras(optional androidx.core.app.ActivityOptionsCompat? activityOptions, optional int flags);
+  }
+
+  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 @androidx.navigation.NavDeepLinkSaveStateControl public static final void enableDeepLinkSaveState(boolean saveState);
+    method public androidx.navigation.NavBackStackEntry getBackStackEntry(@IdRes int destinationId);
+    method public final androidx.navigation.NavBackStackEntry getBackStackEntry(String route);
+    method public androidx.navigation.NavBackStackEntry? getCurrentBackStackEntry();
+    method public final kotlinx.coroutines.flow.Flow<androidx.navigation.NavBackStackEntry> getCurrentBackStackEntryFlow();
+    method public androidx.navigation.NavDestination? getCurrentDestination();
+    method @MainThread public androidx.navigation.NavGraph getGraph();
+    method public androidx.navigation.NavInflater getNavInflater();
+    method public androidx.navigation.NavigatorProvider getNavigatorProvider();
+    method public androidx.navigation.NavBackStackEntry? getPreviousBackStackEntry();
+    method public androidx.lifecycle.ViewModelStoreOwner getViewModelStoreOwner(@IdRes int navGraphId);
+    method public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> getVisibleEntries();
+    method @MainThread public boolean handleDeepLink(android.content.Intent? intent);
+    method @MainThread public void navigate(@IdRes int resId);
+    method @MainThread public void navigate(@IdRes int resId, android.os.Bundle? args);
+    method @MainThread public void navigate(@IdRes int resId, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions);
+    method @MainThread public void navigate(@IdRes int resId, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
+    method @MainThread public void navigate(android.net.Uri deepLink);
+    method @MainThread public void navigate(android.net.Uri deepLink, androidx.navigation.NavOptions? navOptions);
+    method @MainThread public void navigate(android.net.Uri deepLink, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
+    method @MainThread public void navigate(androidx.navigation.NavDeepLinkRequest request);
+    method @MainThread public void navigate(androidx.navigation.NavDeepLinkRequest request, androidx.navigation.NavOptions? navOptions);
+    method @MainThread public void navigate(androidx.navigation.NavDeepLinkRequest request, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
+    method @MainThread public void navigate(androidx.navigation.NavDirections directions);
+    method @MainThread public void navigate(androidx.navigation.NavDirections directions, androidx.navigation.NavOptions? navOptions);
+    method @MainThread public void navigate(androidx.navigation.NavDirections directions, androidx.navigation.Navigator.Extras navigatorExtras);
+    method public final void navigate(String route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> builder);
+    method public final void navigate(String route, optional androidx.navigation.NavOptions? navOptions, optional androidx.navigation.Navigator.Extras? navigatorExtras);
+    method public final void navigate(String route, optional androidx.navigation.NavOptions? navOptions);
+    method public final void navigate(String route);
+    method @MainThread public boolean navigateUp();
+    method @MainThread public boolean popBackStack();
+    method @MainThread public boolean popBackStack(@IdRes int destinationId, boolean inclusive);
+    method @MainThread public boolean popBackStack(@IdRes int destinationId, boolean inclusive, boolean saveState);
+    method @MainThread public final boolean popBackStack(String route, boolean inclusive, optional boolean saveState);
+    method @MainThread public final boolean popBackStack(String route, boolean inclusive);
+    method public void removeOnDestinationChangedListener(androidx.navigation.NavController.OnDestinationChangedListener listener);
+    method @CallSuper public void restoreState(android.os.Bundle? navState);
+    method @CallSuper public android.os.Bundle? saveState();
+    method @CallSuper @MainThread public void setGraph(androidx.navigation.NavGraph graph);
+    method @CallSuper @MainThread public void setGraph(@NavigationRes int graphResId);
+    method @CallSuper @MainThread public void setGraph(@NavigationRes int graphResId, android.os.Bundle? startDestinationArgs);
+    method @CallSuper @MainThread public void setGraph(androidx.navigation.NavGraph graph, android.os.Bundle? startDestinationArgs);
+    property public androidx.navigation.NavBackStackEntry? currentBackStackEntry;
+    property public final kotlinx.coroutines.flow.Flow<androidx.navigation.NavBackStackEntry> currentBackStackEntryFlow;
+    property public androidx.navigation.NavDestination? currentDestination;
+    property @MainThread public androidx.navigation.NavGraph graph;
+    property public androidx.navigation.NavInflater navInflater;
+    property public androidx.navigation.NavigatorProvider navigatorProvider;
+    property public androidx.navigation.NavBackStackEntry? previousBackStackEntry;
+    property public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> visibleEntries;
+    field public static final androidx.navigation.NavController.Companion Companion;
+    field public static final String KEY_DEEP_LINK_INTENT = "android-support-nav:controller:deepLinkIntent";
+  }
+
+  public static final class NavController.Companion {
+    method @androidx.navigation.NavDeepLinkSaveStateControl public void enableDeepLinkSaveState(boolean saveState);
+  }
+
+  public static fun interface NavController.OnDestinationChangedListener {
+    method public void onDestinationChanged(androidx.navigation.NavController controller, androidx.navigation.NavDestination destination, android.os.Bundle? arguments);
+  }
+
+  public final class NavControllerKt {
+    method @Deprecated public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  @kotlin.RequiresOptIn(level=kotlin.RequiresOptIn.Level) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface NavControllerVisibleEntries {
+  }
+
+  public final class NavDeepLinkBuilder {
+    ctor public NavDeepLinkBuilder(android.content.Context context);
+    method public androidx.navigation.NavDeepLinkBuilder addDestination(@IdRes int destId, optional android.os.Bundle? args);
+    method public androidx.navigation.NavDeepLinkBuilder addDestination(@IdRes int destId);
+    method public androidx.navigation.NavDeepLinkBuilder addDestination(String route, optional android.os.Bundle? args);
+    method public androidx.navigation.NavDeepLinkBuilder addDestination(String route);
+    method public android.app.PendingIntent createPendingIntent();
+    method public androidx.core.app.TaskStackBuilder createTaskStackBuilder();
+    method public androidx.navigation.NavDeepLinkBuilder setArguments(android.os.Bundle? args);
+    method public androidx.navigation.NavDeepLinkBuilder setComponentName(Class<? extends android.app.Activity> activityClass);
+    method public androidx.navigation.NavDeepLinkBuilder setComponentName(android.content.ComponentName componentName);
+    method public androidx.navigation.NavDeepLinkBuilder setDestination(@IdRes int destId, optional android.os.Bundle? args);
+    method public androidx.navigation.NavDeepLinkBuilder setDestination(@IdRes int destId);
+    method public androidx.navigation.NavDeepLinkBuilder setDestination(String destRoute, optional android.os.Bundle? args);
+    method public androidx.navigation.NavDeepLinkBuilder setDestination(String destRoute);
+    method public androidx.navigation.NavDeepLinkBuilder setGraph(@NavigationRes int navGraphId);
+    method public androidx.navigation.NavDeepLinkBuilder setGraph(androidx.navigation.NavGraph navGraph);
+  }
+
+  @kotlin.RequiresOptIn(level=kotlin.RequiresOptIn.Level) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface NavDeepLinkSaveStateControl {
+  }
+
+  public interface NavHost {
+    method public androidx.navigation.NavController getNavController();
+    property public abstract androidx.navigation.NavController navController;
+  }
+
+  public class NavHostController extends androidx.navigation.NavController {
+    ctor public NavHostController(android.content.Context context);
+    method public final void enableOnBackPressed(boolean enabled);
+    method public final void setLifecycleOwner(androidx.lifecycle.LifecycleOwner owner);
+    method public final void setOnBackPressedDispatcher(androidx.activity.OnBackPressedDispatcher dispatcher);
+    method public final void setViewModelStore(androidx.lifecycle.ViewModelStore viewModelStore);
+  }
+
+  public final class NavHostKt {
+    method @Deprecated public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class NavInflater {
+    ctor public NavInflater(android.content.Context context, androidx.navigation.NavigatorProvider navigatorProvider);
+    method public androidx.navigation.NavGraph inflate(@NavigationRes int graphResId);
+    field public static final androidx.navigation.NavInflater.Companion Companion;
+  }
+
+  public static final class NavInflater.Companion {
+  }
+
+  public final class Navigation {
+    method public static android.view.View.OnClickListener createNavigateOnClickListener(@IdRes int resId, optional android.os.Bundle? args);
+    method public static android.view.View.OnClickListener createNavigateOnClickListener(@IdRes int resId);
+    method public static android.view.View.OnClickListener createNavigateOnClickListener(androidx.navigation.NavDirections directions);
+    method public static androidx.navigation.NavController findNavController(android.app.Activity activity, @IdRes int viewId);
+    method public static androidx.navigation.NavController findNavController(android.view.View view);
+    method public static void setViewNavController(android.view.View view, androidx.navigation.NavController? controller);
+    field public static final androidx.navigation.Navigation INSTANCE;
+  }
+
+  public final class ViewKt {
+    method public static androidx.navigation.NavController findNavController(android.view.View);
+  }
+
+}
+
diff --git a/navigation/navigation-runtime/api/public_plus_experimental_current.txt b/navigation/navigation-runtime/api/public_plus_experimental_current.txt
index c46a8bf..34f5b9d 100644
--- a/navigation/navigation-runtime/api/public_plus_experimental_current.txt
+++ b/navigation/navigation-runtime/api/public_plus_experimental_current.txt
@@ -94,6 +94,7 @@
     method @MainThread public final boolean clearBackStack(String route);
     method @MainThread public final boolean clearBackStack(@IdRes int destinationId);
     method public androidx.navigation.NavDeepLinkBuilder createDeepLink();
+    method @androidx.navigation.NavDeepLinkSaveStateControl public static final void enableDeepLinkSaveState(boolean saveState);
     method public androidx.navigation.NavBackStackEntry getBackStackEntry(@IdRes int destinationId);
     method public final androidx.navigation.NavBackStackEntry getBackStackEntry(String route);
     method public androidx.navigation.NavBackStackEntry? getCurrentBackStackEntry();
@@ -149,6 +150,7 @@
   }
 
   public static final class NavController.Companion {
+    method @androidx.navigation.NavDeepLinkSaveStateControl public void enableDeepLinkSaveState(boolean saveState);
   }
 
   public static fun interface NavController.OnDestinationChangedListener {
@@ -182,6 +184,9 @@
     method public androidx.navigation.NavDeepLinkBuilder setGraph(androidx.navigation.NavGraph navGraph);
   }
 
+  @kotlin.RequiresOptIn(level=kotlin.RequiresOptIn.Level) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface NavDeepLinkSaveStateControl {
+  }
+
   public interface NavHost {
     method public androidx.navigation.NavController getNavController();
     property public abstract androidx.navigation.NavController navController;
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/navigation/navigation-runtime/api/res-2.4.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to navigation/navigation-runtime/api/res-2.4.0-beta02.txt
diff --git a/navigation/navigation-runtime/api/restricted_2.4.0-beta02.txt b/navigation/navigation-runtime/api/restricted_2.4.0-beta02.txt
new file mode 100644
index 0000000..1b18046
--- /dev/null
+++ b/navigation/navigation-runtime/api/restricted_2.4.0-beta02.txt
@@ -0,0 +1,224 @@
+// Signature format: 4.0
+package androidx.navigation {
+
+  public final class ActivityKt {
+    method public static androidx.navigation.NavController findNavController(android.app.Activity, @IdRes int viewId);
+  }
+
+  public final class ActivityNavArgsLazyKt {
+    method @MainThread public static inline <reified Args extends androidx.navigation.NavArgs> androidx.navigation.NavArgsLazy<Args>! navArgs(android.app.Activity);
+  }
+
+  @androidx.navigation.Navigator.Name("activity") public class ActivityNavigator extends androidx.navigation.Navigator<androidx.navigation.ActivityNavigator.Destination> {
+    ctor public ActivityNavigator(android.content.Context context);
+    method public static final void applyPopAnimationsToPendingTransition(android.app.Activity activity);
+    method public androidx.navigation.ActivityNavigator.Destination createDestination();
+    method public androidx.navigation.NavDestination? navigate(androidx.navigation.ActivityNavigator.Destination destination, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
+    field public static final androidx.navigation.ActivityNavigator.Companion Companion;
+  }
+
+  public static final class ActivityNavigator.Companion {
+    method public void applyPopAnimationsToPendingTransition(android.app.Activity activity);
+  }
+
+  @androidx.navigation.NavDestination.ClassType(Activity::class) public static class ActivityNavigator.Destination extends androidx.navigation.NavDestination {
+    ctor public ActivityNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.ActivityNavigator.Destination> activityNavigator);
+    ctor public ActivityNavigator.Destination(androidx.navigation.NavigatorProvider navigatorProvider);
+    method public final String? getAction();
+    method public final android.content.ComponentName? getComponent();
+    method public final android.net.Uri? getData();
+    method public final String? getDataPattern();
+    method public final android.content.Intent? getIntent();
+    method public final String? getTargetPackage();
+    method public final androidx.navigation.ActivityNavigator.Destination setAction(String? action);
+    method public final androidx.navigation.ActivityNavigator.Destination setComponentName(android.content.ComponentName? name);
+    method public final androidx.navigation.ActivityNavigator.Destination setData(android.net.Uri? data);
+    method public final androidx.navigation.ActivityNavigator.Destination setDataPattern(String? dataPattern);
+    method public final androidx.navigation.ActivityNavigator.Destination setIntent(android.content.Intent? intent);
+    method public final androidx.navigation.ActivityNavigator.Destination setTargetPackage(String? packageName);
+    property public final String? action;
+    property public final android.content.ComponentName? component;
+    property public final android.net.Uri? data;
+    property public final String? dataPattern;
+    property public final android.content.Intent? intent;
+    property public final String? targetPackage;
+  }
+
+  public static final class ActivityNavigator.Extras implements androidx.navigation.Navigator.Extras {
+    method public androidx.core.app.ActivityOptionsCompat? getActivityOptions();
+    method public int getFlags();
+    property public final androidx.core.app.ActivityOptionsCompat? activityOptions;
+    property public final int flags;
+  }
+
+  public static final class ActivityNavigator.Extras.Builder {
+    ctor public ActivityNavigator.Extras.Builder();
+    method public androidx.navigation.ActivityNavigator.Extras.Builder addFlags(int flags);
+    method public androidx.navigation.ActivityNavigator.Extras build();
+    method public androidx.navigation.ActivityNavigator.Extras.Builder setActivityOptions(androidx.core.app.ActivityOptionsCompat activityOptions);
+  }
+
+  @androidx.navigation.NavDestinationDsl public final class ActivityNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.ActivityNavigator.Destination> {
+    ctor @Deprecated public ActivityNavigatorDestinationBuilder(androidx.navigation.ActivityNavigator navigator, @IdRes int id);
+    ctor public ActivityNavigatorDestinationBuilder(androidx.navigation.ActivityNavigator navigator, String route);
+    method public androidx.navigation.ActivityNavigator.Destination build();
+    method public String? getAction();
+    method public kotlin.reflect.KClass<? extends android.app.Activity>? getActivityClass();
+    method public android.net.Uri? getData();
+    method public String? getDataPattern();
+    method public String? getTargetPackage();
+    method public void setAction(String? action);
+    method public void setActivityClass(kotlin.reflect.KClass<? extends android.app.Activity>? activityClass);
+    method public void setData(android.net.Uri? data);
+    method public void setDataPattern(String? dataPattern);
+    method public void setTargetPackage(String? targetPackage);
+    property public final String? action;
+    property public final kotlin.reflect.KClass<? extends android.app.Activity>? activityClass;
+    property public final android.net.Uri? data;
+    property public final String? dataPattern;
+    property public final String? targetPackage;
+  }
+
+  public final class ActivityNavigatorDestinationBuilderKt {
+    method @Deprecated public static inline void activity(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.ActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+    method public static inline void activity(androidx.navigation.NavGraphBuilder, String route, kotlin.jvm.functions.Function1<? super androidx.navigation.ActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+  }
+
+  public final class ActivityNavigatorExtrasKt {
+    method public static androidx.navigation.ActivityNavigator.Extras ActivityNavigatorExtras(optional androidx.core.app.ActivityOptionsCompat? activityOptions, optional int flags);
+  }
+
+  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);
+    method public androidx.navigation.NavBackStackEntry? getCurrentBackStackEntry();
+    method public final kotlinx.coroutines.flow.Flow<androidx.navigation.NavBackStackEntry> getCurrentBackStackEntryFlow();
+    method public androidx.navigation.NavDestination? getCurrentDestination();
+    method @MainThread public androidx.navigation.NavGraph getGraph();
+    method public androidx.navigation.NavInflater getNavInflater();
+    method public androidx.navigation.NavigatorProvider getNavigatorProvider();
+    method public androidx.navigation.NavBackStackEntry? getPreviousBackStackEntry();
+    method public androidx.lifecycle.ViewModelStoreOwner getViewModelStoreOwner(@IdRes int navGraphId);
+    method public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> getVisibleEntries();
+    method @MainThread public boolean handleDeepLink(android.content.Intent? intent);
+    method @MainThread public void navigate(@IdRes int resId);
+    method @MainThread public void navigate(@IdRes int resId, android.os.Bundle? args);
+    method @MainThread public void navigate(@IdRes int resId, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions);
+    method @MainThread public void navigate(@IdRes int resId, android.os.Bundle? args, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
+    method @MainThread public void navigate(android.net.Uri deepLink);
+    method @MainThread public void navigate(android.net.Uri deepLink, androidx.navigation.NavOptions? navOptions);
+    method @MainThread public void navigate(android.net.Uri deepLink, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
+    method @MainThread public void navigate(androidx.navigation.NavDeepLinkRequest request);
+    method @MainThread public void navigate(androidx.navigation.NavDeepLinkRequest request, androidx.navigation.NavOptions? navOptions);
+    method @MainThread public void navigate(androidx.navigation.NavDeepLinkRequest request, androidx.navigation.NavOptions? navOptions, androidx.navigation.Navigator.Extras? navigatorExtras);
+    method @MainThread public void navigate(androidx.navigation.NavDirections directions);
+    method @MainThread public void navigate(androidx.navigation.NavDirections directions, androidx.navigation.NavOptions? navOptions);
+    method @MainThread public void navigate(androidx.navigation.NavDirections directions, androidx.navigation.Navigator.Extras navigatorExtras);
+    method public final void navigate(String route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> builder);
+    method public final void navigate(String route, optional androidx.navigation.NavOptions? navOptions, optional androidx.navigation.Navigator.Extras? navigatorExtras);
+    method public final void navigate(String route, optional androidx.navigation.NavOptions? navOptions);
+    method public final void navigate(String route);
+    method @MainThread public boolean navigateUp();
+    method @MainThread public boolean popBackStack();
+    method @MainThread public boolean popBackStack(@IdRes int destinationId, boolean inclusive);
+    method @MainThread public boolean popBackStack(@IdRes int destinationId, boolean inclusive, boolean saveState);
+    method @MainThread public final boolean popBackStack(String route, boolean inclusive, optional boolean saveState);
+    method @MainThread public final boolean popBackStack(String route, boolean inclusive);
+    method public void removeOnDestinationChangedListener(androidx.navigation.NavController.OnDestinationChangedListener listener);
+    method @CallSuper public void restoreState(android.os.Bundle? navState);
+    method @CallSuper public android.os.Bundle? saveState();
+    method @CallSuper @MainThread public void setGraph(androidx.navigation.NavGraph graph);
+    method @CallSuper @MainThread public void setGraph(@NavigationRes int graphResId);
+    method @CallSuper @MainThread public void setGraph(@NavigationRes int graphResId, android.os.Bundle? startDestinationArgs);
+    method @CallSuper @MainThread public void setGraph(androidx.navigation.NavGraph graph, android.os.Bundle? startDestinationArgs);
+    property public androidx.navigation.NavBackStackEntry? currentBackStackEntry;
+    property public final kotlinx.coroutines.flow.Flow<androidx.navigation.NavBackStackEntry> currentBackStackEntryFlow;
+    property public androidx.navigation.NavDestination? currentDestination;
+    property @MainThread public androidx.navigation.NavGraph graph;
+    property public androidx.navigation.NavInflater navInflater;
+    property public androidx.navigation.NavigatorProvider navigatorProvider;
+    property public androidx.navigation.NavBackStackEntry? previousBackStackEntry;
+    property public final kotlinx.coroutines.flow.StateFlow<java.util.List<androidx.navigation.NavBackStackEntry>> visibleEntries;
+    field public static final androidx.navigation.NavController.Companion Companion;
+    field public static final String KEY_DEEP_LINK_INTENT = "android-support-nav:controller:deepLinkIntent";
+  }
+
+  public static final class NavController.Companion {
+  }
+
+  public static fun interface NavController.OnDestinationChangedListener {
+    method public void onDestinationChanged(androidx.navigation.NavController controller, androidx.navigation.NavDestination destination, android.os.Bundle? arguments);
+  }
+
+  public final class NavControllerKt {
+    method @Deprecated public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class NavDeepLinkBuilder {
+    ctor public NavDeepLinkBuilder(android.content.Context context);
+    method public androidx.navigation.NavDeepLinkBuilder addDestination(@IdRes int destId, optional android.os.Bundle? args);
+    method public androidx.navigation.NavDeepLinkBuilder addDestination(@IdRes int destId);
+    method public androidx.navigation.NavDeepLinkBuilder addDestination(String route, optional android.os.Bundle? args);
+    method public androidx.navigation.NavDeepLinkBuilder addDestination(String route);
+    method public android.app.PendingIntent createPendingIntent();
+    method public androidx.core.app.TaskStackBuilder createTaskStackBuilder();
+    method public androidx.navigation.NavDeepLinkBuilder setArguments(android.os.Bundle? args);
+    method public androidx.navigation.NavDeepLinkBuilder setComponentName(Class<? extends android.app.Activity> activityClass);
+    method public androidx.navigation.NavDeepLinkBuilder setComponentName(android.content.ComponentName componentName);
+    method public androidx.navigation.NavDeepLinkBuilder setDestination(@IdRes int destId, optional android.os.Bundle? args);
+    method public androidx.navigation.NavDeepLinkBuilder setDestination(@IdRes int destId);
+    method public androidx.navigation.NavDeepLinkBuilder setDestination(String destRoute, optional android.os.Bundle? args);
+    method public androidx.navigation.NavDeepLinkBuilder setDestination(String destRoute);
+    method public androidx.navigation.NavDeepLinkBuilder setGraph(@NavigationRes int navGraphId);
+    method public androidx.navigation.NavDeepLinkBuilder setGraph(androidx.navigation.NavGraph navGraph);
+  }
+
+  public interface NavHost {
+    method public androidx.navigation.NavController getNavController();
+    property public abstract androidx.navigation.NavController navController;
+  }
+
+  public class NavHostController extends androidx.navigation.NavController {
+    ctor public NavHostController(android.content.Context context);
+    method public final void enableOnBackPressed(boolean enabled);
+    method public final void setLifecycleOwner(androidx.lifecycle.LifecycleOwner owner);
+    method public final void setOnBackPressedDispatcher(androidx.activity.OnBackPressedDispatcher dispatcher);
+    method public final void setViewModelStore(androidx.lifecycle.ViewModelStore viewModelStore);
+  }
+
+  public final class NavHostKt {
+    method @Deprecated public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, optional @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+    method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, String startDestination, optional String? route, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+  }
+
+  public final class NavInflater {
+    ctor public NavInflater(android.content.Context context, androidx.navigation.NavigatorProvider navigatorProvider);
+    method public androidx.navigation.NavGraph inflate(@NavigationRes int graphResId);
+    field public static final androidx.navigation.NavInflater.Companion Companion;
+  }
+
+  public static final class NavInflater.Companion {
+  }
+
+  public final class Navigation {
+    method public static android.view.View.OnClickListener createNavigateOnClickListener(@IdRes int resId, optional android.os.Bundle? args);
+    method public static android.view.View.OnClickListener createNavigateOnClickListener(@IdRes int resId);
+    method public static android.view.View.OnClickListener createNavigateOnClickListener(androidx.navigation.NavDirections directions);
+    method public static androidx.navigation.NavController findNavController(android.app.Activity activity, @IdRes int viewId);
+    method public static androidx.navigation.NavController findNavController(android.view.View view);
+    method public static void setViewNavController(android.view.View view, androidx.navigation.NavController? controller);
+    field public static final androidx.navigation.Navigation INSTANCE;
+  }
+
+  public final class ViewKt {
+    method public static androidx.navigation.NavController findNavController(android.view.View);
+  }
+
+}
+
diff --git a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavBackStackEntryTest.kt b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavBackStackEntryTest.kt
index ec92699..dc167bf 100644
--- a/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavBackStackEntryTest.kt
+++ b/navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavBackStackEntryTest.kt
@@ -262,7 +262,7 @@
     fun testGetSavedStateHandle() {
         val entry = NavBackStackEntry.create(
             ApplicationProvider.getApplicationContext(),
-            NavDestination(TestNavigator()), null, TestLifecycleOwner(), NavControllerViewModel()
+            NavDestination(TestNavigator()), null, Lifecycle.State.STARTED, NavControllerViewModel()
         )
         entry.maxLifecycle = Lifecycle.State.CREATED
 
diff --git a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavBackStackEntryState.kt b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavBackStackEntryState.kt
index 0caf28a..cbf3493 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavBackStackEntryState.kt
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavBackStackEntryState.kt
@@ -18,9 +18,9 @@
 import android.annotation.SuppressLint
 import android.content.Context
 import android.os.Bundle
-import android.os.Parcelable
 import android.os.Parcel
-import androidx.lifecycle.LifecycleOwner
+import android.os.Parcelable
+import androidx.lifecycle.Lifecycle
 
 @SuppressLint("BanParcelableUsage")
 internal class NavBackStackEntryState : Parcelable {
@@ -47,7 +47,7 @@
     fun instantiate(
         context: Context,
         destination: NavDestination,
-        lifecycleOwner: LifecycleOwner?,
+        hostLifecycleState: Lifecycle.State,
         viewModel: NavControllerViewModel?
     ): NavBackStackEntry {
         val args = args?.apply {
@@ -55,7 +55,7 @@
         }
         return NavBackStackEntry.create(
             context, destination, args,
-            lifecycleOwner, viewModel,
+            hostLifecycleState, viewModel,
             id, savedState
         )
     }
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 2391c39..a08cb43 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt
@@ -40,6 +40,7 @@
 import androidx.lifecycle.ViewModelStore
 import androidx.lifecycle.ViewModelStoreOwner
 import androidx.navigation.NavDestination.Companion.createRoute
+import androidx.navigation.NavDestination.Companion.hierarchy
 import androidx.navigation.NavGraph.Companion.findStartDestination
 import kotlinx.coroutines.channels.BufferOverflow
 import kotlinx.coroutines.flow.Flow
@@ -165,8 +166,19 @@
     private var onBackPressedDispatcher: OnBackPressedDispatcher? = null
     private var viewModel: NavControllerViewModel? = null
     private val onDestinationChangedListeners = CopyOnWriteArrayList<OnDestinationChangedListener>()
+    internal var hostLifecycleState: Lifecycle.State = Lifecycle.State.INITIALIZED
+        get() {
+            // A LifecycleOwner is not required by NavController.
+            // In the cases where one is not provided, always keep the host lifecycle at CREATED
+            return if (lifecycleOwner == null) {
+                Lifecycle.State.CREATED
+            } else {
+                field
+            }
+        }
 
     private val lifecycleObserver: LifecycleObserver = LifecycleEventObserver { _, event ->
+        hostLifecycleState = event.targetState
         if (_graph != null) {
             for (entry in backQueue) {
                 entry.handleLifecycleEvent(event)
@@ -301,7 +313,7 @@
             arguments: Bundle?
         ) = NavBackStackEntry.create(
             context, destination, arguments,
-            lifecycleOwner, viewModel
+            hostLifecycleState, viewModel
         )
 
         override fun pop(popUpTo: NavBackStackEntry, saveState: Boolean) {
@@ -1115,7 +1127,7 @@
                             "found from the current destination $currentDestination"
                     )
                 }
-                val entry = state.instantiate(context, node, lifecycleOwner, viewModel)
+                val entry = state.instantiate(context, node, hostLifecycleState, viewModel)
                 val navigator = _navigatorProvider.getNavigator<Navigator<*>>(node.navigatorName)
                 val navigatorBackStack = navigatorState.getOrPut(navigator) {
                     NavControllerNavigatorState(navigator)
@@ -1258,7 +1270,26 @@
                 }
                 navigate(
                     node, arguments,
-                    NavOptions.Builder().setEnterAnim(0).setExitAnim(0).build(), null
+                    navOptions {
+                        anim {
+                            enter = 0
+                            exit = 0
+                        }
+                        val changingGraphs = node is NavGraph &&
+                            currentDestination?.hierarchy?.none { it == node } == true
+                        if (changingGraphs && deepLinkSaveState) {
+                            // If we are navigating to a 'sibling' graph (one that isn't part
+                            // of the current destination's hierarchy), then we need to saveState
+                            // to ensure that each graph has its own saved state that users can
+                            // return to
+                            popUpTo(graph.findStartDestination().id) {
+                                saveState = true
+                            }
+                            // Note we specifically don't call restoreState = true
+                            // as our deep link should support multiple instances of the
+                            // same graph in a row
+                        }
+                    }, null
                 )
             }
             return true
@@ -1675,7 +1706,7 @@
             } else {
                 // Not a single top operation, so we're looking to add the node to the back stack
                 val backStackEntry = NavBackStackEntry.create(
-                    context, node, finalArgs, lifecycleOwner, viewModel
+                    context, node, finalArgs, hostLifecycleState, viewModel
                 )
                 navigator.navigateInternal(listOf(backStackEntry), navOptions, navigatorExtras) {
                     navigated = true
@@ -1765,7 +1796,7 @@
                 "Restore State failed: destination $dest cannot be found from the current " +
                     "destination $currentDestination"
             }
-            backStack += state.instantiate(context, node, lifecycleOwner, viewModel)
+            backStack += state.instantiate(context, node, hostLifecycleState, viewModel)
             currentDestination = node
         }
         return backStack
@@ -1802,7 +1833,7 @@
                         restoredEntry.destination == parent
                     } ?: NavBackStackEntry.create(
                         context, parent,
-                        finalArgs, lifecycleOwner, viewModel
+                        finalArgs, hostLifecycleState, viewModel
                     )
                     hierarchy.addFirst(entry)
                     // Pop any orphaned copy of that navigation graph off the back stack
@@ -1823,7 +1854,8 @@
                 val entry = restoredEntries.lastOrNull { restoredEntry ->
                     restoredEntry.destination == parent
                 } ?: NavBackStackEntry.create(
-                    context, parent, parent.addInDefaultArgs(finalArgs), lifecycleOwner, viewModel
+                    context, parent, parent.addInDefaultArgs(finalArgs), hostLifecycleState,
+                    viewModel
                 )
                 hierarchy.addFirst(entry)
             }
@@ -1849,7 +1881,8 @@
             val entry = restoredEntries.lastOrNull { restoredEntry ->
                 restoredEntry.destination == _graph!!
             } ?: NavBackStackEntry.create(
-                context, _graph!!, _graph!!.addInDefaultArgs(finalArgs), lifecycleOwner, viewModel
+                context, _graph!!, _graph!!.addInDefaultArgs(finalArgs), hostLifecycleState,
+                viewModel
             )
             hierarchy.addFirst(entry)
         }
@@ -2265,6 +2298,22 @@
          */
         public const val KEY_DEEP_LINK_INTENT: String =
             "android-support-nav:controller:deepLinkIntent"
+
+        private var deepLinkSaveState = true
+
+        /**
+         * By default, [handleDeepLink] will automatically add calls to
+         * [NavOptions.Builder.setPopUpTo] with a `saveState` of `true` when the deep
+         * link takes you to another graph (e.g., a different navigation graph than the
+         * one your start destination is in).
+         *
+         * You can disable this behavior by passing `false` for [saveState].
+         */
+        @JvmStatic
+        @NavDeepLinkSaveStateControl
+        public fun enableDeepLinkSaveState(saveState: Boolean) {
+            deepLinkSaveState = saveState
+        }
     }
 }
 
diff --git a/datastore/datastore-core/src/main/java/androidx/datastore/core/StorageException.kt b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavDeepLinkSaveStateControl.kt
similarity index 64%
copy from datastore/datastore-core/src/main/java/androidx/datastore/core/StorageException.kt
copy to navigation/navigation-runtime/src/main/java/androidx/navigation/NavDeepLinkSaveStateControl.kt
index c43f04a..b4a1099 100644
--- a/datastore/datastore-core/src/main/java/androidx/datastore/core/StorageException.kt
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavDeepLinkSaveStateControl.kt
@@ -14,15 +14,12 @@
  * limitations under the License.
  */
 
-package androidx.datastore.core
-
-import java.io.IOException
+package androidx.navigation
 
 /**
- * Exception for storage-related errors. Defined as a subclass of {@link IOException} on Android and
- * JRE.
- *
- * @param message the detail message.
- * @param cause the cause.
+ * @see NavController.enableDeepLinkSaveState
  */
-open class StorageException(message: String, cause: Throwable? = null) : IOException(message, cause)
+@Retention(AnnotationRetention.RUNTIME)
+@Target(AnnotationTarget.FUNCTION)
+@RequiresOptIn(level = RequiresOptIn.Level.WARNING)
+public annotation class NavDeepLinkSaveStateControl
diff --git a/navigation/navigation-safe-args-gradle-plugin/src/test/kotlin/androidx/navigation/safeargs/gradle/IncrementalPluginTest.kt b/navigation/navigation-safe-args-gradle-plugin/src/test/kotlin/androidx/navigation/safeargs/gradle/IncrementalPluginTest.kt
index 45ecc19..5a32c9d 100644
--- a/navigation/navigation-safe-args-gradle-plugin/src/test/kotlin/androidx/navigation/safeargs/gradle/IncrementalPluginTest.kt
+++ b/navigation/navigation-safe-args-gradle-plugin/src/test/kotlin/androidx/navigation/safeargs/gradle/IncrementalPluginTest.kt
@@ -18,13 +18,11 @@
 
 import org.hamcrest.CoreMatchers
 import org.hamcrest.MatcherAssert
-import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 
 // Does not work in the Android Studio
-@Ignore // b/186177309
 @RunWith(Parameterized::class)
 class IncrementalPluginTest(private val generateKotlin: Boolean) : BasePluginTest() {
 
diff --git a/navigation/navigation-safe-args-gradle-plugin/src/test/kotlin/androidx/navigation/safeargs/gradle/JavaPluginTest.kt b/navigation/navigation-safe-args-gradle-plugin/src/test/kotlin/androidx/navigation/safeargs/gradle/JavaPluginTest.kt
index 359653a..4e81b7d 100644
--- a/navigation/navigation-safe-args-gradle-plugin/src/test/kotlin/androidx/navigation/safeargs/gradle/JavaPluginTest.kt
+++ b/navigation/navigation-safe-args-gradle-plugin/src/test/kotlin/androidx/navigation/safeargs/gradle/JavaPluginTest.kt
@@ -16,13 +16,11 @@
 
 package androidx.navigation.safeargs.gradle
 
-import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 
 // Does not work in the Android Studio
-@Ignore // b/186177309
 @RunWith(JUnit4::class)
 class JavaPluginTest : BasePluginTest() {
 
diff --git a/navigation/navigation-safe-args-gradle-plugin/src/test/kotlin/androidx/navigation/safeargs/gradle/KotlinPluginTest.kt b/navigation/navigation-safe-args-gradle-plugin/src/test/kotlin/androidx/navigation/safeargs/gradle/KotlinPluginTest.kt
index 412ce2f..c937f2e 100644
--- a/navigation/navigation-safe-args-gradle-plugin/src/test/kotlin/androidx/navigation/safeargs/gradle/KotlinPluginTest.kt
+++ b/navigation/navigation-safe-args-gradle-plugin/src/test/kotlin/androidx/navigation/safeargs/gradle/KotlinPluginTest.kt
@@ -16,13 +16,11 @@
 
 package androidx.navigation.safeargs.gradle
 
-import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 
 // Does not work in the Android Studio
-@Ignore // b/186177309
 @RunWith(JUnit4::class)
 class KotlinPluginTest : BasePluginTest() {
 
diff --git a/navigation/navigation-safe-args-gradle-plugin/src/test/test-data/multimodule-project/app/build.gradle b/navigation/navigation-safe-args-gradle-plugin/src/test/test-data/multimodule-project/app/build.gradle
index 13a7464..487b093 100644
--- a/navigation/navigation-safe-args-gradle-plugin/src/test/test-data/multimodule-project/app/build.gradle
+++ b/navigation/navigation-safe-args-gradle-plugin/src/test/test-data/multimodule-project/app/build.gradle
@@ -20,10 +20,10 @@
 }
 
 android {
-    buildToolsVersion buildTools
-    compileSdkVersion compileSdk
+    buildToolsVersion rootProject.ext.buildTools
+    compileSdkVersion rootProject.ext.compileSdk
     defaultConfig {
-        minSdkVersion minSdk
+        minSdkVersion rootProject.ext.minSdk
     }
     signingConfigs {
         debug {
diff --git a/navigation/navigation-safe-args-gradle-plugin/src/test/test-data/multimodule-project/base/build.gradle b/navigation/navigation-safe-args-gradle-plugin/src/test/test-data/multimodule-project/base/build.gradle
index b9d7c79..8654fea 100644
--- a/navigation/navigation-safe-args-gradle-plugin/src/test/test-data/multimodule-project/base/build.gradle
+++ b/navigation/navigation-safe-args-gradle-plugin/src/test/test-data/multimodule-project/base/build.gradle
@@ -19,10 +19,10 @@
     id("androidx.navigation.safeargs")
 }
 android {
-    buildToolsVersion buildTools
-    compileSdkVersion compileSdk
+    buildToolsVersion rootProject.ext.buildTools
+    compileSdkVersion rootProject.ext.compileSdk
     defaultConfig {
-        minSdkVersion minSdk
+        minSdkVersion rootProject.ext.minSdk
     }
     signingConfigs {
         debug {
diff --git a/navigation/navigation-safe-args-gradle-plugin/src/test/test-data/multimodule-project/dynamic_feature/build.gradle b/navigation/navigation-safe-args-gradle-plugin/src/test/test-data/multimodule-project/dynamic_feature/build.gradle
index 11de549..389d486 100644
--- a/navigation/navigation-safe-args-gradle-plugin/src/test/test-data/multimodule-project/dynamic_feature/build.gradle
+++ b/navigation/navigation-safe-args-gradle-plugin/src/test/test-data/multimodule-project/dynamic_feature/build.gradle
@@ -19,10 +19,10 @@
     id("androidx.navigation.safeargs")
 }
 android {
-    buildToolsVersion buildTools
-    compileSdkVersion compileSdk
+    buildToolsVersion rootProject.ext.buildTools
+    compileSdkVersion rootProject.ext.compileSdk
     defaultConfig {
-        minSdkVersion minSdk
+        minSdkVersion rootProject.ext.minSdk
     }
     signingConfigs {
         debug {
diff --git a/navigation/navigation-safe-args-gradle-plugin/src/test/test-data/multimodule-project/feature/build.gradle b/navigation/navigation-safe-args-gradle-plugin/src/test/test-data/multimodule-project/feature/build.gradle
index 4acd09f2..132f642 100644
--- a/navigation/navigation-safe-args-gradle-plugin/src/test/test-data/multimodule-project/feature/build.gradle
+++ b/navigation/navigation-safe-args-gradle-plugin/src/test/test-data/multimodule-project/feature/build.gradle
@@ -20,10 +20,10 @@
 }
 
 android {
-    buildToolsVersion buildTools
-    compileSdkVersion compileSdk
+    buildToolsVersion rootProject.ext.buildTools
+    compileSdkVersion rootProject.ext.compileSdk
     defaultConfig {
-        minSdkVersion minSdk
+        minSdkVersion rootProject.ext.minSdk
     }
     signingConfigs {
         debug {
diff --git a/navigation/navigation-safe-args-gradle-plugin/src/test/test-data/multimodule-project/library/build.gradle b/navigation/navigation-safe-args-gradle-plugin/src/test/test-data/multimodule-project/library/build.gradle
index 62f5974..0232a95 100644
--- a/navigation/navigation-safe-args-gradle-plugin/src/test/test-data/multimodule-project/library/build.gradle
+++ b/navigation/navigation-safe-args-gradle-plugin/src/test/test-data/multimodule-project/library/build.gradle
@@ -20,10 +20,10 @@
 }
 
 android {
-    buildToolsVersion buildTools
-    compileSdkVersion compileSdk
+    buildToolsVersion rootProject.ext.buildTools
+    compileSdkVersion rootProject.ext.compileSdk
     defaultConfig {
-        minSdkVersion minSdk
+        minSdkVersion rootProject.ext.minSdk
     }
     signingConfigs {
         debug {
diff --git a/navigation/navigation-testing/api/2.4.0-beta01.txt b/navigation/navigation-testing/api/2.4.0-beta01.txt
index 8fc24e8..89f60a4 100644
--- a/navigation/navigation-testing/api/2.4.0-beta01.txt
+++ b/navigation/navigation-testing/api/2.4.0-beta01.txt
@@ -14,6 +14,7 @@
   public final class TestNavigatorState extends androidx.navigation.NavigatorState {
     ctor public TestNavigatorState(optional android.content.Context? context, optional kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
     ctor public TestNavigatorState(optional android.content.Context? context);
+    ctor public TestNavigatorState();
     method public androidx.navigation.NavBackStackEntry createBackStackEntry(androidx.navigation.NavDestination destination, android.os.Bundle? arguments);
     method public androidx.navigation.NavBackStackEntry restoreBackStackEntry(androidx.navigation.NavBackStackEntry previouslySavedEntry);
   }
diff --git a/navigation/navigation-testing/api/2.4.0-beta02.txt b/navigation/navigation-testing/api/2.4.0-beta02.txt
new file mode 100644
index 0000000..89f60a4
--- /dev/null
+++ b/navigation/navigation-testing/api/2.4.0-beta02.txt
@@ -0,0 +1,23 @@
+// Signature format: 4.0
+package androidx.navigation.testing {
+
+  public final class TestNavHostController extends androidx.navigation.NavHostController {
+    ctor public TestNavHostController(android.content.Context context);
+    method public java.util.List<androidx.navigation.NavBackStackEntry> getBackStack();
+    method public void setCurrentDestination(@IdRes int destId, optional android.os.Bundle args);
+    method public void setCurrentDestination(@IdRes int destId);
+    method public void setCurrentDestination(String destRoute, optional android.os.Bundle args);
+    method public void setCurrentDestination(String destRoute);
+    property public final java.util.List<androidx.navigation.NavBackStackEntry> backStack;
+  }
+
+  public final class TestNavigatorState extends androidx.navigation.NavigatorState {
+    ctor public TestNavigatorState(optional android.content.Context? context, optional kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
+    ctor public TestNavigatorState(optional android.content.Context? context);
+    ctor public TestNavigatorState();
+    method public androidx.navigation.NavBackStackEntry createBackStackEntry(androidx.navigation.NavDestination destination, android.os.Bundle? arguments);
+    method public androidx.navigation.NavBackStackEntry restoreBackStackEntry(androidx.navigation.NavBackStackEntry previouslySavedEntry);
+  }
+
+}
+
diff --git a/navigation/navigation-testing/api/current.txt b/navigation/navigation-testing/api/current.txt
index 8fc24e8..89f60a4 100644
--- a/navigation/navigation-testing/api/current.txt
+++ b/navigation/navigation-testing/api/current.txt
@@ -14,6 +14,7 @@
   public final class TestNavigatorState extends androidx.navigation.NavigatorState {
     ctor public TestNavigatorState(optional android.content.Context? context, optional kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
     ctor public TestNavigatorState(optional android.content.Context? context);
+    ctor public TestNavigatorState();
     method public androidx.navigation.NavBackStackEntry createBackStackEntry(androidx.navigation.NavDestination destination, android.os.Bundle? arguments);
     method public androidx.navigation.NavBackStackEntry restoreBackStackEntry(androidx.navigation.NavBackStackEntry previouslySavedEntry);
   }
diff --git a/navigation/navigation-testing/api/public_plus_experimental_2.4.0-beta01.txt b/navigation/navigation-testing/api/public_plus_experimental_2.4.0-beta01.txt
index 8fc24e8..89f60a4 100644
--- a/navigation/navigation-testing/api/public_plus_experimental_2.4.0-beta01.txt
+++ b/navigation/navigation-testing/api/public_plus_experimental_2.4.0-beta01.txt
@@ -14,6 +14,7 @@
   public final class TestNavigatorState extends androidx.navigation.NavigatorState {
     ctor public TestNavigatorState(optional android.content.Context? context, optional kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
     ctor public TestNavigatorState(optional android.content.Context? context);
+    ctor public TestNavigatorState();
     method public androidx.navigation.NavBackStackEntry createBackStackEntry(androidx.navigation.NavDestination destination, android.os.Bundle? arguments);
     method public androidx.navigation.NavBackStackEntry restoreBackStackEntry(androidx.navigation.NavBackStackEntry previouslySavedEntry);
   }
diff --git a/navigation/navigation-testing/api/public_plus_experimental_2.4.0-beta02.txt b/navigation/navigation-testing/api/public_plus_experimental_2.4.0-beta02.txt
new file mode 100644
index 0000000..89f60a4
--- /dev/null
+++ b/navigation/navigation-testing/api/public_plus_experimental_2.4.0-beta02.txt
@@ -0,0 +1,23 @@
+// Signature format: 4.0
+package androidx.navigation.testing {
+
+  public final class TestNavHostController extends androidx.navigation.NavHostController {
+    ctor public TestNavHostController(android.content.Context context);
+    method public java.util.List<androidx.navigation.NavBackStackEntry> getBackStack();
+    method public void setCurrentDestination(@IdRes int destId, optional android.os.Bundle args);
+    method public void setCurrentDestination(@IdRes int destId);
+    method public void setCurrentDestination(String destRoute, optional android.os.Bundle args);
+    method public void setCurrentDestination(String destRoute);
+    property public final java.util.List<androidx.navigation.NavBackStackEntry> backStack;
+  }
+
+  public final class TestNavigatorState extends androidx.navigation.NavigatorState {
+    ctor public TestNavigatorState(optional android.content.Context? context, optional kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
+    ctor public TestNavigatorState(optional android.content.Context? context);
+    ctor public TestNavigatorState();
+    method public androidx.navigation.NavBackStackEntry createBackStackEntry(androidx.navigation.NavDestination destination, android.os.Bundle? arguments);
+    method public androidx.navigation.NavBackStackEntry restoreBackStackEntry(androidx.navigation.NavBackStackEntry previouslySavedEntry);
+  }
+
+}
+
diff --git a/navigation/navigation-testing/api/public_plus_experimental_current.txt b/navigation/navigation-testing/api/public_plus_experimental_current.txt
index 8fc24e8..89f60a4 100644
--- a/navigation/navigation-testing/api/public_plus_experimental_current.txt
+++ b/navigation/navigation-testing/api/public_plus_experimental_current.txt
@@ -14,6 +14,7 @@
   public final class TestNavigatorState extends androidx.navigation.NavigatorState {
     ctor public TestNavigatorState(optional android.content.Context? context, optional kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
     ctor public TestNavigatorState(optional android.content.Context? context);
+    ctor public TestNavigatorState();
     method public androidx.navigation.NavBackStackEntry createBackStackEntry(androidx.navigation.NavDestination destination, android.os.Bundle? arguments);
     method public androidx.navigation.NavBackStackEntry restoreBackStackEntry(androidx.navigation.NavBackStackEntry previouslySavedEntry);
   }
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/navigation/navigation-testing/api/res-2.4.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to navigation/navigation-testing/api/res-2.4.0-beta02.txt
diff --git a/navigation/navigation-testing/api/restricted_2.4.0-beta01.txt b/navigation/navigation-testing/api/restricted_2.4.0-beta01.txt
index 8fc24e8..89f60a4 100644
--- a/navigation/navigation-testing/api/restricted_2.4.0-beta01.txt
+++ b/navigation/navigation-testing/api/restricted_2.4.0-beta01.txt
@@ -14,6 +14,7 @@
   public final class TestNavigatorState extends androidx.navigation.NavigatorState {
     ctor public TestNavigatorState(optional android.content.Context? context, optional kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
     ctor public TestNavigatorState(optional android.content.Context? context);
+    ctor public TestNavigatorState();
     method public androidx.navigation.NavBackStackEntry createBackStackEntry(androidx.navigation.NavDestination destination, android.os.Bundle? arguments);
     method public androidx.navigation.NavBackStackEntry restoreBackStackEntry(androidx.navigation.NavBackStackEntry previouslySavedEntry);
   }
diff --git a/navigation/navigation-testing/api/restricted_2.4.0-beta02.txt b/navigation/navigation-testing/api/restricted_2.4.0-beta02.txt
new file mode 100644
index 0000000..89f60a4
--- /dev/null
+++ b/navigation/navigation-testing/api/restricted_2.4.0-beta02.txt
@@ -0,0 +1,23 @@
+// Signature format: 4.0
+package androidx.navigation.testing {
+
+  public final class TestNavHostController extends androidx.navigation.NavHostController {
+    ctor public TestNavHostController(android.content.Context context);
+    method public java.util.List<androidx.navigation.NavBackStackEntry> getBackStack();
+    method public void setCurrentDestination(@IdRes int destId, optional android.os.Bundle args);
+    method public void setCurrentDestination(@IdRes int destId);
+    method public void setCurrentDestination(String destRoute, optional android.os.Bundle args);
+    method public void setCurrentDestination(String destRoute);
+    property public final java.util.List<androidx.navigation.NavBackStackEntry> backStack;
+  }
+
+  public final class TestNavigatorState extends androidx.navigation.NavigatorState {
+    ctor public TestNavigatorState(optional android.content.Context? context, optional kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
+    ctor public TestNavigatorState(optional android.content.Context? context);
+    ctor public TestNavigatorState();
+    method public androidx.navigation.NavBackStackEntry createBackStackEntry(androidx.navigation.NavDestination destination, android.os.Bundle? arguments);
+    method public androidx.navigation.NavBackStackEntry restoreBackStackEntry(androidx.navigation.NavBackStackEntry previouslySavedEntry);
+  }
+
+}
+
diff --git a/navigation/navigation-testing/api/restricted_current.txt b/navigation/navigation-testing/api/restricted_current.txt
index 8fc24e8..89f60a4 100644
--- a/navigation/navigation-testing/api/restricted_current.txt
+++ b/navigation/navigation-testing/api/restricted_current.txt
@@ -14,6 +14,7 @@
   public final class TestNavigatorState extends androidx.navigation.NavigatorState {
     ctor public TestNavigatorState(optional android.content.Context? context, optional kotlinx.coroutines.CoroutineDispatcher coroutineDispatcher);
     ctor public TestNavigatorState(optional android.content.Context? context);
+    ctor public TestNavigatorState();
     method public androidx.navigation.NavBackStackEntry createBackStackEntry(androidx.navigation.NavDestination destination, android.os.Bundle? arguments);
     method public androidx.navigation.NavBackStackEntry restoreBackStackEntry(androidx.navigation.NavBackStackEntry previouslySavedEntry);
   }
diff --git a/navigation/navigation-testing/src/androidTest/java/androidx/navigation/testing/TestNavigatorStateTest.kt b/navigation/navigation-testing/src/androidTest/java/androidx/navigation/testing/TestNavigatorStateTest.kt
index 0203eda..faa7248 100644
--- a/navigation/navigation-testing/src/androidTest/java/androidx/navigation/testing/TestNavigatorStateTest.kt
+++ b/navigation/navigation-testing/src/androidTest/java/androidx/navigation/testing/TestNavigatorStateTest.kt
@@ -17,11 +17,14 @@
 package androidx.navigation.testing
 
 import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
 import androidx.navigation.FloatingWindow
 import androidx.navigation.NavBackStackEntry
 import androidx.navigation.NavDestination
 import androidx.navigation.NavOptions
 import androidx.navigation.Navigator
+import androidx.navigation.navOptions
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import com.google.common.truth.Truth.assertThat
@@ -190,6 +193,41 @@
             .isEqualTo(Lifecycle.State.DESTROYED)
     }
 
+    @Test
+    fun testNewInstanceBeforeComplete() {
+        val navigator = TestTransitionNavigator()
+        navigator.onAttach(state)
+        val firstEntry = state.createBackStackEntry(navigator.createDestination(), null)
+        firstEntry.destination.route = "first"
+
+        navigator.navigate(listOf(firstEntry), null, null)
+        state.markTransitionComplete(firstEntry)
+
+        val secondEntry = state.createBackStackEntry(navigator.createDestination(), null)
+        secondEntry.destination.route = "second"
+        navigator.navigate(listOf(secondEntry), navOptions {
+            popUpTo("first") { saveState = true }
+            launchSingleTop = true
+            restoreState = true
+        }, null)
+
+        val viewModel = ViewModelProvider(secondEntry).get(TestViewModel::class.java)
+
+        navigator.popBackStack(secondEntry, true)
+        val restoredSecondEntry = state.restoreBackStackEntry(secondEntry)
+        navigator.navigate(listOf(restoredSecondEntry), navOptions {
+            popUpTo("first") { saveState = true }
+            launchSingleTop = true
+            restoreState = true
+        }, null)
+
+        state.transitionsInProgress.value.forEach {
+            state.markTransitionComplete(it)
+        }
+
+        assertThat(viewModel.wasCleared).isFalse()
+    }
+
     @Navigator.Name("test")
     internal class TestNavigator : Navigator<NavDestination>() {
         override fun createDestination(): NavDestination = NavDestination(this)
@@ -222,4 +260,13 @@
     internal class FloatingTestDestination(
         navigator: Navigator<out NavDestination>
     ) : NavDestination(navigator), FloatingWindow
+
+    class TestViewModel : ViewModel() {
+        var wasCleared = false
+
+        override fun onCleared() {
+            super.onCleared()
+            wasCleared = true
+        }
+    }
 }
\ No newline at end of file
diff --git a/navigation/navigation-testing/src/main/java/androidx/navigation/testing/TestNavigatorState.kt b/navigation/navigation-testing/src/main/java/androidx/navigation/testing/TestNavigatorState.kt
index c146ce31..6099fcf 100644
--- a/navigation/navigation-testing/src/main/java/androidx/navigation/testing/TestNavigatorState.kt
+++ b/navigation/navigation-testing/src/main/java/androidx/navigation/testing/TestNavigatorState.kt
@@ -19,9 +19,7 @@
 import android.content.Context
 import android.os.Bundle
 import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.LifecycleOwner
 import androidx.lifecycle.ViewModelStore
-import androidx.lifecycle.testing.TestLifecycleOwner
 import androidx.navigation.FloatingWindow
 import androidx.navigation.NavBackStackEntry
 import androidx.navigation.NavDestination
@@ -50,11 +48,6 @@
     private val coroutineDispatcher: CoroutineDispatcher = Dispatchers.Main.immediate
 ) : NavigatorState() {
 
-    private val lifecycleOwner: LifecycleOwner = TestLifecycleOwner(
-        Lifecycle.State.RESUMED,
-        coroutineDispatcher
-    )
-
     private val viewModelStoreProvider = object : NavViewModelStoreProvider {
         private val viewModelStores = mutableMapOf<String, ViewModelStore>()
         override fun getViewModelStore(
@@ -71,7 +64,7 @@
         destination: NavDestination,
         arguments: Bundle?
     ): NavBackStackEntry = NavBackStackEntry.create(
-        context, destination, arguments, lifecycleOwner, viewModelStoreProvider
+        context, destination, arguments, Lifecycle.State.RESUMED, viewModelStoreProvider
     )
 
     /**
@@ -86,7 +79,7 @@
         return NavBackStackEntry.create(
             context,
             previouslySavedEntry.destination, previouslySavedEntry.arguments,
-            lifecycleOwner, viewModelStoreProvider,
+            Lifecycle.State.RESUMED, viewModelStoreProvider,
             previouslySavedEntry.id, savedState
         )
     }
@@ -145,6 +138,7 @@
                         entry.maxLifecycle = Lifecycle.State.DESTROYED
                         if (!saveState) {
                             savedStates.remove(entry.id)
+                            viewModelStoreProvider.getViewModelStore(entry.id).clear()
                         }
                     } else {
                         entry.maxLifecycle = Lifecycle.State.CREATED
diff --git a/navigation/navigation-ui-ktx/api/2.4.0-beta02.txt b/navigation/navigation-ui-ktx/api/2.4.0-beta02.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/navigation/navigation-ui-ktx/api/2.4.0-beta02.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/navigation/navigation-ui-ktx/api/public_plus_experimental_2.4.0-beta02.txt b/navigation/navigation-ui-ktx/api/public_plus_experimental_2.4.0-beta02.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/navigation/navigation-ui-ktx/api/public_plus_experimental_2.4.0-beta02.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/navigation/navigation-ui-ktx/api/res-2.4.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to navigation/navigation-ui-ktx/api/res-2.4.0-beta02.txt
diff --git a/navigation/navigation-ui-ktx/api/restricted_2.4.0-beta02.txt b/navigation/navigation-ui-ktx/api/restricted_2.4.0-beta02.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/navigation/navigation-ui-ktx/api/restricted_2.4.0-beta02.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/navigation/navigation-ui/api/2.4.0-beta02.txt b/navigation/navigation-ui/api/2.4.0-beta02.txt
new file mode 100644
index 0000000..9551da2
--- /dev/null
+++ b/navigation/navigation-ui/api/2.4.0-beta02.txt
@@ -0,0 +1,87 @@
+// Signature format: 4.0
+package androidx.navigation.ui {
+
+  public final class ActivityKt {
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController navController, optional androidx.navigation.ui.AppBarConfiguration configuration);
+  }
+
+  public final class AppBarConfiguration {
+    method @Deprecated public androidx.drawerlayout.widget.DrawerLayout? getDrawerLayout();
+    method public androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener? getFallbackOnNavigateUpListener();
+    method public androidx.customview.widget.Openable? getOpenableLayout();
+    method public java.util.Set<java.lang.Integer> getTopLevelDestinations();
+    property @Deprecated public final androidx.drawerlayout.widget.DrawerLayout? drawerLayout;
+    property public final androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener? fallbackOnNavigateUpListener;
+    property public final androidx.customview.widget.Openable? openableLayout;
+    property public final java.util.Set<java.lang.Integer> topLevelDestinations;
+  }
+
+  public static final class AppBarConfiguration.Builder {
+    ctor public AppBarConfiguration.Builder(androidx.navigation.NavGraph navGraph);
+    ctor public AppBarConfiguration.Builder(android.view.Menu topLevelMenu);
+    ctor public AppBarConfiguration.Builder(int... topLevelDestinationIds);
+    ctor public AppBarConfiguration.Builder(java.util.Set<java.lang.Integer> topLevelDestinationIds);
+    method public androidx.navigation.ui.AppBarConfiguration build();
+    method @Deprecated public androidx.navigation.ui.AppBarConfiguration.Builder setDrawerLayout(androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public androidx.navigation.ui.AppBarConfiguration.Builder setFallbackOnNavigateUpListener(androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener? fallbackOnNavigateUpListener);
+    method public androidx.navigation.ui.AppBarConfiguration.Builder setOpenableLayout(androidx.customview.widget.Openable? openableLayout);
+  }
+
+  public static fun interface AppBarConfiguration.OnNavigateUpListener {
+    method public boolean onNavigateUp();
+  }
+
+  public final class AppBarConfigurationKt {
+    method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(androidx.navigation.NavGraph navGraph, optional androidx.customview.widget.Openable? drawerLayout, optional kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener);
+    method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(android.view.Menu topLevelMenu, optional androidx.customview.widget.Openable? drawerLayout, optional kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener);
+    method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(java.util.Set<java.lang.Integer> topLevelDestinationIds, optional androidx.customview.widget.Openable? drawerLayout, optional kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener);
+  }
+
+  public final class BottomNavigationViewKt {
+    method public static void setupWithNavController(com.google.android.material.navigation.NavigationBarView, androidx.navigation.NavController navController);
+  }
+
+  public final class CollapsingToolbarLayoutKt {
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, optional androidx.navigation.ui.AppBarConfiguration configuration);
+  }
+
+  public final class MenuItemKt {
+    method public static boolean onNavDestinationSelected(android.view.MenuItem, androidx.navigation.NavController navController);
+  }
+
+  public final class NavControllerKt {
+    method public static boolean navigateUp(androidx.navigation.NavController, androidx.customview.widget.Openable? drawerLayout);
+    method public static boolean navigateUp(androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration appBarConfiguration);
+  }
+
+  public final class NavigationUI {
+    method public static boolean navigateUp(androidx.navigation.NavController navController, androidx.customview.widget.Openable? openableLayout);
+    method public static boolean navigateUp(androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration);
+    method public static boolean onNavDestinationSelected(android.view.MenuItem item, androidx.navigation.NavController navController);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity activity, androidx.navigation.NavController navController, androidx.customview.widget.Openable? openableLayout);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity activity, androidx.navigation.NavController navController, optional androidx.navigation.ui.AppBarConfiguration configuration);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity activity, androidx.navigation.NavController navController);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, androidx.customview.widget.Openable? openableLayout);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, optional androidx.navigation.ui.AppBarConfiguration configuration);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout collapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, androidx.customview.widget.Openable? openableLayout);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout collapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, optional androidx.navigation.ui.AppBarConfiguration configuration);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout collapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController);
+    method public static void setupWithNavController(com.google.android.material.navigation.NavigationView navigationView, androidx.navigation.NavController navController);
+    method public static void setupWithNavController(com.google.android.material.navigation.NavigationBarView navigationBarView, androidx.navigation.NavController navController);
+    field public static final androidx.navigation.ui.NavigationUI INSTANCE;
+  }
+
+  public final class NavigationViewKt {
+    method public static void setupWithNavController(com.google.android.material.navigation.NavigationView, androidx.navigation.NavController navController);
+  }
+
+  public final class ToolbarKt {
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController navController, optional androidx.navigation.ui.AppBarConfiguration configuration);
+  }
+
+}
+
diff --git a/navigation/navigation-ui/api/public_plus_experimental_2.4.0-beta02.txt b/navigation/navigation-ui/api/public_plus_experimental_2.4.0-beta02.txt
new file mode 100644
index 0000000..ce4e91b
--- /dev/null
+++ b/navigation/navigation-ui/api/public_plus_experimental_2.4.0-beta02.txt
@@ -0,0 +1,93 @@
+// Signature format: 4.0
+package androidx.navigation.ui {
+
+  public final class ActivityKt {
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController navController, optional androidx.navigation.ui.AppBarConfiguration configuration);
+  }
+
+  public final class AppBarConfiguration {
+    method @Deprecated public androidx.drawerlayout.widget.DrawerLayout? getDrawerLayout();
+    method public androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener? getFallbackOnNavigateUpListener();
+    method public androidx.customview.widget.Openable? getOpenableLayout();
+    method public java.util.Set<java.lang.Integer> getTopLevelDestinations();
+    property @Deprecated public final androidx.drawerlayout.widget.DrawerLayout? drawerLayout;
+    property public final androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener? fallbackOnNavigateUpListener;
+    property public final androidx.customview.widget.Openable? openableLayout;
+    property public final java.util.Set<java.lang.Integer> topLevelDestinations;
+  }
+
+  public static final class AppBarConfiguration.Builder {
+    ctor public AppBarConfiguration.Builder(androidx.navigation.NavGraph navGraph);
+    ctor public AppBarConfiguration.Builder(android.view.Menu topLevelMenu);
+    ctor public AppBarConfiguration.Builder(int... topLevelDestinationIds);
+    ctor public AppBarConfiguration.Builder(java.util.Set<java.lang.Integer> topLevelDestinationIds);
+    method public androidx.navigation.ui.AppBarConfiguration build();
+    method @Deprecated public androidx.navigation.ui.AppBarConfiguration.Builder setDrawerLayout(androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public androidx.navigation.ui.AppBarConfiguration.Builder setFallbackOnNavigateUpListener(androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener? fallbackOnNavigateUpListener);
+    method public androidx.navigation.ui.AppBarConfiguration.Builder setOpenableLayout(androidx.customview.widget.Openable? openableLayout);
+  }
+
+  public static fun interface AppBarConfiguration.OnNavigateUpListener {
+    method public boolean onNavigateUp();
+  }
+
+  public final class AppBarConfigurationKt {
+    method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(androidx.navigation.NavGraph navGraph, optional androidx.customview.widget.Openable? drawerLayout, optional kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener);
+    method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(android.view.Menu topLevelMenu, optional androidx.customview.widget.Openable? drawerLayout, optional kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener);
+    method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(java.util.Set<java.lang.Integer> topLevelDestinationIds, optional androidx.customview.widget.Openable? drawerLayout, optional kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener);
+  }
+
+  public final class BottomNavigationViewKt {
+    method public static void setupWithNavController(com.google.android.material.navigation.NavigationBarView, androidx.navigation.NavController navController);
+  }
+
+  public final class CollapsingToolbarLayoutKt {
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, optional androidx.navigation.ui.AppBarConfiguration configuration);
+  }
+
+  public final class MenuItemKt {
+    method public static boolean onNavDestinationSelected(android.view.MenuItem, androidx.navigation.NavController navController);
+  }
+
+  public final class NavControllerKt {
+    method public static boolean navigateUp(androidx.navigation.NavController, androidx.customview.widget.Openable? drawerLayout);
+    method public static boolean navigateUp(androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration appBarConfiguration);
+  }
+
+  public final class NavigationUI {
+    method public static boolean navigateUp(androidx.navigation.NavController navController, androidx.customview.widget.Openable? openableLayout);
+    method public static boolean navigateUp(androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration);
+    method public static boolean onNavDestinationSelected(android.view.MenuItem item, androidx.navigation.NavController navController);
+    method @androidx.navigation.ui.NavigationUiSaveStateControl public static boolean onNavDestinationSelected(android.view.MenuItem item, androidx.navigation.NavController navController, boolean saveState);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity activity, androidx.navigation.NavController navController, androidx.customview.widget.Openable? openableLayout);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity activity, androidx.navigation.NavController navController, optional androidx.navigation.ui.AppBarConfiguration configuration);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity activity, androidx.navigation.NavController navController);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, androidx.customview.widget.Openable? openableLayout);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, optional androidx.navigation.ui.AppBarConfiguration configuration);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout collapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, androidx.customview.widget.Openable? openableLayout);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout collapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, optional androidx.navigation.ui.AppBarConfiguration configuration);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout collapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController);
+    method public static void setupWithNavController(com.google.android.material.navigation.NavigationView navigationView, androidx.navigation.NavController navController);
+    method @androidx.navigation.ui.NavigationUiSaveStateControl public static void setupWithNavController(com.google.android.material.navigation.NavigationView navigationView, androidx.navigation.NavController navController, boolean saveState);
+    method public static void setupWithNavController(com.google.android.material.navigation.NavigationBarView navigationBarView, androidx.navigation.NavController navController);
+    method @androidx.navigation.ui.NavigationUiSaveStateControl public static void setupWithNavController(com.google.android.material.navigation.NavigationBarView navigationBarView, androidx.navigation.NavController navController, boolean saveState);
+    field public static final androidx.navigation.ui.NavigationUI INSTANCE;
+  }
+
+  @kotlin.RequiresOptIn(level=kotlin.RequiresOptIn.Level) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface NavigationUiSaveStateControl {
+  }
+
+  public final class NavigationViewKt {
+    method public static void setupWithNavController(com.google.android.material.navigation.NavigationView, androidx.navigation.NavController navController);
+  }
+
+  public final class ToolbarKt {
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController navController, optional androidx.navigation.ui.AppBarConfiguration configuration);
+  }
+
+}
+
diff --git a/navigation/navigation-ui/api/res-2.4.0-beta02.txt b/navigation/navigation-ui/api/res-2.4.0-beta02.txt
new file mode 100644
index 0000000..e65fdbe
--- /dev/null
+++ b/navigation/navigation-ui/api/res-2.4.0-beta02.txt
@@ -0,0 +1,8 @@
+anim nav_default_enter_anim
+anim nav_default_exit_anim
+anim nav_default_pop_enter_anim
+anim nav_default_pop_exit_anim
+animator nav_default_enter_anim
+animator nav_default_exit_anim
+animator nav_default_pop_enter_anim
+animator nav_default_pop_exit_anim
diff --git a/navigation/navigation-ui/api/restricted_2.4.0-beta02.txt b/navigation/navigation-ui/api/restricted_2.4.0-beta02.txt
new file mode 100644
index 0000000..9551da2
--- /dev/null
+++ b/navigation/navigation-ui/api/restricted_2.4.0-beta02.txt
@@ -0,0 +1,87 @@
+// Signature format: 4.0
+package androidx.navigation.ui {
+
+  public final class ActivityKt {
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController navController, optional androidx.navigation.ui.AppBarConfiguration configuration);
+  }
+
+  public final class AppBarConfiguration {
+    method @Deprecated public androidx.drawerlayout.widget.DrawerLayout? getDrawerLayout();
+    method public androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener? getFallbackOnNavigateUpListener();
+    method public androidx.customview.widget.Openable? getOpenableLayout();
+    method public java.util.Set<java.lang.Integer> getTopLevelDestinations();
+    property @Deprecated public final androidx.drawerlayout.widget.DrawerLayout? drawerLayout;
+    property public final androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener? fallbackOnNavigateUpListener;
+    property public final androidx.customview.widget.Openable? openableLayout;
+    property public final java.util.Set<java.lang.Integer> topLevelDestinations;
+  }
+
+  public static final class AppBarConfiguration.Builder {
+    ctor public AppBarConfiguration.Builder(androidx.navigation.NavGraph navGraph);
+    ctor public AppBarConfiguration.Builder(android.view.Menu topLevelMenu);
+    ctor public AppBarConfiguration.Builder(int... topLevelDestinationIds);
+    ctor public AppBarConfiguration.Builder(java.util.Set<java.lang.Integer> topLevelDestinationIds);
+    method public androidx.navigation.ui.AppBarConfiguration build();
+    method @Deprecated public androidx.navigation.ui.AppBarConfiguration.Builder setDrawerLayout(androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public androidx.navigation.ui.AppBarConfiguration.Builder setFallbackOnNavigateUpListener(androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener? fallbackOnNavigateUpListener);
+    method public androidx.navigation.ui.AppBarConfiguration.Builder setOpenableLayout(androidx.customview.widget.Openable? openableLayout);
+  }
+
+  public static fun interface AppBarConfiguration.OnNavigateUpListener {
+    method public boolean onNavigateUp();
+  }
+
+  public final class AppBarConfigurationKt {
+    method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(androidx.navigation.NavGraph navGraph, optional androidx.customview.widget.Openable? drawerLayout, optional kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener);
+    method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(android.view.Menu topLevelMenu, optional androidx.customview.widget.Openable? drawerLayout, optional kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener);
+    method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(java.util.Set<java.lang.Integer> topLevelDestinationIds, optional androidx.customview.widget.Openable? drawerLayout, optional kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener);
+  }
+
+  public final class BottomNavigationViewKt {
+    method public static void setupWithNavController(com.google.android.material.navigation.NavigationBarView, androidx.navigation.NavController navController);
+  }
+
+  public final class CollapsingToolbarLayoutKt {
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, optional androidx.navigation.ui.AppBarConfiguration configuration);
+  }
+
+  public final class MenuItemKt {
+    method public static boolean onNavDestinationSelected(android.view.MenuItem, androidx.navigation.NavController navController);
+  }
+
+  public final class NavControllerKt {
+    method public static boolean navigateUp(androidx.navigation.NavController, androidx.customview.widget.Openable? drawerLayout);
+    method public static boolean navigateUp(androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration appBarConfiguration);
+  }
+
+  public final class NavigationUI {
+    method public static boolean navigateUp(androidx.navigation.NavController navController, androidx.customview.widget.Openable? openableLayout);
+    method public static boolean navigateUp(androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration);
+    method public static boolean onNavDestinationSelected(android.view.MenuItem item, androidx.navigation.NavController navController);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity activity, androidx.navigation.NavController navController, androidx.customview.widget.Openable? openableLayout);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity activity, androidx.navigation.NavController navController, optional androidx.navigation.ui.AppBarConfiguration configuration);
+    method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity activity, androidx.navigation.NavController navController);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, androidx.customview.widget.Openable? openableLayout);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, optional androidx.navigation.ui.AppBarConfiguration configuration);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout collapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, androidx.customview.widget.Openable? openableLayout);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout collapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, optional androidx.navigation.ui.AppBarConfiguration configuration);
+    method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout collapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController);
+    method public static void setupWithNavController(com.google.android.material.navigation.NavigationView navigationView, androidx.navigation.NavController navController);
+    method public static void setupWithNavController(com.google.android.material.navigation.NavigationBarView navigationBarView, androidx.navigation.NavController navController);
+    field public static final androidx.navigation.ui.NavigationUI INSTANCE;
+  }
+
+  public final class NavigationViewKt {
+    method public static void setupWithNavController(com.google.android.material.navigation.NavigationView, androidx.navigation.NavController navController);
+  }
+
+  public final class ToolbarKt {
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+    method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController navController, optional androidx.navigation.ui.AppBarConfiguration configuration);
+  }
+
+}
+
diff --git a/navigation/navigation-ui/src/main/java/androidx/navigation/ui/NavigationUI.kt b/navigation/navigation-ui/src/main/java/androidx/navigation/ui/NavigationUI.kt
index e00b8ae..095ec16b 100644
--- a/navigation/navigation-ui/src/main/java/androidx/navigation/ui/NavigationUI.kt
+++ b/navigation/navigation-ui/src/main/java/androidx/navigation/ui/NavigationUI.kt
@@ -90,7 +90,8 @@
         return try {
             // TODO provide proper API instead of using Exceptions as Control-Flow.
             navController.navigate(item.itemId, null, options)
-            true
+            // Return true only if the destination we've navigated to matches the MenuItem
+            navController.currentDestination?.matchDestination(item.itemId) == true
         } catch (e: IllegalArgumentException) {
             false
         }
@@ -153,7 +154,8 @@
         return try {
             // TODO provide proper API instead of using Exceptions as Control-Flow.
             navController.navigate(item.itemId, null, options)
-            true
+            // Return true only if the destination we've navigated to matches the MenuItem
+            navController.currentDestination?.matchDestination(item.itemId) == true
         } catch (e: IllegalArgumentException) {
             false
         }
diff --git a/paging/paging-common/api/3.1.0-beta02.txt b/paging/paging-common/api/3.1.0-beta02.txt
index cb81fc4..fa86c1f 100644
--- a/paging/paging-common/api/3.1.0-beta02.txt
+++ b/paging/paging-common/api/3.1.0-beta02.txt
@@ -27,7 +27,9 @@
     method @AnyThread public void invalidate();
     method @WorkerThread public boolean isInvalid();
     method public <ToValue> androidx.paging.DataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource<Key,ToValue>! map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
     method public <ToValue> androidx.paging.DataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource<Key,ToValue>! mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
     method @AnyThread public void removeInvalidatedCallback(androidx.paging.DataSource.InvalidatedCallback onInvalidatedCallback);
     property @WorkerThread public boolean isInvalid;
   }
@@ -38,7 +40,9 @@
     method public final kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> asPagingSourceFactory();
     method public abstract androidx.paging.DataSource<Key,Value> create();
     method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue>! map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
     method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue>! mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
   }
 
   public static fun interface DataSource.InvalidatedCallback {
@@ -259,9 +263,11 @@
   }
 
   public final class PagedListConfigKt {
+    method @kotlin.jvm.JvmSynthetic public static androidx.paging.PagedList.Config! Config(int pageSize, optional int prefetchDistance, optional boolean enablePlaceholders, optional int initialLoadSizeHint, optional int maxSize);
   }
 
   public final class PagedListKt {
+    method @Deprecated @kotlin.jvm.JvmSynthetic public static <Key extends java.lang.Object, Value> androidx.paging.PagedList<Value>! PagedList(androidx.paging.DataSource<Key,Value> dataSource, androidx.paging.PagedList.Config config, java.util.concurrent.Executor notifyExecutor, java.util.concurrent.Executor fetchExecutor, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional Key? initialKey);
   }
 
   public final class Pager<Key, Value> {
@@ -304,14 +310,18 @@
 
   public final class PagingDataTransforms {
     method @CheckResult public static <T> androidx.paging.PagingData<T> filter(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T> androidx.paging.PagingData<T>! filter(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super java.lang.Boolean>,?> predicate);
     method @CheckResult public static <T, R> androidx.paging.PagingData<R> flatMap(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,? extends java.lang.Iterable<? extends R>> transform);
+    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T extends java.lang.Object, R> androidx.paging.PagingData<R>! flatMap(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super java.lang.Iterable<? extends R>>,?> transform);
     method @CheckResult public static <T> androidx.paging.PagingData<T> insertFooterItem(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, T item);
     method @CheckResult public static <T> androidx.paging.PagingData<T> insertFooterItem(androidx.paging.PagingData<T>, T item);
     method @CheckResult public static <T> androidx.paging.PagingData<T> insertHeaderItem(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, T item);
     method @CheckResult public static <T> androidx.paging.PagingData<T> insertHeaderItem(androidx.paging.PagingData<T>, T item);
     method @CheckResult public static <R, T extends R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
     method @CheckResult public static <R, T extends R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
+    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T extends R, R> androidx.paging.PagingData<R>! insertSeparators(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, kotlin.jvm.functions.Function3<? super T,? super T,? super kotlin.coroutines.Continuation<? super R>,?> generator);
     method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T extends java.lang.Object, R> androidx.paging.PagingData<R>! map(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super R>,?> transform);
   }
 
   public abstract class PagingSource<Key, Value> {
diff --git a/paging/paging-common/api/api_lint.ignore b/paging/paging-common/api/api_lint.ignore
index 4191eb5..256d1b7 100644
--- a/paging/paging-common/api/api_lint.ignore
+++ b/paging/paging-common/api/api_lint.ignore
@@ -31,3 +31,29 @@
     androidx.paging.PagedList.Config does not declare a `getPageSize()` method matching method androidx.paging.PagedList.Config.Builder.setPageSize(int)
 MissingGetterMatchingBuilder: androidx.paging.PagedList.Config.Builder#setPrefetchDistance(int):
     androidx.paging.PagedList.Config does not declare a `getPrefetchDistance()` method matching method androidx.paging.PagedList.Config.Builder.setPrefetchDistance(int)
+
+
+MissingJvmstatic: androidx.paging.PagedListConfigKt#Config(int, int, boolean, int, int):
+    A Kotlin method with default parameter values should be annotated with @JvmOverloads for better Java interoperability; see https://android.github.io/kotlin-guides/interop.html#function-overloads-for-defaults
+MissingJvmstatic: androidx.paging.PagedListKt#PagedList(androidx.paging.DataSource<Key,Value>, androidx.paging.PagedList.Config, java.util.concurrent.Executor, java.util.concurrent.Executor, androidx.paging.PagedList.BoundaryCallback<Value>, Key):
+    A Kotlin method with default parameter values should be annotated with @JvmOverloads for better Java interoperability; see https://android.github.io/kotlin-guides/interop.html#function-overloads-for-defaults
+
+
+MissingNullability: androidx.paging.DataSource#map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue>):
+    Missing nullability on method `map` return
+MissingNullability: androidx.paging.DataSource#mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>>):
+    Missing nullability on method `mapByPage` return
+MissingNullability: androidx.paging.DataSource.Factory#map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue>):
+    Missing nullability on method `map` return
+MissingNullability: androidx.paging.DataSource.Factory#mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>>):
+    Missing nullability on method `mapByPage` return
+MissingNullability: androidx.paging.PagedListConfigKt#Config(int, int, boolean, int, int):
+    Missing nullability on method `Config` return
+MissingNullability: androidx.paging.PagingDataTransforms#filter(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super java.lang.Boolean>,?>):
+    Missing nullability on method `filter` return
+MissingNullability: androidx.paging.PagingDataTransforms#flatMap(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super java.lang.Iterable<? extends R>>,?>):
+    Missing nullability on method `flatMap` return
+MissingNullability: androidx.paging.PagingDataTransforms#insertSeparators(androidx.paging.PagingData<T>, androidx.paging.TerminalSeparatorType, kotlin.jvm.functions.Function3<? super T,? super T,? super kotlin.coroutines.Continuation<? super R>,?>):
+    Missing nullability on method `insertSeparators` return
+MissingNullability: androidx.paging.PagingDataTransforms#map(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super R>,?>):
+    Missing nullability on method `map` return
diff --git a/paging/paging-common/api/current.ignore b/paging/paging-common/api/current.ignore
deleted file mode 100644
index 97a4c77..0000000
--- a/paging/paging-common/api/current.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-RemovedPackage: androidx.paging.multicast:
-    Removed package androidx.paging.multicast
diff --git a/paging/paging-common/api/current.txt b/paging/paging-common/api/current.txt
index cb81fc4..fa86c1f 100644
--- a/paging/paging-common/api/current.txt
+++ b/paging/paging-common/api/current.txt
@@ -27,7 +27,9 @@
     method @AnyThread public void invalidate();
     method @WorkerThread public boolean isInvalid();
     method public <ToValue> androidx.paging.DataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource<Key,ToValue>! map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
     method public <ToValue> androidx.paging.DataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource<Key,ToValue>! mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
     method @AnyThread public void removeInvalidatedCallback(androidx.paging.DataSource.InvalidatedCallback onInvalidatedCallback);
     property @WorkerThread public boolean isInvalid;
   }
@@ -38,7 +40,9 @@
     method public final kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> asPagingSourceFactory();
     method public abstract androidx.paging.DataSource<Key,Value> create();
     method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue>! map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
     method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue>! mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
   }
 
   public static fun interface DataSource.InvalidatedCallback {
@@ -259,9 +263,11 @@
   }
 
   public final class PagedListConfigKt {
+    method @kotlin.jvm.JvmSynthetic public static androidx.paging.PagedList.Config! Config(int pageSize, optional int prefetchDistance, optional boolean enablePlaceholders, optional int initialLoadSizeHint, optional int maxSize);
   }
 
   public final class PagedListKt {
+    method @Deprecated @kotlin.jvm.JvmSynthetic public static <Key extends java.lang.Object, Value> androidx.paging.PagedList<Value>! PagedList(androidx.paging.DataSource<Key,Value> dataSource, androidx.paging.PagedList.Config config, java.util.concurrent.Executor notifyExecutor, java.util.concurrent.Executor fetchExecutor, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional Key? initialKey);
   }
 
   public final class Pager<Key, Value> {
@@ -304,14 +310,18 @@
 
   public final class PagingDataTransforms {
     method @CheckResult public static <T> androidx.paging.PagingData<T> filter(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T> androidx.paging.PagingData<T>! filter(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super java.lang.Boolean>,?> predicate);
     method @CheckResult public static <T, R> androidx.paging.PagingData<R> flatMap(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,? extends java.lang.Iterable<? extends R>> transform);
+    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T extends java.lang.Object, R> androidx.paging.PagingData<R>! flatMap(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super java.lang.Iterable<? extends R>>,?> transform);
     method @CheckResult public static <T> androidx.paging.PagingData<T> insertFooterItem(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, T item);
     method @CheckResult public static <T> androidx.paging.PagingData<T> insertFooterItem(androidx.paging.PagingData<T>, T item);
     method @CheckResult public static <T> androidx.paging.PagingData<T> insertHeaderItem(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, T item);
     method @CheckResult public static <T> androidx.paging.PagingData<T> insertHeaderItem(androidx.paging.PagingData<T>, T item);
     method @CheckResult public static <R, T extends R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
     method @CheckResult public static <R, T extends R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
+    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T extends R, R> androidx.paging.PagingData<R>! insertSeparators(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, kotlin.jvm.functions.Function3<? super T,? super T,? super kotlin.coroutines.Continuation<? super R>,?> generator);
     method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T extends java.lang.Object, R> androidx.paging.PagingData<R>! map(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super R>,?> transform);
   }
 
   public abstract class PagingSource<Key, Value> {
diff --git a/paging/paging-common/api/public_plus_experimental_3.1.0-beta02.txt b/paging/paging-common/api/public_plus_experimental_3.1.0-beta02.txt
index 059daf7..52de171 100644
--- a/paging/paging-common/api/public_plus_experimental_3.1.0-beta02.txt
+++ b/paging/paging-common/api/public_plus_experimental_3.1.0-beta02.txt
@@ -27,7 +27,9 @@
     method @AnyThread public void invalidate();
     method @WorkerThread public boolean isInvalid();
     method public <ToValue> androidx.paging.DataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource<Key,ToValue>! map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
     method public <ToValue> androidx.paging.DataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource<Key,ToValue>! mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
     method @AnyThread public void removeInvalidatedCallback(androidx.paging.DataSource.InvalidatedCallback onInvalidatedCallback);
     property @WorkerThread public boolean isInvalid;
   }
@@ -38,7 +40,9 @@
     method public final kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> asPagingSourceFactory();
     method public abstract androidx.paging.DataSource<Key,Value> create();
     method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue>! map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
     method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue>! mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
   }
 
   public static fun interface DataSource.InvalidatedCallback {
@@ -262,9 +266,11 @@
   }
 
   public final class PagedListConfigKt {
+    method @kotlin.jvm.JvmSynthetic public static androidx.paging.PagedList.Config! Config(int pageSize, optional int prefetchDistance, optional boolean enablePlaceholders, optional int initialLoadSizeHint, optional int maxSize);
   }
 
   public final class PagedListKt {
+    method @Deprecated @kotlin.jvm.JvmSynthetic public static <Key extends java.lang.Object, Value> androidx.paging.PagedList<Value>! PagedList(androidx.paging.DataSource<Key,Value> dataSource, androidx.paging.PagedList.Config config, java.util.concurrent.Executor notifyExecutor, java.util.concurrent.Executor fetchExecutor, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional Key? initialKey);
   }
 
   public final class Pager<Key, Value> {
@@ -308,14 +314,18 @@
 
   public final class PagingDataTransforms {
     method @CheckResult public static <T> androidx.paging.PagingData<T> filter(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T> androidx.paging.PagingData<T>! filter(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super java.lang.Boolean>,?> predicate);
     method @CheckResult public static <T, R> androidx.paging.PagingData<R> flatMap(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,? extends java.lang.Iterable<? extends R>> transform);
+    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T extends java.lang.Object, R> androidx.paging.PagingData<R>! flatMap(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super java.lang.Iterable<? extends R>>,?> transform);
     method @CheckResult public static <T> androidx.paging.PagingData<T> insertFooterItem(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, T item);
     method @CheckResult public static <T> androidx.paging.PagingData<T> insertFooterItem(androidx.paging.PagingData<T>, T item);
     method @CheckResult public static <T> androidx.paging.PagingData<T> insertHeaderItem(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, T item);
     method @CheckResult public static <T> androidx.paging.PagingData<T> insertHeaderItem(androidx.paging.PagingData<T>, T item);
     method @CheckResult public static <R, T extends R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
     method @CheckResult public static <R, T extends R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
+    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T extends R, R> androidx.paging.PagingData<R>! insertSeparators(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, kotlin.jvm.functions.Function3<? super T,? super T,? super kotlin.coroutines.Continuation<? super R>,?> generator);
     method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T extends java.lang.Object, R> androidx.paging.PagingData<R>! map(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super R>,?> transform);
   }
 
   public abstract class PagingSource<Key, Value> {
diff --git a/paging/paging-common/api/public_plus_experimental_current.txt b/paging/paging-common/api/public_plus_experimental_current.txt
index 059daf7..52de171 100644
--- a/paging/paging-common/api/public_plus_experimental_current.txt
+++ b/paging/paging-common/api/public_plus_experimental_current.txt
@@ -27,7 +27,9 @@
     method @AnyThread public void invalidate();
     method @WorkerThread public boolean isInvalid();
     method public <ToValue> androidx.paging.DataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource<Key,ToValue>! map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
     method public <ToValue> androidx.paging.DataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource<Key,ToValue>! mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
     method @AnyThread public void removeInvalidatedCallback(androidx.paging.DataSource.InvalidatedCallback onInvalidatedCallback);
     property @WorkerThread public boolean isInvalid;
   }
@@ -38,7 +40,9 @@
     method public final kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> asPagingSourceFactory();
     method public abstract androidx.paging.DataSource<Key,Value> create();
     method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue>! map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
     method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue>! mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
   }
 
   public static fun interface DataSource.InvalidatedCallback {
@@ -262,9 +266,11 @@
   }
 
   public final class PagedListConfigKt {
+    method @kotlin.jvm.JvmSynthetic public static androidx.paging.PagedList.Config! Config(int pageSize, optional int prefetchDistance, optional boolean enablePlaceholders, optional int initialLoadSizeHint, optional int maxSize);
   }
 
   public final class PagedListKt {
+    method @Deprecated @kotlin.jvm.JvmSynthetic public static <Key extends java.lang.Object, Value> androidx.paging.PagedList<Value>! PagedList(androidx.paging.DataSource<Key,Value> dataSource, androidx.paging.PagedList.Config config, java.util.concurrent.Executor notifyExecutor, java.util.concurrent.Executor fetchExecutor, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional Key? initialKey);
   }
 
   public final class Pager<Key, Value> {
@@ -308,14 +314,18 @@
 
   public final class PagingDataTransforms {
     method @CheckResult public static <T> androidx.paging.PagingData<T> filter(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T> androidx.paging.PagingData<T>! filter(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super java.lang.Boolean>,?> predicate);
     method @CheckResult public static <T, R> androidx.paging.PagingData<R> flatMap(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,? extends java.lang.Iterable<? extends R>> transform);
+    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T extends java.lang.Object, R> androidx.paging.PagingData<R>! flatMap(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super java.lang.Iterable<? extends R>>,?> transform);
     method @CheckResult public static <T> androidx.paging.PagingData<T> insertFooterItem(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, T item);
     method @CheckResult public static <T> androidx.paging.PagingData<T> insertFooterItem(androidx.paging.PagingData<T>, T item);
     method @CheckResult public static <T> androidx.paging.PagingData<T> insertHeaderItem(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, T item);
     method @CheckResult public static <T> androidx.paging.PagingData<T> insertHeaderItem(androidx.paging.PagingData<T>, T item);
     method @CheckResult public static <R, T extends R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
     method @CheckResult public static <R, T extends R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
+    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T extends R, R> androidx.paging.PagingData<R>! insertSeparators(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, kotlin.jvm.functions.Function3<? super T,? super T,? super kotlin.coroutines.Continuation<? super R>,?> generator);
     method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T extends java.lang.Object, R> androidx.paging.PagingData<R>! map(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super R>,?> transform);
   }
 
   public abstract class PagingSource<Key, Value> {
diff --git a/paging/paging-common/api/restricted_3.1.0-beta02.txt b/paging/paging-common/api/restricted_3.1.0-beta02.txt
index cb81fc4..fa86c1f 100644
--- a/paging/paging-common/api/restricted_3.1.0-beta02.txt
+++ b/paging/paging-common/api/restricted_3.1.0-beta02.txt
@@ -27,7 +27,9 @@
     method @AnyThread public void invalidate();
     method @WorkerThread public boolean isInvalid();
     method public <ToValue> androidx.paging.DataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource<Key,ToValue>! map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
     method public <ToValue> androidx.paging.DataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource<Key,ToValue>! mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
     method @AnyThread public void removeInvalidatedCallback(androidx.paging.DataSource.InvalidatedCallback onInvalidatedCallback);
     property @WorkerThread public boolean isInvalid;
   }
@@ -38,7 +40,9 @@
     method public final kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> asPagingSourceFactory();
     method public abstract androidx.paging.DataSource<Key,Value> create();
     method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue>! map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
     method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue>! mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
   }
 
   public static fun interface DataSource.InvalidatedCallback {
@@ -259,9 +263,11 @@
   }
 
   public final class PagedListConfigKt {
+    method @kotlin.jvm.JvmSynthetic public static androidx.paging.PagedList.Config! Config(int pageSize, optional int prefetchDistance, optional boolean enablePlaceholders, optional int initialLoadSizeHint, optional int maxSize);
   }
 
   public final class PagedListKt {
+    method @Deprecated @kotlin.jvm.JvmSynthetic public static <Key extends java.lang.Object, Value> androidx.paging.PagedList<Value>! PagedList(androidx.paging.DataSource<Key,Value> dataSource, androidx.paging.PagedList.Config config, java.util.concurrent.Executor notifyExecutor, java.util.concurrent.Executor fetchExecutor, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional Key? initialKey);
   }
 
   public final class Pager<Key, Value> {
@@ -304,14 +310,18 @@
 
   public final class PagingDataTransforms {
     method @CheckResult public static <T> androidx.paging.PagingData<T> filter(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T> androidx.paging.PagingData<T>! filter(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super java.lang.Boolean>,?> predicate);
     method @CheckResult public static <T, R> androidx.paging.PagingData<R> flatMap(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,? extends java.lang.Iterable<? extends R>> transform);
+    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T extends java.lang.Object, R> androidx.paging.PagingData<R>! flatMap(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super java.lang.Iterable<? extends R>>,?> transform);
     method @CheckResult public static <T> androidx.paging.PagingData<T> insertFooterItem(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, T item);
     method @CheckResult public static <T> androidx.paging.PagingData<T> insertFooterItem(androidx.paging.PagingData<T>, T item);
     method @CheckResult public static <T> androidx.paging.PagingData<T> insertHeaderItem(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, T item);
     method @CheckResult public static <T> androidx.paging.PagingData<T> insertHeaderItem(androidx.paging.PagingData<T>, T item);
     method @CheckResult public static <R, T extends R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
     method @CheckResult public static <R, T extends R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
+    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T extends R, R> androidx.paging.PagingData<R>! insertSeparators(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, kotlin.jvm.functions.Function3<? super T,? super T,? super kotlin.coroutines.Continuation<? super R>,?> generator);
     method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T extends java.lang.Object, R> androidx.paging.PagingData<R>! map(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super R>,?> transform);
   }
 
   public abstract class PagingSource<Key, Value> {
diff --git a/paging/paging-common/api/restricted_current.ignore b/paging/paging-common/api/restricted_current.ignore
deleted file mode 100644
index 97a4c77..0000000
--- a/paging/paging-common/api/restricted_current.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-RemovedPackage: androidx.paging.multicast:
-    Removed package androidx.paging.multicast
diff --git a/paging/paging-common/api/restricted_current.txt b/paging/paging-common/api/restricted_current.txt
index cb81fc4..fa86c1f 100644
--- a/paging/paging-common/api/restricted_current.txt
+++ b/paging/paging-common/api/restricted_current.txt
@@ -27,7 +27,9 @@
     method @AnyThread public void invalidate();
     method @WorkerThread public boolean isInvalid();
     method public <ToValue> androidx.paging.DataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource<Key,ToValue>! map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
     method public <ToValue> androidx.paging.DataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource<Key,ToValue>! mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
     method @AnyThread public void removeInvalidatedCallback(androidx.paging.DataSource.InvalidatedCallback onInvalidatedCallback);
     property @WorkerThread public boolean isInvalid;
   }
@@ -38,7 +40,9 @@
     method public final kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> asPagingSourceFactory();
     method public abstract androidx.paging.DataSource<Key,Value> create();
     method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue>! map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
     method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+    method @kotlin.jvm.JvmSynthetic public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue>! mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
   }
 
   public static fun interface DataSource.InvalidatedCallback {
@@ -259,9 +263,11 @@
   }
 
   public final class PagedListConfigKt {
+    method @kotlin.jvm.JvmSynthetic public static androidx.paging.PagedList.Config! Config(int pageSize, optional int prefetchDistance, optional boolean enablePlaceholders, optional int initialLoadSizeHint, optional int maxSize);
   }
 
   public final class PagedListKt {
+    method @Deprecated @kotlin.jvm.JvmSynthetic public static <Key extends java.lang.Object, Value> androidx.paging.PagedList<Value>! PagedList(androidx.paging.DataSource<Key,Value> dataSource, androidx.paging.PagedList.Config config, java.util.concurrent.Executor notifyExecutor, java.util.concurrent.Executor fetchExecutor, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional Key? initialKey);
   }
 
   public final class Pager<Key, Value> {
@@ -304,14 +310,18 @@
 
   public final class PagingDataTransforms {
     method @CheckResult public static <T> androidx.paging.PagingData<T> filter(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T> androidx.paging.PagingData<T>! filter(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super java.lang.Boolean>,?> predicate);
     method @CheckResult public static <T, R> androidx.paging.PagingData<R> flatMap(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,? extends java.lang.Iterable<? extends R>> transform);
+    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T extends java.lang.Object, R> androidx.paging.PagingData<R>! flatMap(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super java.lang.Iterable<? extends R>>,?> transform);
     method @CheckResult public static <T> androidx.paging.PagingData<T> insertFooterItem(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, T item);
     method @CheckResult public static <T> androidx.paging.PagingData<T> insertFooterItem(androidx.paging.PagingData<T>, T item);
     method @CheckResult public static <T> androidx.paging.PagingData<T> insertHeaderItem(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, T item);
     method @CheckResult public static <T> androidx.paging.PagingData<T> insertHeaderItem(androidx.paging.PagingData<T>, T item);
     method @CheckResult public static <R, T extends R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
     method @CheckResult public static <R, T extends R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
+    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T extends R, R> androidx.paging.PagingData<R>! insertSeparators(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, kotlin.jvm.functions.Function3<? super T,? super T,? super kotlin.coroutines.Continuation<? super R>,?> generator);
     method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+    method @CheckResult @kotlin.jvm.JvmSynthetic public static <T extends java.lang.Object, R> androidx.paging.PagingData<R>! map(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super kotlin.coroutines.Continuation<? super R>,?> transform);
   }
 
   public abstract class PagingSource<Key, Value> {
diff --git a/playground-common/androidx-shared.properties b/playground-common/androidx-shared.properties
index 606adab..53c5c5f 100644
--- a/playground-common/androidx-shared.properties
+++ b/playground-common/androidx-shared.properties
@@ -24,6 +24,7 @@
 # This separation is necessary to ensure gradle can read certain properties
 # at configuration time.
 
+org.gradle.jvmargs=-Xmx8g -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParallelGC -Dkotlin.daemon.jvm.options=-XX:MaxMetaspaceSize=1g
 android.useAndroidX=true
 # Disable features we do not use
 android.defaults.buildfeatures.aidl=false
diff --git a/playground-common/playground.properties b/playground-common/playground.properties
index 2510bf3..cbada77 100644
--- a/playground-common/playground.properties
+++ b/playground-common/playground.properties
@@ -22,11 +22,10 @@
 # Android operating system, and which are packaged with your app"s APK
 # https://developer.android.com/topic/libraries/support-library/androidx-rn
 # Kotlin code style for this project: "official" or "obsolete":
-org.gradle.jvmargs=-Xmx2048m
 kotlin.code.style=official
 # Disable docs
 androidx.enableDocumentation=false
-androidx.playground.snapshotBuildId=7782543
-androidx.playground.metalavaBuildId=7743859
+androidx.playground.snapshotBuildId=7838424
+androidx.playground.metalavaBuildId=7813966
 androidx.playground.dokkaBuildId=7472101
 androidx.studio.type=playground
diff --git a/preference/preference-ktx/src/main/java/androidx/preference/PreferenceGroup.kt b/preference/preference-ktx/src/main/java/androidx/preference/PreferenceGroup.kt
index 4be53bd..b5b1a7e 100644
--- a/preference/preference-ktx/src/main/java/androidx/preference/PreferenceGroup.kt
+++ b/preference/preference-ktx/src/main/java/androidx/preference/PreferenceGroup.kt
@@ -30,7 +30,6 @@
  * @throws IndexOutOfBoundsException if index is less than 0 or greater than or equal to the count.
  */
 public operator fun PreferenceGroup.get(index: Int): Preference = getPreference(index)
-    ?: throw IndexOutOfBoundsException("Index: $index, Size: $preferenceCount")
 
 /** Returns `true` if `preference` is found in this preference group. */
 public operator fun PreferenceGroup.contains(preference: Preference): Boolean {
@@ -85,7 +84,7 @@
     object : MutableIterator<Preference> {
         private var index = 0
         override fun hasNext() = index < size
-        override fun next() = getPreference(index++) ?: throw IndexOutOfBoundsException()
+        override fun next() = getPreference(index++)
         override fun remove() {
             removePreference(getPreference(--index))
         }
diff --git a/preference/preference/api/api_lint.ignore b/preference/preference/api/api_lint.ignore
index 2f6c3aa..48e46d1 100644
--- a/preference/preference/api/api_lint.ignore
+++ b/preference/preference/api/api_lint.ignore
@@ -63,196 +63,32 @@
     Internal field mChecked must not be exposed
 
 
-MissingNullability: androidx.preference.CheckBoxPreference#CheckBoxPreference(android.content.Context) parameter #0:
-    Missing nullability on parameter `context` in method `CheckBoxPreference`
-MissingNullability: androidx.preference.CheckBoxPreference#CheckBoxPreference(android.content.Context, android.util.AttributeSet) parameter #0:
-    Missing nullability on parameter `context` in method `CheckBoxPreference`
-MissingNullability: androidx.preference.CheckBoxPreference#CheckBoxPreference(android.content.Context, android.util.AttributeSet) parameter #1:
-    Missing nullability on parameter `attrs` in method `CheckBoxPreference`
-MissingNullability: androidx.preference.CheckBoxPreference#CheckBoxPreference(android.content.Context, android.util.AttributeSet, int) parameter #0:
-    Missing nullability on parameter `context` in method `CheckBoxPreference`
-MissingNullability: androidx.preference.CheckBoxPreference#CheckBoxPreference(android.content.Context, android.util.AttributeSet, int) parameter #1:
-    Missing nullability on parameter `attrs` in method `CheckBoxPreference`
-MissingNullability: androidx.preference.CheckBoxPreference#CheckBoxPreference(android.content.Context, android.util.AttributeSet, int, int) parameter #0:
-    Missing nullability on parameter `context` in method `CheckBoxPreference`
-MissingNullability: androidx.preference.CheckBoxPreference#CheckBoxPreference(android.content.Context, android.util.AttributeSet, int, int) parameter #1:
-    Missing nullability on parameter `attrs` in method `CheckBoxPreference`
-MissingNullability: androidx.preference.CheckBoxPreference#onBindViewHolder(androidx.preference.PreferenceViewHolder) parameter #0:
-    Missing nullability on parameter `holder` in method `onBindViewHolder`
-MissingNullability: androidx.preference.DialogPreference#DialogPreference(android.content.Context) parameter #0:
-    Missing nullability on parameter `context` in method `DialogPreference`
-MissingNullability: androidx.preference.DialogPreference#DialogPreference(android.content.Context, android.util.AttributeSet) parameter #0:
-    Missing nullability on parameter `context` in method `DialogPreference`
-MissingNullability: androidx.preference.DialogPreference#DialogPreference(android.content.Context, android.util.AttributeSet) parameter #1:
-    Missing nullability on parameter `attrs` in method `DialogPreference`
-MissingNullability: androidx.preference.DialogPreference#DialogPreference(android.content.Context, android.util.AttributeSet, int) parameter #0:
-    Missing nullability on parameter `context` in method `DialogPreference`
-MissingNullability: androidx.preference.DialogPreference#DialogPreference(android.content.Context, android.util.AttributeSet, int) parameter #1:
-    Missing nullability on parameter `attrs` in method `DialogPreference`
-MissingNullability: androidx.preference.DialogPreference#DialogPreference(android.content.Context, android.util.AttributeSet, int, int) parameter #0:
-    Missing nullability on parameter `context` in method `DialogPreference`
-MissingNullability: androidx.preference.DialogPreference#DialogPreference(android.content.Context, android.util.AttributeSet, int, int) parameter #1:
-    Missing nullability on parameter `attrs` in method `DialogPreference`
-MissingNullability: androidx.preference.DialogPreference#getDialogIcon():
-    Missing nullability on method `getDialogIcon` return
-MissingNullability: androidx.preference.DialogPreference#getDialogMessage():
-    Missing nullability on method `getDialogMessage` return
-MissingNullability: androidx.preference.DialogPreference#getDialogTitle():
-    Missing nullability on method `getDialogTitle` return
-MissingNullability: androidx.preference.DialogPreference#getNegativeButtonText():
-    Missing nullability on method `getNegativeButtonText` return
-MissingNullability: androidx.preference.DialogPreference#getPositiveButtonText():
-    Missing nullability on method `getPositiveButtonText` return
-MissingNullability: androidx.preference.DialogPreference#setDialogIcon(android.graphics.drawable.Drawable) parameter #0:
-    Missing nullability on parameter `dialogIcon` in method `setDialogIcon`
-MissingNullability: androidx.preference.DialogPreference#setDialogMessage(CharSequence) parameter #0:
-    Missing nullability on parameter `dialogMessage` in method `setDialogMessage`
-MissingNullability: androidx.preference.DialogPreference#setDialogTitle(CharSequence) parameter #0:
-    Missing nullability on parameter `dialogTitle` in method `setDialogTitle`
-MissingNullability: androidx.preference.DialogPreference#setNegativeButtonText(CharSequence) parameter #0:
-    Missing nullability on parameter `negativeButtonText` in method `setNegativeButtonText`
-MissingNullability: androidx.preference.DialogPreference#setPositiveButtonText(CharSequence) parameter #0:
-    Missing nullability on parameter `positiveButtonText` in method `setPositiveButtonText`
-MissingNullability: androidx.preference.DropDownPreference#DropDownPreference(android.content.Context) parameter #0:
-    Missing nullability on parameter `context` in method `DropDownPreference`
-MissingNullability: androidx.preference.DropDownPreference#DropDownPreference(android.content.Context, android.util.AttributeSet) parameter #0:
-    Missing nullability on parameter `context` in method `DropDownPreference`
-MissingNullability: androidx.preference.DropDownPreference#DropDownPreference(android.content.Context, android.util.AttributeSet) parameter #1:
-    Missing nullability on parameter `attrs` in method `DropDownPreference`
-MissingNullability: androidx.preference.DropDownPreference#DropDownPreference(android.content.Context, android.util.AttributeSet, int) parameter #0:
-    Missing nullability on parameter `context` in method `DropDownPreference`
-MissingNullability: androidx.preference.DropDownPreference#DropDownPreference(android.content.Context, android.util.AttributeSet, int) parameter #1:
-    Missing nullability on parameter `attrs` in method `DropDownPreference`
-MissingNullability: androidx.preference.DropDownPreference#DropDownPreference(android.content.Context, android.util.AttributeSet, int, int) parameter #0:
-    Missing nullability on parameter `context` in method `DropDownPreference`
-MissingNullability: androidx.preference.DropDownPreference#DropDownPreference(android.content.Context, android.util.AttributeSet, int, int) parameter #1:
-    Missing nullability on parameter `attrs` in method `DropDownPreference`
-MissingNullability: androidx.preference.DropDownPreference#createAdapter():
-    Missing nullability on method `createAdapter` return
-MissingNullability: androidx.preference.DropDownPreference#onBindViewHolder(androidx.preference.PreferenceViewHolder) parameter #0:
-    Missing nullability on parameter `holder` in method `onBindViewHolder`
-MissingNullability: androidx.preference.EditTextPreference#EditTextPreference(android.content.Context) parameter #0:
-    Missing nullability on parameter `context` in method `EditTextPreference`
-MissingNullability: androidx.preference.EditTextPreference#EditTextPreference(android.content.Context, android.util.AttributeSet) parameter #0:
-    Missing nullability on parameter `context` in method `EditTextPreference`
-MissingNullability: androidx.preference.EditTextPreference#EditTextPreference(android.content.Context, android.util.AttributeSet) parameter #1:
-    Missing nullability on parameter `attrs` in method `EditTextPreference`
-MissingNullability: androidx.preference.EditTextPreference#EditTextPreference(android.content.Context, android.util.AttributeSet, int) parameter #0:
-    Missing nullability on parameter `context` in method `EditTextPreference`
-MissingNullability: androidx.preference.EditTextPreference#EditTextPreference(android.content.Context, android.util.AttributeSet, int) parameter #1:
-    Missing nullability on parameter `attrs` in method `EditTextPreference`
-MissingNullability: androidx.preference.EditTextPreference#EditTextPreference(android.content.Context, android.util.AttributeSet, int, int) parameter #0:
-    Missing nullability on parameter `context` in method `EditTextPreference`
-MissingNullability: androidx.preference.EditTextPreference#EditTextPreference(android.content.Context, android.util.AttributeSet, int, int) parameter #1:
-    Missing nullability on parameter `attrs` in method `EditTextPreference`
-MissingNullability: androidx.preference.EditTextPreference#getText():
-    Missing nullability on method `getText` return
 MissingNullability: androidx.preference.EditTextPreference#onGetDefaultValue(android.content.res.TypedArray, int):
     Missing nullability on method `onGetDefaultValue` return
-MissingNullability: androidx.preference.EditTextPreference#onGetDefaultValue(android.content.res.TypedArray, int) parameter #0:
-    Missing nullability on parameter `a` in method `onGetDefaultValue`
-MissingNullability: androidx.preference.EditTextPreference#onRestoreInstanceState(android.os.Parcelable) parameter #0:
-    Missing nullability on parameter `state` in method `onRestoreInstanceState`
-MissingNullability: androidx.preference.EditTextPreference#onSaveInstanceState():
-    Missing nullability on method `onSaveInstanceState` return
 MissingNullability: androidx.preference.EditTextPreference#onSetInitialValue(Object) parameter #0:
     Missing nullability on parameter `defaultValue` in method `onSetInitialValue`
-MissingNullability: androidx.preference.EditTextPreference#setText(String) parameter #0:
-    Missing nullability on parameter `text` in method `setText`
-MissingNullability: androidx.preference.EditTextPreference.SimpleSummaryProvider#getInstance():
-    Missing nullability on method `getInstance` return
-MissingNullability: androidx.preference.EditTextPreference.SimpleSummaryProvider#provideSummary(androidx.preference.EditTextPreference):
-    Missing nullability on method `provideSummary` return
-MissingNullability: androidx.preference.EditTextPreference.SimpleSummaryProvider#provideSummary(androidx.preference.EditTextPreference) parameter #0:
-    Missing nullability on parameter `preference` in method `provideSummary`
-MissingNullability: androidx.preference.EditTextPreferenceDialogFragment#onBindDialogView(android.view.View) parameter #0:
-    Missing nullability on parameter `view` in method `onBindDialogView`
-MissingNullability: androidx.preference.EditTextPreferenceDialogFragment#onCreate(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `savedInstanceState` in method `onCreate`
-MissingNullability: androidx.preference.EditTextPreferenceDialogFragmentCompat#newInstance(String):
-    Missing nullability on method `newInstance` return
 MissingNullability: androidx.preference.EditTextPreferenceDialogFragmentCompat#newInstance(String) parameter #0:
     Missing nullability on parameter `key` in method `newInstance`
-MissingNullability: androidx.preference.EditTextPreferenceDialogFragmentCompat#onBindDialogView(android.view.View) parameter #0:
-    Missing nullability on parameter `view` in method `onBindDialogView`
-MissingNullability: androidx.preference.EditTextPreferenceDialogFragmentCompat#onCreate(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `savedInstanceState` in method `onCreate`
-MissingNullability: androidx.preference.ListPreference#ListPreference(android.content.Context) parameter #0:
-    Missing nullability on parameter `context` in method `ListPreference`
-MissingNullability: androidx.preference.ListPreference#ListPreference(android.content.Context, android.util.AttributeSet) parameter #0:
-    Missing nullability on parameter `context` in method `ListPreference`
-MissingNullability: androidx.preference.ListPreference#ListPreference(android.content.Context, android.util.AttributeSet) parameter #1:
-    Missing nullability on parameter `attrs` in method `ListPreference`
-MissingNullability: androidx.preference.ListPreference#ListPreference(android.content.Context, android.util.AttributeSet, int) parameter #0:
-    Missing nullability on parameter `context` in method `ListPreference`
-MissingNullability: androidx.preference.ListPreference#ListPreference(android.content.Context, android.util.AttributeSet, int) parameter #1:
-    Missing nullability on parameter `attrs` in method `ListPreference`
-MissingNullability: androidx.preference.ListPreference#ListPreference(android.content.Context, android.util.AttributeSet, int, int) parameter #0:
-    Missing nullability on parameter `context` in method `ListPreference`
-MissingNullability: androidx.preference.ListPreference#ListPreference(android.content.Context, android.util.AttributeSet, int, int) parameter #1:
-    Missing nullability on parameter `attrs` in method `ListPreference`
 MissingNullability: androidx.preference.ListPreference#findIndexOfValue(String) parameter #0:
     Missing nullability on parameter `value` in method `findIndexOfValue`
 MissingNullability: androidx.preference.ListPreference#getEntries():
     Missing nullability on method `getEntries` return
-MissingNullability: androidx.preference.ListPreference#getEntry():
-    Missing nullability on method `getEntry` return
 MissingNullability: androidx.preference.ListPreference#getEntryValues():
     Missing nullability on method `getEntryValues` return
-MissingNullability: androidx.preference.ListPreference#getSummary():
-    Missing nullability on method `getSummary` return
 MissingNullability: androidx.preference.ListPreference#getValue():
     Missing nullability on method `getValue` return
 MissingNullability: androidx.preference.ListPreference#onGetDefaultValue(android.content.res.TypedArray, int):
     Missing nullability on method `onGetDefaultValue` return
-MissingNullability: androidx.preference.ListPreference#onGetDefaultValue(android.content.res.TypedArray, int) parameter #0:
-    Missing nullability on parameter `a` in method `onGetDefaultValue`
-MissingNullability: androidx.preference.ListPreference#onRestoreInstanceState(android.os.Parcelable) parameter #0:
-    Missing nullability on parameter `state` in method `onRestoreInstanceState`
-MissingNullability: androidx.preference.ListPreference#onSaveInstanceState():
-    Missing nullability on method `onSaveInstanceState` return
 MissingNullability: androidx.preference.ListPreference#onSetInitialValue(Object) parameter #0:
     Missing nullability on parameter `defaultValue` in method `onSetInitialValue`
 MissingNullability: androidx.preference.ListPreference#setEntries(CharSequence[]) parameter #0:
     Missing nullability on parameter `entries` in method `setEntries`
 MissingNullability: androidx.preference.ListPreference#setEntryValues(CharSequence[]) parameter #0:
     Missing nullability on parameter `entryValues` in method `setEntryValues`
-MissingNullability: androidx.preference.ListPreference#setSummary(CharSequence) parameter #0:
-    Missing nullability on parameter `summary` in method `setSummary`
 MissingNullability: androidx.preference.ListPreference#setValue(String) parameter #0:
     Missing nullability on parameter `value` in method `setValue`
-MissingNullability: androidx.preference.ListPreference.SimpleSummaryProvider#getInstance():
-    Missing nullability on method `getInstance` return
-MissingNullability: androidx.preference.ListPreference.SimpleSummaryProvider#provideSummary(androidx.preference.ListPreference):
-    Missing nullability on method `provideSummary` return
-MissingNullability: androidx.preference.ListPreference.SimpleSummaryProvider#provideSummary(androidx.preference.ListPreference) parameter #0:
-    Missing nullability on parameter `preference` in method `provideSummary`
-MissingNullability: androidx.preference.ListPreferenceDialogFragment#onCreate(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `savedInstanceState` in method `onCreate`
-MissingNullability: androidx.preference.ListPreferenceDialogFragment#onPrepareDialogBuilder(android.app.AlertDialog.Builder) parameter #0:
-    Missing nullability on parameter `builder` in method `onPrepareDialogBuilder`
-MissingNullability: androidx.preference.ListPreferenceDialogFragmentCompat#newInstance(String):
-    Missing nullability on method `newInstance` return
 MissingNullability: androidx.preference.ListPreferenceDialogFragmentCompat#newInstance(String) parameter #0:
     Missing nullability on parameter `key` in method `newInstance`
-MissingNullability: androidx.preference.ListPreferenceDialogFragmentCompat#onCreate(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `savedInstanceState` in method `onCreate`
-MissingNullability: androidx.preference.ListPreferenceDialogFragmentCompat#onPrepareDialogBuilder(androidx.appcompat.app.AlertDialog.Builder) parameter #0:
-    Missing nullability on parameter `builder` in method `onPrepareDialogBuilder`
-MissingNullability: androidx.preference.MultiSelectListPreference#MultiSelectListPreference(android.content.Context) parameter #0:
-    Missing nullability on parameter `context` in method `MultiSelectListPreference`
-MissingNullability: androidx.preference.MultiSelectListPreference#MultiSelectListPreference(android.content.Context, android.util.AttributeSet) parameter #0:
-    Missing nullability on parameter `context` in method `MultiSelectListPreference`
-MissingNullability: androidx.preference.MultiSelectListPreference#MultiSelectListPreference(android.content.Context, android.util.AttributeSet) parameter #1:
-    Missing nullability on parameter `attrs` in method `MultiSelectListPreference`
-MissingNullability: androidx.preference.MultiSelectListPreference#MultiSelectListPreference(android.content.Context, android.util.AttributeSet, int) parameter #0:
-    Missing nullability on parameter `context` in method `MultiSelectListPreference`
-MissingNullability: androidx.preference.MultiSelectListPreference#MultiSelectListPreference(android.content.Context, android.util.AttributeSet, int) parameter #1:
-    Missing nullability on parameter `attrs` in method `MultiSelectListPreference`
-MissingNullability: androidx.preference.MultiSelectListPreference#MultiSelectListPreference(android.content.Context, android.util.AttributeSet, int, int) parameter #0:
-    Missing nullability on parameter `context` in method `MultiSelectListPreference`
-MissingNullability: androidx.preference.MultiSelectListPreference#MultiSelectListPreference(android.content.Context, android.util.AttributeSet, int, int) parameter #1:
-    Missing nullability on parameter `attrs` in method `MultiSelectListPreference`
 MissingNullability: androidx.preference.MultiSelectListPreference#findIndexOfValue(String) parameter #0:
     Missing nullability on parameter `value` in method `findIndexOfValue`
 MissingNullability: androidx.preference.MultiSelectListPreference#getEntries():
@@ -263,14 +99,6 @@
     Missing nullability on method `getSelectedItems` return
 MissingNullability: androidx.preference.MultiSelectListPreference#getValues():
     Missing nullability on method `getValues` return
-MissingNullability: androidx.preference.MultiSelectListPreference#onGetDefaultValue(android.content.res.TypedArray, int):
-    Missing nullability on method `onGetDefaultValue` return
-MissingNullability: androidx.preference.MultiSelectListPreference#onGetDefaultValue(android.content.res.TypedArray, int) parameter #0:
-    Missing nullability on parameter `a` in method `onGetDefaultValue`
-MissingNullability: androidx.preference.MultiSelectListPreference#onRestoreInstanceState(android.os.Parcelable) parameter #0:
-    Missing nullability on parameter `state` in method `onRestoreInstanceState`
-MissingNullability: androidx.preference.MultiSelectListPreference#onSaveInstanceState():
-    Missing nullability on method `onSaveInstanceState` return
 MissingNullability: androidx.preference.MultiSelectListPreference#onSetInitialValue(Object) parameter #0:
     Missing nullability on parameter `defaultValue` in method `onSetInitialValue`
 MissingNullability: androidx.preference.MultiSelectListPreference#setEntries(CharSequence[]) parameter #0:
@@ -281,50 +109,12 @@
     Missing nullability on parameter `values` in method `setValues`
 MissingNullability: androidx.preference.MultiSelectListPreferenceDialogFragment#onCreate(android.os.Bundle) parameter #0:
     Missing nullability on parameter `savedInstanceState` in method `onCreate`
-MissingNullability: androidx.preference.MultiSelectListPreferenceDialogFragment#onPrepareDialogBuilder(android.app.AlertDialog.Builder) parameter #0:
-    Missing nullability on parameter `builder` in method `onPrepareDialogBuilder`
-MissingNullability: androidx.preference.MultiSelectListPreferenceDialogFragmentCompat#newInstance(String):
-    Missing nullability on method `newInstance` return
 MissingNullability: androidx.preference.MultiSelectListPreferenceDialogFragmentCompat#newInstance(String) parameter #0:
     Missing nullability on parameter `key` in method `newInstance`
-MissingNullability: androidx.preference.MultiSelectListPreferenceDialogFragmentCompat#onCreate(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `savedInstanceState` in method `onCreate`
-MissingNullability: androidx.preference.MultiSelectListPreferenceDialogFragmentCompat#onPrepareDialogBuilder(androidx.appcompat.app.AlertDialog.Builder) parameter #0:
-    Missing nullability on parameter `builder` in method `onPrepareDialogBuilder`
-MissingNullability: androidx.preference.Preference#Preference(android.content.Context) parameter #0:
-    Missing nullability on parameter `context` in method `Preference`
-MissingNullability: androidx.preference.Preference#Preference(android.content.Context, android.util.AttributeSet) parameter #0:
-    Missing nullability on parameter `context` in method `Preference`
-MissingNullability: androidx.preference.Preference#Preference(android.content.Context, android.util.AttributeSet) parameter #1:
-    Missing nullability on parameter `attrs` in method `Preference`
-MissingNullability: androidx.preference.Preference#Preference(android.content.Context, android.util.AttributeSet, int) parameter #0:
-    Missing nullability on parameter `context` in method `Preference`
-MissingNullability: androidx.preference.Preference#Preference(android.content.Context, android.util.AttributeSet, int) parameter #1:
-    Missing nullability on parameter `attrs` in method `Preference`
-MissingNullability: androidx.preference.Preference#Preference(android.content.Context, android.util.AttributeSet, int, int) parameter #0:
-    Missing nullability on parameter `context` in method `Preference`
-MissingNullability: androidx.preference.Preference#Preference(android.content.Context, android.util.AttributeSet, int, int) parameter #1:
-    Missing nullability on parameter `attrs` in method `Preference`
 MissingNullability: androidx.preference.Preference#callChangeListener(Object) parameter #0:
     Missing nullability on parameter `newValue` in method `callChangeListener`
-MissingNullability: androidx.preference.Preference#getContext():
-    Missing nullability on method `getContext` return
-MissingNullability: androidx.preference.Preference#getDependency():
-    Missing nullability on method `getDependency` return
-MissingNullability: androidx.preference.Preference#getExtras():
-    Missing nullability on method `getExtras` return
-MissingNullability: androidx.preference.Preference#getFragment():
-    Missing nullability on method `getFragment` return
-MissingNullability: androidx.preference.Preference#getIcon():
-    Missing nullability on method `getIcon` return
-MissingNullability: androidx.preference.Preference#getIntent():
-    Missing nullability on method `getIntent` return
 MissingNullability: androidx.preference.Preference#getKey():
     Missing nullability on method `getKey` return
-MissingNullability: androidx.preference.Preference#getOnPreferenceChangeListener():
-    Missing nullability on method `getOnPreferenceChangeListener` return
-MissingNullability: androidx.preference.Preference#getOnPreferenceClickListener():
-    Missing nullability on method `getOnPreferenceClickListener` return
 MissingNullability: androidx.preference.Preference#getPersistedString(String):
     Missing nullability on method `getPersistedString` return
 MissingNullability: androidx.preference.Preference#getPersistedString(String) parameter #0:
@@ -335,90 +125,20 @@
     Missing nullability on parameter `defaultReturnValue` in method `getPersistedStringSet`
 MissingNullability: androidx.preference.Preference#getPreferenceManager():
     Missing nullability on method `getPreferenceManager` return
-MissingNullability: androidx.preference.Preference#getSharedPreferences():
-    Missing nullability on method `getSharedPreferences` return
-MissingNullability: androidx.preference.Preference#getSummary():
-    Missing nullability on method `getSummary` return
-MissingNullability: androidx.preference.Preference#getTitle():
-    Missing nullability on method `getTitle` return
-MissingNullability: androidx.preference.Preference#onAttachedToHierarchy(androidx.preference.PreferenceManager) parameter #0:
-    Missing nullability on parameter `preferenceManager` in method `onAttachedToHierarchy`
-MissingNullability: androidx.preference.Preference#onBindViewHolder(androidx.preference.PreferenceViewHolder) parameter #0:
-    Missing nullability on parameter `holder` in method `onBindViewHolder`
-MissingNullability: androidx.preference.Preference#onDependencyChanged(androidx.preference.Preference, boolean) parameter #0:
-    Missing nullability on parameter `dependency` in method `onDependencyChanged`
-MissingNullability: androidx.preference.Preference#onGetDefaultValue(android.content.res.TypedArray, int):
-    Missing nullability on method `onGetDefaultValue` return
-MissingNullability: androidx.preference.Preference#onGetDefaultValue(android.content.res.TypedArray, int) parameter #0:
-    Missing nullability on parameter `a` in method `onGetDefaultValue`
-MissingNullability: androidx.preference.Preference#onParentChanged(androidx.preference.Preference, boolean) parameter #0:
-    Missing nullability on parameter `parent` in method `onParentChanged`
-MissingNullability: androidx.preference.Preference#onRestoreInstanceState(android.os.Parcelable) parameter #0:
-    Missing nullability on parameter `state` in method `onRestoreInstanceState`
-MissingNullability: androidx.preference.Preference#onSaveInstanceState():
-    Missing nullability on method `onSaveInstanceState` return
-MissingNullability: androidx.preference.Preference#peekExtras():
-    Missing nullability on method `peekExtras` return
 MissingNullability: androidx.preference.Preference#persistString(String) parameter #0:
     Missing nullability on parameter `value` in method `persistString`
 MissingNullability: androidx.preference.Preference#persistStringSet(java.util.Set<java.lang.String>) parameter #0:
     Missing nullability on parameter `values` in method `persistStringSet`
-MissingNullability: androidx.preference.Preference#restoreHierarchyState(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `container` in method `restoreHierarchyState`
-MissingNullability: androidx.preference.Preference#saveHierarchyState(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `container` in method `saveHierarchyState`
 MissingNullability: androidx.preference.Preference#setDefaultValue(Object) parameter #0:
     Missing nullability on parameter `defaultValue` in method `setDefaultValue`
-MissingNullability: androidx.preference.Preference#setDependency(String) parameter #0:
-    Missing nullability on parameter `dependencyKey` in method `setDependency`
-MissingNullability: androidx.preference.Preference#setFragment(String) parameter #0:
-    Missing nullability on parameter `fragment` in method `setFragment`
-MissingNullability: androidx.preference.Preference#setIcon(android.graphics.drawable.Drawable) parameter #0:
-    Missing nullability on parameter `icon` in method `setIcon`
-MissingNullability: androidx.preference.Preference#setIntent(android.content.Intent) parameter #0:
-    Missing nullability on parameter `intent` in method `setIntent`
 MissingNullability: androidx.preference.Preference#setKey(String) parameter #0:
     Missing nullability on parameter `key` in method `setKey`
-MissingNullability: androidx.preference.Preference#setOnPreferenceChangeListener(androidx.preference.Preference.OnPreferenceChangeListener) parameter #0:
-    Missing nullability on parameter `onPreferenceChangeListener` in method `setOnPreferenceChangeListener`
-MissingNullability: androidx.preference.Preference#setOnPreferenceClickListener(androidx.preference.Preference.OnPreferenceClickListener) parameter #0:
-    Missing nullability on parameter `onPreferenceClickListener` in method `setOnPreferenceClickListener`
-MissingNullability: androidx.preference.Preference#setPreferenceDataStore(androidx.preference.PreferenceDataStore) parameter #0:
-    Missing nullability on parameter `dataStore` in method `setPreferenceDataStore`
-MissingNullability: androidx.preference.Preference#setSummary(CharSequence) parameter #0:
-    Missing nullability on parameter `summary` in method `setSummary`
-MissingNullability: androidx.preference.Preference#setTitle(CharSequence) parameter #0:
-    Missing nullability on parameter `title` in method `setTitle`
 MissingNullability: androidx.preference.Preference.BaseSavedState#BaseSavedState(android.os.Parcel) parameter #0:
     Missing nullability on parameter `source` in method `BaseSavedState`
 MissingNullability: androidx.preference.Preference.BaseSavedState#BaseSavedState(android.os.Parcelable) parameter #0:
     Missing nullability on parameter `superState` in method `BaseSavedState`
-MissingNullability: androidx.preference.Preference.BaseSavedState#CREATOR:
-    Missing nullability on field `CREATOR` in class `class androidx.preference.Preference.BaseSavedState`
-MissingNullability: androidx.preference.Preference.OnPreferenceChangeListener#onPreferenceChange(androidx.preference.Preference, Object) parameter #0:
-    Missing nullability on parameter `preference` in method `onPreferenceChange`
 MissingNullability: androidx.preference.Preference.OnPreferenceChangeListener#onPreferenceChange(androidx.preference.Preference, Object) parameter #1:
     Missing nullability on parameter `newValue` in method `onPreferenceChange`
-MissingNullability: androidx.preference.Preference.OnPreferenceClickListener#onPreferenceClick(androidx.preference.Preference) parameter #0:
-    Missing nullability on parameter `preference` in method `onPreferenceClick`
-MissingNullability: androidx.preference.Preference.SummaryProvider#provideSummary(T):
-    Missing nullability on method `provideSummary` return
-MissingNullability: androidx.preference.PreferenceCategory#PreferenceCategory(android.content.Context) parameter #0:
-    Missing nullability on parameter `context` in method `PreferenceCategory`
-MissingNullability: androidx.preference.PreferenceCategory#PreferenceCategory(android.content.Context, android.util.AttributeSet) parameter #0:
-    Missing nullability on parameter `context` in method `PreferenceCategory`
-MissingNullability: androidx.preference.PreferenceCategory#PreferenceCategory(android.content.Context, android.util.AttributeSet) parameter #1:
-    Missing nullability on parameter `attrs` in method `PreferenceCategory`
-MissingNullability: androidx.preference.PreferenceCategory#PreferenceCategory(android.content.Context, android.util.AttributeSet, int) parameter #0:
-    Missing nullability on parameter `context` in method `PreferenceCategory`
-MissingNullability: androidx.preference.PreferenceCategory#PreferenceCategory(android.content.Context, android.util.AttributeSet, int) parameter #1:
-    Missing nullability on parameter `attrs` in method `PreferenceCategory`
-MissingNullability: androidx.preference.PreferenceCategory#PreferenceCategory(android.content.Context, android.util.AttributeSet, int, int) parameter #0:
-    Missing nullability on parameter `context` in method `PreferenceCategory`
-MissingNullability: androidx.preference.PreferenceCategory#PreferenceCategory(android.content.Context, android.util.AttributeSet, int, int) parameter #1:
-    Missing nullability on parameter `attrs` in method `PreferenceCategory`
-MissingNullability: androidx.preference.PreferenceCategory#onBindViewHolder(androidx.preference.PreferenceViewHolder) parameter #0:
-    Missing nullability on parameter `holder` in method `onBindViewHolder`
 MissingNullability: androidx.preference.PreferenceDataStore#getBoolean(String, boolean) parameter #0:
     Missing nullability on parameter `key` in method `getBoolean`
 MissingNullability: androidx.preference.PreferenceDataStore#getFloat(String, float) parameter #0:
@@ -443,314 +163,34 @@
     Missing nullability on parameter `key` in method `putString`
 MissingNullability: androidx.preference.PreferenceDataStore#putStringSet(String, java.util.Set<java.lang.String>) parameter #0:
     Missing nullability on parameter `key` in method `putStringSet`
-MissingNullability: androidx.preference.PreferenceDialogFragment#onCreate(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `savedInstanceState` in method `onCreate`
-MissingNullability: androidx.preference.PreferenceDialogFragment#onCreateDialog(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `savedInstanceState` in method `onCreateDialog`
-MissingNullability: androidx.preference.PreferenceDialogFragment#onDismiss(android.content.DialogInterface) parameter #0:
-    Missing nullability on parameter `dialog` in method `onDismiss`
 MissingNullability: androidx.preference.PreferenceDialogFragmentCompat#getPreference():
     Missing nullability on method `getPreference` return
-MissingNullability: androidx.preference.PreferenceDialogFragmentCompat#onBindDialogView(android.view.View) parameter #0:
-    Missing nullability on parameter `view` in method `onBindDialogView`
-MissingNullability: androidx.preference.PreferenceDialogFragmentCompat#onClick(android.content.DialogInterface, int) parameter #0:
-    Missing nullability on parameter `dialog` in method `onClick`
-MissingNullability: androidx.preference.PreferenceDialogFragmentCompat#onCreate(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `savedInstanceState` in method `onCreate`
-MissingNullability: androidx.preference.PreferenceDialogFragmentCompat#onCreateDialog(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `savedInstanceState` in method `onCreateDialog`
-MissingNullability: androidx.preference.PreferenceDialogFragmentCompat#onCreateDialogView(android.content.Context):
-    Missing nullability on method `onCreateDialogView` return
-MissingNullability: androidx.preference.PreferenceDialogFragmentCompat#onCreateDialogView(android.content.Context) parameter #0:
-    Missing nullability on parameter `context` in method `onCreateDialogView`
-MissingNullability: androidx.preference.PreferenceDialogFragmentCompat#onPrepareDialogBuilder(androidx.appcompat.app.AlertDialog.Builder) parameter #0:
-    Missing nullability on parameter `builder` in method `onPrepareDialogBuilder`
-MissingNullability: androidx.preference.PreferenceFragment#onCreate(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `savedInstanceState` in method `onCreate`
-MissingNullability: androidx.preference.PreferenceFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle):
-    Missing nullability on method `onCreateView` return
-MissingNullability: androidx.preference.PreferenceFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #0:
-    Missing nullability on parameter `inflater` in method `onCreateView`
-MissingNullability: androidx.preference.PreferenceFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `container` in method `onCreateView`
-MissingNullability: androidx.preference.PreferenceFragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #2:
-    Missing nullability on parameter `savedInstanceState` in method `onCreateView`
-MissingNullability: androidx.preference.PreferenceFragment#onSaveInstanceState(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `outState` in method `onSaveInstanceState`
-MissingNullability: androidx.preference.PreferenceFragment#onViewCreated(android.view.View, android.os.Bundle) parameter #0:
-    Missing nullability on parameter `view` in method `onViewCreated`
-MissingNullability: androidx.preference.PreferenceFragment#onViewCreated(android.view.View, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `savedInstanceState` in method `onViewCreated`
-MissingNullability: androidx.preference.PreferenceFragment.OnPreferenceDisplayDialogCallback#onPreferenceDisplayDialog(androidx.preference.PreferenceFragment, androidx.preference.Preference) parameter #1:
-    Missing nullability on parameter `pref` in method `onPreferenceDisplayDialog`
-MissingNullability: androidx.preference.PreferenceFragment.OnPreferenceStartFragmentCallback#onPreferenceStartFragment(androidx.preference.PreferenceFragment, androidx.preference.Preference) parameter #0:
-    Missing nullability on parameter `caller` in method `onPreferenceStartFragment`
-MissingNullability: androidx.preference.PreferenceFragment.OnPreferenceStartFragmentCallback#onPreferenceStartFragment(androidx.preference.PreferenceFragment, androidx.preference.Preference) parameter #1:
-    Missing nullability on parameter `pref` in method `onPreferenceStartFragment`
-MissingNullability: androidx.preference.PreferenceFragment.OnPreferenceStartScreenCallback#onPreferenceStartScreen(androidx.preference.PreferenceFragment, androidx.preference.PreferenceScreen) parameter #0:
-    Missing nullability on parameter `caller` in method `onPreferenceStartScreen`
-MissingNullability: androidx.preference.PreferenceFragment.OnPreferenceStartScreenCallback#onPreferenceStartScreen(androidx.preference.PreferenceFragment, androidx.preference.PreferenceScreen) parameter #1:
-    Missing nullability on parameter `pref` in method `onPreferenceStartScreen`
 MissingNullability: androidx.preference.PreferenceFragmentCompat#getListView():
     Missing nullability on method `getListView` return
 MissingNullability: androidx.preference.PreferenceFragmentCompat#getPreferenceManager():
     Missing nullability on method `getPreferenceManager` return
 MissingNullability: androidx.preference.PreferenceFragmentCompat#getPreferenceScreen():
     Missing nullability on method `getPreferenceScreen` return
-MissingNullability: androidx.preference.PreferenceFragmentCompat#onCreateAdapter(androidx.preference.PreferenceScreen):
-    Missing nullability on method `onCreateAdapter` return
-MissingNullability: androidx.preference.PreferenceFragmentCompat#onCreateAdapter(androidx.preference.PreferenceScreen) parameter #0:
-    Missing nullability on parameter `preferenceScreen` in method `onCreateAdapter`
-MissingNullability: androidx.preference.PreferenceFragmentCompat#onCreateLayoutManager():
-    Missing nullability on method `onCreateLayoutManager` return
-MissingNullability: androidx.preference.PreferenceFragmentCompat#onCreatePreferences(android.os.Bundle, String) parameter #0:
-    Missing nullability on parameter `savedInstanceState` in method `onCreatePreferences`
-MissingNullability: androidx.preference.PreferenceFragmentCompat#onCreatePreferences(android.os.Bundle, String) parameter #1:
-    Missing nullability on parameter `rootKey` in method `onCreatePreferences`
-MissingNullability: androidx.preference.PreferenceFragmentCompat#onCreateRecyclerView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle):
-    Missing nullability on method `onCreateRecyclerView` return
-MissingNullability: androidx.preference.PreferenceFragmentCompat#onCreateRecyclerView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #0:
-    Missing nullability on parameter `inflater` in method `onCreateRecyclerView`
-MissingNullability: androidx.preference.PreferenceFragmentCompat#onCreateRecyclerView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #1:
-    Missing nullability on parameter `parent` in method `onCreateRecyclerView`
-MissingNullability: androidx.preference.PreferenceFragmentCompat#onCreateRecyclerView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) parameter #2:
-    Missing nullability on parameter `savedInstanceState` in method `onCreateRecyclerView`
-MissingNullability: androidx.preference.PreferenceFragmentCompat#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle):
-    Missing nullability on method `onCreateView` return
-MissingNullability: androidx.preference.PreferenceFragmentCompat#onDisplayPreferenceDialog(androidx.preference.Preference) parameter #0:
-    Missing nullability on parameter `preference` in method `onDisplayPreferenceDialog`
-MissingNullability: androidx.preference.PreferenceFragmentCompat#onNavigateToScreen(androidx.preference.PreferenceScreen) parameter #0:
-    Missing nullability on parameter `preferenceScreen` in method `onNavigateToScreen`
-MissingNullability: androidx.preference.PreferenceFragmentCompat#onPreferenceTreeClick(androidx.preference.Preference) parameter #0:
-    Missing nullability on parameter `preference` in method `onPreferenceTreeClick`
-MissingNullability: androidx.preference.PreferenceFragmentCompat#scrollToPreference(String) parameter #0:
-    Missing nullability on parameter `key` in method `scrollToPreference`
-MissingNullability: androidx.preference.PreferenceFragmentCompat#scrollToPreference(androidx.preference.Preference) parameter #0:
-    Missing nullability on parameter `preference` in method `scrollToPreference`
-MissingNullability: androidx.preference.PreferenceFragmentCompat#setDivider(android.graphics.drawable.Drawable) parameter #0:
-    Missing nullability on parameter `divider` in method `setDivider`
 MissingNullability: androidx.preference.PreferenceFragmentCompat#setPreferenceScreen(androidx.preference.PreferenceScreen) parameter #0:
     Missing nullability on parameter `preferenceScreen` in method `setPreferenceScreen`
-MissingNullability: androidx.preference.PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback#onPreferenceDisplayDialog(androidx.preference.PreferenceFragmentCompat, androidx.preference.Preference) parameter #1:
-    Missing nullability on parameter `pref` in method `onPreferenceDisplayDialog`
-MissingNullability: androidx.preference.PreferenceFragmentCompat.OnPreferenceStartFragmentCallback#onPreferenceStartFragment(androidx.preference.PreferenceFragmentCompat, androidx.preference.Preference) parameter #0:
-    Missing nullability on parameter `caller` in method `onPreferenceStartFragment`
-MissingNullability: androidx.preference.PreferenceFragmentCompat.OnPreferenceStartFragmentCallback#onPreferenceStartFragment(androidx.preference.PreferenceFragmentCompat, androidx.preference.Preference) parameter #1:
-    Missing nullability on parameter `pref` in method `onPreferenceStartFragment`
-MissingNullability: androidx.preference.PreferenceFragmentCompat.OnPreferenceStartScreenCallback#onPreferenceStartScreen(androidx.preference.PreferenceFragmentCompat, androidx.preference.PreferenceScreen) parameter #0:
-    Missing nullability on parameter `caller` in method `onPreferenceStartScreen`
-MissingNullability: androidx.preference.PreferenceFragmentCompat.OnPreferenceStartScreenCallback#onPreferenceStartScreen(androidx.preference.PreferenceFragmentCompat, androidx.preference.PreferenceScreen) parameter #1:
-    Missing nullability on parameter `pref` in method `onPreferenceStartScreen`
-MissingNullability: androidx.preference.PreferenceGroup#PreferenceGroup(android.content.Context, android.util.AttributeSet) parameter #0:
-    Missing nullability on parameter `context` in method `PreferenceGroup`
-MissingNullability: androidx.preference.PreferenceGroup#PreferenceGroup(android.content.Context, android.util.AttributeSet) parameter #1:
-    Missing nullability on parameter `attrs` in method `PreferenceGroup`
-MissingNullability: androidx.preference.PreferenceGroup#PreferenceGroup(android.content.Context, android.util.AttributeSet, int) parameter #0:
-    Missing nullability on parameter `context` in method `PreferenceGroup`
-MissingNullability: androidx.preference.PreferenceGroup#PreferenceGroup(android.content.Context, android.util.AttributeSet, int) parameter #1:
-    Missing nullability on parameter `attrs` in method `PreferenceGroup`
-MissingNullability: androidx.preference.PreferenceGroup#PreferenceGroup(android.content.Context, android.util.AttributeSet, int, int) parameter #0:
-    Missing nullability on parameter `context` in method `PreferenceGroup`
-MissingNullability: androidx.preference.PreferenceGroup#PreferenceGroup(android.content.Context, android.util.AttributeSet, int, int) parameter #1:
-    Missing nullability on parameter `attrs` in method `PreferenceGroup`
-MissingNullability: androidx.preference.PreferenceGroup#addItemFromInflater(androidx.preference.Preference) parameter #0:
-    Missing nullability on parameter `preference` in method `addItemFromInflater`
-MissingNullability: androidx.preference.PreferenceGroup#addPreference(androidx.preference.Preference) parameter #0:
-    Missing nullability on parameter `preference` in method `addPreference`
-MissingNullability: androidx.preference.PreferenceGroup#dispatchRestoreInstanceState(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `container` in method `dispatchRestoreInstanceState`
-MissingNullability: androidx.preference.PreferenceGroup#dispatchSaveInstanceState(android.os.Bundle) parameter #0:
-    Missing nullability on parameter `container` in method `dispatchSaveInstanceState`
-MissingNullability: androidx.preference.PreferenceGroup#getPreference(int):
-    Missing nullability on method `getPreference` return
-MissingNullability: androidx.preference.PreferenceGroup#onPrepareAddPreference(androidx.preference.Preference) parameter #0:
-    Missing nullability on parameter `preference` in method `onPrepareAddPreference`
-MissingNullability: androidx.preference.PreferenceGroup#onRestoreInstanceState(android.os.Parcelable) parameter #0:
-    Missing nullability on parameter `state` in method `onRestoreInstanceState`
-MissingNullability: androidx.preference.PreferenceGroup#onSaveInstanceState():
-    Missing nullability on method `onSaveInstanceState` return
-MissingNullability: androidx.preference.PreferenceGroup#removePreference(androidx.preference.Preference) parameter #0:
-    Missing nullability on parameter `preference` in method `removePreference`
-MissingNullability: androidx.preference.PreferenceGroup.PreferencePositionCallback#getPreferenceAdapterPosition(String) parameter #0:
-    Missing nullability on parameter `key` in method `getPreferenceAdapterPosition`
-MissingNullability: androidx.preference.PreferenceGroup.PreferencePositionCallback#getPreferenceAdapterPosition(androidx.preference.Preference) parameter #0:
-    Missing nullability on parameter `preference` in method `getPreferenceAdapterPosition`
-MissingNullability: androidx.preference.PreferenceManager#createPreferenceScreen(android.content.Context):
-    Missing nullability on method `createPreferenceScreen` return
-MissingNullability: androidx.preference.PreferenceManager#createPreferenceScreen(android.content.Context) parameter #0:
-    Missing nullability on parameter `context` in method `createPreferenceScreen`
-MissingNullability: androidx.preference.PreferenceManager#getContext():
-    Missing nullability on method `getContext` return
 MissingNullability: androidx.preference.PreferenceManager#getDefaultSharedPreferences(android.content.Context):
     Missing nullability on method `getDefaultSharedPreferences` return
-MissingNullability: androidx.preference.PreferenceManager#getDefaultSharedPreferences(android.content.Context) parameter #0:
-    Missing nullability on parameter `context` in method `getDefaultSharedPreferences`
-MissingNullability: androidx.preference.PreferenceManager#getOnDisplayPreferenceDialogListener():
-    Missing nullability on method `getOnDisplayPreferenceDialogListener` return
-MissingNullability: androidx.preference.PreferenceManager#getOnNavigateToScreenListener():
-    Missing nullability on method `getOnNavigateToScreenListener` return
-MissingNullability: androidx.preference.PreferenceManager#getOnPreferenceTreeClickListener():
-    Missing nullability on method `getOnPreferenceTreeClickListener` return
-MissingNullability: androidx.preference.PreferenceManager#getPreferenceComparisonCallback():
-    Missing nullability on method `getPreferenceComparisonCallback` return
 MissingNullability: androidx.preference.PreferenceManager#getPreferenceScreen():
     Missing nullability on method `getPreferenceScreen` return
 MissingNullability: androidx.preference.PreferenceManager#getSharedPreferencesName():
     Missing nullability on method `getSharedPreferencesName` return
-MissingNullability: androidx.preference.PreferenceManager#setDefaultValues(android.content.Context, String, int, int, boolean) parameter #0:
-    Missing nullability on parameter `context` in method `setDefaultValues`
 MissingNullability: androidx.preference.PreferenceManager#setDefaultValues(android.content.Context, String, int, int, boolean) parameter #1:
     Missing nullability on parameter `sharedPreferencesName` in method `setDefaultValues`
-MissingNullability: androidx.preference.PreferenceManager#setDefaultValues(android.content.Context, int, boolean) parameter #0:
-    Missing nullability on parameter `context` in method `setDefaultValues`
-MissingNullability: androidx.preference.PreferenceManager#setOnDisplayPreferenceDialogListener(androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener) parameter #0:
-    Missing nullability on parameter `onDisplayPreferenceDialogListener` in method `setOnDisplayPreferenceDialogListener`
-MissingNullability: androidx.preference.PreferenceManager#setOnNavigateToScreenListener(androidx.preference.PreferenceManager.OnNavigateToScreenListener) parameter #0:
-    Missing nullability on parameter `listener` in method `setOnNavigateToScreenListener`
-MissingNullability: androidx.preference.PreferenceManager#setOnPreferenceTreeClickListener(androidx.preference.PreferenceManager.OnPreferenceTreeClickListener) parameter #0:
-    Missing nullability on parameter `listener` in method `setOnPreferenceTreeClickListener`
-MissingNullability: androidx.preference.PreferenceManager#setPreferenceComparisonCallback(androidx.preference.PreferenceManager.PreferenceComparisonCallback) parameter #0:
-    Missing nullability on parameter `preferenceComparisonCallback` in method `setPreferenceComparisonCallback`
-MissingNullability: androidx.preference.PreferenceManager#setPreferenceDataStore(androidx.preference.PreferenceDataStore) parameter #0:
-    Missing nullability on parameter `dataStore` in method `setPreferenceDataStore`
 MissingNullability: androidx.preference.PreferenceManager#setPreferences(androidx.preference.PreferenceScreen) parameter #0:
     Missing nullability on parameter `preferenceScreen` in method `setPreferences`
 MissingNullability: androidx.preference.PreferenceManager#setSharedPreferencesName(String) parameter #0:
     Missing nullability on parameter `sharedPreferencesName` in method `setSharedPreferencesName`
-MissingNullability: androidx.preference.PreferenceManager#showDialog(androidx.preference.Preference) parameter #0:
-    Missing nullability on parameter `preference` in method `showDialog`
-MissingNullability: androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener#onDisplayPreferenceDialog(androidx.preference.Preference) parameter #0:
-    Missing nullability on parameter `preference` in method `onDisplayPreferenceDialog`
-MissingNullability: androidx.preference.PreferenceManager.OnNavigateToScreenListener#onNavigateToScreen(androidx.preference.PreferenceScreen) parameter #0:
-    Missing nullability on parameter `preferenceScreen` in method `onNavigateToScreen`
-MissingNullability: androidx.preference.PreferenceManager.OnPreferenceTreeClickListener#onPreferenceTreeClick(androidx.preference.Preference) parameter #0:
-    Missing nullability on parameter `preference` in method `onPreferenceTreeClick`
-MissingNullability: androidx.preference.PreferenceManager.PreferenceComparisonCallback#arePreferenceContentsTheSame(androidx.preference.Preference, androidx.preference.Preference) parameter #0:
-    Missing nullability on parameter `p1` in method `arePreferenceContentsTheSame`
-MissingNullability: androidx.preference.PreferenceManager.PreferenceComparisonCallback#arePreferenceContentsTheSame(androidx.preference.Preference, androidx.preference.Preference) parameter #1:
-    Missing nullability on parameter `p2` in method `arePreferenceContentsTheSame`
-MissingNullability: androidx.preference.PreferenceManager.PreferenceComparisonCallback#arePreferenceItemsTheSame(androidx.preference.Preference, androidx.preference.Preference) parameter #0:
-    Missing nullability on parameter `p1` in method `arePreferenceItemsTheSame`
-MissingNullability: androidx.preference.PreferenceManager.PreferenceComparisonCallback#arePreferenceItemsTheSame(androidx.preference.Preference, androidx.preference.Preference) parameter #1:
-    Missing nullability on parameter `p2` in method `arePreferenceItemsTheSame`
-MissingNullability: androidx.preference.PreferenceManager.SimplePreferenceComparisonCallback#arePreferenceContentsTheSame(androidx.preference.Preference, androidx.preference.Preference) parameter #0:
-    Missing nullability on parameter `p1` in method `arePreferenceContentsTheSame`
-MissingNullability: androidx.preference.PreferenceManager.SimplePreferenceComparisonCallback#arePreferenceContentsTheSame(androidx.preference.Preference, androidx.preference.Preference) parameter #1:
-    Missing nullability on parameter `p2` in method `arePreferenceContentsTheSame`
-MissingNullability: androidx.preference.PreferenceManager.SimplePreferenceComparisonCallback#arePreferenceItemsTheSame(androidx.preference.Preference, androidx.preference.Preference) parameter #0:
-    Missing nullability on parameter `p1` in method `arePreferenceItemsTheSame`
-MissingNullability: androidx.preference.PreferenceManager.SimplePreferenceComparisonCallback#arePreferenceItemsTheSame(androidx.preference.Preference, androidx.preference.Preference) parameter #1:
-    Missing nullability on parameter `p2` in method `arePreferenceItemsTheSame`
 MissingNullability: androidx.preference.PreferenceViewHolder#findViewById(int):
     Missing nullability on method `findViewById` return
-MissingNullability: androidx.preference.SeekBarPreference#SeekBarPreference(android.content.Context) parameter #0:
-    Missing nullability on parameter `context` in method `SeekBarPreference`
-MissingNullability: androidx.preference.SeekBarPreference#SeekBarPreference(android.content.Context, android.util.AttributeSet) parameter #0:
-    Missing nullability on parameter `context` in method `SeekBarPreference`
-MissingNullability: androidx.preference.SeekBarPreference#SeekBarPreference(android.content.Context, android.util.AttributeSet) parameter #1:
-    Missing nullability on parameter `attrs` in method `SeekBarPreference`
-MissingNullability: androidx.preference.SeekBarPreference#SeekBarPreference(android.content.Context, android.util.AttributeSet, int) parameter #0:
-    Missing nullability on parameter `context` in method `SeekBarPreference`
-MissingNullability: androidx.preference.SeekBarPreference#SeekBarPreference(android.content.Context, android.util.AttributeSet, int) parameter #1:
-    Missing nullability on parameter `attrs` in method `SeekBarPreference`
-MissingNullability: androidx.preference.SeekBarPreference#SeekBarPreference(android.content.Context, android.util.AttributeSet, int, int) parameter #0:
-    Missing nullability on parameter `context` in method `SeekBarPreference`
-MissingNullability: androidx.preference.SeekBarPreference#SeekBarPreference(android.content.Context, android.util.AttributeSet, int, int) parameter #1:
-    Missing nullability on parameter `attrs` in method `SeekBarPreference`
-MissingNullability: androidx.preference.SeekBarPreference#onBindViewHolder(androidx.preference.PreferenceViewHolder) parameter #0:
-    Missing nullability on parameter `holder` in method `onBindViewHolder`
-MissingNullability: androidx.preference.SeekBarPreference#onGetDefaultValue(android.content.res.TypedArray, int):
-    Missing nullability on method `onGetDefaultValue` return
-MissingNullability: androidx.preference.SeekBarPreference#onGetDefaultValue(android.content.res.TypedArray, int) parameter #0:
-    Missing nullability on parameter `a` in method `onGetDefaultValue`
-MissingNullability: androidx.preference.SeekBarPreference#onRestoreInstanceState(android.os.Parcelable) parameter #0:
-    Missing nullability on parameter `state` in method `onRestoreInstanceState`
-MissingNullability: androidx.preference.SeekBarPreference#onSaveInstanceState():
-    Missing nullability on method `onSaveInstanceState` return
 MissingNullability: androidx.preference.SeekBarPreference#onSetInitialValue(Object) parameter #0:
     Missing nullability on parameter `defaultValue` in method `onSetInitialValue`
-MissingNullability: androidx.preference.SwitchPreference#SwitchPreference(android.content.Context) parameter #0:
-    Missing nullability on parameter `context` in method `SwitchPreference`
-MissingNullability: androidx.preference.SwitchPreference#SwitchPreference(android.content.Context, android.util.AttributeSet) parameter #0:
-    Missing nullability on parameter `context` in method `SwitchPreference`
-MissingNullability: androidx.preference.SwitchPreference#SwitchPreference(android.content.Context, android.util.AttributeSet) parameter #1:
-    Missing nullability on parameter `attrs` in method `SwitchPreference`
-MissingNullability: androidx.preference.SwitchPreference#SwitchPreference(android.content.Context, android.util.AttributeSet, int) parameter #0:
-    Missing nullability on parameter `context` in method `SwitchPreference`
-MissingNullability: androidx.preference.SwitchPreference#SwitchPreference(android.content.Context, android.util.AttributeSet, int) parameter #1:
-    Missing nullability on parameter `attrs` in method `SwitchPreference`
-MissingNullability: androidx.preference.SwitchPreference#SwitchPreference(android.content.Context, android.util.AttributeSet, int, int) parameter #0:
-    Missing nullability on parameter `context` in method `SwitchPreference`
-MissingNullability: androidx.preference.SwitchPreference#SwitchPreference(android.content.Context, android.util.AttributeSet, int, int) parameter #1:
-    Missing nullability on parameter `attrs` in method `SwitchPreference`
-MissingNullability: androidx.preference.SwitchPreference#getSwitchTextOff():
-    Missing nullability on method `getSwitchTextOff` return
-MissingNullability: androidx.preference.SwitchPreference#getSwitchTextOn():
-    Missing nullability on method `getSwitchTextOn` return
-MissingNullability: androidx.preference.SwitchPreference#onBindViewHolder(androidx.preference.PreferenceViewHolder) parameter #0:
-    Missing nullability on parameter `holder` in method `onBindViewHolder`
-MissingNullability: androidx.preference.SwitchPreference#setSwitchTextOff(CharSequence) parameter #0:
-    Missing nullability on parameter `offText` in method `setSwitchTextOff`
-MissingNullability: androidx.preference.SwitchPreference#setSwitchTextOn(CharSequence) parameter #0:
-    Missing nullability on parameter `onText` in method `setSwitchTextOn`
-MissingNullability: androidx.preference.SwitchPreferenceCompat#SwitchPreferenceCompat(android.content.Context) parameter #0:
-    Missing nullability on parameter `context` in method `SwitchPreferenceCompat`
-MissingNullability: androidx.preference.SwitchPreferenceCompat#SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet) parameter #0:
-    Missing nullability on parameter `context` in method `SwitchPreferenceCompat`
-MissingNullability: androidx.preference.SwitchPreferenceCompat#SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet) parameter #1:
-    Missing nullability on parameter `attrs` in method `SwitchPreferenceCompat`
-MissingNullability: androidx.preference.SwitchPreferenceCompat#SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet, int) parameter #0:
-    Missing nullability on parameter `context` in method `SwitchPreferenceCompat`
-MissingNullability: androidx.preference.SwitchPreferenceCompat#SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet, int) parameter #1:
-    Missing nullability on parameter `attrs` in method `SwitchPreferenceCompat`
-MissingNullability: androidx.preference.SwitchPreferenceCompat#SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet, int, int) parameter #0:
-    Missing nullability on parameter `context` in method `SwitchPreferenceCompat`
-MissingNullability: androidx.preference.SwitchPreferenceCompat#SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet, int, int) parameter #1:
-    Missing nullability on parameter `attrs` in method `SwitchPreferenceCompat`
-MissingNullability: androidx.preference.SwitchPreferenceCompat#getSwitchTextOff():
-    Missing nullability on method `getSwitchTextOff` return
-MissingNullability: androidx.preference.SwitchPreferenceCompat#getSwitchTextOn():
-    Missing nullability on method `getSwitchTextOn` return
-MissingNullability: androidx.preference.SwitchPreferenceCompat#onBindViewHolder(androidx.preference.PreferenceViewHolder) parameter #0:
-    Missing nullability on parameter `holder` in method `onBindViewHolder`
-MissingNullability: androidx.preference.SwitchPreferenceCompat#setSwitchTextOff(CharSequence) parameter #0:
-    Missing nullability on parameter `offText` in method `setSwitchTextOff`
-MissingNullability: androidx.preference.SwitchPreferenceCompat#setSwitchTextOn(CharSequence) parameter #0:
-    Missing nullability on parameter `onText` in method `setSwitchTextOn`
-MissingNullability: androidx.preference.TwoStatePreference#TwoStatePreference(android.content.Context) parameter #0:
-    Missing nullability on parameter `context` in method `TwoStatePreference`
-MissingNullability: androidx.preference.TwoStatePreference#TwoStatePreference(android.content.Context, android.util.AttributeSet) parameter #0:
-    Missing nullability on parameter `context` in method `TwoStatePreference`
-MissingNullability: androidx.preference.TwoStatePreference#TwoStatePreference(android.content.Context, android.util.AttributeSet) parameter #1:
-    Missing nullability on parameter `attrs` in method `TwoStatePreference`
-MissingNullability: androidx.preference.TwoStatePreference#TwoStatePreference(android.content.Context, android.util.AttributeSet, int) parameter #0:
-    Missing nullability on parameter `context` in method `TwoStatePreference`
-MissingNullability: androidx.preference.TwoStatePreference#TwoStatePreference(android.content.Context, android.util.AttributeSet, int) parameter #1:
-    Missing nullability on parameter `attrs` in method `TwoStatePreference`
-MissingNullability: androidx.preference.TwoStatePreference#TwoStatePreference(android.content.Context, android.util.AttributeSet, int, int) parameter #0:
-    Missing nullability on parameter `context` in method `TwoStatePreference`
-MissingNullability: androidx.preference.TwoStatePreference#TwoStatePreference(android.content.Context, android.util.AttributeSet, int, int) parameter #1:
-    Missing nullability on parameter `attrs` in method `TwoStatePreference`
-MissingNullability: androidx.preference.TwoStatePreference#getSummaryOff():
-    Missing nullability on method `getSummaryOff` return
-MissingNullability: androidx.preference.TwoStatePreference#getSummaryOn():
-    Missing nullability on method `getSummaryOn` return
-MissingNullability: androidx.preference.TwoStatePreference#onGetDefaultValue(android.content.res.TypedArray, int):
-    Missing nullability on method `onGetDefaultValue` return
-MissingNullability: androidx.preference.TwoStatePreference#onGetDefaultValue(android.content.res.TypedArray, int) parameter #0:
-    Missing nullability on parameter `a` in method `onGetDefaultValue`
-MissingNullability: androidx.preference.TwoStatePreference#onRestoreInstanceState(android.os.Parcelable) parameter #0:
-    Missing nullability on parameter `state` in method `onRestoreInstanceState`
-MissingNullability: androidx.preference.TwoStatePreference#onSaveInstanceState():
-    Missing nullability on method `onSaveInstanceState` return
 MissingNullability: androidx.preference.TwoStatePreference#onSetInitialValue(Object) parameter #0:
     Missing nullability on parameter `defaultValue` in method `onSetInitialValue`
-MissingNullability: androidx.preference.TwoStatePreference#setSummaryOff(CharSequence) parameter #0:
-    Missing nullability on parameter `summary` in method `setSummaryOff`
-MissingNullability: androidx.preference.TwoStatePreference#setSummaryOn(CharSequence) parameter #0:
-    Missing nullability on parameter `summary` in method `setSummaryOn`
-MissingNullability: androidx.preference.TwoStatePreference#syncSummaryView(androidx.preference.PreferenceViewHolder) parameter #0:
-    Missing nullability on parameter `holder` in method `syncSummaryView`
 
 
 MutableBareField: androidx.preference.TwoStatePreference#mChecked:
diff --git a/preference/preference/api/current.txt b/preference/preference/api/current.txt
index 4cc0b65..b3f9a4c 100644
--- a/preference/preference/api/current.txt
+++ b/preference/preference/api/current.txt
@@ -2,33 +2,33 @@
 package androidx.preference {
 
   public class CheckBoxPreference extends androidx.preference.TwoStatePreference {
-    ctor public CheckBoxPreference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public CheckBoxPreference(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public CheckBoxPreference(android.content.Context!, android.util.AttributeSet!);
-    ctor public CheckBoxPreference(android.content.Context!);
+    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet?);
+    ctor public CheckBoxPreference(android.content.Context);
   }
 
   public abstract class DialogPreference extends androidx.preference.Preference {
-    ctor public DialogPreference(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public DialogPreference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public DialogPreference(android.content.Context!, android.util.AttributeSet!);
-    ctor public DialogPreference(android.content.Context!);
-    method public android.graphics.drawable.Drawable! getDialogIcon();
+    ctor public DialogPreference(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public DialogPreference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public DialogPreference(android.content.Context, android.util.AttributeSet?);
+    ctor public DialogPreference(android.content.Context);
+    method public android.graphics.drawable.Drawable? getDialogIcon();
     method public int getDialogLayoutResource();
-    method public CharSequence! getDialogMessage();
-    method public CharSequence! getDialogTitle();
-    method public CharSequence! getNegativeButtonText();
-    method public CharSequence! getPositiveButtonText();
-    method public void setDialogIcon(android.graphics.drawable.Drawable!);
+    method public CharSequence? getDialogMessage();
+    method public CharSequence? getDialogTitle();
+    method public CharSequence? getNegativeButtonText();
+    method public CharSequence? getPositiveButtonText();
+    method public void setDialogIcon(android.graphics.drawable.Drawable?);
     method public void setDialogIcon(int);
     method public void setDialogLayoutResource(int);
-    method public void setDialogMessage(CharSequence!);
+    method public void setDialogMessage(CharSequence?);
     method public void setDialogMessage(int);
-    method public void setDialogTitle(CharSequence!);
+    method public void setDialogTitle(CharSequence?);
     method public void setDialogTitle(int);
-    method public void setNegativeButtonText(CharSequence!);
+    method public void setNegativeButtonText(CharSequence?);
     method public void setNegativeButtonText(int);
-    method public void setPositiveButtonText(CharSequence!);
+    method public void setPositiveButtonText(CharSequence?);
     method public void setPositiveButtonText(int);
   }
 
@@ -37,21 +37,21 @@
   }
 
   public class DropDownPreference extends androidx.preference.ListPreference {
-    ctor public DropDownPreference(android.content.Context!);
-    ctor public DropDownPreference(android.content.Context!, android.util.AttributeSet!);
-    ctor public DropDownPreference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public DropDownPreference(android.content.Context!, android.util.AttributeSet!, int, int);
-    method protected android.widget.ArrayAdapter! createAdapter();
+    ctor public DropDownPreference(android.content.Context);
+    ctor public DropDownPreference(android.content.Context, android.util.AttributeSet?);
+    ctor public DropDownPreference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public DropDownPreference(android.content.Context, android.util.AttributeSet?, int, int);
+    method protected android.widget.ArrayAdapter createAdapter();
   }
 
   public class EditTextPreference extends androidx.preference.DialogPreference {
-    ctor public EditTextPreference(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public EditTextPreference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public EditTextPreference(android.content.Context!, android.util.AttributeSet!);
-    ctor public EditTextPreference(android.content.Context!);
-    method public String! getText();
+    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet?);
+    ctor public EditTextPreference(android.content.Context);
+    method public String? getText();
     method public void setOnBindEditTextListener(androidx.preference.EditTextPreference.OnBindEditTextListener?);
-    method public void setText(String!);
+    method public void setText(String?);
   }
 
   public static interface EditTextPreference.OnBindEditTextListener {
@@ -59,31 +59,31 @@
   }
 
   public static final class EditTextPreference.SimpleSummaryProvider implements androidx.preference.Preference.SummaryProvider<androidx.preference.EditTextPreference> {
-    method public static androidx.preference.EditTextPreference.SimpleSummaryProvider! getInstance();
-    method public CharSequence! provideSummary(androidx.preference.EditTextPreference!);
+    method public static androidx.preference.EditTextPreference.SimpleSummaryProvider getInstance();
+    method public CharSequence? provideSummary(androidx.preference.EditTextPreference);
   }
 
   @Deprecated public class EditTextPreferenceDialogFragment extends androidx.preference.PreferenceDialogFragment {
     ctor @Deprecated public EditTextPreferenceDialogFragment();
-    method @Deprecated public static androidx.preference.EditTextPreferenceDialogFragment! newInstance(String!);
-    method @Deprecated protected void onBindDialogView(android.view.View!);
+    method @Deprecated public static androidx.preference.EditTextPreferenceDialogFragment newInstance(String!);
+    method @Deprecated protected void onBindDialogView(android.view.View);
     method @Deprecated public void onDialogClosed(boolean);
   }
 
   public class EditTextPreferenceDialogFragmentCompat extends androidx.preference.PreferenceDialogFragmentCompat {
     ctor public EditTextPreferenceDialogFragmentCompat();
-    method public static androidx.preference.EditTextPreferenceDialogFragmentCompat! newInstance(String!);
+    method public static androidx.preference.EditTextPreferenceDialogFragmentCompat newInstance(String!);
     method public void onDialogClosed(boolean);
   }
 
   public class ListPreference extends androidx.preference.DialogPreference {
-    ctor public ListPreference(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public ListPreference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public ListPreference(android.content.Context!, android.util.AttributeSet!);
-    ctor public ListPreference(android.content.Context!);
+    ctor public ListPreference(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public ListPreference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public ListPreference(android.content.Context, android.util.AttributeSet?);
+    ctor public ListPreference(android.content.Context);
     method public int findIndexOfValue(String!);
     method public CharSequence![]! getEntries();
-    method public CharSequence! getEntry();
+    method public CharSequence? getEntry();
     method public CharSequence![]! getEntryValues();
     method public String! getValue();
     method public void setEntries(CharSequence![]!);
@@ -95,28 +95,28 @@
   }
 
   public static final class ListPreference.SimpleSummaryProvider implements androidx.preference.Preference.SummaryProvider<androidx.preference.ListPreference> {
-    method public static androidx.preference.ListPreference.SimpleSummaryProvider! getInstance();
-    method public CharSequence! provideSummary(androidx.preference.ListPreference!);
+    method public static androidx.preference.ListPreference.SimpleSummaryProvider getInstance();
+    method public CharSequence? provideSummary(androidx.preference.ListPreference);
   }
 
   @Deprecated public class ListPreferenceDialogFragment extends androidx.preference.PreferenceDialogFragment {
     ctor @Deprecated public ListPreferenceDialogFragment();
-    method @Deprecated public static androidx.preference.ListPreferenceDialogFragment! newInstance(String!);
+    method @Deprecated public static androidx.preference.ListPreferenceDialogFragment newInstance(String!);
     method @Deprecated public void onDialogClosed(boolean);
-    method @Deprecated protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder!);
+    method @Deprecated protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder);
   }
 
   public class ListPreferenceDialogFragmentCompat extends androidx.preference.PreferenceDialogFragmentCompat {
     ctor public ListPreferenceDialogFragmentCompat();
-    method public static androidx.preference.ListPreferenceDialogFragmentCompat! newInstance(String!);
+    method public static androidx.preference.ListPreferenceDialogFragmentCompat newInstance(String!);
     method public void onDialogClosed(boolean);
   }
 
   public class MultiSelectListPreference extends androidx.preference.DialogPreference {
-    ctor public MultiSelectListPreference(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public MultiSelectListPreference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public MultiSelectListPreference(android.content.Context!, android.util.AttributeSet!);
-    ctor public MultiSelectListPreference(android.content.Context!);
+    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet?);
+    ctor public MultiSelectListPreference(android.content.Context);
     method public int findIndexOfValue(String!);
     method public CharSequence![]! getEntries();
     method public CharSequence![]! getEntryValues();
@@ -131,35 +131,35 @@
 
   @Deprecated public class MultiSelectListPreferenceDialogFragment extends androidx.preference.PreferenceDialogFragment {
     ctor @Deprecated public MultiSelectListPreferenceDialogFragment();
-    method @Deprecated public static androidx.preference.MultiSelectListPreferenceDialogFragment! newInstance(String!);
+    method @Deprecated public static androidx.preference.MultiSelectListPreferenceDialogFragment newInstance(String!);
     method @Deprecated public void onDialogClosed(boolean);
-    method @Deprecated protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder!);
+    method @Deprecated protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder);
   }
 
   public class MultiSelectListPreferenceDialogFragmentCompat extends androidx.preference.PreferenceDialogFragmentCompat {
     ctor public MultiSelectListPreferenceDialogFragmentCompat();
-    method public static androidx.preference.MultiSelectListPreferenceDialogFragmentCompat! newInstance(String!);
+    method public static androidx.preference.MultiSelectListPreferenceDialogFragmentCompat newInstance(String!);
     method public void onDialogClosed(boolean);
   }
 
   public class Preference implements java.lang.Comparable<androidx.preference.Preference> {
-    ctor public Preference(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public Preference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public Preference(android.content.Context!, android.util.AttributeSet!);
-    ctor public Preference(android.content.Context!);
+    ctor public Preference(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public Preference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public Preference(android.content.Context, android.util.AttributeSet?);
+    ctor public Preference(android.content.Context);
     method public boolean callChangeListener(Object!);
     method public int compareTo(androidx.preference.Preference);
     method protected <T extends androidx.preference.Preference> T? findPreferenceInHierarchy(String);
-    method public android.content.Context! getContext();
-    method public String! getDependency();
-    method public android.os.Bundle! getExtras();
-    method public String! getFragment();
-    method public android.graphics.drawable.Drawable! getIcon();
-    method public android.content.Intent! getIntent();
+    method public android.content.Context getContext();
+    method public String? getDependency();
+    method public android.os.Bundle getExtras();
+    method public String? getFragment();
+    method public android.graphics.drawable.Drawable? getIcon();
+    method public android.content.Intent? getIntent();
     method public String! getKey();
     method public final int getLayoutResource();
-    method public androidx.preference.Preference.OnPreferenceChangeListener! getOnPreferenceChangeListener();
-    method public androidx.preference.Preference.OnPreferenceClickListener! getOnPreferenceClickListener();
+    method public androidx.preference.Preference.OnPreferenceChangeListener? getOnPreferenceChangeListener();
+    method public androidx.preference.Preference.OnPreferenceClickListener? getOnPreferenceClickListener();
     method public int getOrder();
     method public androidx.preference.PreferenceGroup? getParent();
     method protected boolean getPersistedBoolean(boolean);
@@ -170,11 +170,11 @@
     method public java.util.Set<java.lang.String!>! getPersistedStringSet(java.util.Set<java.lang.String!>!);
     method public androidx.preference.PreferenceDataStore? getPreferenceDataStore();
     method public androidx.preference.PreferenceManager! getPreferenceManager();
-    method public android.content.SharedPreferences! getSharedPreferences();
+    method public android.content.SharedPreferences? getSharedPreferences();
     method public boolean getShouldDisableView();
-    method public CharSequence! getSummary();
+    method public CharSequence? getSummary();
     method public final androidx.preference.Preference.SummaryProvider? getSummaryProvider();
-    method public CharSequence! getTitle();
+    method public CharSequence? getTitle();
     method public final int getWidgetLayoutResource();
     method public boolean hasKey();
     method public boolean isCopyingEnabled();
@@ -189,51 +189,51 @@
     method public void notifyDependencyChange(boolean);
     method protected void notifyHierarchyChanged();
     method public void onAttached();
-    method protected void onAttachedToHierarchy(androidx.preference.PreferenceManager!);
-    method public void onBindViewHolder(androidx.preference.PreferenceViewHolder!);
+    method protected void onAttachedToHierarchy(androidx.preference.PreferenceManager);
+    method public void onBindViewHolder(androidx.preference.PreferenceViewHolder);
     method protected void onClick();
-    method public void onDependencyChanged(androidx.preference.Preference!, boolean);
+    method public void onDependencyChanged(androidx.preference.Preference, boolean);
     method public void onDetached();
-    method protected Object! onGetDefaultValue(android.content.res.TypedArray!, int);
+    method protected Object? onGetDefaultValue(android.content.res.TypedArray, int);
     method @Deprecated @CallSuper public void onInitializeAccessibilityNodeInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
-    method public void onParentChanged(androidx.preference.Preference!, boolean);
+    method public void onParentChanged(androidx.preference.Preference, boolean);
     method protected void onPrepareForRemoval();
-    method protected void onRestoreInstanceState(android.os.Parcelable!);
-    method protected android.os.Parcelable! onSaveInstanceState();
+    method protected void onRestoreInstanceState(android.os.Parcelable?);
+    method protected android.os.Parcelable? onSaveInstanceState();
     method @Deprecated protected void onSetInitialValue(boolean, Object!);
     method protected void onSetInitialValue(Object?);
-    method public android.os.Bundle! peekExtras();
+    method public android.os.Bundle? peekExtras();
     method protected boolean persistBoolean(boolean);
     method protected boolean persistFloat(float);
     method protected boolean persistInt(int);
     method protected boolean persistLong(long);
     method protected boolean persistString(String!);
     method public boolean persistStringSet(java.util.Set<java.lang.String!>!);
-    method public void restoreHierarchyState(android.os.Bundle!);
-    method public void saveHierarchyState(android.os.Bundle!);
+    method public void restoreHierarchyState(android.os.Bundle);
+    method public void saveHierarchyState(android.os.Bundle);
     method public void setCopyingEnabled(boolean);
     method public void setDefaultValue(Object!);
-    method public void setDependency(String!);
+    method public void setDependency(String?);
     method public void setEnabled(boolean);
-    method public void setFragment(String!);
-    method public void setIcon(android.graphics.drawable.Drawable!);
+    method public void setFragment(String?);
+    method public void setIcon(android.graphics.drawable.Drawable?);
     method public void setIcon(int);
     method public void setIconSpaceReserved(boolean);
-    method public void setIntent(android.content.Intent!);
+    method public void setIntent(android.content.Intent?);
     method public void setKey(String!);
     method public void setLayoutResource(int);
-    method public void setOnPreferenceChangeListener(androidx.preference.Preference.OnPreferenceChangeListener!);
-    method public void setOnPreferenceClickListener(androidx.preference.Preference.OnPreferenceClickListener!);
+    method public void setOnPreferenceChangeListener(androidx.preference.Preference.OnPreferenceChangeListener?);
+    method public void setOnPreferenceClickListener(androidx.preference.Preference.OnPreferenceClickListener?);
     method public void setOrder(int);
     method public void setPersistent(boolean);
-    method public void setPreferenceDataStore(androidx.preference.PreferenceDataStore!);
+    method public void setPreferenceDataStore(androidx.preference.PreferenceDataStore?);
     method public void setSelectable(boolean);
     method public void setShouldDisableView(boolean);
     method public void setSingleLineTitle(boolean);
-    method public void setSummary(CharSequence!);
+    method public void setSummary(CharSequence?);
     method public void setSummary(int);
     method public final void setSummaryProvider(androidx.preference.Preference.SummaryProvider?);
-    method public void setTitle(CharSequence!);
+    method public void setTitle(CharSequence?);
     method public void setTitle(int);
     method public void setViewId(int);
     method public final void setVisible(boolean);
@@ -246,26 +246,26 @@
   public static class Preference.BaseSavedState extends android.view.AbsSavedState {
     ctor public Preference.BaseSavedState(android.os.Parcel!);
     ctor public Preference.BaseSavedState(android.os.Parcelable!);
-    field public static final android.os.Parcelable.Creator<androidx.preference.Preference.BaseSavedState!>! CREATOR;
+    field public static final android.os.Parcelable.Creator<androidx.preference.Preference.BaseSavedState!> CREATOR;
   }
 
   public static interface Preference.OnPreferenceChangeListener {
-    method public boolean onPreferenceChange(androidx.preference.Preference!, Object!);
+    method public boolean onPreferenceChange(androidx.preference.Preference, Object!);
   }
 
   public static interface Preference.OnPreferenceClickListener {
-    method public boolean onPreferenceClick(androidx.preference.Preference!);
+    method public boolean onPreferenceClick(androidx.preference.Preference);
   }
 
   public static interface Preference.SummaryProvider<T extends androidx.preference.Preference> {
-    method public CharSequence! provideSummary(T!);
+    method public CharSequence? provideSummary(T);
   }
 
   public class PreferenceCategory extends androidx.preference.PreferenceGroup {
-    ctor public PreferenceCategory(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public PreferenceCategory(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public PreferenceCategory(android.content.Context!, android.util.AttributeSet!);
-    ctor public PreferenceCategory(android.content.Context!);
+    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet?, int);
+    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet?);
+    ctor public PreferenceCategory(android.content.Context);
   }
 
   public abstract class PreferenceDataStore {
@@ -287,14 +287,14 @@
   @Deprecated public abstract class PreferenceDialogFragment extends android.app.DialogFragment implements android.content.DialogInterface.OnClickListener {
     ctor @Deprecated public PreferenceDialogFragment();
     method @Deprecated public androidx.preference.DialogPreference! getPreference();
-    method @Deprecated protected void onBindDialogView(android.view.View!);
-    method @Deprecated public void onClick(android.content.DialogInterface!, int);
-    method @Deprecated public void onCreate(android.os.Bundle!);
-    method @Deprecated public android.app.Dialog onCreateDialog(android.os.Bundle!);
-    method @Deprecated protected android.view.View! onCreateDialogView(android.content.Context!);
+    method @Deprecated protected void onBindDialogView(android.view.View);
+    method @Deprecated public void onClick(android.content.DialogInterface, int);
+    method @Deprecated public void onCreate(android.os.Bundle?);
+    method @Deprecated public android.app.Dialog onCreateDialog(android.os.Bundle?);
+    method @Deprecated protected android.view.View? onCreateDialogView(android.content.Context);
     method @Deprecated public abstract void onDialogClosed(boolean);
-    method @Deprecated public void onDismiss(android.content.DialogInterface!);
-    method @Deprecated protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder!);
+    method @Deprecated public void onDismiss(android.content.DialogInterface);
+    method @Deprecated protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder);
     method @Deprecated public void onSaveInstanceState(android.os.Bundle);
     field @Deprecated protected static final String ARG_KEY = "key";
   }
@@ -302,38 +302,38 @@
   public abstract class PreferenceDialogFragmentCompat extends androidx.fragment.app.DialogFragment implements android.content.DialogInterface.OnClickListener {
     ctor public PreferenceDialogFragmentCompat();
     method public androidx.preference.DialogPreference! getPreference();
-    method protected void onBindDialogView(android.view.View!);
-    method public void onClick(android.content.DialogInterface!, int);
-    method protected android.view.View! onCreateDialogView(android.content.Context!);
+    method protected void onBindDialogView(android.view.View);
+    method public void onClick(android.content.DialogInterface, int);
+    method protected android.view.View? onCreateDialogView(android.content.Context);
     method public abstract void onDialogClosed(boolean);
-    method protected void onPrepareDialogBuilder(androidx.appcompat.app.AlertDialog.Builder!);
+    method protected void onPrepareDialogBuilder(androidx.appcompat.app.AlertDialog.Builder);
     field protected static final String ARG_KEY = "key";
   }
 
   @Deprecated public abstract class PreferenceFragment extends android.app.Fragment implements androidx.preference.DialogPreference.TargetFragment androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener androidx.preference.PreferenceManager.OnNavigateToScreenListener androidx.preference.PreferenceManager.OnPreferenceTreeClickListener {
     ctor @Deprecated public PreferenceFragment();
     method @Deprecated public void addPreferencesFromResource(@XmlRes int);
-    method @Deprecated public <T extends androidx.preference.Preference> T! findPreference(CharSequence!);
+    method @Deprecated public <T extends androidx.preference.Preference> T! findPreference(CharSequence);
     method @Deprecated public final androidx.recyclerview.widget.RecyclerView! getListView();
     method @Deprecated public androidx.preference.PreferenceManager! getPreferenceManager();
     method @Deprecated public androidx.preference.PreferenceScreen! getPreferenceScreen();
-    method @Deprecated public void onCreate(android.os.Bundle!);
-    method @Deprecated protected androidx.recyclerview.widget.RecyclerView.Adapter! onCreateAdapter(androidx.preference.PreferenceScreen!);
-    method @Deprecated public androidx.recyclerview.widget.RecyclerView.LayoutManager! onCreateLayoutManager();
-    method @Deprecated public abstract void onCreatePreferences(android.os.Bundle!, String!);
-    method @Deprecated public androidx.recyclerview.widget.RecyclerView! onCreateRecyclerView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
-    method @Deprecated public android.view.View! onCreateView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
+    method @Deprecated public void onCreate(android.os.Bundle?);
+    method @Deprecated protected androidx.recyclerview.widget.RecyclerView.Adapter onCreateAdapter(androidx.preference.PreferenceScreen);
+    method @Deprecated public androidx.recyclerview.widget.RecyclerView.LayoutManager onCreateLayoutManager();
+    method @Deprecated public abstract void onCreatePreferences(android.os.Bundle?, String!);
+    method @Deprecated public androidx.recyclerview.widget.RecyclerView onCreateRecyclerView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle?);
+    method @Deprecated public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup?, android.os.Bundle?);
     method @Deprecated public void onDestroyView();
-    method @Deprecated public void onDisplayPreferenceDialog(androidx.preference.Preference!);
-    method @Deprecated public void onNavigateToScreen(androidx.preference.PreferenceScreen!);
-    method @Deprecated public boolean onPreferenceTreeClick(androidx.preference.Preference!);
-    method @Deprecated public void onSaveInstanceState(android.os.Bundle!);
+    method @Deprecated public void onDisplayPreferenceDialog(androidx.preference.Preference);
+    method @Deprecated public void onNavigateToScreen(androidx.preference.PreferenceScreen);
+    method @Deprecated public boolean onPreferenceTreeClick(androidx.preference.Preference);
+    method @Deprecated public void onSaveInstanceState(android.os.Bundle);
     method @Deprecated public void onStart();
     method @Deprecated public void onStop();
-    method @Deprecated public void onViewCreated(android.view.View!, android.os.Bundle!);
-    method @Deprecated public void scrollToPreference(String!);
-    method @Deprecated public void scrollToPreference(androidx.preference.Preference!);
-    method @Deprecated public void setDivider(android.graphics.drawable.Drawable!);
+    method @Deprecated public void onViewCreated(android.view.View, android.os.Bundle?);
+    method @Deprecated public void scrollToPreference(String);
+    method @Deprecated public void scrollToPreference(androidx.preference.Preference);
+    method @Deprecated public void setDivider(android.graphics.drawable.Drawable?);
     method @Deprecated public void setDividerHeight(int);
     method @Deprecated public void setPreferenceScreen(androidx.preference.PreferenceScreen!);
     method @Deprecated public void setPreferencesFromResource(@XmlRes int, String?);
@@ -341,15 +341,15 @@
   }
 
   @Deprecated public static interface PreferenceFragment.OnPreferenceDisplayDialogCallback {
-    method @Deprecated public boolean onPreferenceDisplayDialog(androidx.preference.PreferenceFragment, androidx.preference.Preference!);
+    method @Deprecated public boolean onPreferenceDisplayDialog(androidx.preference.PreferenceFragment, androidx.preference.Preference);
   }
 
   @Deprecated public static interface PreferenceFragment.OnPreferenceStartFragmentCallback {
-    method @Deprecated public boolean onPreferenceStartFragment(androidx.preference.PreferenceFragment!, androidx.preference.Preference!);
+    method @Deprecated public boolean onPreferenceStartFragment(androidx.preference.PreferenceFragment, androidx.preference.Preference);
   }
 
   @Deprecated public static interface PreferenceFragment.OnPreferenceStartScreenCallback {
-    method @Deprecated public boolean onPreferenceStartScreen(androidx.preference.PreferenceFragment!, androidx.preference.PreferenceScreen!);
+    method @Deprecated public boolean onPreferenceStartScreen(androidx.preference.PreferenceFragment, androidx.preference.PreferenceScreen);
   }
 
   public abstract class PreferenceFragmentCompat extends androidx.fragment.app.Fragment implements androidx.preference.DialogPreference.TargetFragment androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener androidx.preference.PreferenceManager.OnNavigateToScreenListener androidx.preference.PreferenceManager.OnPreferenceTreeClickListener {
@@ -359,16 +359,16 @@
     method public final androidx.recyclerview.widget.RecyclerView! getListView();
     method public androidx.preference.PreferenceManager! getPreferenceManager();
     method public androidx.preference.PreferenceScreen! getPreferenceScreen();
-    method protected androidx.recyclerview.widget.RecyclerView.Adapter! onCreateAdapter(androidx.preference.PreferenceScreen!);
-    method public androidx.recyclerview.widget.RecyclerView.LayoutManager! onCreateLayoutManager();
-    method public abstract void onCreatePreferences(android.os.Bundle!, String!);
-    method public androidx.recyclerview.widget.RecyclerView! onCreateRecyclerView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
-    method public void onDisplayPreferenceDialog(androidx.preference.Preference!);
-    method public void onNavigateToScreen(androidx.preference.PreferenceScreen!);
-    method public boolean onPreferenceTreeClick(androidx.preference.Preference!);
-    method public void scrollToPreference(String!);
-    method public void scrollToPreference(androidx.preference.Preference!);
-    method public void setDivider(android.graphics.drawable.Drawable!);
+    method protected androidx.recyclerview.widget.RecyclerView.Adapter onCreateAdapter(androidx.preference.PreferenceScreen);
+    method public androidx.recyclerview.widget.RecyclerView.LayoutManager onCreateLayoutManager();
+    method public abstract void onCreatePreferences(android.os.Bundle?, String?);
+    method public androidx.recyclerview.widget.RecyclerView onCreateRecyclerView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle?);
+    method public void onDisplayPreferenceDialog(androidx.preference.Preference);
+    method public void onNavigateToScreen(androidx.preference.PreferenceScreen);
+    method public boolean onPreferenceTreeClick(androidx.preference.Preference);
+    method public void scrollToPreference(String);
+    method public void scrollToPreference(androidx.preference.Preference);
+    method public void setDivider(android.graphics.drawable.Drawable?);
     method public void setDividerHeight(int);
     method public void setPreferenceScreen(androidx.preference.PreferenceScreen!);
     method public void setPreferencesFromResource(@XmlRes int, String?);
@@ -376,42 +376,42 @@
   }
 
   public static interface PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback {
-    method public boolean onPreferenceDisplayDialog(androidx.preference.PreferenceFragmentCompat, androidx.preference.Preference!);
+    method public boolean onPreferenceDisplayDialog(androidx.preference.PreferenceFragmentCompat, androidx.preference.Preference);
   }
 
   public static interface PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
-    method public boolean onPreferenceStartFragment(androidx.preference.PreferenceFragmentCompat!, androidx.preference.Preference!);
+    method public boolean onPreferenceStartFragment(androidx.preference.PreferenceFragmentCompat, androidx.preference.Preference);
   }
 
   public static interface PreferenceFragmentCompat.OnPreferenceStartScreenCallback {
-    method public boolean onPreferenceStartScreen(androidx.preference.PreferenceFragmentCompat!, androidx.preference.PreferenceScreen!);
+    method public boolean onPreferenceStartScreen(androidx.preference.PreferenceFragmentCompat, androidx.preference.PreferenceScreen);
   }
 
   public abstract class PreferenceGroup extends androidx.preference.Preference {
-    ctor public PreferenceGroup(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public PreferenceGroup(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public PreferenceGroup(android.content.Context!, android.util.AttributeSet!);
-    method public void addItemFromInflater(androidx.preference.Preference!);
-    method public boolean addPreference(androidx.preference.Preference!);
-    method protected void dispatchRestoreInstanceState(android.os.Bundle!);
-    method protected void dispatchSaveInstanceState(android.os.Bundle!);
+    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet?, int);
+    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet?);
+    method public void addItemFromInflater(androidx.preference.Preference);
+    method public boolean addPreference(androidx.preference.Preference);
+    method protected void dispatchRestoreInstanceState(android.os.Bundle);
+    method protected void dispatchSaveInstanceState(android.os.Bundle);
     method public <T extends androidx.preference.Preference> T? findPreference(CharSequence);
     method public int getInitialExpandedChildrenCount();
-    method public androidx.preference.Preference! getPreference(int);
+    method public androidx.preference.Preference getPreference(int);
     method public int getPreferenceCount();
     method protected boolean isOnSameScreenAsChildren();
     method public boolean isOrderingAsAdded();
-    method protected boolean onPrepareAddPreference(androidx.preference.Preference!);
+    method protected boolean onPrepareAddPreference(androidx.preference.Preference);
     method public void removeAll();
-    method public boolean removePreference(androidx.preference.Preference!);
+    method public boolean removePreference(androidx.preference.Preference);
     method public boolean removePreferenceRecursively(CharSequence);
     method public void setInitialExpandedChildrenCount(int);
     method public void setOrderingAsAdded(boolean);
   }
 
   public static interface PreferenceGroup.PreferencePositionCallback {
-    method public int getPreferenceAdapterPosition(String!);
-    method public int getPreferenceAdapterPosition(androidx.preference.Preference!);
+    method public int getPreferenceAdapterPosition(String);
+    method public int getPreferenceAdapterPosition(androidx.preference.Preference);
   }
 
   public abstract class PreferenceHeaderFragmentCompat extends androidx.fragment.app.Fragment implements androidx.preference.PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
@@ -425,14 +425,14 @@
   }
 
   public class PreferenceManager {
-    method public androidx.preference.PreferenceScreen! createPreferenceScreen(android.content.Context!);
+    method public androidx.preference.PreferenceScreen createPreferenceScreen(android.content.Context);
     method public <T extends androidx.preference.Preference> T? findPreference(CharSequence);
-    method public android.content.Context! getContext();
-    method public static android.content.SharedPreferences! getDefaultSharedPreferences(android.content.Context!);
-    method public androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener! getOnDisplayPreferenceDialogListener();
-    method public androidx.preference.PreferenceManager.OnNavigateToScreenListener! getOnNavigateToScreenListener();
-    method public androidx.preference.PreferenceManager.OnPreferenceTreeClickListener! getOnPreferenceTreeClickListener();
-    method public androidx.preference.PreferenceManager.PreferenceComparisonCallback! getPreferenceComparisonCallback();
+    method public android.content.Context getContext();
+    method public static android.content.SharedPreferences! getDefaultSharedPreferences(android.content.Context);
+    method public androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener? getOnDisplayPreferenceDialogListener();
+    method public androidx.preference.PreferenceManager.OnNavigateToScreenListener? getOnNavigateToScreenListener();
+    method public androidx.preference.PreferenceManager.OnPreferenceTreeClickListener? getOnPreferenceTreeClickListener();
+    method public androidx.preference.PreferenceManager.PreferenceComparisonCallback? getPreferenceComparisonCallback();
     method public androidx.preference.PreferenceDataStore? getPreferenceDataStore();
     method public androidx.preference.PreferenceScreen! getPreferenceScreen();
     method public android.content.SharedPreferences? getSharedPreferences();
@@ -440,44 +440,44 @@
     method public String! getSharedPreferencesName();
     method public boolean isStorageDefault();
     method public boolean isStorageDeviceProtected();
-    method public static void setDefaultValues(android.content.Context!, int, boolean);
-    method public static void setDefaultValues(android.content.Context!, String!, int, int, boolean);
-    method public void setOnDisplayPreferenceDialogListener(androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener!);
-    method public void setOnNavigateToScreenListener(androidx.preference.PreferenceManager.OnNavigateToScreenListener!);
-    method public void setOnPreferenceTreeClickListener(androidx.preference.PreferenceManager.OnPreferenceTreeClickListener!);
-    method public void setPreferenceComparisonCallback(androidx.preference.PreferenceManager.PreferenceComparisonCallback!);
-    method public void setPreferenceDataStore(androidx.preference.PreferenceDataStore!);
+    method public static void setDefaultValues(android.content.Context, int, boolean);
+    method public static void setDefaultValues(android.content.Context, String!, int, int, boolean);
+    method public void setOnDisplayPreferenceDialogListener(androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener?);
+    method public void setOnNavigateToScreenListener(androidx.preference.PreferenceManager.OnNavigateToScreenListener?);
+    method public void setOnPreferenceTreeClickListener(androidx.preference.PreferenceManager.OnPreferenceTreeClickListener?);
+    method public void setPreferenceComparisonCallback(androidx.preference.PreferenceManager.PreferenceComparisonCallback?);
+    method public void setPreferenceDataStore(androidx.preference.PreferenceDataStore?);
     method public boolean setPreferences(androidx.preference.PreferenceScreen!);
     method public void setSharedPreferencesMode(int);
     method public void setSharedPreferencesName(String!);
     method public void setStorageDefault();
     method public void setStorageDeviceProtected();
-    method public void showDialog(androidx.preference.Preference!);
+    method public void showDialog(androidx.preference.Preference);
     field public static final String KEY_HAS_SET_DEFAULT_VALUES = "_has_set_default_values";
   }
 
   public static interface PreferenceManager.OnDisplayPreferenceDialogListener {
-    method public void onDisplayPreferenceDialog(androidx.preference.Preference!);
+    method public void onDisplayPreferenceDialog(androidx.preference.Preference);
   }
 
   public static interface PreferenceManager.OnNavigateToScreenListener {
-    method public void onNavigateToScreen(androidx.preference.PreferenceScreen!);
+    method public void onNavigateToScreen(androidx.preference.PreferenceScreen);
   }
 
   public static interface PreferenceManager.OnPreferenceTreeClickListener {
-    method public boolean onPreferenceTreeClick(androidx.preference.Preference!);
+    method public boolean onPreferenceTreeClick(androidx.preference.Preference);
   }
 
   public abstract static class PreferenceManager.PreferenceComparisonCallback {
     ctor public PreferenceManager.PreferenceComparisonCallback();
-    method public abstract boolean arePreferenceContentsTheSame(androidx.preference.Preference!, androidx.preference.Preference!);
-    method public abstract boolean arePreferenceItemsTheSame(androidx.preference.Preference!, androidx.preference.Preference!);
+    method public abstract boolean arePreferenceContentsTheSame(androidx.preference.Preference, androidx.preference.Preference);
+    method public abstract boolean arePreferenceItemsTheSame(androidx.preference.Preference, androidx.preference.Preference);
   }
 
   public static class PreferenceManager.SimplePreferenceComparisonCallback extends androidx.preference.PreferenceManager.PreferenceComparisonCallback {
     ctor public PreferenceManager.SimplePreferenceComparisonCallback();
-    method public boolean arePreferenceContentsTheSame(androidx.preference.Preference!, androidx.preference.Preference!);
-    method public boolean arePreferenceItemsTheSame(androidx.preference.Preference!, androidx.preference.Preference!);
+    method public boolean arePreferenceContentsTheSame(androidx.preference.Preference, androidx.preference.Preference);
+    method public boolean arePreferenceItemsTheSame(androidx.preference.Preference, androidx.preference.Preference);
   }
 
   public final class PreferenceScreen extends androidx.preference.PreferenceGroup {
@@ -494,10 +494,10 @@
   }
 
   public class SeekBarPreference extends androidx.preference.Preference {
-    ctor public SeekBarPreference(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public SeekBarPreference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public SeekBarPreference(android.content.Context!, android.util.AttributeSet!);
-    ctor public SeekBarPreference(android.content.Context!);
+    ctor public SeekBarPreference(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public SeekBarPreference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public SeekBarPreference(android.content.Context, android.util.AttributeSet?);
+    ctor public SeekBarPreference(android.content.Context);
     method public int getMax();
     method public int getMin();
     method public final int getSeekBarIncrement();
@@ -515,47 +515,47 @@
   }
 
   public class SwitchPreference extends androidx.preference.TwoStatePreference {
-    ctor public SwitchPreference(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public SwitchPreference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public SwitchPreference(android.content.Context!, android.util.AttributeSet!);
-    ctor public SwitchPreference(android.content.Context!);
-    method public CharSequence! getSwitchTextOff();
-    method public CharSequence! getSwitchTextOn();
-    method public void setSwitchTextOff(CharSequence!);
+    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet?);
+    ctor public SwitchPreference(android.content.Context);
+    method public CharSequence? getSwitchTextOff();
+    method public CharSequence? getSwitchTextOn();
+    method public void setSwitchTextOff(CharSequence?);
     method public void setSwitchTextOff(int);
-    method public void setSwitchTextOn(CharSequence!);
+    method public void setSwitchTextOn(CharSequence?);
     method public void setSwitchTextOn(int);
   }
 
   public class SwitchPreferenceCompat extends androidx.preference.TwoStatePreference {
-    ctor public SwitchPreferenceCompat(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public SwitchPreferenceCompat(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public SwitchPreferenceCompat(android.content.Context!, android.util.AttributeSet!);
-    ctor public SwitchPreferenceCompat(android.content.Context!);
-    method public CharSequence! getSwitchTextOff();
-    method public CharSequence! getSwitchTextOn();
-    method public void setSwitchTextOff(CharSequence!);
+    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet?, int);
+    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet?);
+    ctor public SwitchPreferenceCompat(android.content.Context);
+    method public CharSequence? getSwitchTextOff();
+    method public CharSequence? getSwitchTextOn();
+    method public void setSwitchTextOff(CharSequence?);
     method public void setSwitchTextOff(int);
-    method public void setSwitchTextOn(CharSequence!);
+    method public void setSwitchTextOn(CharSequence?);
     method public void setSwitchTextOn(int);
   }
 
   public abstract class TwoStatePreference extends androidx.preference.Preference {
-    ctor public TwoStatePreference(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public TwoStatePreference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public TwoStatePreference(android.content.Context!, android.util.AttributeSet!);
-    ctor public TwoStatePreference(android.content.Context!);
+    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet?);
+    ctor public TwoStatePreference(android.content.Context);
     method public boolean getDisableDependentsState();
-    method public CharSequence! getSummaryOff();
-    method public CharSequence! getSummaryOn();
+    method public CharSequence? getSummaryOff();
+    method public CharSequence? getSummaryOn();
     method public boolean isChecked();
     method public void setChecked(boolean);
     method public void setDisableDependentsState(boolean);
-    method public void setSummaryOff(CharSequence!);
+    method public void setSummaryOff(CharSequence?);
     method public void setSummaryOff(int);
-    method public void setSummaryOn(CharSequence!);
+    method public void setSummaryOn(CharSequence?);
     method public void setSummaryOn(int);
-    method protected void syncSummaryView(androidx.preference.PreferenceViewHolder!);
+    method protected void syncSummaryView(androidx.preference.PreferenceViewHolder);
     field protected boolean mChecked;
   }
 
diff --git a/preference/preference/api/public_plus_experimental_current.txt b/preference/preference/api/public_plus_experimental_current.txt
index 4cc0b65..b3f9a4c 100644
--- a/preference/preference/api/public_plus_experimental_current.txt
+++ b/preference/preference/api/public_plus_experimental_current.txt
@@ -2,33 +2,33 @@
 package androidx.preference {
 
   public class CheckBoxPreference extends androidx.preference.TwoStatePreference {
-    ctor public CheckBoxPreference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public CheckBoxPreference(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public CheckBoxPreference(android.content.Context!, android.util.AttributeSet!);
-    ctor public CheckBoxPreference(android.content.Context!);
+    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet?);
+    ctor public CheckBoxPreference(android.content.Context);
   }
 
   public abstract class DialogPreference extends androidx.preference.Preference {
-    ctor public DialogPreference(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public DialogPreference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public DialogPreference(android.content.Context!, android.util.AttributeSet!);
-    ctor public DialogPreference(android.content.Context!);
-    method public android.graphics.drawable.Drawable! getDialogIcon();
+    ctor public DialogPreference(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public DialogPreference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public DialogPreference(android.content.Context, android.util.AttributeSet?);
+    ctor public DialogPreference(android.content.Context);
+    method public android.graphics.drawable.Drawable? getDialogIcon();
     method public int getDialogLayoutResource();
-    method public CharSequence! getDialogMessage();
-    method public CharSequence! getDialogTitle();
-    method public CharSequence! getNegativeButtonText();
-    method public CharSequence! getPositiveButtonText();
-    method public void setDialogIcon(android.graphics.drawable.Drawable!);
+    method public CharSequence? getDialogMessage();
+    method public CharSequence? getDialogTitle();
+    method public CharSequence? getNegativeButtonText();
+    method public CharSequence? getPositiveButtonText();
+    method public void setDialogIcon(android.graphics.drawable.Drawable?);
     method public void setDialogIcon(int);
     method public void setDialogLayoutResource(int);
-    method public void setDialogMessage(CharSequence!);
+    method public void setDialogMessage(CharSequence?);
     method public void setDialogMessage(int);
-    method public void setDialogTitle(CharSequence!);
+    method public void setDialogTitle(CharSequence?);
     method public void setDialogTitle(int);
-    method public void setNegativeButtonText(CharSequence!);
+    method public void setNegativeButtonText(CharSequence?);
     method public void setNegativeButtonText(int);
-    method public void setPositiveButtonText(CharSequence!);
+    method public void setPositiveButtonText(CharSequence?);
     method public void setPositiveButtonText(int);
   }
 
@@ -37,21 +37,21 @@
   }
 
   public class DropDownPreference extends androidx.preference.ListPreference {
-    ctor public DropDownPreference(android.content.Context!);
-    ctor public DropDownPreference(android.content.Context!, android.util.AttributeSet!);
-    ctor public DropDownPreference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public DropDownPreference(android.content.Context!, android.util.AttributeSet!, int, int);
-    method protected android.widget.ArrayAdapter! createAdapter();
+    ctor public DropDownPreference(android.content.Context);
+    ctor public DropDownPreference(android.content.Context, android.util.AttributeSet?);
+    ctor public DropDownPreference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public DropDownPreference(android.content.Context, android.util.AttributeSet?, int, int);
+    method protected android.widget.ArrayAdapter createAdapter();
   }
 
   public class EditTextPreference extends androidx.preference.DialogPreference {
-    ctor public EditTextPreference(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public EditTextPreference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public EditTextPreference(android.content.Context!, android.util.AttributeSet!);
-    ctor public EditTextPreference(android.content.Context!);
-    method public String! getText();
+    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet?);
+    ctor public EditTextPreference(android.content.Context);
+    method public String? getText();
     method public void setOnBindEditTextListener(androidx.preference.EditTextPreference.OnBindEditTextListener?);
-    method public void setText(String!);
+    method public void setText(String?);
   }
 
   public static interface EditTextPreference.OnBindEditTextListener {
@@ -59,31 +59,31 @@
   }
 
   public static final class EditTextPreference.SimpleSummaryProvider implements androidx.preference.Preference.SummaryProvider<androidx.preference.EditTextPreference> {
-    method public static androidx.preference.EditTextPreference.SimpleSummaryProvider! getInstance();
-    method public CharSequence! provideSummary(androidx.preference.EditTextPreference!);
+    method public static androidx.preference.EditTextPreference.SimpleSummaryProvider getInstance();
+    method public CharSequence? provideSummary(androidx.preference.EditTextPreference);
   }
 
   @Deprecated public class EditTextPreferenceDialogFragment extends androidx.preference.PreferenceDialogFragment {
     ctor @Deprecated public EditTextPreferenceDialogFragment();
-    method @Deprecated public static androidx.preference.EditTextPreferenceDialogFragment! newInstance(String!);
-    method @Deprecated protected void onBindDialogView(android.view.View!);
+    method @Deprecated public static androidx.preference.EditTextPreferenceDialogFragment newInstance(String!);
+    method @Deprecated protected void onBindDialogView(android.view.View);
     method @Deprecated public void onDialogClosed(boolean);
   }
 
   public class EditTextPreferenceDialogFragmentCompat extends androidx.preference.PreferenceDialogFragmentCompat {
     ctor public EditTextPreferenceDialogFragmentCompat();
-    method public static androidx.preference.EditTextPreferenceDialogFragmentCompat! newInstance(String!);
+    method public static androidx.preference.EditTextPreferenceDialogFragmentCompat newInstance(String!);
     method public void onDialogClosed(boolean);
   }
 
   public class ListPreference extends androidx.preference.DialogPreference {
-    ctor public ListPreference(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public ListPreference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public ListPreference(android.content.Context!, android.util.AttributeSet!);
-    ctor public ListPreference(android.content.Context!);
+    ctor public ListPreference(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public ListPreference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public ListPreference(android.content.Context, android.util.AttributeSet?);
+    ctor public ListPreference(android.content.Context);
     method public int findIndexOfValue(String!);
     method public CharSequence![]! getEntries();
-    method public CharSequence! getEntry();
+    method public CharSequence? getEntry();
     method public CharSequence![]! getEntryValues();
     method public String! getValue();
     method public void setEntries(CharSequence![]!);
@@ -95,28 +95,28 @@
   }
 
   public static final class ListPreference.SimpleSummaryProvider implements androidx.preference.Preference.SummaryProvider<androidx.preference.ListPreference> {
-    method public static androidx.preference.ListPreference.SimpleSummaryProvider! getInstance();
-    method public CharSequence! provideSummary(androidx.preference.ListPreference!);
+    method public static androidx.preference.ListPreference.SimpleSummaryProvider getInstance();
+    method public CharSequence? provideSummary(androidx.preference.ListPreference);
   }
 
   @Deprecated public class ListPreferenceDialogFragment extends androidx.preference.PreferenceDialogFragment {
     ctor @Deprecated public ListPreferenceDialogFragment();
-    method @Deprecated public static androidx.preference.ListPreferenceDialogFragment! newInstance(String!);
+    method @Deprecated public static androidx.preference.ListPreferenceDialogFragment newInstance(String!);
     method @Deprecated public void onDialogClosed(boolean);
-    method @Deprecated protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder!);
+    method @Deprecated protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder);
   }
 
   public class ListPreferenceDialogFragmentCompat extends androidx.preference.PreferenceDialogFragmentCompat {
     ctor public ListPreferenceDialogFragmentCompat();
-    method public static androidx.preference.ListPreferenceDialogFragmentCompat! newInstance(String!);
+    method public static androidx.preference.ListPreferenceDialogFragmentCompat newInstance(String!);
     method public void onDialogClosed(boolean);
   }
 
   public class MultiSelectListPreference extends androidx.preference.DialogPreference {
-    ctor public MultiSelectListPreference(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public MultiSelectListPreference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public MultiSelectListPreference(android.content.Context!, android.util.AttributeSet!);
-    ctor public MultiSelectListPreference(android.content.Context!);
+    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet?);
+    ctor public MultiSelectListPreference(android.content.Context);
     method public int findIndexOfValue(String!);
     method public CharSequence![]! getEntries();
     method public CharSequence![]! getEntryValues();
@@ -131,35 +131,35 @@
 
   @Deprecated public class MultiSelectListPreferenceDialogFragment extends androidx.preference.PreferenceDialogFragment {
     ctor @Deprecated public MultiSelectListPreferenceDialogFragment();
-    method @Deprecated public static androidx.preference.MultiSelectListPreferenceDialogFragment! newInstance(String!);
+    method @Deprecated public static androidx.preference.MultiSelectListPreferenceDialogFragment newInstance(String!);
     method @Deprecated public void onDialogClosed(boolean);
-    method @Deprecated protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder!);
+    method @Deprecated protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder);
   }
 
   public class MultiSelectListPreferenceDialogFragmentCompat extends androidx.preference.PreferenceDialogFragmentCompat {
     ctor public MultiSelectListPreferenceDialogFragmentCompat();
-    method public static androidx.preference.MultiSelectListPreferenceDialogFragmentCompat! newInstance(String!);
+    method public static androidx.preference.MultiSelectListPreferenceDialogFragmentCompat newInstance(String!);
     method public void onDialogClosed(boolean);
   }
 
   public class Preference implements java.lang.Comparable<androidx.preference.Preference> {
-    ctor public Preference(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public Preference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public Preference(android.content.Context!, android.util.AttributeSet!);
-    ctor public Preference(android.content.Context!);
+    ctor public Preference(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public Preference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public Preference(android.content.Context, android.util.AttributeSet?);
+    ctor public Preference(android.content.Context);
     method public boolean callChangeListener(Object!);
     method public int compareTo(androidx.preference.Preference);
     method protected <T extends androidx.preference.Preference> T? findPreferenceInHierarchy(String);
-    method public android.content.Context! getContext();
-    method public String! getDependency();
-    method public android.os.Bundle! getExtras();
-    method public String! getFragment();
-    method public android.graphics.drawable.Drawable! getIcon();
-    method public android.content.Intent! getIntent();
+    method public android.content.Context getContext();
+    method public String? getDependency();
+    method public android.os.Bundle getExtras();
+    method public String? getFragment();
+    method public android.graphics.drawable.Drawable? getIcon();
+    method public android.content.Intent? getIntent();
     method public String! getKey();
     method public final int getLayoutResource();
-    method public androidx.preference.Preference.OnPreferenceChangeListener! getOnPreferenceChangeListener();
-    method public androidx.preference.Preference.OnPreferenceClickListener! getOnPreferenceClickListener();
+    method public androidx.preference.Preference.OnPreferenceChangeListener? getOnPreferenceChangeListener();
+    method public androidx.preference.Preference.OnPreferenceClickListener? getOnPreferenceClickListener();
     method public int getOrder();
     method public androidx.preference.PreferenceGroup? getParent();
     method protected boolean getPersistedBoolean(boolean);
@@ -170,11 +170,11 @@
     method public java.util.Set<java.lang.String!>! getPersistedStringSet(java.util.Set<java.lang.String!>!);
     method public androidx.preference.PreferenceDataStore? getPreferenceDataStore();
     method public androidx.preference.PreferenceManager! getPreferenceManager();
-    method public android.content.SharedPreferences! getSharedPreferences();
+    method public android.content.SharedPreferences? getSharedPreferences();
     method public boolean getShouldDisableView();
-    method public CharSequence! getSummary();
+    method public CharSequence? getSummary();
     method public final androidx.preference.Preference.SummaryProvider? getSummaryProvider();
-    method public CharSequence! getTitle();
+    method public CharSequence? getTitle();
     method public final int getWidgetLayoutResource();
     method public boolean hasKey();
     method public boolean isCopyingEnabled();
@@ -189,51 +189,51 @@
     method public void notifyDependencyChange(boolean);
     method protected void notifyHierarchyChanged();
     method public void onAttached();
-    method protected void onAttachedToHierarchy(androidx.preference.PreferenceManager!);
-    method public void onBindViewHolder(androidx.preference.PreferenceViewHolder!);
+    method protected void onAttachedToHierarchy(androidx.preference.PreferenceManager);
+    method public void onBindViewHolder(androidx.preference.PreferenceViewHolder);
     method protected void onClick();
-    method public void onDependencyChanged(androidx.preference.Preference!, boolean);
+    method public void onDependencyChanged(androidx.preference.Preference, boolean);
     method public void onDetached();
-    method protected Object! onGetDefaultValue(android.content.res.TypedArray!, int);
+    method protected Object? onGetDefaultValue(android.content.res.TypedArray, int);
     method @Deprecated @CallSuper public void onInitializeAccessibilityNodeInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
-    method public void onParentChanged(androidx.preference.Preference!, boolean);
+    method public void onParentChanged(androidx.preference.Preference, boolean);
     method protected void onPrepareForRemoval();
-    method protected void onRestoreInstanceState(android.os.Parcelable!);
-    method protected android.os.Parcelable! onSaveInstanceState();
+    method protected void onRestoreInstanceState(android.os.Parcelable?);
+    method protected android.os.Parcelable? onSaveInstanceState();
     method @Deprecated protected void onSetInitialValue(boolean, Object!);
     method protected void onSetInitialValue(Object?);
-    method public android.os.Bundle! peekExtras();
+    method public android.os.Bundle? peekExtras();
     method protected boolean persistBoolean(boolean);
     method protected boolean persistFloat(float);
     method protected boolean persistInt(int);
     method protected boolean persistLong(long);
     method protected boolean persistString(String!);
     method public boolean persistStringSet(java.util.Set<java.lang.String!>!);
-    method public void restoreHierarchyState(android.os.Bundle!);
-    method public void saveHierarchyState(android.os.Bundle!);
+    method public void restoreHierarchyState(android.os.Bundle);
+    method public void saveHierarchyState(android.os.Bundle);
     method public void setCopyingEnabled(boolean);
     method public void setDefaultValue(Object!);
-    method public void setDependency(String!);
+    method public void setDependency(String?);
     method public void setEnabled(boolean);
-    method public void setFragment(String!);
-    method public void setIcon(android.graphics.drawable.Drawable!);
+    method public void setFragment(String?);
+    method public void setIcon(android.graphics.drawable.Drawable?);
     method public void setIcon(int);
     method public void setIconSpaceReserved(boolean);
-    method public void setIntent(android.content.Intent!);
+    method public void setIntent(android.content.Intent?);
     method public void setKey(String!);
     method public void setLayoutResource(int);
-    method public void setOnPreferenceChangeListener(androidx.preference.Preference.OnPreferenceChangeListener!);
-    method public void setOnPreferenceClickListener(androidx.preference.Preference.OnPreferenceClickListener!);
+    method public void setOnPreferenceChangeListener(androidx.preference.Preference.OnPreferenceChangeListener?);
+    method public void setOnPreferenceClickListener(androidx.preference.Preference.OnPreferenceClickListener?);
     method public void setOrder(int);
     method public void setPersistent(boolean);
-    method public void setPreferenceDataStore(androidx.preference.PreferenceDataStore!);
+    method public void setPreferenceDataStore(androidx.preference.PreferenceDataStore?);
     method public void setSelectable(boolean);
     method public void setShouldDisableView(boolean);
     method public void setSingleLineTitle(boolean);
-    method public void setSummary(CharSequence!);
+    method public void setSummary(CharSequence?);
     method public void setSummary(int);
     method public final void setSummaryProvider(androidx.preference.Preference.SummaryProvider?);
-    method public void setTitle(CharSequence!);
+    method public void setTitle(CharSequence?);
     method public void setTitle(int);
     method public void setViewId(int);
     method public final void setVisible(boolean);
@@ -246,26 +246,26 @@
   public static class Preference.BaseSavedState extends android.view.AbsSavedState {
     ctor public Preference.BaseSavedState(android.os.Parcel!);
     ctor public Preference.BaseSavedState(android.os.Parcelable!);
-    field public static final android.os.Parcelable.Creator<androidx.preference.Preference.BaseSavedState!>! CREATOR;
+    field public static final android.os.Parcelable.Creator<androidx.preference.Preference.BaseSavedState!> CREATOR;
   }
 
   public static interface Preference.OnPreferenceChangeListener {
-    method public boolean onPreferenceChange(androidx.preference.Preference!, Object!);
+    method public boolean onPreferenceChange(androidx.preference.Preference, Object!);
   }
 
   public static interface Preference.OnPreferenceClickListener {
-    method public boolean onPreferenceClick(androidx.preference.Preference!);
+    method public boolean onPreferenceClick(androidx.preference.Preference);
   }
 
   public static interface Preference.SummaryProvider<T extends androidx.preference.Preference> {
-    method public CharSequence! provideSummary(T!);
+    method public CharSequence? provideSummary(T);
   }
 
   public class PreferenceCategory extends androidx.preference.PreferenceGroup {
-    ctor public PreferenceCategory(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public PreferenceCategory(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public PreferenceCategory(android.content.Context!, android.util.AttributeSet!);
-    ctor public PreferenceCategory(android.content.Context!);
+    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet?, int);
+    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet?);
+    ctor public PreferenceCategory(android.content.Context);
   }
 
   public abstract class PreferenceDataStore {
@@ -287,14 +287,14 @@
   @Deprecated public abstract class PreferenceDialogFragment extends android.app.DialogFragment implements android.content.DialogInterface.OnClickListener {
     ctor @Deprecated public PreferenceDialogFragment();
     method @Deprecated public androidx.preference.DialogPreference! getPreference();
-    method @Deprecated protected void onBindDialogView(android.view.View!);
-    method @Deprecated public void onClick(android.content.DialogInterface!, int);
-    method @Deprecated public void onCreate(android.os.Bundle!);
-    method @Deprecated public android.app.Dialog onCreateDialog(android.os.Bundle!);
-    method @Deprecated protected android.view.View! onCreateDialogView(android.content.Context!);
+    method @Deprecated protected void onBindDialogView(android.view.View);
+    method @Deprecated public void onClick(android.content.DialogInterface, int);
+    method @Deprecated public void onCreate(android.os.Bundle?);
+    method @Deprecated public android.app.Dialog onCreateDialog(android.os.Bundle?);
+    method @Deprecated protected android.view.View? onCreateDialogView(android.content.Context);
     method @Deprecated public abstract void onDialogClosed(boolean);
-    method @Deprecated public void onDismiss(android.content.DialogInterface!);
-    method @Deprecated protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder!);
+    method @Deprecated public void onDismiss(android.content.DialogInterface);
+    method @Deprecated protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder);
     method @Deprecated public void onSaveInstanceState(android.os.Bundle);
     field @Deprecated protected static final String ARG_KEY = "key";
   }
@@ -302,38 +302,38 @@
   public abstract class PreferenceDialogFragmentCompat extends androidx.fragment.app.DialogFragment implements android.content.DialogInterface.OnClickListener {
     ctor public PreferenceDialogFragmentCompat();
     method public androidx.preference.DialogPreference! getPreference();
-    method protected void onBindDialogView(android.view.View!);
-    method public void onClick(android.content.DialogInterface!, int);
-    method protected android.view.View! onCreateDialogView(android.content.Context!);
+    method protected void onBindDialogView(android.view.View);
+    method public void onClick(android.content.DialogInterface, int);
+    method protected android.view.View? onCreateDialogView(android.content.Context);
     method public abstract void onDialogClosed(boolean);
-    method protected void onPrepareDialogBuilder(androidx.appcompat.app.AlertDialog.Builder!);
+    method protected void onPrepareDialogBuilder(androidx.appcompat.app.AlertDialog.Builder);
     field protected static final String ARG_KEY = "key";
   }
 
   @Deprecated public abstract class PreferenceFragment extends android.app.Fragment implements androidx.preference.DialogPreference.TargetFragment androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener androidx.preference.PreferenceManager.OnNavigateToScreenListener androidx.preference.PreferenceManager.OnPreferenceTreeClickListener {
     ctor @Deprecated public PreferenceFragment();
     method @Deprecated public void addPreferencesFromResource(@XmlRes int);
-    method @Deprecated public <T extends androidx.preference.Preference> T! findPreference(CharSequence!);
+    method @Deprecated public <T extends androidx.preference.Preference> T! findPreference(CharSequence);
     method @Deprecated public final androidx.recyclerview.widget.RecyclerView! getListView();
     method @Deprecated public androidx.preference.PreferenceManager! getPreferenceManager();
     method @Deprecated public androidx.preference.PreferenceScreen! getPreferenceScreen();
-    method @Deprecated public void onCreate(android.os.Bundle!);
-    method @Deprecated protected androidx.recyclerview.widget.RecyclerView.Adapter! onCreateAdapter(androidx.preference.PreferenceScreen!);
-    method @Deprecated public androidx.recyclerview.widget.RecyclerView.LayoutManager! onCreateLayoutManager();
-    method @Deprecated public abstract void onCreatePreferences(android.os.Bundle!, String!);
-    method @Deprecated public androidx.recyclerview.widget.RecyclerView! onCreateRecyclerView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
-    method @Deprecated public android.view.View! onCreateView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
+    method @Deprecated public void onCreate(android.os.Bundle?);
+    method @Deprecated protected androidx.recyclerview.widget.RecyclerView.Adapter onCreateAdapter(androidx.preference.PreferenceScreen);
+    method @Deprecated public androidx.recyclerview.widget.RecyclerView.LayoutManager onCreateLayoutManager();
+    method @Deprecated public abstract void onCreatePreferences(android.os.Bundle?, String!);
+    method @Deprecated public androidx.recyclerview.widget.RecyclerView onCreateRecyclerView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle?);
+    method @Deprecated public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup?, android.os.Bundle?);
     method @Deprecated public void onDestroyView();
-    method @Deprecated public void onDisplayPreferenceDialog(androidx.preference.Preference!);
-    method @Deprecated public void onNavigateToScreen(androidx.preference.PreferenceScreen!);
-    method @Deprecated public boolean onPreferenceTreeClick(androidx.preference.Preference!);
-    method @Deprecated public void onSaveInstanceState(android.os.Bundle!);
+    method @Deprecated public void onDisplayPreferenceDialog(androidx.preference.Preference);
+    method @Deprecated public void onNavigateToScreen(androidx.preference.PreferenceScreen);
+    method @Deprecated public boolean onPreferenceTreeClick(androidx.preference.Preference);
+    method @Deprecated public void onSaveInstanceState(android.os.Bundle);
     method @Deprecated public void onStart();
     method @Deprecated public void onStop();
-    method @Deprecated public void onViewCreated(android.view.View!, android.os.Bundle!);
-    method @Deprecated public void scrollToPreference(String!);
-    method @Deprecated public void scrollToPreference(androidx.preference.Preference!);
-    method @Deprecated public void setDivider(android.graphics.drawable.Drawable!);
+    method @Deprecated public void onViewCreated(android.view.View, android.os.Bundle?);
+    method @Deprecated public void scrollToPreference(String);
+    method @Deprecated public void scrollToPreference(androidx.preference.Preference);
+    method @Deprecated public void setDivider(android.graphics.drawable.Drawable?);
     method @Deprecated public void setDividerHeight(int);
     method @Deprecated public void setPreferenceScreen(androidx.preference.PreferenceScreen!);
     method @Deprecated public void setPreferencesFromResource(@XmlRes int, String?);
@@ -341,15 +341,15 @@
   }
 
   @Deprecated public static interface PreferenceFragment.OnPreferenceDisplayDialogCallback {
-    method @Deprecated public boolean onPreferenceDisplayDialog(androidx.preference.PreferenceFragment, androidx.preference.Preference!);
+    method @Deprecated public boolean onPreferenceDisplayDialog(androidx.preference.PreferenceFragment, androidx.preference.Preference);
   }
 
   @Deprecated public static interface PreferenceFragment.OnPreferenceStartFragmentCallback {
-    method @Deprecated public boolean onPreferenceStartFragment(androidx.preference.PreferenceFragment!, androidx.preference.Preference!);
+    method @Deprecated public boolean onPreferenceStartFragment(androidx.preference.PreferenceFragment, androidx.preference.Preference);
   }
 
   @Deprecated public static interface PreferenceFragment.OnPreferenceStartScreenCallback {
-    method @Deprecated public boolean onPreferenceStartScreen(androidx.preference.PreferenceFragment!, androidx.preference.PreferenceScreen!);
+    method @Deprecated public boolean onPreferenceStartScreen(androidx.preference.PreferenceFragment, androidx.preference.PreferenceScreen);
   }
 
   public abstract class PreferenceFragmentCompat extends androidx.fragment.app.Fragment implements androidx.preference.DialogPreference.TargetFragment androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener androidx.preference.PreferenceManager.OnNavigateToScreenListener androidx.preference.PreferenceManager.OnPreferenceTreeClickListener {
@@ -359,16 +359,16 @@
     method public final androidx.recyclerview.widget.RecyclerView! getListView();
     method public androidx.preference.PreferenceManager! getPreferenceManager();
     method public androidx.preference.PreferenceScreen! getPreferenceScreen();
-    method protected androidx.recyclerview.widget.RecyclerView.Adapter! onCreateAdapter(androidx.preference.PreferenceScreen!);
-    method public androidx.recyclerview.widget.RecyclerView.LayoutManager! onCreateLayoutManager();
-    method public abstract void onCreatePreferences(android.os.Bundle!, String!);
-    method public androidx.recyclerview.widget.RecyclerView! onCreateRecyclerView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
-    method public void onDisplayPreferenceDialog(androidx.preference.Preference!);
-    method public void onNavigateToScreen(androidx.preference.PreferenceScreen!);
-    method public boolean onPreferenceTreeClick(androidx.preference.Preference!);
-    method public void scrollToPreference(String!);
-    method public void scrollToPreference(androidx.preference.Preference!);
-    method public void setDivider(android.graphics.drawable.Drawable!);
+    method protected androidx.recyclerview.widget.RecyclerView.Adapter onCreateAdapter(androidx.preference.PreferenceScreen);
+    method public androidx.recyclerview.widget.RecyclerView.LayoutManager onCreateLayoutManager();
+    method public abstract void onCreatePreferences(android.os.Bundle?, String?);
+    method public androidx.recyclerview.widget.RecyclerView onCreateRecyclerView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle?);
+    method public void onDisplayPreferenceDialog(androidx.preference.Preference);
+    method public void onNavigateToScreen(androidx.preference.PreferenceScreen);
+    method public boolean onPreferenceTreeClick(androidx.preference.Preference);
+    method public void scrollToPreference(String);
+    method public void scrollToPreference(androidx.preference.Preference);
+    method public void setDivider(android.graphics.drawable.Drawable?);
     method public void setDividerHeight(int);
     method public void setPreferenceScreen(androidx.preference.PreferenceScreen!);
     method public void setPreferencesFromResource(@XmlRes int, String?);
@@ -376,42 +376,42 @@
   }
 
   public static interface PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback {
-    method public boolean onPreferenceDisplayDialog(androidx.preference.PreferenceFragmentCompat, androidx.preference.Preference!);
+    method public boolean onPreferenceDisplayDialog(androidx.preference.PreferenceFragmentCompat, androidx.preference.Preference);
   }
 
   public static interface PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
-    method public boolean onPreferenceStartFragment(androidx.preference.PreferenceFragmentCompat!, androidx.preference.Preference!);
+    method public boolean onPreferenceStartFragment(androidx.preference.PreferenceFragmentCompat, androidx.preference.Preference);
   }
 
   public static interface PreferenceFragmentCompat.OnPreferenceStartScreenCallback {
-    method public boolean onPreferenceStartScreen(androidx.preference.PreferenceFragmentCompat!, androidx.preference.PreferenceScreen!);
+    method public boolean onPreferenceStartScreen(androidx.preference.PreferenceFragmentCompat, androidx.preference.PreferenceScreen);
   }
 
   public abstract class PreferenceGroup extends androidx.preference.Preference {
-    ctor public PreferenceGroup(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public PreferenceGroup(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public PreferenceGroup(android.content.Context!, android.util.AttributeSet!);
-    method public void addItemFromInflater(androidx.preference.Preference!);
-    method public boolean addPreference(androidx.preference.Preference!);
-    method protected void dispatchRestoreInstanceState(android.os.Bundle!);
-    method protected void dispatchSaveInstanceState(android.os.Bundle!);
+    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet?, int);
+    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet?);
+    method public void addItemFromInflater(androidx.preference.Preference);
+    method public boolean addPreference(androidx.preference.Preference);
+    method protected void dispatchRestoreInstanceState(android.os.Bundle);
+    method protected void dispatchSaveInstanceState(android.os.Bundle);
     method public <T extends androidx.preference.Preference> T? findPreference(CharSequence);
     method public int getInitialExpandedChildrenCount();
-    method public androidx.preference.Preference! getPreference(int);
+    method public androidx.preference.Preference getPreference(int);
     method public int getPreferenceCount();
     method protected boolean isOnSameScreenAsChildren();
     method public boolean isOrderingAsAdded();
-    method protected boolean onPrepareAddPreference(androidx.preference.Preference!);
+    method protected boolean onPrepareAddPreference(androidx.preference.Preference);
     method public void removeAll();
-    method public boolean removePreference(androidx.preference.Preference!);
+    method public boolean removePreference(androidx.preference.Preference);
     method public boolean removePreferenceRecursively(CharSequence);
     method public void setInitialExpandedChildrenCount(int);
     method public void setOrderingAsAdded(boolean);
   }
 
   public static interface PreferenceGroup.PreferencePositionCallback {
-    method public int getPreferenceAdapterPosition(String!);
-    method public int getPreferenceAdapterPosition(androidx.preference.Preference!);
+    method public int getPreferenceAdapterPosition(String);
+    method public int getPreferenceAdapterPosition(androidx.preference.Preference);
   }
 
   public abstract class PreferenceHeaderFragmentCompat extends androidx.fragment.app.Fragment implements androidx.preference.PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
@@ -425,14 +425,14 @@
   }
 
   public class PreferenceManager {
-    method public androidx.preference.PreferenceScreen! createPreferenceScreen(android.content.Context!);
+    method public androidx.preference.PreferenceScreen createPreferenceScreen(android.content.Context);
     method public <T extends androidx.preference.Preference> T? findPreference(CharSequence);
-    method public android.content.Context! getContext();
-    method public static android.content.SharedPreferences! getDefaultSharedPreferences(android.content.Context!);
-    method public androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener! getOnDisplayPreferenceDialogListener();
-    method public androidx.preference.PreferenceManager.OnNavigateToScreenListener! getOnNavigateToScreenListener();
-    method public androidx.preference.PreferenceManager.OnPreferenceTreeClickListener! getOnPreferenceTreeClickListener();
-    method public androidx.preference.PreferenceManager.PreferenceComparisonCallback! getPreferenceComparisonCallback();
+    method public android.content.Context getContext();
+    method public static android.content.SharedPreferences! getDefaultSharedPreferences(android.content.Context);
+    method public androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener? getOnDisplayPreferenceDialogListener();
+    method public androidx.preference.PreferenceManager.OnNavigateToScreenListener? getOnNavigateToScreenListener();
+    method public androidx.preference.PreferenceManager.OnPreferenceTreeClickListener? getOnPreferenceTreeClickListener();
+    method public androidx.preference.PreferenceManager.PreferenceComparisonCallback? getPreferenceComparisonCallback();
     method public androidx.preference.PreferenceDataStore? getPreferenceDataStore();
     method public androidx.preference.PreferenceScreen! getPreferenceScreen();
     method public android.content.SharedPreferences? getSharedPreferences();
@@ -440,44 +440,44 @@
     method public String! getSharedPreferencesName();
     method public boolean isStorageDefault();
     method public boolean isStorageDeviceProtected();
-    method public static void setDefaultValues(android.content.Context!, int, boolean);
-    method public static void setDefaultValues(android.content.Context!, String!, int, int, boolean);
-    method public void setOnDisplayPreferenceDialogListener(androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener!);
-    method public void setOnNavigateToScreenListener(androidx.preference.PreferenceManager.OnNavigateToScreenListener!);
-    method public void setOnPreferenceTreeClickListener(androidx.preference.PreferenceManager.OnPreferenceTreeClickListener!);
-    method public void setPreferenceComparisonCallback(androidx.preference.PreferenceManager.PreferenceComparisonCallback!);
-    method public void setPreferenceDataStore(androidx.preference.PreferenceDataStore!);
+    method public static void setDefaultValues(android.content.Context, int, boolean);
+    method public static void setDefaultValues(android.content.Context, String!, int, int, boolean);
+    method public void setOnDisplayPreferenceDialogListener(androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener?);
+    method public void setOnNavigateToScreenListener(androidx.preference.PreferenceManager.OnNavigateToScreenListener?);
+    method public void setOnPreferenceTreeClickListener(androidx.preference.PreferenceManager.OnPreferenceTreeClickListener?);
+    method public void setPreferenceComparisonCallback(androidx.preference.PreferenceManager.PreferenceComparisonCallback?);
+    method public void setPreferenceDataStore(androidx.preference.PreferenceDataStore?);
     method public boolean setPreferences(androidx.preference.PreferenceScreen!);
     method public void setSharedPreferencesMode(int);
     method public void setSharedPreferencesName(String!);
     method public void setStorageDefault();
     method public void setStorageDeviceProtected();
-    method public void showDialog(androidx.preference.Preference!);
+    method public void showDialog(androidx.preference.Preference);
     field public static final String KEY_HAS_SET_DEFAULT_VALUES = "_has_set_default_values";
   }
 
   public static interface PreferenceManager.OnDisplayPreferenceDialogListener {
-    method public void onDisplayPreferenceDialog(androidx.preference.Preference!);
+    method public void onDisplayPreferenceDialog(androidx.preference.Preference);
   }
 
   public static interface PreferenceManager.OnNavigateToScreenListener {
-    method public void onNavigateToScreen(androidx.preference.PreferenceScreen!);
+    method public void onNavigateToScreen(androidx.preference.PreferenceScreen);
   }
 
   public static interface PreferenceManager.OnPreferenceTreeClickListener {
-    method public boolean onPreferenceTreeClick(androidx.preference.Preference!);
+    method public boolean onPreferenceTreeClick(androidx.preference.Preference);
   }
 
   public abstract static class PreferenceManager.PreferenceComparisonCallback {
     ctor public PreferenceManager.PreferenceComparisonCallback();
-    method public abstract boolean arePreferenceContentsTheSame(androidx.preference.Preference!, androidx.preference.Preference!);
-    method public abstract boolean arePreferenceItemsTheSame(androidx.preference.Preference!, androidx.preference.Preference!);
+    method public abstract boolean arePreferenceContentsTheSame(androidx.preference.Preference, androidx.preference.Preference);
+    method public abstract boolean arePreferenceItemsTheSame(androidx.preference.Preference, androidx.preference.Preference);
   }
 
   public static class PreferenceManager.SimplePreferenceComparisonCallback extends androidx.preference.PreferenceManager.PreferenceComparisonCallback {
     ctor public PreferenceManager.SimplePreferenceComparisonCallback();
-    method public boolean arePreferenceContentsTheSame(androidx.preference.Preference!, androidx.preference.Preference!);
-    method public boolean arePreferenceItemsTheSame(androidx.preference.Preference!, androidx.preference.Preference!);
+    method public boolean arePreferenceContentsTheSame(androidx.preference.Preference, androidx.preference.Preference);
+    method public boolean arePreferenceItemsTheSame(androidx.preference.Preference, androidx.preference.Preference);
   }
 
   public final class PreferenceScreen extends androidx.preference.PreferenceGroup {
@@ -494,10 +494,10 @@
   }
 
   public class SeekBarPreference extends androidx.preference.Preference {
-    ctor public SeekBarPreference(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public SeekBarPreference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public SeekBarPreference(android.content.Context!, android.util.AttributeSet!);
-    ctor public SeekBarPreference(android.content.Context!);
+    ctor public SeekBarPreference(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public SeekBarPreference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public SeekBarPreference(android.content.Context, android.util.AttributeSet?);
+    ctor public SeekBarPreference(android.content.Context);
     method public int getMax();
     method public int getMin();
     method public final int getSeekBarIncrement();
@@ -515,47 +515,47 @@
   }
 
   public class SwitchPreference extends androidx.preference.TwoStatePreference {
-    ctor public SwitchPreference(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public SwitchPreference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public SwitchPreference(android.content.Context!, android.util.AttributeSet!);
-    ctor public SwitchPreference(android.content.Context!);
-    method public CharSequence! getSwitchTextOff();
-    method public CharSequence! getSwitchTextOn();
-    method public void setSwitchTextOff(CharSequence!);
+    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet?);
+    ctor public SwitchPreference(android.content.Context);
+    method public CharSequence? getSwitchTextOff();
+    method public CharSequence? getSwitchTextOn();
+    method public void setSwitchTextOff(CharSequence?);
     method public void setSwitchTextOff(int);
-    method public void setSwitchTextOn(CharSequence!);
+    method public void setSwitchTextOn(CharSequence?);
     method public void setSwitchTextOn(int);
   }
 
   public class SwitchPreferenceCompat extends androidx.preference.TwoStatePreference {
-    ctor public SwitchPreferenceCompat(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public SwitchPreferenceCompat(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public SwitchPreferenceCompat(android.content.Context!, android.util.AttributeSet!);
-    ctor public SwitchPreferenceCompat(android.content.Context!);
-    method public CharSequence! getSwitchTextOff();
-    method public CharSequence! getSwitchTextOn();
-    method public void setSwitchTextOff(CharSequence!);
+    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet?, int);
+    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet?);
+    ctor public SwitchPreferenceCompat(android.content.Context);
+    method public CharSequence? getSwitchTextOff();
+    method public CharSequence? getSwitchTextOn();
+    method public void setSwitchTextOff(CharSequence?);
     method public void setSwitchTextOff(int);
-    method public void setSwitchTextOn(CharSequence!);
+    method public void setSwitchTextOn(CharSequence?);
     method public void setSwitchTextOn(int);
   }
 
   public abstract class TwoStatePreference extends androidx.preference.Preference {
-    ctor public TwoStatePreference(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public TwoStatePreference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public TwoStatePreference(android.content.Context!, android.util.AttributeSet!);
-    ctor public TwoStatePreference(android.content.Context!);
+    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet?);
+    ctor public TwoStatePreference(android.content.Context);
     method public boolean getDisableDependentsState();
-    method public CharSequence! getSummaryOff();
-    method public CharSequence! getSummaryOn();
+    method public CharSequence? getSummaryOff();
+    method public CharSequence? getSummaryOn();
     method public boolean isChecked();
     method public void setChecked(boolean);
     method public void setDisableDependentsState(boolean);
-    method public void setSummaryOff(CharSequence!);
+    method public void setSummaryOff(CharSequence?);
     method public void setSummaryOff(int);
-    method public void setSummaryOn(CharSequence!);
+    method public void setSummaryOn(CharSequence?);
     method public void setSummaryOn(int);
-    method protected void syncSummaryView(androidx.preference.PreferenceViewHolder!);
+    method protected void syncSummaryView(androidx.preference.PreferenceViewHolder);
     field protected boolean mChecked;
   }
 
diff --git a/preference/preference/api/restricted_current.txt b/preference/preference/api/restricted_current.txt
index 1ca2328..4a9020e 100644
--- a/preference/preference/api/restricted_current.txt
+++ b/preference/preference/api/restricted_current.txt
@@ -2,33 +2,33 @@
 package androidx.preference {
 
   public class CheckBoxPreference extends androidx.preference.TwoStatePreference {
-    ctor public CheckBoxPreference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public CheckBoxPreference(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public CheckBoxPreference(android.content.Context!, android.util.AttributeSet!);
-    ctor public CheckBoxPreference(android.content.Context!);
+    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet?);
+    ctor public CheckBoxPreference(android.content.Context);
   }
 
   public abstract class DialogPreference extends androidx.preference.Preference {
-    ctor public DialogPreference(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public DialogPreference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public DialogPreference(android.content.Context!, android.util.AttributeSet!);
-    ctor public DialogPreference(android.content.Context!);
-    method public android.graphics.drawable.Drawable! getDialogIcon();
+    ctor public DialogPreference(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public DialogPreference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public DialogPreference(android.content.Context, android.util.AttributeSet?);
+    ctor public DialogPreference(android.content.Context);
+    method public android.graphics.drawable.Drawable? getDialogIcon();
     method public int getDialogLayoutResource();
-    method public CharSequence! getDialogMessage();
-    method public CharSequence! getDialogTitle();
-    method public CharSequence! getNegativeButtonText();
-    method public CharSequence! getPositiveButtonText();
-    method public void setDialogIcon(android.graphics.drawable.Drawable!);
+    method public CharSequence? getDialogMessage();
+    method public CharSequence? getDialogTitle();
+    method public CharSequence? getNegativeButtonText();
+    method public CharSequence? getPositiveButtonText();
+    method public void setDialogIcon(android.graphics.drawable.Drawable?);
     method public void setDialogIcon(int);
     method public void setDialogLayoutResource(int);
-    method public void setDialogMessage(CharSequence!);
+    method public void setDialogMessage(CharSequence?);
     method public void setDialogMessage(int);
-    method public void setDialogTitle(CharSequence!);
+    method public void setDialogTitle(CharSequence?);
     method public void setDialogTitle(int);
-    method public void setNegativeButtonText(CharSequence!);
+    method public void setNegativeButtonText(CharSequence?);
     method public void setNegativeButtonText(int);
-    method public void setPositiveButtonText(CharSequence!);
+    method public void setPositiveButtonText(CharSequence?);
     method public void setPositiveButtonText(int);
   }
 
@@ -37,21 +37,21 @@
   }
 
   public class DropDownPreference extends androidx.preference.ListPreference {
-    ctor public DropDownPreference(android.content.Context!);
-    ctor public DropDownPreference(android.content.Context!, android.util.AttributeSet!);
-    ctor public DropDownPreference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public DropDownPreference(android.content.Context!, android.util.AttributeSet!, int, int);
-    method protected android.widget.ArrayAdapter! createAdapter();
+    ctor public DropDownPreference(android.content.Context);
+    ctor public DropDownPreference(android.content.Context, android.util.AttributeSet?);
+    ctor public DropDownPreference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public DropDownPreference(android.content.Context, android.util.AttributeSet?, int, int);
+    method protected android.widget.ArrayAdapter createAdapter();
   }
 
   public class EditTextPreference extends androidx.preference.DialogPreference {
-    ctor public EditTextPreference(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public EditTextPreference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public EditTextPreference(android.content.Context!, android.util.AttributeSet!);
-    ctor public EditTextPreference(android.content.Context!);
-    method public String! getText();
+    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet?);
+    ctor public EditTextPreference(android.content.Context);
+    method public String? getText();
     method public void setOnBindEditTextListener(androidx.preference.EditTextPreference.OnBindEditTextListener?);
-    method public void setText(String!);
+    method public void setText(String?);
   }
 
   public static interface EditTextPreference.OnBindEditTextListener {
@@ -59,31 +59,31 @@
   }
 
   public static final class EditTextPreference.SimpleSummaryProvider implements androidx.preference.Preference.SummaryProvider<androidx.preference.EditTextPreference> {
-    method public static androidx.preference.EditTextPreference.SimpleSummaryProvider! getInstance();
-    method public CharSequence! provideSummary(androidx.preference.EditTextPreference!);
+    method public static androidx.preference.EditTextPreference.SimpleSummaryProvider getInstance();
+    method public CharSequence? provideSummary(androidx.preference.EditTextPreference);
   }
 
   @Deprecated public class EditTextPreferenceDialogFragment extends androidx.preference.PreferenceDialogFragment {
     ctor @Deprecated public EditTextPreferenceDialogFragment();
-    method @Deprecated public static androidx.preference.EditTextPreferenceDialogFragment! newInstance(String!);
-    method @Deprecated protected void onBindDialogView(android.view.View!);
+    method @Deprecated public static androidx.preference.EditTextPreferenceDialogFragment newInstance(String!);
+    method @Deprecated protected void onBindDialogView(android.view.View);
     method @Deprecated public void onDialogClosed(boolean);
   }
 
   public class EditTextPreferenceDialogFragmentCompat extends androidx.preference.PreferenceDialogFragmentCompat {
     ctor public EditTextPreferenceDialogFragmentCompat();
-    method public static androidx.preference.EditTextPreferenceDialogFragmentCompat! newInstance(String!);
+    method public static androidx.preference.EditTextPreferenceDialogFragmentCompat newInstance(String!);
     method public void onDialogClosed(boolean);
   }
 
   public class ListPreference extends androidx.preference.DialogPreference {
-    ctor public ListPreference(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public ListPreference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public ListPreference(android.content.Context!, android.util.AttributeSet!);
-    ctor public ListPreference(android.content.Context!);
+    ctor public ListPreference(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public ListPreference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public ListPreference(android.content.Context, android.util.AttributeSet?);
+    ctor public ListPreference(android.content.Context);
     method public int findIndexOfValue(String!);
     method public CharSequence![]! getEntries();
-    method public CharSequence! getEntry();
+    method public CharSequence? getEntry();
     method public CharSequence![]! getEntryValues();
     method public String! getValue();
     method public void setEntries(CharSequence![]!);
@@ -95,28 +95,28 @@
   }
 
   public static final class ListPreference.SimpleSummaryProvider implements androidx.preference.Preference.SummaryProvider<androidx.preference.ListPreference> {
-    method public static androidx.preference.ListPreference.SimpleSummaryProvider! getInstance();
-    method public CharSequence! provideSummary(androidx.preference.ListPreference!);
+    method public static androidx.preference.ListPreference.SimpleSummaryProvider getInstance();
+    method public CharSequence? provideSummary(androidx.preference.ListPreference);
   }
 
   @Deprecated public class ListPreferenceDialogFragment extends androidx.preference.PreferenceDialogFragment {
     ctor @Deprecated public ListPreferenceDialogFragment();
-    method @Deprecated public static androidx.preference.ListPreferenceDialogFragment! newInstance(String!);
+    method @Deprecated public static androidx.preference.ListPreferenceDialogFragment newInstance(String!);
     method @Deprecated public void onDialogClosed(boolean);
-    method @Deprecated protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder!);
+    method @Deprecated protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder);
   }
 
   public class ListPreferenceDialogFragmentCompat extends androidx.preference.PreferenceDialogFragmentCompat {
     ctor public ListPreferenceDialogFragmentCompat();
-    method public static androidx.preference.ListPreferenceDialogFragmentCompat! newInstance(String!);
+    method public static androidx.preference.ListPreferenceDialogFragmentCompat newInstance(String!);
     method public void onDialogClosed(boolean);
   }
 
   public class MultiSelectListPreference extends androidx.preference.DialogPreference {
-    ctor public MultiSelectListPreference(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public MultiSelectListPreference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public MultiSelectListPreference(android.content.Context!, android.util.AttributeSet!);
-    ctor public MultiSelectListPreference(android.content.Context!);
+    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet?);
+    ctor public MultiSelectListPreference(android.content.Context);
     method public int findIndexOfValue(String!);
     method public CharSequence![]! getEntries();
     method public CharSequence![]! getEntryValues();
@@ -131,35 +131,35 @@
 
   @Deprecated public class MultiSelectListPreferenceDialogFragment extends androidx.preference.PreferenceDialogFragment {
     ctor @Deprecated public MultiSelectListPreferenceDialogFragment();
-    method @Deprecated public static androidx.preference.MultiSelectListPreferenceDialogFragment! newInstance(String!);
+    method @Deprecated public static androidx.preference.MultiSelectListPreferenceDialogFragment newInstance(String!);
     method @Deprecated public void onDialogClosed(boolean);
-    method @Deprecated protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder!);
+    method @Deprecated protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder);
   }
 
   public class MultiSelectListPreferenceDialogFragmentCompat extends androidx.preference.PreferenceDialogFragmentCompat {
     ctor public MultiSelectListPreferenceDialogFragmentCompat();
-    method public static androidx.preference.MultiSelectListPreferenceDialogFragmentCompat! newInstance(String!);
+    method public static androidx.preference.MultiSelectListPreferenceDialogFragmentCompat newInstance(String!);
     method public void onDialogClosed(boolean);
   }
 
   public class Preference implements java.lang.Comparable<androidx.preference.Preference> {
-    ctor public Preference(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public Preference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public Preference(android.content.Context!, android.util.AttributeSet!);
-    ctor public Preference(android.content.Context!);
+    ctor public Preference(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public Preference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public Preference(android.content.Context, android.util.AttributeSet?);
+    ctor public Preference(android.content.Context);
     method public boolean callChangeListener(Object!);
     method public int compareTo(androidx.preference.Preference);
     method protected <T extends androidx.preference.Preference> T? findPreferenceInHierarchy(String);
-    method public android.content.Context! getContext();
-    method public String! getDependency();
-    method public android.os.Bundle! getExtras();
-    method public String! getFragment();
-    method public android.graphics.drawable.Drawable! getIcon();
-    method public android.content.Intent! getIntent();
+    method public android.content.Context getContext();
+    method public String? getDependency();
+    method public android.os.Bundle getExtras();
+    method public String? getFragment();
+    method public android.graphics.drawable.Drawable? getIcon();
+    method public android.content.Intent? getIntent();
     method public String! getKey();
     method public final int getLayoutResource();
-    method public androidx.preference.Preference.OnPreferenceChangeListener! getOnPreferenceChangeListener();
-    method public androidx.preference.Preference.OnPreferenceClickListener! getOnPreferenceClickListener();
+    method public androidx.preference.Preference.OnPreferenceChangeListener? getOnPreferenceChangeListener();
+    method public androidx.preference.Preference.OnPreferenceClickListener? getOnPreferenceClickListener();
     method public int getOrder();
     method public androidx.preference.PreferenceGroup? getParent();
     method protected boolean getPersistedBoolean(boolean);
@@ -170,11 +170,11 @@
     method public java.util.Set<java.lang.String!>! getPersistedStringSet(java.util.Set<java.lang.String!>!);
     method public androidx.preference.PreferenceDataStore? getPreferenceDataStore();
     method public androidx.preference.PreferenceManager! getPreferenceManager();
-    method public android.content.SharedPreferences! getSharedPreferences();
+    method public android.content.SharedPreferences? getSharedPreferences();
     method public boolean getShouldDisableView();
-    method public CharSequence! getSummary();
+    method public CharSequence? getSummary();
     method public final androidx.preference.Preference.SummaryProvider? getSummaryProvider();
-    method public CharSequence! getTitle();
+    method public CharSequence? getTitle();
     method public final int getWidgetLayoutResource();
     method public boolean hasKey();
     method public boolean isCopyingEnabled();
@@ -189,22 +189,22 @@
     method public void notifyDependencyChange(boolean);
     method protected void notifyHierarchyChanged();
     method public void onAttached();
-    method protected void onAttachedToHierarchy(androidx.preference.PreferenceManager!);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void onAttachedToHierarchy(androidx.preference.PreferenceManager!, long);
-    method public void onBindViewHolder(androidx.preference.PreferenceViewHolder!);
+    method protected void onAttachedToHierarchy(androidx.preference.PreferenceManager);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void onAttachedToHierarchy(androidx.preference.PreferenceManager, long);
+    method public void onBindViewHolder(androidx.preference.PreferenceViewHolder);
     method protected void onClick();
-    method public void onDependencyChanged(androidx.preference.Preference!, boolean);
+    method public void onDependencyChanged(androidx.preference.Preference, boolean);
     method public void onDetached();
-    method protected Object! onGetDefaultValue(android.content.res.TypedArray!, int);
+    method protected Object? onGetDefaultValue(android.content.res.TypedArray, int);
     method @Deprecated @CallSuper public void onInitializeAccessibilityNodeInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
-    method public void onParentChanged(androidx.preference.Preference!, boolean);
+    method public void onParentChanged(androidx.preference.Preference, boolean);
     method protected void onPrepareForRemoval();
-    method protected void onRestoreInstanceState(android.os.Parcelable!);
-    method protected android.os.Parcelable! onSaveInstanceState();
+    method protected void onRestoreInstanceState(android.os.Parcelable?);
+    method protected android.os.Parcelable? onSaveInstanceState();
     method @Deprecated protected void onSetInitialValue(boolean, Object!);
     method protected void onSetInitialValue(Object?);
-    method public android.os.Bundle! peekExtras();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void performClick(android.view.View!);
+    method public android.os.Bundle? peekExtras();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void performClick(android.view.View);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void performClick();
     method protected boolean persistBoolean(boolean);
     method protected boolean persistFloat(float);
@@ -212,31 +212,31 @@
     method protected boolean persistLong(long);
     method protected boolean persistString(String!);
     method public boolean persistStringSet(java.util.Set<java.lang.String!>!);
-    method public void restoreHierarchyState(android.os.Bundle!);
-    method public void saveHierarchyState(android.os.Bundle!);
+    method public void restoreHierarchyState(android.os.Bundle);
+    method public void saveHierarchyState(android.os.Bundle);
     method public void setCopyingEnabled(boolean);
     method public void setDefaultValue(Object!);
-    method public void setDependency(String!);
+    method public void setDependency(String?);
     method public void setEnabled(boolean);
-    method public void setFragment(String!);
-    method public void setIcon(android.graphics.drawable.Drawable!);
+    method public void setFragment(String?);
+    method public void setIcon(android.graphics.drawable.Drawable?);
     method public void setIcon(int);
     method public void setIconSpaceReserved(boolean);
-    method public void setIntent(android.content.Intent!);
+    method public void setIntent(android.content.Intent?);
     method public void setKey(String!);
     method public void setLayoutResource(int);
-    method public void setOnPreferenceChangeListener(androidx.preference.Preference.OnPreferenceChangeListener!);
-    method public void setOnPreferenceClickListener(androidx.preference.Preference.OnPreferenceClickListener!);
+    method public void setOnPreferenceChangeListener(androidx.preference.Preference.OnPreferenceChangeListener?);
+    method public void setOnPreferenceClickListener(androidx.preference.Preference.OnPreferenceClickListener?);
     method public void setOrder(int);
     method public void setPersistent(boolean);
-    method public void setPreferenceDataStore(androidx.preference.PreferenceDataStore!);
+    method public void setPreferenceDataStore(androidx.preference.PreferenceDataStore?);
     method public void setSelectable(boolean);
     method public void setShouldDisableView(boolean);
     method public void setSingleLineTitle(boolean);
-    method public void setSummary(CharSequence!);
+    method public void setSummary(CharSequence?);
     method public void setSummary(int);
     method public final void setSummaryProvider(androidx.preference.Preference.SummaryProvider?);
-    method public void setTitle(CharSequence!);
+    method public void setTitle(CharSequence?);
     method public void setTitle(int);
     method public void setViewId(int);
     method public final void setVisible(boolean);
@@ -249,26 +249,26 @@
   public static class Preference.BaseSavedState extends android.view.AbsSavedState {
     ctor public Preference.BaseSavedState(android.os.Parcel!);
     ctor public Preference.BaseSavedState(android.os.Parcelable!);
-    field public static final android.os.Parcelable.Creator<androidx.preference.Preference.BaseSavedState!>! CREATOR;
+    field public static final android.os.Parcelable.Creator<androidx.preference.Preference.BaseSavedState!> CREATOR;
   }
 
   public static interface Preference.OnPreferenceChangeListener {
-    method public boolean onPreferenceChange(androidx.preference.Preference!, Object!);
+    method public boolean onPreferenceChange(androidx.preference.Preference, Object!);
   }
 
   public static interface Preference.OnPreferenceClickListener {
-    method public boolean onPreferenceClick(androidx.preference.Preference!);
+    method public boolean onPreferenceClick(androidx.preference.Preference);
   }
 
   public static interface Preference.SummaryProvider<T extends androidx.preference.Preference> {
-    method public CharSequence! provideSummary(T!);
+    method public CharSequence? provideSummary(T);
   }
 
   public class PreferenceCategory extends androidx.preference.PreferenceGroup {
-    ctor public PreferenceCategory(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public PreferenceCategory(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public PreferenceCategory(android.content.Context!, android.util.AttributeSet!);
-    ctor public PreferenceCategory(android.content.Context!);
+    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet?, int);
+    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet?);
+    ctor public PreferenceCategory(android.content.Context);
   }
 
   public abstract class PreferenceDataStore {
@@ -290,14 +290,14 @@
   @Deprecated public abstract class PreferenceDialogFragment extends android.app.DialogFragment implements android.content.DialogInterface.OnClickListener {
     ctor @Deprecated public PreferenceDialogFragment();
     method @Deprecated public androidx.preference.DialogPreference! getPreference();
-    method @Deprecated protected void onBindDialogView(android.view.View!);
-    method @Deprecated public void onClick(android.content.DialogInterface!, int);
-    method @Deprecated public void onCreate(android.os.Bundle!);
-    method @Deprecated public android.app.Dialog onCreateDialog(android.os.Bundle!);
-    method @Deprecated protected android.view.View! onCreateDialogView(android.content.Context!);
+    method @Deprecated protected void onBindDialogView(android.view.View);
+    method @Deprecated public void onClick(android.content.DialogInterface, int);
+    method @Deprecated public void onCreate(android.os.Bundle?);
+    method @Deprecated public android.app.Dialog onCreateDialog(android.os.Bundle?);
+    method @Deprecated protected android.view.View? onCreateDialogView(android.content.Context);
     method @Deprecated public abstract void onDialogClosed(boolean);
-    method @Deprecated public void onDismiss(android.content.DialogInterface!);
-    method @Deprecated protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder!);
+    method @Deprecated public void onDismiss(android.content.DialogInterface);
+    method @Deprecated protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder);
     method @Deprecated public void onSaveInstanceState(android.os.Bundle);
     field @Deprecated protected static final String ARG_KEY = "key";
   }
@@ -305,38 +305,38 @@
   public abstract class PreferenceDialogFragmentCompat extends androidx.fragment.app.DialogFragment implements android.content.DialogInterface.OnClickListener {
     ctor public PreferenceDialogFragmentCompat();
     method public androidx.preference.DialogPreference! getPreference();
-    method protected void onBindDialogView(android.view.View!);
-    method public void onClick(android.content.DialogInterface!, int);
-    method protected android.view.View! onCreateDialogView(android.content.Context!);
+    method protected void onBindDialogView(android.view.View);
+    method public void onClick(android.content.DialogInterface, int);
+    method protected android.view.View? onCreateDialogView(android.content.Context);
     method public abstract void onDialogClosed(boolean);
-    method protected void onPrepareDialogBuilder(androidx.appcompat.app.AlertDialog.Builder!);
+    method protected void onPrepareDialogBuilder(androidx.appcompat.app.AlertDialog.Builder);
     field protected static final String ARG_KEY = "key";
   }
 
   @Deprecated public abstract class PreferenceFragment extends android.app.Fragment implements androidx.preference.DialogPreference.TargetFragment androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener androidx.preference.PreferenceManager.OnNavigateToScreenListener androidx.preference.PreferenceManager.OnPreferenceTreeClickListener {
     ctor @Deprecated public PreferenceFragment();
     method @Deprecated public void addPreferencesFromResource(@XmlRes int);
-    method @Deprecated public <T extends androidx.preference.Preference> T! findPreference(CharSequence!);
+    method @Deprecated public <T extends androidx.preference.Preference> T! findPreference(CharSequence);
     method @Deprecated public final androidx.recyclerview.widget.RecyclerView! getListView();
     method @Deprecated public androidx.preference.PreferenceManager! getPreferenceManager();
     method @Deprecated public androidx.preference.PreferenceScreen! getPreferenceScreen();
-    method @Deprecated public void onCreate(android.os.Bundle!);
-    method @Deprecated protected androidx.recyclerview.widget.RecyclerView.Adapter! onCreateAdapter(androidx.preference.PreferenceScreen!);
-    method @Deprecated public androidx.recyclerview.widget.RecyclerView.LayoutManager! onCreateLayoutManager();
-    method @Deprecated public abstract void onCreatePreferences(android.os.Bundle!, String!);
-    method @Deprecated public androidx.recyclerview.widget.RecyclerView! onCreateRecyclerView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
-    method @Deprecated public android.view.View! onCreateView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
+    method @Deprecated public void onCreate(android.os.Bundle?);
+    method @Deprecated protected androidx.recyclerview.widget.RecyclerView.Adapter onCreateAdapter(androidx.preference.PreferenceScreen);
+    method @Deprecated public androidx.recyclerview.widget.RecyclerView.LayoutManager onCreateLayoutManager();
+    method @Deprecated public abstract void onCreatePreferences(android.os.Bundle?, String!);
+    method @Deprecated public androidx.recyclerview.widget.RecyclerView onCreateRecyclerView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle?);
+    method @Deprecated public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup?, android.os.Bundle?);
     method @Deprecated public void onDestroyView();
-    method @Deprecated public void onDisplayPreferenceDialog(androidx.preference.Preference!);
-    method @Deprecated public void onNavigateToScreen(androidx.preference.PreferenceScreen!);
-    method @Deprecated public boolean onPreferenceTreeClick(androidx.preference.Preference!);
-    method @Deprecated public void onSaveInstanceState(android.os.Bundle!);
+    method @Deprecated public void onDisplayPreferenceDialog(androidx.preference.Preference);
+    method @Deprecated public void onNavigateToScreen(androidx.preference.PreferenceScreen);
+    method @Deprecated public boolean onPreferenceTreeClick(androidx.preference.Preference);
+    method @Deprecated public void onSaveInstanceState(android.os.Bundle);
     method @Deprecated public void onStart();
     method @Deprecated public void onStop();
-    method @Deprecated public void onViewCreated(android.view.View!, android.os.Bundle!);
-    method @Deprecated public void scrollToPreference(String!);
-    method @Deprecated public void scrollToPreference(androidx.preference.Preference!);
-    method @Deprecated public void setDivider(android.graphics.drawable.Drawable!);
+    method @Deprecated public void onViewCreated(android.view.View, android.os.Bundle?);
+    method @Deprecated public void scrollToPreference(String);
+    method @Deprecated public void scrollToPreference(androidx.preference.Preference);
+    method @Deprecated public void setDivider(android.graphics.drawable.Drawable?);
     method @Deprecated public void setDividerHeight(int);
     method @Deprecated public void setPreferenceScreen(androidx.preference.PreferenceScreen!);
     method @Deprecated public void setPreferencesFromResource(@XmlRes int, String?);
@@ -344,37 +344,37 @@
   }
 
   @Deprecated public static interface PreferenceFragment.OnPreferenceDisplayDialogCallback {
-    method @Deprecated public boolean onPreferenceDisplayDialog(androidx.preference.PreferenceFragment, androidx.preference.Preference!);
+    method @Deprecated public boolean onPreferenceDisplayDialog(androidx.preference.PreferenceFragment, androidx.preference.Preference);
   }
 
   @Deprecated public static interface PreferenceFragment.OnPreferenceStartFragmentCallback {
-    method @Deprecated public boolean onPreferenceStartFragment(androidx.preference.PreferenceFragment!, androidx.preference.Preference!);
+    method @Deprecated public boolean onPreferenceStartFragment(androidx.preference.PreferenceFragment, androidx.preference.Preference);
   }
 
   @Deprecated public static interface PreferenceFragment.OnPreferenceStartScreenCallback {
-    method @Deprecated public boolean onPreferenceStartScreen(androidx.preference.PreferenceFragment!, androidx.preference.PreferenceScreen!);
+    method @Deprecated public boolean onPreferenceStartScreen(androidx.preference.PreferenceFragment, androidx.preference.PreferenceScreen);
   }
 
   public abstract class PreferenceFragmentCompat extends androidx.fragment.app.Fragment implements androidx.preference.DialogPreference.TargetFragment androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener androidx.preference.PreferenceManager.OnNavigateToScreenListener androidx.preference.PreferenceManager.OnPreferenceTreeClickListener {
     ctor public PreferenceFragmentCompat();
     method public void addPreferencesFromResource(@XmlRes int);
     method public <T extends androidx.preference.Preference> T? findPreference(CharSequence);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.fragment.app.Fragment! getCallbackFragment();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.fragment.app.Fragment? getCallbackFragment();
     method public final androidx.recyclerview.widget.RecyclerView! getListView();
     method public androidx.preference.PreferenceManager! getPreferenceManager();
     method public androidx.preference.PreferenceScreen! getPreferenceScreen();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void onBindPreferences();
-    method protected androidx.recyclerview.widget.RecyclerView.Adapter! onCreateAdapter(androidx.preference.PreferenceScreen!);
-    method public androidx.recyclerview.widget.RecyclerView.LayoutManager! onCreateLayoutManager();
-    method public abstract void onCreatePreferences(android.os.Bundle!, String!);
-    method public androidx.recyclerview.widget.RecyclerView! onCreateRecyclerView(android.view.LayoutInflater!, android.view.ViewGroup!, android.os.Bundle!);
-    method public void onDisplayPreferenceDialog(androidx.preference.Preference!);
-    method public void onNavigateToScreen(androidx.preference.PreferenceScreen!);
-    method public boolean onPreferenceTreeClick(androidx.preference.Preference!);
+    method protected androidx.recyclerview.widget.RecyclerView.Adapter onCreateAdapter(androidx.preference.PreferenceScreen);
+    method public androidx.recyclerview.widget.RecyclerView.LayoutManager onCreateLayoutManager();
+    method public abstract void onCreatePreferences(android.os.Bundle?, String?);
+    method public androidx.recyclerview.widget.RecyclerView onCreateRecyclerView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle?);
+    method public void onDisplayPreferenceDialog(androidx.preference.Preference);
+    method public void onNavigateToScreen(androidx.preference.PreferenceScreen);
+    method public boolean onPreferenceTreeClick(androidx.preference.Preference);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void onUnbindPreferences();
-    method public void scrollToPreference(String!);
-    method public void scrollToPreference(androidx.preference.Preference!);
-    method public void setDivider(android.graphics.drawable.Drawable!);
+    method public void scrollToPreference(String);
+    method public void scrollToPreference(androidx.preference.Preference);
+    method public void setDivider(android.graphics.drawable.Drawable?);
     method public void setDividerHeight(int);
     method public void setPreferenceScreen(androidx.preference.PreferenceScreen!);
     method public void setPreferencesFromResource(@XmlRes int, String?);
@@ -382,35 +382,35 @@
   }
 
   public static interface PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback {
-    method public boolean onPreferenceDisplayDialog(androidx.preference.PreferenceFragmentCompat, androidx.preference.Preference!);
+    method public boolean onPreferenceDisplayDialog(androidx.preference.PreferenceFragmentCompat, androidx.preference.Preference);
   }
 
   public static interface PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
-    method public boolean onPreferenceStartFragment(androidx.preference.PreferenceFragmentCompat!, androidx.preference.Preference!);
+    method public boolean onPreferenceStartFragment(androidx.preference.PreferenceFragmentCompat, androidx.preference.Preference);
   }
 
   public static interface PreferenceFragmentCompat.OnPreferenceStartScreenCallback {
-    method public boolean onPreferenceStartScreen(androidx.preference.PreferenceFragmentCompat!, androidx.preference.PreferenceScreen!);
+    method public boolean onPreferenceStartScreen(androidx.preference.PreferenceFragmentCompat, androidx.preference.PreferenceScreen);
   }
 
   public abstract class PreferenceGroup extends androidx.preference.Preference {
-    ctor public PreferenceGroup(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public PreferenceGroup(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public PreferenceGroup(android.content.Context!, android.util.AttributeSet!);
-    method public void addItemFromInflater(androidx.preference.Preference!);
-    method public boolean addPreference(androidx.preference.Preference!);
-    method protected void dispatchRestoreInstanceState(android.os.Bundle!);
-    method protected void dispatchSaveInstanceState(android.os.Bundle!);
+    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet?, int);
+    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet?);
+    method public void addItemFromInflater(androidx.preference.Preference);
+    method public boolean addPreference(androidx.preference.Preference);
+    method protected void dispatchRestoreInstanceState(android.os.Bundle);
+    method protected void dispatchSaveInstanceState(android.os.Bundle);
     method public <T extends androidx.preference.Preference> T? findPreference(CharSequence);
     method public int getInitialExpandedChildrenCount();
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.preference.PreferenceGroup.OnExpandButtonClickListener? getOnExpandButtonClickListener();
-    method public androidx.preference.Preference! getPreference(int);
+    method public androidx.preference.Preference getPreference(int);
     method public int getPreferenceCount();
     method protected boolean isOnSameScreenAsChildren();
     method public boolean isOrderingAsAdded();
-    method protected boolean onPrepareAddPreference(androidx.preference.Preference!);
+    method protected boolean onPrepareAddPreference(androidx.preference.Preference);
     method public void removeAll();
-    method public boolean removePreference(androidx.preference.Preference!);
+    method public boolean removePreference(androidx.preference.Preference);
     method public boolean removePreferenceRecursively(CharSequence);
     method public void setInitialExpandedChildrenCount(int);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setOnExpandButtonClickListener(androidx.preference.PreferenceGroup.OnExpandButtonClickListener?);
@@ -422,21 +422,21 @@
   }
 
   public static interface PreferenceGroup.PreferencePositionCallback {
-    method public int getPreferenceAdapterPosition(String!);
-    method public int getPreferenceAdapterPosition(androidx.preference.Preference!);
+    method public int getPreferenceAdapterPosition(String);
+    method public int getPreferenceAdapterPosition(androidx.preference.Preference);
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class PreferenceGroupAdapter extends androidx.recyclerview.widget.RecyclerView.Adapter<androidx.preference.PreferenceViewHolder> implements androidx.preference.PreferenceGroup.PreferencePositionCallback {
-    ctor public PreferenceGroupAdapter(androidx.preference.PreferenceGroup!);
-    method public androidx.preference.Preference! getItem(int);
+    ctor public PreferenceGroupAdapter(androidx.preference.PreferenceGroup);
+    method public androidx.preference.Preference? getItem(int);
     method public int getItemCount();
-    method public int getPreferenceAdapterPosition(String!);
-    method public int getPreferenceAdapterPosition(androidx.preference.Preference!);
+    method public int getPreferenceAdapterPosition(String);
+    method public int getPreferenceAdapterPosition(androidx.preference.Preference);
     method public void onBindViewHolder(androidx.preference.PreferenceViewHolder, int);
     method public androidx.preference.PreferenceViewHolder onCreateViewHolder(android.view.ViewGroup, int);
-    method public void onPreferenceChange(androidx.preference.Preference!);
-    method public void onPreferenceHierarchyChange(androidx.preference.Preference!);
-    method public void onPreferenceVisibilityChange(androidx.preference.Preference!);
+    method public void onPreferenceChange(androidx.preference.Preference);
+    method public void onPreferenceHierarchyChange(androidx.preference.Preference);
+    method public void onPreferenceVisibilityChange(androidx.preference.Preference);
   }
 
   public abstract class PreferenceHeaderFragmentCompat extends androidx.fragment.app.Fragment implements androidx.preference.PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
@@ -450,69 +450,69 @@
   }
 
   public class PreferenceManager {
-    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public PreferenceManager(android.content.Context!);
-    method public androidx.preference.PreferenceScreen! createPreferenceScreen(android.content.Context!);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public PreferenceManager(android.content.Context);
+    method public androidx.preference.PreferenceScreen createPreferenceScreen(android.content.Context);
     method public <T extends androidx.preference.Preference> T? findPreference(CharSequence);
-    method public android.content.Context! getContext();
-    method public static android.content.SharedPreferences! getDefaultSharedPreferences(android.content.Context!);
-    method public androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener! getOnDisplayPreferenceDialogListener();
-    method public androidx.preference.PreferenceManager.OnNavigateToScreenListener! getOnNavigateToScreenListener();
-    method public androidx.preference.PreferenceManager.OnPreferenceTreeClickListener! getOnPreferenceTreeClickListener();
-    method public androidx.preference.PreferenceManager.PreferenceComparisonCallback! getPreferenceComparisonCallback();
+    method public android.content.Context getContext();
+    method public static android.content.SharedPreferences! getDefaultSharedPreferences(android.content.Context);
+    method public androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener? getOnDisplayPreferenceDialogListener();
+    method public androidx.preference.PreferenceManager.OnNavigateToScreenListener? getOnNavigateToScreenListener();
+    method public androidx.preference.PreferenceManager.OnPreferenceTreeClickListener? getOnPreferenceTreeClickListener();
+    method public androidx.preference.PreferenceManager.PreferenceComparisonCallback? getPreferenceComparisonCallback();
     method public androidx.preference.PreferenceDataStore? getPreferenceDataStore();
     method public androidx.preference.PreferenceScreen! getPreferenceScreen();
     method public android.content.SharedPreferences? getSharedPreferences();
     method public int getSharedPreferencesMode();
     method public String! getSharedPreferencesName();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.preference.PreferenceScreen! inflateFromResource(android.content.Context!, int, androidx.preference.PreferenceScreen!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.preference.PreferenceScreen inflateFromResource(android.content.Context, int, androidx.preference.PreferenceScreen?);
     method public boolean isStorageDefault();
     method public boolean isStorageDeviceProtected();
-    method public static void setDefaultValues(android.content.Context!, int, boolean);
-    method public static void setDefaultValues(android.content.Context!, String!, int, int, boolean);
-    method public void setOnDisplayPreferenceDialogListener(androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener!);
-    method public void setOnNavigateToScreenListener(androidx.preference.PreferenceManager.OnNavigateToScreenListener!);
-    method public void setOnPreferenceTreeClickListener(androidx.preference.PreferenceManager.OnPreferenceTreeClickListener!);
-    method public void setPreferenceComparisonCallback(androidx.preference.PreferenceManager.PreferenceComparisonCallback!);
-    method public void setPreferenceDataStore(androidx.preference.PreferenceDataStore!);
+    method public static void setDefaultValues(android.content.Context, int, boolean);
+    method public static void setDefaultValues(android.content.Context, String!, int, int, boolean);
+    method public void setOnDisplayPreferenceDialogListener(androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener?);
+    method public void setOnNavigateToScreenListener(androidx.preference.PreferenceManager.OnNavigateToScreenListener?);
+    method public void setOnPreferenceTreeClickListener(androidx.preference.PreferenceManager.OnPreferenceTreeClickListener?);
+    method public void setPreferenceComparisonCallback(androidx.preference.PreferenceManager.PreferenceComparisonCallback?);
+    method public void setPreferenceDataStore(androidx.preference.PreferenceDataStore?);
     method public boolean setPreferences(androidx.preference.PreferenceScreen!);
     method public void setSharedPreferencesMode(int);
     method public void setSharedPreferencesName(String!);
     method public void setStorageDefault();
     method public void setStorageDeviceProtected();
-    method public void showDialog(androidx.preference.Preference!);
+    method public void showDialog(androidx.preference.Preference);
     field public static final String KEY_HAS_SET_DEFAULT_VALUES = "_has_set_default_values";
   }
 
   public static interface PreferenceManager.OnDisplayPreferenceDialogListener {
-    method public void onDisplayPreferenceDialog(androidx.preference.Preference!);
+    method public void onDisplayPreferenceDialog(androidx.preference.Preference);
   }
 
   public static interface PreferenceManager.OnNavigateToScreenListener {
-    method public void onNavigateToScreen(androidx.preference.PreferenceScreen!);
+    method public void onNavigateToScreen(androidx.preference.PreferenceScreen);
   }
 
   public static interface PreferenceManager.OnPreferenceTreeClickListener {
-    method public boolean onPreferenceTreeClick(androidx.preference.Preference!);
+    method public boolean onPreferenceTreeClick(androidx.preference.Preference);
   }
 
   public abstract static class PreferenceManager.PreferenceComparisonCallback {
     ctor public PreferenceManager.PreferenceComparisonCallback();
-    method public abstract boolean arePreferenceContentsTheSame(androidx.preference.Preference!, androidx.preference.Preference!);
-    method public abstract boolean arePreferenceItemsTheSame(androidx.preference.Preference!, androidx.preference.Preference!);
+    method public abstract boolean arePreferenceContentsTheSame(androidx.preference.Preference, androidx.preference.Preference);
+    method public abstract boolean arePreferenceItemsTheSame(androidx.preference.Preference, androidx.preference.Preference);
   }
 
   public static class PreferenceManager.SimplePreferenceComparisonCallback extends androidx.preference.PreferenceManager.PreferenceComparisonCallback {
     ctor public PreferenceManager.SimplePreferenceComparisonCallback();
-    method public boolean arePreferenceContentsTheSame(androidx.preference.Preference!, androidx.preference.Preference!);
-    method public boolean arePreferenceItemsTheSame(androidx.preference.Preference!, androidx.preference.Preference!);
+    method public boolean arePreferenceContentsTheSame(androidx.preference.Preference, androidx.preference.Preference);
+    method public boolean arePreferenceItemsTheSame(androidx.preference.Preference, androidx.preference.Preference);
   }
 
   @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class PreferenceRecyclerViewAccessibilityDelegate extends androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate {
-    ctor @Deprecated public PreferenceRecyclerViewAccessibilityDelegate(androidx.recyclerview.widget.RecyclerView!);
+    ctor @Deprecated public PreferenceRecyclerViewAccessibilityDelegate(androidx.recyclerview.widget.RecyclerView);
   }
 
   public final class PreferenceScreen extends androidx.preference.PreferenceGroup {
-    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public PreferenceScreen(android.content.Context!, android.util.AttributeSet!);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public PreferenceScreen(android.content.Context, android.util.AttributeSet?);
     method public void setShouldUseGeneratedIds(boolean);
     method public boolean shouldUseGeneratedIds();
   }
@@ -526,10 +526,10 @@
   }
 
   public class SeekBarPreference extends androidx.preference.Preference {
-    ctor public SeekBarPreference(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public SeekBarPreference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public SeekBarPreference(android.content.Context!, android.util.AttributeSet!);
-    ctor public SeekBarPreference(android.content.Context!);
+    ctor public SeekBarPreference(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public SeekBarPreference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public SeekBarPreference(android.content.Context, android.util.AttributeSet?);
+    ctor public SeekBarPreference(android.content.Context);
     method public int getMax();
     method public int getMin();
     method public final int getSeekBarIncrement();
@@ -547,53 +547,53 @@
   }
 
   public class SwitchPreference extends androidx.preference.TwoStatePreference {
-    ctor public SwitchPreference(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public SwitchPreference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public SwitchPreference(android.content.Context!, android.util.AttributeSet!);
-    ctor public SwitchPreference(android.content.Context!);
-    method public CharSequence! getSwitchTextOff();
-    method public CharSequence! getSwitchTextOn();
-    method public void setSwitchTextOff(CharSequence!);
+    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet?);
+    ctor public SwitchPreference(android.content.Context);
+    method public CharSequence? getSwitchTextOff();
+    method public CharSequence? getSwitchTextOn();
+    method public void setSwitchTextOff(CharSequence?);
     method public void setSwitchTextOff(int);
-    method public void setSwitchTextOn(CharSequence!);
+    method public void setSwitchTextOn(CharSequence?);
     method public void setSwitchTextOn(int);
   }
 
   public class SwitchPreferenceCompat extends androidx.preference.TwoStatePreference {
-    ctor public SwitchPreferenceCompat(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public SwitchPreferenceCompat(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public SwitchPreferenceCompat(android.content.Context!, android.util.AttributeSet!);
-    ctor public SwitchPreferenceCompat(android.content.Context!);
-    method public CharSequence! getSwitchTextOff();
-    method public CharSequence! getSwitchTextOn();
-    method public void setSwitchTextOff(CharSequence!);
+    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet?, int);
+    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet?);
+    ctor public SwitchPreferenceCompat(android.content.Context);
+    method public CharSequence? getSwitchTextOff();
+    method public CharSequence? getSwitchTextOn();
+    method public void setSwitchTextOff(CharSequence?);
     method public void setSwitchTextOff(int);
-    method public void setSwitchTextOn(CharSequence!);
+    method public void setSwitchTextOn(CharSequence?);
     method public void setSwitchTextOn(int);
   }
 
   public abstract class TwoStatePreference extends androidx.preference.Preference {
-    ctor public TwoStatePreference(android.content.Context!, android.util.AttributeSet!, int, int);
-    ctor public TwoStatePreference(android.content.Context!, android.util.AttributeSet!, int);
-    ctor public TwoStatePreference(android.content.Context!, android.util.AttributeSet!);
-    ctor public TwoStatePreference(android.content.Context!);
+    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet?, int);
+    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet?);
+    ctor public TwoStatePreference(android.content.Context);
     method public boolean getDisableDependentsState();
-    method public CharSequence! getSummaryOff();
-    method public CharSequence! getSummaryOn();
+    method public CharSequence? getSummaryOff();
+    method public CharSequence? getSummaryOn();
     method public boolean isChecked();
     method public void setChecked(boolean);
     method public void setDisableDependentsState(boolean);
-    method public void setSummaryOff(CharSequence!);
+    method public void setSummaryOff(CharSequence?);
     method public void setSummaryOff(int);
-    method public void setSummaryOn(CharSequence!);
+    method public void setSummaryOn(CharSequence?);
     method public void setSummaryOn(int);
-    method protected void syncSummaryView(androidx.preference.PreferenceViewHolder!);
+    method protected void syncSummaryView(androidx.preference.PreferenceViewHolder);
     field protected boolean mChecked;
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class UnPressableLinearLayout extends android.widget.LinearLayout {
-    ctor public UnPressableLinearLayout(android.content.Context!);
-    ctor public UnPressableLinearLayout(android.content.Context!, android.util.AttributeSet!);
+    ctor public UnPressableLinearLayout(android.content.Context);
+    ctor public UnPressableLinearLayout(android.content.Context, android.util.AttributeSet?);
   }
 
 }
@@ -601,9 +601,9 @@
 package @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY) androidx.preference.internal {
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class PreferenceImageView extends android.widget.ImageView {
-    ctor public PreferenceImageView(android.content.Context!);
-    ctor public PreferenceImageView(android.content.Context!, android.util.AttributeSet!);
-    ctor public PreferenceImageView(android.content.Context!, android.util.AttributeSet!, int);
+    ctor public PreferenceImageView(android.content.Context);
+    ctor public PreferenceImageView(android.content.Context, android.util.AttributeSet?);
+    ctor public PreferenceImageView(android.content.Context, android.util.AttributeSet?, int);
   }
 
 }
diff --git a/preference/preference/lint-baseline.xml b/preference/preference/lint-baseline.xml
index 0b708f6..a83047e 100644
--- a/preference/preference/lint-baseline.xml
+++ b/preference/preference/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.2.0-dev" type="baseline" client="gradle" dependencies="false" name="AGP (7.2.0-dev)" variant="all" version="7.2.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="ClassVerificationFailure"
@@ -8,7 +8,7 @@
         errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceCategory.java"
-            line="73"
+            line="77"
             column="29"/>
     </issue>
 
@@ -19,7 +19,7 @@
         errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/EditTextPreference.java"
-            line="161"
+            line="164"
             column="38"/>
     </issue>
 
@@ -30,7 +30,7 @@
         errorLine2="                ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/ListPreference.java"
-            line="244"
+            line="249"
             column="17"/>
     </issue>
 
@@ -41,7 +41,7 @@
         errorLine2="                ~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/ListPreference.java"
-            line="244"
+            line="249"
             column="17"/>
     </issue>
 
@@ -52,755 +52,62 @@
         errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceScreen.java"
-            line="80"
+            line="82"
             column="20"/>
     </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="    public CheckBoxPreference(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                              ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/CheckBoxPreference.java"
-            line="44"
-            column="31"/>
-    </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="    public CheckBoxPreference(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                                               ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/CheckBoxPreference.java"
-            line="44"
-            column="48"/>
-    </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="            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
-        errorLine2="            ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/CheckBoxPreference.java"
-            line="48"
-            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="            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
-        errorLine2="                             ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/CheckBoxPreference.java"
-            line="48"
-            column="30"/>
-    </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="    public CheckBoxPreference(Context context, AttributeSet attrs) {"
-        errorLine2="                              ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/CheckBoxPreference.java"
-            line="66"
-            column="31"/>
-    </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="    public CheckBoxPreference(Context context, AttributeSet attrs) {"
-        errorLine2="                                               ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/CheckBoxPreference.java"
-            line="66"
-            column="48"/>
-    </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="    public CheckBoxPreference(Context context) {"
-        errorLine2="                              ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/CheckBoxPreference.java"
-            line="71"
-            column="31"/>
-    </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="    public void onBindViewHolder(PreferenceViewHolder holder) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/CheckBoxPreference.java"
-            line="76"
-            column="34"/>
-    </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 void performClick(View view) {"
-        errorLine2="                                ~~~~">
-        <location
-            file="src/main/java/androidx/preference/CheckBoxPreference.java"
-            line="89"
-            column="33"/>
-    </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="            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
-        errorLine2="            ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/DialogPreference.java"
-            line="51"
-            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="            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
-        errorLine2="                             ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/DialogPreference.java"
-            line="51"
-            column="30"/>
-    </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="    public DialogPreference(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                            ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/DialogPreference.java"
-            line="86"
-            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="    public DialogPreference(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                                             ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/DialogPreference.java"
-            line="86"
-            column="46"/>
-    </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="    public DialogPreference(Context context, AttributeSet attrs) {"
-        errorLine2="                            ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/DialogPreference.java"
-            line="90"
-            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="    public DialogPreference(Context context, AttributeSet attrs) {"
-        errorLine2="                                             ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/DialogPreference.java"
-            line="90"
-            column="46"/>
-    </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="    public DialogPreference(Context context) {"
-        errorLine2="                            ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/DialogPreference.java"
-            line="95"
-            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="    public void setDialogTitle(CharSequence dialogTitle) {"
-        errorLine2="                               ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/DialogPreference.java"
-            line="104"
-            column="32"/>
-    </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="    public CharSequence getDialogTitle() {"
-        errorLine2="           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/DialogPreference.java"
-            line="121"
-            column="12"/>
-    </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="    public void setDialogMessage(CharSequence dialogMessage) {"
-        errorLine2="                                 ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/DialogPreference.java"
-            line="135"
-            column="34"/>
-    </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="    public CharSequence getDialogMessage() {"
-        errorLine2="           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/DialogPreference.java"
-            line="152"
-            column="12"/>
-    </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="    public void setDialogIcon(Drawable dialogIcon) {"
-        errorLine2="                              ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/DialogPreference.java"
-            line="161"
-            column="31"/>
-    </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="    public Drawable getDialogIcon() {"
-        errorLine2="           ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/DialogPreference.java"
-            line="179"
-            column="12"/>
-    </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="    public void setPositiveButtonText(CharSequence positiveButtonText) {"
-        errorLine2="                                      ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/DialogPreference.java"
-            line="188"
-            column="39"/>
-    </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="    public CharSequence getPositiveButtonText() {"
-        errorLine2="           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/DialogPreference.java"
-            line="205"
-            column="12"/>
-    </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="    public void setNegativeButtonText(CharSequence negativeButtonText) {"
-        errorLine2="                                      ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/DialogPreference.java"
-            line="214"
-            column="39"/>
-    </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="    public CharSequence getNegativeButtonText() {"
-        errorLine2="           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/DialogPreference.java"
-            line="231"
-            column="12"/>
-    </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="    public DropDownPreference(Context context) {"
-        errorLine2="                              ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/DropDownPreference.java"
-            line="57"
-            column="31"/>
-    </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="    public DropDownPreference(Context context, AttributeSet attrs) {"
-        errorLine2="                              ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/DropDownPreference.java"
-            line="61"
-            column="31"/>
-    </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="    public DropDownPreference(Context context, AttributeSet attrs) {"
-        errorLine2="                                               ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/DropDownPreference.java"
-            line="61"
-            column="48"/>
-    </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="    public DropDownPreference(Context context, AttributeSet attrs, int defStyle) {"
-        errorLine2="                              ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/DropDownPreference.java"
-            line="65"
-            column="31"/>
-    </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="    public DropDownPreference(Context context, AttributeSet attrs, int defStyle) {"
-        errorLine2="                                               ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/DropDownPreference.java"
-            line="65"
-            column="48"/>
-    </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="    public DropDownPreference(Context context, AttributeSet attrs, int defStyleAttr,"
-        errorLine2="                              ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/DropDownPreference.java"
-            line="69"
-            column="31"/>
-    </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="    public DropDownPreference(Context context, AttributeSet attrs, int defStyleAttr,"
-        errorLine2="                                               ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/DropDownPreference.java"
-            line="69"
-            column="48"/>
-    </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 ArrayAdapter createAdapter() {"
-        errorLine2="              ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/DropDownPreference.java"
-            line="98"
-            column="15"/>
-    </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="    public void onBindViewHolder(PreferenceViewHolder holder) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/DropDownPreference.java"
-            line="128"
-            column="34"/>
-    </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="    public EditTextPreference(Context context, AttributeSet attrs, int defStyleAttr,"
-        errorLine2="                              ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/EditTextPreference.java"
-            line="42"
-            column="31"/>
-    </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="    public EditTextPreference(Context context, AttributeSet attrs, int defStyleAttr,"
-        errorLine2="                                               ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/EditTextPreference.java"
-            line="42"
-            column="48"/>
-    </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="    public EditTextPreference(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                              ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/EditTextPreference.java"
-            line="57"
-            column="31"/>
-    </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="    public EditTextPreference(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                                               ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/EditTextPreference.java"
-            line="57"
-            column="48"/>
-    </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="    public EditTextPreference(Context context, AttributeSet attrs) {"
-        errorLine2="                              ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/EditTextPreference.java"
-            line="61"
-            column="31"/>
-    </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="    public EditTextPreference(Context context, AttributeSet attrs) {"
-        errorLine2="                                               ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/EditTextPreference.java"
-            line="61"
-            column="48"/>
-    </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="    public EditTextPreference(Context context) {"
-        errorLine2="                              ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/EditTextPreference.java"
-            line="66"
-            column="31"/>
-    </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="    public void setText(String text) {"
-        errorLine2="                        ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/EditTextPreference.java"
-            line="75"
-            column="25"/>
-    </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="    public String getText() {"
-        errorLine2="           ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/EditTextPreference.java"
-            line="95"
-            column="12"/>
-    </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 Object onGetDefaultValue(TypedArray a, int index) {"
+        errorLine1="    protected Object onGetDefaultValue(@NonNull TypedArray a, int index) {"
         errorLine2="              ~~~~~~">
         <location
             file="src/main/java/androidx/preference/EditTextPreference.java"
-            line="100"
+            line="102"
             column="15"/>
     </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 Object onGetDefaultValue(TypedArray a, int index) {"
-        errorLine2="                                       ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/EditTextPreference.java"
-            line="100"
-            column="40"/>
-    </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 void onSetInitialValue(Object defaultValue) {"
         errorLine2="                                     ~~~~~~">
         <location
             file="src/main/java/androidx/preference/EditTextPreference.java"
-            line="105"
+            line="107"
             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 Parcelable onSaveInstanceState() {"
-        errorLine2="              ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/EditTextPreference.java"
-            line="115"
-            column="15"/>
-    </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 void onRestoreInstanceState(Parcelable state) {"
-        errorLine2="                                          ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/EditTextPreference.java"
-            line="128"
-            column="43"/>
-    </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="        public static SimpleSummaryProvider getInstance() {"
-        errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/EditTextPreference.java"
-            line="230"
-            column="23"/>
-    </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="        public CharSequence provideSummary(EditTextPreference preference) {"
-        errorLine2="               ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/EditTextPreference.java"
-            line="238"
-            column="16"/>
-    </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="        public CharSequence provideSummary(EditTextPreference preference) {"
-        errorLine2="                                           ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/EditTextPreference.java"
-            line="238"
-            column="44"/>
-    </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="    public static EditTextPreferenceDialogFragment newInstance(String key) {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/EditTextPreferenceDialogFragment.java"
-            line="51"
-            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="    public static EditTextPreferenceDialogFragment newInstance(String key) {"
         errorLine2="                                                               ~~~~~~">
         <location
             file="src/main/java/androidx/preference/EditTextPreferenceDialogFragment.java"
-            line="51"
+            line="53"
             column="64"/>
     </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="    public void onCreate(Bundle savedInstanceState) {"
-        errorLine2="                         ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/EditTextPreferenceDialogFragment.java"
-            line="61"
-            column="26"/>
-    </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 void onBindDialogView(View view) {"
-        errorLine2="                                    ~~~~">
-        <location
-            file="src/main/java/androidx/preference/EditTextPreferenceDialogFragment.java"
-            line="77"
-            column="37"/>
-    </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="    public static EditTextPreferenceDialogFragmentCompat newInstance(String key) {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/EditTextPreferenceDialogFragmentCompat.java"
-            line="48"
-            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="    public static EditTextPreferenceDialogFragmentCompat newInstance(String key) {"
         errorLine2="                                                                     ~~~~~~">
         <location
             file="src/main/java/androidx/preference/EditTextPreferenceDialogFragmentCompat.java"
-            line="48"
+            line="50"
             column="70"/>
     </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="    public void onCreate(Bundle savedInstanceState) {"
-        errorLine2="                         ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/EditTextPreferenceDialogFragmentCompat.java"
-            line="58"
-            column="26"/>
-    </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 void onBindDialogView(View view) {"
-        errorLine2="                                    ~~~~">
-        <location
-            file="src/main/java/androidx/preference/EditTextPreferenceDialogFragmentCompat.java"
-            line="74"
-            column="37"/>
-    </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="    public ListPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
-        errorLine2="                          ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/ListPreference.java"
-            line="48"
-            column="27"/>
-    </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="    public ListPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
-        errorLine2="                                           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/ListPreference.java"
-            line="48"
-            column="44"/>
-    </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="    public ListPreference(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                          ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/ListPreference.java"
-            line="77"
-            column="27"/>
-    </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="    public ListPreference(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                                           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/ListPreference.java"
-            line="77"
-            column="44"/>
-    </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="    public ListPreference(Context context, AttributeSet attrs) {"
-        errorLine2="                          ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/ListPreference.java"
-            line="81"
-            column="27"/>
-    </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="    public ListPreference(Context context, AttributeSet attrs) {"
-        errorLine2="                                           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/ListPreference.java"
-            line="81"
-            column="44"/>
-    </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="    public ListPreference(Context context) {"
-        errorLine2="                          ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/ListPreference.java"
-            line="86"
-            column="27"/>
-    </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="    public void setEntries(CharSequence[] entries) {"
         errorLine2="                           ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/ListPreference.java"
-            line="99"
+            line="102"
             column="28"/>
     </issue>
 
@@ -811,7 +118,7 @@
         errorLine2="           ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/ListPreference.java"
-            line="116"
+            line="119"
             column="12"/>
     </issue>
 
@@ -822,7 +129,7 @@
         errorLine2="                               ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/ListPreference.java"
-            line="127"
+            line="130"
             column="32"/>
     </issue>
 
@@ -833,29 +140,7 @@
         errorLine2="           ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/ListPreference.java"
-            line="144"
-            column="12"/>
-    </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="    public void setSummary(CharSequence summary) {"
-        errorLine2="                           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/ListPreference.java"
-            line="149"
-            column="28"/>
-    </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="    public CharSequence getSummary() {"
-        errorLine2="           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/ListPreference.java"
-            line="160"
+            line="147"
             column="12"/>
     </issue>
 
@@ -866,7 +151,7 @@
         errorLine2="                         ~~~~~~">
         <location
             file="src/main/java/androidx/preference/ListPreference.java"
-            line="184"
+            line="188"
             column="26"/>
     </issue>
 
@@ -877,18 +162,7 @@
         errorLine2="           ~~~~~~">
         <location
             file="src/main/java/androidx/preference/ListPreference.java"
-            line="202"
-            column="12"/>
-    </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="    public CharSequence getEntry() {"
-        errorLine2="           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/ListPreference.java"
-            line="211"
+            line="206"
             column="12"/>
     </issue>
 
@@ -899,107 +173,30 @@
         errorLine2="                                ~~~~~~">
         <location
             file="src/main/java/androidx/preference/ListPreference.java"
-            line="222"
+            line="227"
             column="33"/>
     </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 Object onGetDefaultValue(TypedArray a, int index) {"
+        errorLine1="    protected Object onGetDefaultValue(@NonNull TypedArray a, int index) {"
         errorLine2="              ~~~~~~">
         <location
             file="src/main/java/androidx/preference/ListPreference.java"
-            line="249"
+            line="254"
             column="15"/>
     </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 Object onGetDefaultValue(TypedArray a, int index) {"
-        errorLine2="                                       ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/ListPreference.java"
-            line="249"
-            column="40"/>
-    </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 void onSetInitialValue(Object defaultValue) {"
         errorLine2="                                     ~~~~~~">
         <location
             file="src/main/java/androidx/preference/ListPreference.java"
-            line="254"
-            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 Parcelable onSaveInstanceState() {"
-        errorLine2="              ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/ListPreference.java"
             line="259"
-            column="15"/>
-    </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 void onRestoreInstanceState(Parcelable state) {"
-        errorLine2="                                          ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/ListPreference.java"
-            line="272"
-            column="43"/>
-    </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="        public static SimpleSummaryProvider getInstance() {"
-        errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/ListPreference.java"
-            line="334"
-            column="23"/>
-    </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="        public CharSequence provideSummary(ListPreference preference) {"
-        errorLine2="               ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/ListPreference.java"
-            line="342"
-            column="16"/>
-    </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="        public CharSequence provideSummary(ListPreference preference) {"
-        errorLine2="                                           ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/ListPreference.java"
-            line="342"
-            column="44"/>
-    </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="    public static ListPreferenceDialogFragment newInstance(String key) {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/ListPreferenceDialogFragment.java"
-            line="50"
-            column="19"/>
+            column="38"/>
     </issue>
 
     <issue
@@ -1009,161 +206,29 @@
         errorLine2="                                                           ~~~~~~">
         <location
             file="src/main/java/androidx/preference/ListPreferenceDialogFragment.java"
-            line="50"
+            line="52"
             column="60"/>
     </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="    public void onCreate(Bundle savedInstanceState) {"
-        errorLine2="                         ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/ListPreferenceDialogFragment.java"
-            line="59"
-            column="26"/>
-    </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 void onPrepareDialogBuilder(AlertDialog.Builder builder) {"
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/ListPreferenceDialogFragment.java"
-            line="92"
-            column="43"/>
-    </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="    public static ListPreferenceDialogFragmentCompat newInstance(String key) {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/ListPreferenceDialogFragmentCompat.java"
-            line="37"
-            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="    public static ListPreferenceDialogFragmentCompat newInstance(String key) {"
         errorLine2="                                                                 ~~~~~~">
         <location
             file="src/main/java/androidx/preference/ListPreferenceDialogFragmentCompat.java"
-            line="37"
+            line="39"
             column="66"/>
     </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="    public void onCreate(Bundle savedInstanceState) {"
-        errorLine2="                         ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/ListPreferenceDialogFragmentCompat.java"
-            line="47"
-            column="26"/>
-    </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 void onPrepareDialogBuilder(AlertDialog.Builder builder) {"
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/ListPreferenceDialogFragmentCompat.java"
-            line="80"
-            column="43"/>
-    </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="            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
-        errorLine2="            ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/MultiSelectListPreference.java"
-            line="49"
-            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="            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
-        errorLine2="                             ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/MultiSelectListPreference.java"
-            line="49"
-            column="30"/>
-    </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="    public MultiSelectListPreference(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                                     ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/MultiSelectListPreference.java"
-            line="67"
-            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="    public MultiSelectListPreference(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                                                      ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/MultiSelectListPreference.java"
-            line="67"
-            column="55"/>
-    </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="    public MultiSelectListPreference(Context context, AttributeSet attrs) {"
-        errorLine2="                                     ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/MultiSelectListPreference.java"
-            line="71"
-            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="    public MultiSelectListPreference(Context context, AttributeSet attrs) {"
-        errorLine2="                                                      ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/MultiSelectListPreference.java"
-            line="71"
-            column="55"/>
-    </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="    public MultiSelectListPreference(Context context) {"
-        errorLine2="                                     ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/MultiSelectListPreference.java"
-            line="77"
-            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="    public void setEntries(CharSequence[] entries) {"
         errorLine2="                           ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/MultiSelectListPreference.java"
-            line="90"
+            line="93"
             column="28"/>
     </issue>
 
@@ -1174,7 +239,7 @@
         errorLine2="           ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/MultiSelectListPreference.java"
-            line="107"
+            line="110"
             column="12"/>
     </issue>
 
@@ -1185,7 +250,7 @@
         errorLine2="                               ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/MultiSelectListPreference.java"
-            line="118"
+            line="121"
             column="32"/>
     </issue>
 
@@ -1196,7 +261,7 @@
         errorLine2="           ~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/MultiSelectListPreference.java"
-            line="135"
+            line="138"
             column="12"/>
     </issue>
 
@@ -1207,7 +272,7 @@
         errorLine2="                          ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/MultiSelectListPreference.java"
-            line="144"
+            line="147"
             column="27"/>
     </issue>
 
@@ -1218,7 +283,7 @@
         errorLine2="           ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/MultiSelectListPreference.java"
-            line="157"
+            line="160"
             column="12"/>
     </issue>
 
@@ -1229,7 +294,7 @@
         errorLine2="                                ~~~~~~">
         <location
             file="src/main/java/androidx/preference/MultiSelectListPreference.java"
-            line="167"
+            line="170"
             column="33"/>
     </issue>
 
@@ -1240,84 +305,29 @@
         errorLine2="              ~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/MultiSelectListPreference.java"
-            line="178"
+            line="181"
             column="15"/>
     </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 Object onGetDefaultValue(TypedArray a, int index) {"
-        errorLine2="              ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/MultiSelectListPreference.java"
-            line="192"
-            column="15"/>
-    </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 Object onGetDefaultValue(TypedArray a, int index) {"
-        errorLine2="                                       ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/MultiSelectListPreference.java"
-            line="192"
-            column="40"/>
-    </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 void onSetInitialValue(Object defaultValue) {"
         errorLine2="                                     ~~~~~~">
         <location
             file="src/main/java/androidx/preference/MultiSelectListPreference.java"
-            line="205"
+            line="208"
             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 Parcelable onSaveInstanceState() {"
-        errorLine2="              ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/MultiSelectListPreference.java"
-            line="210"
-            column="15"/>
-    </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 void onRestoreInstanceState(Parcelable state) {"
-        errorLine2="                                          ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/MultiSelectListPreference.java"
-            line="223"
-            column="43"/>
-    </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="    public static MultiSelectListPreferenceDialogFragment newInstance(String key) {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/MultiSelectListPreferenceDialogFragment.java"
-            line="59"
-            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="    public static MultiSelectListPreferenceDialogFragment newInstance(String key) {"
         errorLine2="                                                                      ~~~~~~">
         <location
             file="src/main/java/androidx/preference/MultiSelectListPreferenceDialogFragment.java"
-            line="59"
+            line="60"
             column="71"/>
     </issue>
 
@@ -1328,326 +338,29 @@
         errorLine2="                         ~~~~~~">
         <location
             file="src/main/java/androidx/preference/MultiSelectListPreferenceDialogFragment.java"
-            line="69"
+            line="70"
             column="26"/>
     </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 void onPrepareDialogBuilder(AlertDialog.Builder builder) {"
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/MultiSelectListPreferenceDialogFragment.java"
-            line="109"
-            column="43"/>
-    </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="    public static MultiSelectListPreferenceDialogFragmentCompat newInstance(String key) {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/MultiSelectListPreferenceDialogFragmentCompat.java"
-            line="49"
-            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="    public static MultiSelectListPreferenceDialogFragmentCompat newInstance(String key) {"
         errorLine2="                                                                            ~~~~~~">
         <location
             file="src/main/java/androidx/preference/MultiSelectListPreferenceDialogFragmentCompat.java"
-            line="49"
+            line="51"
             column="77"/>
     </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="    public void onCreate(Bundle savedInstanceState) {"
-        errorLine2="                         ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/MultiSelectListPreferenceDialogFragmentCompat.java"
-            line="59"
-            column="26"/>
-    </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 void onPrepareDialogBuilder(AlertDialog.Builder builder) {"
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/MultiSelectListPreferenceDialogFragmentCompat.java"
-            line="99"
-            column="43"/>
-    </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="    public Preference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
-        errorLine2="                      ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="204"
-            column="23"/>
-    </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="    public Preference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
-        errorLine2="                                       ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="204"
-            column="40"/>
-    </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="    public Preference(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                      ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="296"
-            column="23"/>
-    </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="    public Preference(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                                       ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="296"
-            column="40"/>
-    </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="    public Preference(Context context, AttributeSet attrs) {"
-        errorLine2="                      ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="311"
-            column="23"/>
-    </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="    public Preference(Context context, AttributeSet attrs) {"
-        errorLine2="                                       ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="311"
-            column="40"/>
-    </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="    public Preference(Context context) {"
-        errorLine2="                      ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="322"
-            column="23"/>
-    </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 Object onGetDefaultValue(TypedArray a, int index) {"
-        errorLine2="              ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="338"
-            column="15"/>
-    </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 Object onGetDefaultValue(TypedArray a, int index) {"
-        errorLine2="                                       ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="338"
-            column="40"/>
-    </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="    public void setIntent(Intent intent) {"
-        errorLine2="                          ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="348"
-            column="27"/>
-    </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="    public Intent getIntent() {"
-        errorLine2="           ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="357"
-            column="12"/>
-    </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="    public void setFragment(String fragment) {"
-        errorLine2="                            ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="366"
-            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="    public String getFragment() {"
-        errorLine2="           ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="375"
-            column="12"/>
-    </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="    public void setPreferenceDataStore(PreferenceDataStore dataStore) {"
-        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="390"
-            column="40"/>
-    </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="    public Bundle getExtras() {"
-        errorLine2="           ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="421"
-            column="12"/>
-    </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="    public Bundle peekExtras() {"
-        errorLine2="           ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="432"
-            column="12"/>
-    </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="    public void onBindViewHolder(PreferenceViewHolder holder) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="501"
-            column="34"/>
-    </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="    public void setTitle(CharSequence title) {"
-        errorLine2="                         ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="658"
-            column="26"/>
-    </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="    public CharSequence getTitle() {"
-        errorLine2="           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="681"
-            column="12"/>
-    </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="    public void setIcon(Drawable icon) {"
-        errorLine2="                        ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="692"
-            column="25"/>
-    </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="    public Drawable getIcon() {"
-        errorLine2="           ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="717"
-            column="12"/>
-    </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="    public CharSequence getSummary() {"
-        errorLine2="           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="733"
-            column="12"/>
-    </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="    public void setSummary(CharSequence summary) {"
-        errorLine2="                           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="750"
-            column="28"/>
-    </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="    public void setKey(String key) {"
         errorLine2="                       ~~~~~~">
         <location
             file="src/main/java/androidx/preference/Preference.java"
-            line="939"
+            line="950"
             column="24"/>
     </issue>
 
@@ -1658,7 +371,7 @@
         errorLine2="           ~~~~~~">
         <location
             file="src/main/java/androidx/preference/Preference.java"
-            line="953"
+            line="964"
             column="12"/>
     </issue>
 
@@ -1669,85 +382,8 @@
         errorLine2="                                      ~~~~~~">
         <location
             file="src/main/java/androidx/preference/Preference.java"
-            line="1119"
-            column="39"/>
-    </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="            OnPreferenceChangeListener onPreferenceChangeListener) {"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
             line="1130"
-            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="    public OnPreferenceChangeListener getOnPreferenceChangeListener() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="1140"
-            column="12"/>
-    </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="    public void setOnPreferenceClickListener(OnPreferenceClickListener onPreferenceClickListener) {"
-        errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="1149"
-            column="46"/>
-    </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="    public OnPreferenceClickListener getOnPreferenceClickListener() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="1158"
-            column="12"/>
-    </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 void performClick(View view) {"
-        errorLine2="                                ~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="1167"
-            column="33"/>
-    </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="    public Context getContext() {"
-        errorLine2="           ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="1213"
-            column="12"/>
-    </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="    public SharedPreferences getSharedPreferences() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="1229"
-            column="12"/>
+            column="39"/>
     </issue>
 
     <issue
@@ -1757,73 +393,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/Preference.java"
-            line="1296"
-            column="12"/>
-    </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 void onAttachedToHierarchy(PreferenceManager preferenceManager) {"
-        errorLine2="                                         ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="1306"
-            column="42"/>
-    </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 void onAttachedToHierarchy(PreferenceManager preferenceManager, long id) {"
-        errorLine2="                                         ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="1324"
-            column="42"/>
-    </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="    public void onDependencyChanged(Preference dependency, boolean disableDependent) {"
-        errorLine2="                                    ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="1484"
-            column="37"/>
-    </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="    public void onParentChanged(Preference parent, boolean disableChild) {"
-        errorLine2="                                ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="1501"
-            column="33"/>
-    </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="    public void setDependency(String dependencyKey) {"
-        errorLine2="                              ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="1527"
-            column="31"/>
-    </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="    public String getDependency() {"
-        errorLine2="           ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="1542"
+            line="1313"
             column="12"/>
     </issue>
 
@@ -1834,7 +404,7 @@
         errorLine2="                                ~~~~~~">
         <location
             file="src/main/java/androidx/preference/Preference.java"
-            line="1572"
+            line="1590"
             column="33"/>
     </issue>
 
@@ -1845,7 +415,7 @@
         errorLine2="                                                                    ~~~~~~">
         <location
             file="src/main/java/androidx/preference/Preference.java"
-            line="1615"
+            line="1633"
             column="69"/>
     </issue>
 
@@ -1856,7 +426,7 @@
         errorLine2="                                    ~~~~~~">
         <location
             file="src/main/java/androidx/preference/Preference.java"
-            line="1648"
+            line="1666"
             column="37"/>
     </issue>
 
@@ -1867,7 +437,7 @@
         errorLine2="              ~~~~~~">
         <location
             file="src/main/java/androidx/preference/Preference.java"
-            line="1678"
+            line="1696"
             column="15"/>
     </issue>
 
@@ -1878,7 +448,7 @@
         errorLine2="                                        ~~~~~~">
         <location
             file="src/main/java/androidx/preference/Preference.java"
-            line="1678"
+            line="1696"
             column="41"/>
     </issue>
 
@@ -1889,7 +459,7 @@
         errorLine2="                                    ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/Preference.java"
-            line="1701"
+            line="1719"
             column="37"/>
     </issue>
 
@@ -1900,7 +470,7 @@
         errorLine2="           ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/Preference.java"
-            line="1731"
+            line="1749"
             column="12"/>
     </issue>
 
@@ -1911,107 +481,30 @@
         errorLine2="                                             ~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/Preference.java"
-            line="1731"
+            line="1749"
             column="46"/>
     </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="    public void saveHierarchyState(Bundle container) {"
-        errorLine2="                                   ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="1998"
-            column="36"/>
-    </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 Parcelable onSaveInstanceState() {"
-        errorLine2="              ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="2036"
-            column="15"/>
-    </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="    public void restoreHierarchyState(Bundle container) {"
-        errorLine2="                                      ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="2048"
-            column="39"/>
-    </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 void onRestoreInstanceState(Parcelable state) {"
-        errorLine2="                                          ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="2086"
-            column="43"/>
-    </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="    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfoCompat info) {}"
         errorLine2="                                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/Preference.java"
-            line="2103"
+            line="2124"
             column="51"/>
     </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="        boolean onPreferenceChange(Preference preference, Object newValue);"
-        errorLine2="                                   ~~~~~~~~~~">
+        errorLine1="        boolean onPreferenceChange(@NonNull Preference preference, Object newValue);"
+        errorLine2="                                                                   ~~~~~~">
         <location
             file="src/main/java/androidx/preference/Preference.java"
-            line="2119"
-            column="36"/>
-    </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="        boolean onPreferenceChange(Preference preference, Object newValue);"
-        errorLine2="                                                          ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="2119"
-            column="59"/>
-    </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="        boolean onPreferenceClick(Preference preference);"
-        errorLine2="                                  ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="2132"
-            column="35"/>
-    </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="        CharSequence provideSummary(T preference);"
-        errorLine2="        ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/Preference.java"
-            line="2189"
-            column="9"/>
+            line="2140"
+            column="68"/>
     </issue>
 
     <issue
@@ -2021,7 +514,7 @@
         errorLine2="                              ~~~~~~">
         <location
             file="src/main/java/androidx/preference/Preference.java"
-            line="2209"
+            line="2232"
             column="31"/>
     </issue>
 
@@ -2032,101 +525,13 @@
         errorLine2="                              ~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/Preference.java"
-            line="2213"
+            line="2236"
             column="31"/>
     </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="            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
-        errorLine2="            ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceCategory.java"
-            line="42"
-            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="            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
-        errorLine2="                             ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceCategory.java"
-            line="42"
-            column="30"/>
-    </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="    public PreferenceCategory(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                              ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceCategory.java"
-            line="46"
-            column="31"/>
-    </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="    public PreferenceCategory(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                                               ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceCategory.java"
-            line="46"
-            column="48"/>
-    </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="    public PreferenceCategory(Context context, AttributeSet attrs) {"
-        errorLine2="                              ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceCategory.java"
-            line="50"
-            column="31"/>
-    </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="    public PreferenceCategory(Context context, AttributeSet attrs) {"
-        errorLine2="                                               ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceCategory.java"
-            line="50"
-            column="48"/>
-    </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="    public PreferenceCategory(Context context) {"
-        errorLine2="                              ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceCategory.java"
-            line="55"
-            column="31"/>
-    </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="    public void onBindViewHolder(PreferenceViewHolder holder) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceCategory.java"
-            line="70"
-            column="34"/>
-    </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="    public void putString(String key, @Nullable String value) {"
         errorLine2="                          ~~~~~~">
         <location
@@ -2259,309 +664,34 @@
     <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="    public void onCreate(Bundle savedInstanceState) {"
-        errorLine2="                         ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceDialogFragment.java"
-            line="92"
-            column="26"/>
-    </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="    public Dialog onCreateDialog(Bundle savedInstanceState) {"
-        errorLine2="                                 ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceDialogFragment.java"
-            line="153"
-            column="34"/>
-    </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="    public DialogPreference getPreference() {"
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceDialogFragment.java"
-            line="191"
+            line="192"
             column="12"/>
     </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 void onPrepareDialogBuilder(AlertDialog.Builder builder) {}"
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceDialogFragment.java"
-            line="210"
-            column="43"/>
-    </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 View onCreateDialogView(Context context) {"
-        errorLine2="              ~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceDialogFragment.java"
-            line="255"
-            column="15"/>
-    </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 View onCreateDialogView(Context context) {"
-        errorLine2="                                      ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceDialogFragment.java"
-            line="255"
-            column="39"/>
-    </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 void onBindDialogView(View view) {"
-        errorLine2="                                    ~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceDialogFragment.java"
-            line="275"
-            column="37"/>
-    </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="    public void onClick(DialogInterface dialog, int which) {"
-        errorLine2="                        ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceDialogFragment.java"
-            line="301"
-            column="25"/>
-    </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="    public void onDismiss(DialogInterface dialog) {"
-        errorLine2="                          ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceDialogFragment.java"
-            line="306"
-            column="27"/>
-    </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="    public void onCreate(Bundle savedInstanceState) {"
-        errorLine2="                         ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceDialogFragmentCompat.java"
-            line="78"
-            column="26"/>
-    </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="    Dialog onCreateDialog(Bundle savedInstanceState) {"
-        errorLine2="                          ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceDialogFragmentCompat.java"
-            line="139"
-            column="27"/>
-    </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="    public DialogPreference getPreference() {"
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceDialogFragmentCompat.java"
-            line="173"
+            line="176"
             column="12"/>
     </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 void onPrepareDialogBuilder(AlertDialog.Builder builder) {}"
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceDialogFragmentCompat.java"
-            line="189"
-            column="43"/>
-    </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 View onCreateDialogView(Context context) {"
-        errorLine2="              ~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceDialogFragmentCompat.java"
-            line="242"
-            column="15"/>
-    </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 View onCreateDialogView(Context context) {"
-        errorLine2="                                      ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceDialogFragmentCompat.java"
-            line="242"
-            column="39"/>
-    </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 void onBindDialogView(View view) {"
-        errorLine2="                                    ~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceDialogFragmentCompat.java"
-            line="258"
-            column="37"/>
-    </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="    public void onClick(DialogInterface dialog, int which) {"
-        errorLine2="                        ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceDialogFragmentCompat.java"
-            line="280"
-            column="25"/>
-    </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="    public void onCreate(Bundle savedInstanceState) {"
-        errorLine2="                         ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="148"
-            column="26"/>
-    </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="    public abstract void onCreatePreferences(Bundle savedInstanceState, String rootKey);"
-        errorLine2="                                             ~~~~~~">
+        errorLine1="    public abstract void onCreatePreferences(@Nullable Bundle savedInstanceState, String rootKey);"
+        errorLine2="                                                                                  ~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceFragment.java"
             line="184"
-            column="46"/>
-    </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="    public abstract void onCreatePreferences(Bundle savedInstanceState, String rootKey);"
-        errorLine2="                                                                        ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="184"
-            column="73"/>
-    </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="    public View onCreateView(LayoutInflater inflater, ViewGroup container,"
-        errorLine2="           ~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="187"
-            column="12"/>
-    </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="    public View onCreateView(LayoutInflater inflater, ViewGroup container,"
-        errorLine2="                             ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="187"
-            column="30"/>
-    </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="    public View onCreateView(LayoutInflater inflater, ViewGroup container,"
-        errorLine2="                                                      ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="187"
-            column="55"/>
-    </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="            Bundle savedInstanceState) {"
-        errorLine2="            ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="188"
-            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="    public void setDivider(Drawable divider) {"
-        errorLine2="                           ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="253"
-            column="28"/>
-    </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="    public void onViewCreated(View view, Bundle savedInstanceState) {"
-        errorLine2="                              ~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="272"
-            column="31"/>
-    </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="    public void onViewCreated(View view, Bundle savedInstanceState) {"
-        errorLine2="                                         ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="272"
-            column="42"/>
-    </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="    public void onSaveInstanceState(Bundle outState) {"
-        errorLine2="                                    ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="322"
-            column="37"/>
+            column="83"/>
     </issue>
 
     <issue
@@ -2571,7 +701,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="341"
+            line="342"
             column="12"/>
     </issue>
 
@@ -2582,7 +712,7 @@
         errorLine2="                                    ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="353"
+            line="354"
             column="37"/>
     </issue>
 
@@ -2593,282 +723,40 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="371"
+            line="372"
             column="12"/>
     </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="    public boolean onPreferenceTreeClick(Preference preference) {"
-        errorLine2="                                         ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="429"
-            column="42"/>
-    </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="    public void onNavigateToScreen(PreferenceScreen preferenceScreen) {"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="458"
-            column="36"/>
-    </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="    public &lt;T extends Preference> T findPreference(CharSequence key) {"
-        errorLine2="                                                   ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="482"
-            column="52"/>
-    </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="    public final RecyclerView getListView() {"
         errorLine2="                 ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="529"
+            line="530"
             column="18"/>
     </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="    public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,"
-        errorLine2="           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="549"
-            column="12"/>
-    </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="    public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,"
-        errorLine2="                                             ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="549"
-            column="46"/>
-    </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="    public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,"
-        errorLine2="                                                                      ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="549"
-            column="71"/>
-    </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="            Bundle savedInstanceState) {"
-        errorLine2="            ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="550"
-            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="    public RecyclerView.LayoutManager onCreateLayoutManager() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="579"
-            column="12"/>
-    </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 RecyclerView.Adapter onCreateAdapter(PreferenceScreen preferenceScreen) {"
-        errorLine2="              ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="592"
-            column="15"/>
-    </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 RecyclerView.Adapter onCreateAdapter(PreferenceScreen preferenceScreen) {"
-        errorLine2="                                                   ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="592"
-            column="52"/>
-    </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="    public void onDisplayPreferenceDialog(Preference preference) {"
-        errorLine2="                                          ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="607"
-            column="43"/>
-    </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="    public android.app.Fragment getCallbackFragment() {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="650"
+            line="654"
             column="12"/>
     </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="    public void scrollToPreference(final String key) {"
-        errorLine2="                                         ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="658"
-            column="42"/>
-    </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="    public void scrollToPreference(final Preference preference) {"
-        errorLine2="                                         ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="666"
-            column="42"/>
-    </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="        boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref);"
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="722"
-            column="43"/>
-    </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="        boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref);"
-        errorLine2="                                                                     ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="722"
-            column="70"/>
-    </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="        boolean onPreferenceStartScreen(PreferenceFragment caller, PreferenceScreen pref);"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="738"
-            column="41"/>
-    </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="        boolean onPreferenceStartScreen(PreferenceFragment caller, PreferenceScreen pref);"
-        errorLine2="                                                                   ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="738"
-            column="68"/>
-    </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="        boolean onPreferenceDisplayDialog(@NonNull PreferenceFragment caller, Preference pref);"
-        errorLine2="                                                                              ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragment.java"
-            line="751"
-            column="79"/>
-    </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="    public abstract void onCreatePreferences(Bundle savedInstanceState, String rootKey);"
-        errorLine2="                                             ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragmentCompat.java"
-            line="174"
-            column="46"/>
-    </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="    public abstract void onCreatePreferences(Bundle savedInstanceState, String rootKey);"
-        errorLine2="                                                                        ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragmentCompat.java"
-            line="174"
-            column="73"/>
-    </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="    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,"
-        errorLine2="           ~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragmentCompat.java"
-            line="177"
-            column="12"/>
-    </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="    public void setDivider(Drawable divider) {"
-        errorLine2="                           ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragmentCompat.java"
-            line="243"
-            column="28"/>
-    </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="    public PreferenceManager getPreferenceManager() {"
         errorLine2="           ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceFragmentCompat.java"
-            line="325"
+            line="327"
             column="12"/>
     </issue>
 
@@ -2879,7 +767,7 @@
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceFragmentCompat.java"
-            line="334"
+            line="336"
             column="12"/>
     </issue>
 
@@ -2890,553 +778,25 @@
         errorLine2="                                    ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceFragmentCompat.java"
-            line="343"
+            line="345"
             column="37"/>
     </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="    public boolean onPreferenceTreeClick(Preference preference) {"
-        errorLine2="                                         ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragmentCompat.java"
-            line="399"
-            column="42"/>
-    </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="    public void onNavigateToScreen(PreferenceScreen preferenceScreen) {"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragmentCompat.java"
-            line="452"
-            column="36"/>
-    </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="    public final RecyclerView getListView() {"
         errorLine2="                 ~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceFragmentCompat.java"
-            line="524"
+            line="549"
             column="18"/>
     </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="    public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,"
-        errorLine2="           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragmentCompat.java"
-            line="542"
-            column="12"/>
-    </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="    public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,"
-        errorLine2="                                             ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragmentCompat.java"
-            line="542"
-            column="46"/>
-    </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="    public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,"
-        errorLine2="                                                                      ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragmentCompat.java"
-            line="542"
-            column="71"/>
-    </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="            Bundle savedInstanceState) {"
-        errorLine2="            ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragmentCompat.java"
-            line="543"
-            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="    public RecyclerView.LayoutManager onCreateLayoutManager() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragmentCompat.java"
-            line="569"
-            column="12"/>
-    </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 RecyclerView.Adapter onCreateAdapter(PreferenceScreen preferenceScreen) {"
-        errorLine2="              ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragmentCompat.java"
-            line="579"
-            column="15"/>
-    </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 RecyclerView.Adapter onCreateAdapter(PreferenceScreen preferenceScreen) {"
-        errorLine2="                                                   ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragmentCompat.java"
-            line="579"
-            column="52"/>
-    </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="    public void onDisplayPreferenceDialog(Preference preference) {"
-        errorLine2="                                          ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragmentCompat.java"
-            line="591"
-            column="43"/>
-    </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="    public Fragment getCallbackFragment() {"
-        errorLine2="           ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragmentCompat.java"
-            line="643"
-            column="12"/>
-    </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="    public void scrollToPreference(final String key) {"
-        errorLine2="                                         ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragmentCompat.java"
-            line="647"
-            column="42"/>
-    </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="    public void scrollToPreference(final Preference preference) {"
-        errorLine2="                                         ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragmentCompat.java"
-            line="651"
-            column="42"/>
-    </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="        boolean onPreferenceStartFragment(PreferenceFragmentCompat caller, Preference pref);"
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragmentCompat.java"
-            line="708"
-            column="43"/>
-    </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="        boolean onPreferenceStartFragment(PreferenceFragmentCompat caller, Preference pref);"
-        errorLine2="                                                                           ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragmentCompat.java"
-            line="708"
-            column="76"/>
-    </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="        boolean onPreferenceStartScreen(PreferenceFragmentCompat caller, PreferenceScreen pref);"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragmentCompat.java"
-            line="724"
-            column="41"/>
-    </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="        boolean onPreferenceStartScreen(PreferenceFragmentCompat caller, PreferenceScreen pref);"
-        errorLine2="                                                                         ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragmentCompat.java"
-            line="724"
-            column="74"/>
-    </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="                Preference pref);"
-        errorLine2="                ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceFragmentCompat.java"
-            line="738"
-            column="17"/>
-    </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="    public PreferenceGroup(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
-        errorLine2="                           ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceGroup.java"
-            line="82"
-            column="28"/>
-    </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="    public PreferenceGroup(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
-        errorLine2="                                            ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceGroup.java"
-            line="82"
-            column="45"/>
-    </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="    public PreferenceGroup(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                           ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceGroup.java"
-            line="102"
-            column="28"/>
-    </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="    public PreferenceGroup(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                                            ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceGroup.java"
-            line="102"
-            column="45"/>
-    </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="    public PreferenceGroup(Context context, AttributeSet attrs) {"
-        errorLine2="                           ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceGroup.java"
-            line="106"
-            column="28"/>
-    </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="    public PreferenceGroup(Context context, AttributeSet attrs) {"
-        errorLine2="                                            ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceGroup.java"
-            line="106"
-            column="45"/>
-    </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="    public void addItemFromInflater(Preference preference) {"
-        errorLine2="                                    ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceGroup.java"
-            line="170"
-            column="37"/>
-    </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="    public Preference getPreference(int index) {"
-        errorLine2="           ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceGroup.java"
-            line="189"
-            column="12"/>
-    </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="    public boolean addPreference(Preference preference) {"
-        errorLine2="                                 ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceGroup.java"
-            line="199"
-            column="34"/>
-    </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="    public boolean removePreference(Preference preference) {"
-        errorLine2="                                    ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceGroup.java"
-            line="274"
-            column="37"/>
-    </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 boolean onPrepareAddPreference(Preference preference) {"
-        errorLine2="                                             ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceGroup.java"
-            line="350"
-            column="46"/>
-    </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 void dispatchSaveInstanceState(Bundle container) {"
-        errorLine2="                                             ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceGroup.java"
-            line="491"
-            column="46"/>
-    </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 void dispatchRestoreInstanceState(Bundle container) {"
-        errorLine2="                                                ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceGroup.java"
-            line="502"
-            column="49"/>
-    </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 Parcelable onSaveInstanceState() {"
-        errorLine2="              ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceGroup.java"
-            line="513"
-            column="15"/>
-    </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 void onRestoreInstanceState(Parcelable state) {"
-        errorLine2="                                          ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceGroup.java"
-            line="519"
-            column="43"/>
-    </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="        int getPreferenceAdapterPosition(String key);"
-        errorLine2="                                         ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceGroup.java"
-            line="545"
-            column="42"/>
-    </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="        int getPreferenceAdapterPosition(Preference preference);"
-        errorLine2="                                         ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceGroup.java"
-            line="554"
-            column="42"/>
-    </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="    public PreferenceGroupAdapter(PreferenceGroup preferenceGroup) {"
-        errorLine2="                                  ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceGroupAdapter.java"
-            line="89"
-            column="35"/>
-    </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="    public Preference getItem(int position) {"
-        errorLine2="           ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceGroupAdapter.java"
-            line="328"
-            column="12"/>
-    </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="    public void onPreferenceChange(Preference preference) {"
-        errorLine2="                                   ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceGroupAdapter.java"
-            line="347"
-            column="36"/>
-    </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="    public void onPreferenceHierarchyChange(Preference preference) {"
-        errorLine2="                                            ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceGroupAdapter.java"
-            line="357"
-            column="45"/>
-    </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="    public void onPreferenceVisibilityChange(Preference preference) {"
-        errorLine2="                                             ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceGroupAdapter.java"
-            line="363"
-            column="46"/>
-    </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="    public int getPreferenceAdapterPosition(String key) {"
-        errorLine2="                                            ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceGroupAdapter.java"
-            line="424"
-            column="45"/>
-    </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="    public int getPreferenceAdapterPosition(Preference preference) {"
-        errorLine2="                                            ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceGroupAdapter.java"
-            line="436"
-            column="45"/>
-    </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="    public PreferenceImageView(Context context) {"
-        errorLine2="                               ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/internal/PreferenceImageView.java"
-            line="44"
-            column="32"/>
-    </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="    public PreferenceImageView(Context context, AttributeSet attrs) {"
-        errorLine2="                               ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/internal/PreferenceImageView.java"
-            line="48"
-            column="32"/>
-    </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="    public PreferenceImageView(Context context, AttributeSet attrs) {"
-        errorLine2="                                                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/internal/PreferenceImageView.java"
-            line="48"
-            column="49"/>
-    </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="    public PreferenceImageView(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                               ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/internal/PreferenceImageView.java"
-            line="52"
-            column="32"/>
-    </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="    public PreferenceImageView(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                                                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/internal/PreferenceImageView.java"
-            line="52"
-            column="49"/>
-    </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="    public PreferenceManager(Context context) {"
-        errorLine2="                             ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="104"
-            column="30"/>
-    </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="    public static SharedPreferences getDefaultSharedPreferences(Context context) {"
+        errorLine1="    public static SharedPreferences getDefaultSharedPreferences(@NonNull Context context) {"
         errorLine2="                  ~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceManager.java"
@@ -3447,100 +807,12 @@
     <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="    public static SharedPreferences getDefaultSharedPreferences(Context context) {"
-        errorLine2="                                                                ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="118"
-            column="65"/>
-    </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="    public static void setDefaultValues(Context context, int resId, boolean readAgain) {"
-        errorLine2="                                        ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="148"
-            column="41"/>
-    </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="    public static void setDefaultValues(Context context, String sharedPreferencesName,"
-        errorLine2="                                        ~~~~~~~">
+        errorLine1="    public static void setDefaultValues(@NonNull Context context, String sharedPreferencesName,"
+        errorLine2="                                                                  ~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceManager.java"
             line="179"
-            column="41"/>
-    </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="    public static void setDefaultValues(Context context, String sharedPreferencesName,"
-        errorLine2="                                                         ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="179"
-            column="58"/>
-    </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="    public PreferenceScreen inflateFromResource(Context context, int resId,"
-        errorLine2="           ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="210"
-            column="12"/>
-    </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="    public PreferenceScreen inflateFromResource(Context context, int resId,"
-        errorLine2="                                                ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="210"
-            column="49"/>
-    </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="            PreferenceScreen rootPreferences) {"
-        errorLine2="            ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="211"
-            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="    public PreferenceScreen createPreferenceScreen(Context context) {"
-        errorLine2="           ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="225"
-            column="12"/>
-    </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="    public PreferenceScreen createPreferenceScreen(Context context) {"
-        errorLine2="                                                   ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="225"
-            column="52"/>
+            column="67"/>
     </issue>
 
     <issue
@@ -3550,7 +822,7 @@
         errorLine2="           ~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="249"
+            line="251"
             column="12"/>
     </issue>
 
@@ -3561,29 +833,18 @@
         errorLine2="                                         ~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="263"
+            line="265"
             column="42"/>
     </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="    public void setPreferenceDataStore(PreferenceDataStore dataStore) {"
-        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="367"
-            column="40"/>
-    </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="    public PreferenceScreen getPreferenceScreen() {"
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="419"
+            line="421"
             column="12"/>
     </issue>
 
@@ -3594,965 +855,52 @@
         errorLine2="                                  ~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="429"
+            line="431"
             column="35"/>
     </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="    public Context getContext() {"
-        errorLine2="           ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="510"
-            column="12"/>
-    </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="    public PreferenceComparisonCallback getPreferenceComparisonCallback() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="514"
-            column="12"/>
-    </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="            PreferenceComparisonCallback preferenceComparisonCallback) {"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="519"
-            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="    public OnDisplayPreferenceDialogListener getOnDisplayPreferenceDialogListener() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="523"
-            column="12"/>
-    </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="            OnDisplayPreferenceDialogListener onDisplayPreferenceDialogListener) {"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="528"
-            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="    public void showDialog(Preference preference) {"
-        errorLine2="                           ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="537"
-            column="28"/>
-    </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="    public void setOnPreferenceTreeClickListener(OnPreferenceTreeClickListener listener) {"
-        errorLine2="                                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="549"
-            column="50"/>
-    </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="    public OnPreferenceTreeClickListener getOnPreferenceTreeClickListener() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="553"
-            column="12"/>
-    </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="    public void setOnNavigateToScreenListener(OnNavigateToScreenListener listener) {"
-        errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="563"
-            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="    public OnNavigateToScreenListener getOnNavigateToScreenListener() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="570"
-            column="12"/>
-    </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="        boolean onPreferenceTreeClick(Preference preference);"
-        errorLine2="                                      ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="586"
-            column="39"/>
-    </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 onDisplayPreferenceDialog(Preference preference);"
-        errorLine2="                                       ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="600"
-            column="40"/>
-    </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 onNavigateToScreen(PreferenceScreen preferenceScreen);"
-        errorLine2="                                ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="614"
-            column="33"/>
-    </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="        public abstract boolean arePreferenceItemsTheSame(Preference p1, Preference p2);"
-        errorLine2="                                                          ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="631"
-            column="59"/>
-    </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="        public abstract boolean arePreferenceItemsTheSame(Preference p1, Preference p2);"
-        errorLine2="                                                                         ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="631"
-            column="74"/>
-    </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="        public abstract boolean arePreferenceContentsTheSame(Preference p1, Preference p2);"
-        errorLine2="                                                             ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="640"
-            column="62"/>
-    </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="        public abstract boolean arePreferenceContentsTheSame(Preference p1, Preference p2);"
-        errorLine2="                                                                            ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="640"
-            column="77"/>
-    </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="        public boolean arePreferenceItemsTheSame(Preference p1, Preference p2) {"
-        errorLine2="                                                 ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="659"
-            column="50"/>
-    </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="        public boolean arePreferenceItemsTheSame(Preference p1, Preference p2) {"
-        errorLine2="                                                                ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="659"
-            column="65"/>
-    </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="        public boolean arePreferenceContentsTheSame(Preference p1, Preference p2) {"
-        errorLine2="                                                    ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="673"
-            column="53"/>
-    </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="        public boolean arePreferenceContentsTheSame(Preference p1, Preference p2) {"
-        errorLine2="                                                                   ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceManager.java"
-            line="673"
-            column="68"/>
-    </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="    public PreferenceRecyclerViewAccessibilityDelegate(RecyclerView recyclerView) {"
-        errorLine2="                                                       ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceRecyclerViewAccessibilityDelegate.java"
-            line="50"
-            column="56"/>
-    </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="    public PreferenceScreen(Context context, AttributeSet attrs) {"
-        errorLine2="                            ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceScreen.java"
-            line="52"
-            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="    public PreferenceScreen(Context context, AttributeSet attrs) {"
-        errorLine2="                                             ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceScreen.java"
-            line="52"
-            column="46"/>
-    </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="    public static PreferenceViewHolder createInstanceForTests(View itemView) {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceViewHolder.java"
-            line="64"
-            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="    public static PreferenceViewHolder createInstanceForTests(View itemView) {"
-        errorLine2="                                                              ~~~~">
-        <location
-            file="src/main/java/androidx/preference/PreferenceViewHolder.java"
-            line="64"
-            column="63"/>
-    </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="    public View findViewById(@IdRes int id) {"
         errorLine2="           ~~~~">
         <location
             file="src/main/java/androidx/preference/PreferenceViewHolder.java"
-            line="75"
+            line="77"
             column="12"/>
     </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="            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
-        errorLine2="            ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SeekBarPreference.java"
-            line="132"
-            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="            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
-        errorLine2="                             ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SeekBarPreference.java"
-            line="132"
-            column="30"/>
-    </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="    public SeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                             ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SeekBarPreference.java"
-            line="151"
-            column="30"/>
-    </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="    public SeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                                              ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SeekBarPreference.java"
-            line="151"
-            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="    public SeekBarPreference(Context context, AttributeSet attrs) {"
-        errorLine2="                             ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SeekBarPreference.java"
-            line="155"
-            column="30"/>
-    </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="    public SeekBarPreference(Context context, AttributeSet attrs) {"
-        errorLine2="                                              ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SeekBarPreference.java"
-            line="155"
-            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="    public SeekBarPreference(Context context) {"
-        errorLine2="                             ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SeekBarPreference.java"
-            line="159"
-            column="30"/>
-    </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="    public void onBindViewHolder(PreferenceViewHolder holder) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SeekBarPreference.java"
-            line="164"
-            column="34"/>
-    </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 void onSetInitialValue(Object defaultValue) {"
         errorLine2="                                     ~~~~~~">
         <location
             file="src/main/java/androidx/preference/SeekBarPreference.java"
-            line="198"
+            line="203"
             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 Object onGetDefaultValue(TypedArray a, int index) {"
-        errorLine2="              ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SeekBarPreference.java"
-            line="206"
-            column="15"/>
-    </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 Object onGetDefaultValue(TypedArray a, int index) {"
-        errorLine2="                                       ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SeekBarPreference.java"
-            line="206"
-            column="40"/>
-    </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 Parcelable onSaveInstanceState() {"
-        errorLine2="              ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SeekBarPreference.java"
-            line="413"
-            column="15"/>
-    </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 void onRestoreInstanceState(Parcelable state) {"
-        errorLine2="                                          ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SeekBarPreference.java"
-            line="429"
-            column="43"/>
-    </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="    public SwitchPreference(Context context, AttributeSet attrs, int defStyleAttr,"
-        errorLine2="                            ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SwitchPreference.java"
-            line="63"
-            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="    public SwitchPreference(Context context, AttributeSet attrs, int defStyleAttr,"
-        errorLine2="                                             ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SwitchPreference.java"
-            line="63"
-            column="46"/>
-    </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="    public SwitchPreference(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                            ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SwitchPreference.java"
-            line="100"
-            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="    public SwitchPreference(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                                             ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SwitchPreference.java"
-            line="100"
-            column="46"/>
-    </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="    public SwitchPreference(Context context, AttributeSet attrs) {"
-        errorLine2="                            ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SwitchPreference.java"
-            line="110"
-            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="    public SwitchPreference(Context context, AttributeSet attrs) {"
-        errorLine2="                                             ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SwitchPreference.java"
-            line="110"
-            column="46"/>
-    </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="    public SwitchPreference(Context context) {"
-        errorLine2="                            ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SwitchPreference.java"
-            line="121"
-            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="    public void onBindViewHolder(PreferenceViewHolder holder) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SwitchPreference.java"
-            line="126"
-            column="34"/>
-    </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="    public void setSwitchTextOn(CharSequence onText) {"
-        errorLine2="                                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SwitchPreference.java"
-            line="139"
-            column="33"/>
-    </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="    public void setSwitchTextOff(CharSequence offText) {"
-        errorLine2="                                 ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SwitchPreference.java"
-            line="150"
-            column="34"/>
-    </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="    public CharSequence getSwitchTextOn() {"
-        errorLine2="           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SwitchPreference.java"
-            line="158"
-            column="12"/>
-    </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="    public CharSequence getSwitchTextOff() {"
-        errorLine2="           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SwitchPreference.java"
-            line="175"
-            column="12"/>
-    </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 void performClick(View view) {"
-        errorLine2="                                ~~~~">
-        <location
-            file="src/main/java/androidx/preference/SwitchPreference.java"
-            line="194"
-            column="33"/>
-    </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="    public SwitchPreferenceCompat(Context context, AttributeSet attrs, int defStyleAttr,"
-        errorLine2="                                  ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SwitchPreferenceCompat.java"
-            line="63"
-            column="35"/>
-    </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="    public SwitchPreferenceCompat(Context context, AttributeSet attrs, int defStyleAttr,"
-        errorLine2="                                                   ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SwitchPreferenceCompat.java"
-            line="63"
-            column="52"/>
-    </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="    public SwitchPreferenceCompat(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                                  ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SwitchPreferenceCompat.java"
-            line="100"
-            column="35"/>
-    </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="    public SwitchPreferenceCompat(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                                                   ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SwitchPreferenceCompat.java"
-            line="100"
-            column="52"/>
-    </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="    public SwitchPreferenceCompat(Context context, AttributeSet attrs) {"
-        errorLine2="                                  ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SwitchPreferenceCompat.java"
-            line="110"
-            column="35"/>
-    </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="    public SwitchPreferenceCompat(Context context, AttributeSet attrs) {"
-        errorLine2="                                                   ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SwitchPreferenceCompat.java"
-            line="110"
-            column="52"/>
-    </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="    public SwitchPreferenceCompat(Context context) {"
-        errorLine2="                                  ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SwitchPreferenceCompat.java"
-            line="119"
-            column="35"/>
-    </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="    public void onBindViewHolder(PreferenceViewHolder holder) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SwitchPreferenceCompat.java"
-            line="124"
-            column="34"/>
-    </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="    public void setSwitchTextOn(CharSequence onText) {"
-        errorLine2="                                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SwitchPreferenceCompat.java"
-            line="137"
-            column="33"/>
-    </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="    public void setSwitchTextOff(CharSequence offText) {"
-        errorLine2="                                 ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SwitchPreferenceCompat.java"
-            line="148"
-            column="34"/>
-    </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="    public CharSequence getSwitchTextOn() {"
-        errorLine2="           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SwitchPreferenceCompat.java"
-            line="156"
-            column="12"/>
-    </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="    public CharSequence getSwitchTextOff() {"
-        errorLine2="           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/SwitchPreferenceCompat.java"
-            line="173"
-            column="12"/>
-    </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 void performClick(View view) {"
-        errorLine2="                                ~~~~">
-        <location
-            file="src/main/java/androidx/preference/SwitchPreferenceCompat.java"
-            line="192"
-            column="33"/>
-    </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="            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
-        errorLine2="            ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/TwoStatePreference.java"
-            line="46"
-            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="            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
-        errorLine2="                             ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/TwoStatePreference.java"
-            line="46"
-            column="30"/>
-    </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="    public TwoStatePreference(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                              ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/TwoStatePreference.java"
-            line="50"
-            column="31"/>
-    </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="    public TwoStatePreference(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                                               ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/TwoStatePreference.java"
-            line="50"
-            column="48"/>
-    </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="    public TwoStatePreference(Context context, AttributeSet attrs) {"
-        errorLine2="                              ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/TwoStatePreference.java"
-            line="54"
-            column="31"/>
-    </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="    public TwoStatePreference(Context context, AttributeSet attrs) {"
-        errorLine2="                                               ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/TwoStatePreference.java"
-            line="54"
-            column="48"/>
-    </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="    public TwoStatePreference(Context context) {"
-        errorLine2="                              ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/TwoStatePreference.java"
-            line="58"
-            column="31"/>
-    </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="    public void setSummaryOn(CharSequence summary) {"
-        errorLine2="                             ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/TwoStatePreference.java"
-            line="114"
-            column="30"/>
-    </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="    public CharSequence getSummaryOn() {"
-        errorLine2="           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/TwoStatePreference.java"
-            line="126"
-            column="12"/>
-    </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="    public void setSummaryOff(CharSequence summary) {"
-        errorLine2="                              ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/TwoStatePreference.java"
-            line="146"
-            column="31"/>
-    </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="    public CharSequence getSummaryOff() {"
-        errorLine2="           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/TwoStatePreference.java"
-            line="158"
-            column="12"/>
-    </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 Object onGetDefaultValue(TypedArray a, int index) {"
-        errorLine2="              ~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/TwoStatePreference.java"
-            line="192"
-            column="15"/>
-    </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 Object onGetDefaultValue(TypedArray a, int index) {"
-        errorLine2="                                       ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/TwoStatePreference.java"
-            line="192"
-            column="40"/>
-    </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 void onSetInitialValue(Object defaultValue) {"
         errorLine2="                                     ~~~~~~">
         <location
             file="src/main/java/androidx/preference/TwoStatePreference.java"
-            line="197"
+            line="203"
             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 void syncSummaryView(PreferenceViewHolder holder) {"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/TwoStatePreference.java"
-            line="209"
-            column="36"/>
-    </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 void syncSummaryView(View view) {"
         errorLine2="                                   ~~~~">
         <location
             file="src/main/java/androidx/preference/TwoStatePreference.java"
-            line="219"
+            line="225"
             column="36"/>
     </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 Parcelable onSaveInstanceState() {"
-        errorLine2="              ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/TwoStatePreference.java"
-            line="250"
-            column="15"/>
-    </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 void onRestoreInstanceState(Parcelable state) {"
-        errorLine2="                                          ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/TwoStatePreference.java"
-            line="263"
-            column="43"/>
-    </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="    public UnPressableLinearLayout(Context context) {"
-        errorLine2="                                   ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/UnPressableLinearLayout.java"
-            line="38"
-            column="36"/>
-    </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="    public UnPressableLinearLayout(Context context, AttributeSet attrs) {"
-        errorLine2="                                   ~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/UnPressableLinearLayout.java"
-            line="42"
-            column="36"/>
-    </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="    public UnPressableLinearLayout(Context context, AttributeSet attrs) {"
-        errorLine2="                                                    ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/preference/UnPressableLinearLayout.java"
-            line="42"
-            column="53"/>
-    </issue>
-
 </issues>
diff --git a/preference/preference/src/androidTest/java/androidx/preference/tests/PreferenceDialogFragmentCompatTest.kt b/preference/preference/src/androidTest/java/androidx/preference/tests/PreferenceDialogFragmentCompatTest.kt
index 2b7b3aa7..bb5e2be 100644
--- a/preference/preference/src/androidTest/java/androidx/preference/tests/PreferenceDialogFragmentCompatTest.kt
+++ b/preference/preference/src/androidTest/java/androidx/preference/tests/PreferenceDialogFragmentCompatTest.kt
@@ -72,7 +72,7 @@
         }
 
         // Show the dialog
-        fragment.preferenceManager.showDialog(fragment.preferenceManager.findPreference("key"))
+        fragment.preferenceManager.showDialog(fragment.preferenceManager.findPreference("key")!!)
 
         // Assert on UI thread so we wait for the dialog to show
         activityTestRule.runOnUiThread {
@@ -100,12 +100,12 @@
 
 class NestedFragment : Fragment(R.layout.simple_layout)
 
-class TestFragmentContainerViewDialogPreference(context: Context?, attrs: AttributeSet?) :
+class TestFragmentContainerViewDialogPreference(context: Context, attrs: AttributeSet?) :
     DialogPreference(context, attrs) {
     init { dialogLayoutResource = R.layout.inflated_fragment_container_view }
 }
 
-class TestFragmentTagDialogPreference(context: Context?, attrs: AttributeSet?) :
+class TestFragmentTagDialogPreference(context: Context, attrs: AttributeSet?) :
     DialogPreference(context, attrs) {
     init { dialogLayoutResource = R.layout.inflated_fragment_tag }
 }
diff --git a/preference/preference/src/androidTest/java/androidx/preference/tests/PreferenceFragmentCompatInterfaceTest.kt b/preference/preference/src/androidTest/java/androidx/preference/tests/PreferenceFragmentCompatInterfaceTest.kt
index 3b5abce..0b16bd9 100644
--- a/preference/preference/src/androidTest/java/androidx/preference/tests/PreferenceFragmentCompatInterfaceTest.kt
+++ b/preference/preference/src/androidTest/java/androidx/preference/tests/PreferenceFragmentCompatInterfaceTest.kt
@@ -78,7 +78,7 @@
     @Test
     fun onPreferenceStartFragmentTest_contextCallback() {
         verifyCallsWithContext {
-            Preference(context).apply {
+            Preference(requireContext()).apply {
                 fragment = "dummy.fragment"
             }
         }
@@ -87,7 +87,7 @@
     @Test
     fun onPreferenceStartFragmentTest_activityCallback() {
         verifyCallsWithActivity {
-            Preference(context).apply {
+            Preference(requireContext()).apply {
                 fragment = "dummy.fragment"
             }
         }
@@ -96,7 +96,7 @@
     @Test
     fun onPreferenceStartFragmentTest_contextAndActivityCallback_contextHandlesCall() {
         verifyCallsWithContextAndActivity(contextHandlesCall = true) {
-            Preference(context).apply {
+            Preference(requireContext()).apply {
                 fragment = "dummy.fragment"
             }
         }
@@ -105,7 +105,7 @@
     @Test
     fun onPreferenceStartFragmentTest_contextAndActivityCallback_contextDoesNotHandleCall() {
         verifyCallsWithContextAndActivity(contextHandlesCall = false) {
-            Preference(context).apply {
+            Preference(requireContext()).apply {
                 fragment = "dummy.fragment"
             }
         }
@@ -124,7 +124,7 @@
     @Test
     fun onPreferenceStartScreenTest_contextCallback() {
         verifyCallsWithContext {
-            preferenceManager.createPreferenceScreen(context).apply {
+            preferenceManager.createPreferenceScreen(requireContext()).apply {
                 // Add a preference as PreferenceScreen will only dispatch
                 // onPreferenceStartScreen if its count != 0
                 addPreference(Preference(context))
@@ -135,7 +135,7 @@
     @Test
     fun onPreferenceStartScreenTest_activityCallback() {
         verifyCallsWithActivity {
-            preferenceManager.createPreferenceScreen(context).apply {
+            preferenceManager.createPreferenceScreen(requireContext()).apply {
                 // Add a preference as PreferenceScreen will only dispatch
                 // onPreferenceStartScreen if its count != 0
                 addPreference(Preference(context))
@@ -146,7 +146,7 @@
     @Test
     fun onPreferenceStartScreenTest_contextAndActivityCallback_contextHandlesCall() {
         verifyCallsWithContextAndActivity(contextHandlesCall = true) {
-            preferenceManager.createPreferenceScreen(context).apply {
+            preferenceManager.createPreferenceScreen(requireContext()).apply {
                 // Add a preference as PreferenceScreen will only dispatch
                 // onPreferenceStartScreen if its count != 0
                 addPreference(Preference(context))
@@ -157,7 +157,7 @@
     @Test
     fun onPreferenceStartScreenTest_contextAndActivityCallback_contextDoesNotHandleCall() {
         verifyCallsWithContextAndActivity(contextHandlesCall = false) {
-            preferenceManager.createPreferenceScreen(context).apply {
+            preferenceManager.createPreferenceScreen(requireContext()).apply {
                 // Add a preference as PreferenceScreen will only dispatch
                 // onPreferenceStartScreen if its count != 0
                 addPreference(Preference(context))
@@ -168,28 +168,28 @@
     @Test
     fun onPreferenceDisplayDialogTest_contextCallback() {
         verifyCallsWithContext {
-            EditTextPreference(context)
+            EditTextPreference(requireContext())
         }
     }
 
     @Test
     fun onPreferenceDisplayDialogTest_activityCallback() {
         verifyCallsWithActivity {
-            EditTextPreference(context)
+            EditTextPreference(requireContext())
         }
     }
 
     @Test
     fun onPreferenceDisplayDialogTest_contextAndActivityCallback_contextHandlesCall() {
         verifyCallsWithContextAndActivity(contextHandlesCall = true) {
-            EditTextPreference(context)
+            EditTextPreference(requireContext())
         }
     }
 
     @Test
     fun onPreferenceDisplayDialogTest_contextAndActivityCallback_contextDoesNotHandleCall() {
         verifyCallsWithContextAndActivity(contextHandlesCall = false) {
-            EditTextPreference(context)
+            EditTextPreference(requireContext())
         }
     }
 
@@ -409,18 +409,18 @@
     }
 
     override fun onPreferenceStartFragment(
-        caller: PreferenceFragmentCompat?,
-        pref: Preference?
+        caller: PreferenceFragmentCompat,
+        pref: Preference
     ) = testCallback()
 
     override fun onPreferenceStartScreen(
-        caller: PreferenceFragmentCompat?,
-        pref: PreferenceScreen?
+        caller: PreferenceFragmentCompat,
+        pref: PreferenceScreen
     ) = testCallback()
 
     override fun onPreferenceDisplayDialog(
         caller: PreferenceFragmentCompat,
-        pref: Preference?
+        pref: Preference
     ) = testCallback()
 }
 
@@ -437,18 +437,18 @@
     PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback {
 
     override fun onPreferenceStartFragment(
-        caller: PreferenceFragmentCompat?,
-        pref: Preference?
+        caller: PreferenceFragmentCompat,
+        pref: Preference
     ) = testCallback()
 
     override fun onPreferenceStartScreen(
-        caller: PreferenceFragmentCompat?,
-        pref: PreferenceScreen?
+        caller: PreferenceFragmentCompat,
+        pref: PreferenceScreen
     ) = testCallback()
 
     override fun onPreferenceDisplayDialog(
         caller: PreferenceFragmentCompat,
-        pref: Preference?
+        pref: Preference
     ) = testCallback()
 }
 
@@ -467,7 +467,7 @@
     private val contextCallback: (() -> Boolean)? = null
 ) : PreferenceFragmentCompat() {
     override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
-        preferenceScreen = preferenceManager.createPreferenceScreen(context)
+        preferenceScreen = preferenceManager.createPreferenceScreen(requireContext())
         val testPreference = testPreferenceFactory()
         testPreference.title = preferenceTitle
         preferenceScreen.addPreference(testPreference)
@@ -513,11 +513,15 @@
     private val childTestCallback: () -> Boolean
 ) :
     Fragment(),
-    PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
+    PreferenceFragmentCompat.OnPreferenceStartFragmentCallback,
+    PreferenceFragmentCompat.OnPreferenceStartScreenCallback,
+    PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback {
 
     class ChildFragment(private val callback: () -> Boolean) :
         Fragment(),
-        PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
+        PreferenceFragmentCompat.OnPreferenceStartFragmentCallback,
+        PreferenceFragmentCompat.OnPreferenceStartScreenCallback,
+        PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback {
 
         override fun onCreateView(
             inflater: LayoutInflater,
@@ -538,7 +542,11 @@
                     add(
                         R.id.child_fragment,
                         TestFragment(
-                            { Preference(context).apply { fragment = "preference.fragment" } },
+                            {
+                                Preference(requireContext()).apply {
+                                    fragment = "preference.fragment"
+                                }
+                            },
                             { false }
                         )
                     )
@@ -548,8 +556,18 @@
         }
 
         override fun onPreferenceStartFragment(
-            caller: PreferenceFragmentCompat?,
-            pref: Preference?
+            caller: PreferenceFragmentCompat,
+            pref: Preference
+        ) = callback()
+
+        override fun onPreferenceStartScreen(
+            caller: PreferenceFragmentCompat,
+            pref: PreferenceScreen
+        ) = callback()
+
+        override fun onPreferenceDisplayDialog(
+            caller: PreferenceFragmentCompat,
+            pref: Preference
         ) = callback()
     }
 
@@ -574,7 +592,17 @@
     }
 
     override fun onPreferenceStartFragment(
-        caller: PreferenceFragmentCompat?,
-        pref: Preference?
+        caller: PreferenceFragmentCompat,
+        pref: Preference
+    ) = parentTestCallback()
+
+    override fun onPreferenceStartScreen(
+        caller: PreferenceFragmentCompat,
+        pref: PreferenceScreen
+    ) = parentTestCallback()
+
+    override fun onPreferenceDisplayDialog(
+        caller: PreferenceFragmentCompat,
+        pref: Preference
     ) = parentTestCallback()
 }
diff --git a/preference/preference/src/androidTest/java/androidx/preference/tests/PreferenceViewHolderStateTest.kt b/preference/preference/src/androidTest/java/androidx/preference/tests/PreferenceViewHolderStateTest.kt
index b096df4..64dd3d2 100644
--- a/preference/preference/src/androidTest/java/androidx/preference/tests/PreferenceViewHolderStateTest.kt
+++ b/preference/preference/src/androidTest/java/androidx/preference/tests/PreferenceViewHolderStateTest.kt
@@ -182,9 +182,9 @@
     var titleColor: Int? = null
     var summaryColor: Int? = null
 
-    override fun onBindViewHolder(holder: PreferenceViewHolder?) {
+    override fun onBindViewHolder(holder: PreferenceViewHolder) {
         super.onBindViewHolder(holder)
-        background = holder!!.itemView.background
+        background = holder.itemView.background
         titleColor = (holder.findViewById(android.R.id.title) as TextView).currentTextColor
         summaryColor = (holder.findViewById(android.R.id.summary) as TextView).currentTextColor
     }
diff --git a/preference/preference/src/androidTest/java/androidx/preference/tests/SelectableTest.kt b/preference/preference/src/androidTest/java/androidx/preference/tests/SelectableTest.kt
index eac2dd5..7c5b6b3 100644
--- a/preference/preference/src/androidTest/java/androidx/preference/tests/SelectableTest.kt
+++ b/preference/preference/src/androidTest/java/androidx/preference/tests/SelectableTest.kt
@@ -175,10 +175,10 @@
      * as its background.
      */
     private class TestPreference(context: Context) : Preference(context) {
-        override fun onBindViewHolder(holder: PreferenceViewHolder?) {
+        override fun onBindViewHolder(holder: PreferenceViewHolder) {
             super.onBindViewHolder(holder)
             // If there's no background, no ripple effect will play regardless.
-            if (holder!!.itemView.background != null) {
+            if (holder.itemView.background != null) {
                 ViewCompat.setBackground(holder.itemView, TestDrawable())
             }
         }
diff --git a/preference/preference/src/main/java/androidx/preference/CheckBoxPreference.java b/preference/preference/src/main/java/androidx/preference/CheckBoxPreference.java
index 11168ec..a0250f3 100644
--- a/preference/preference/src/main/java/androidx/preference/CheckBoxPreference.java
+++ b/preference/preference/src/main/java/androidx/preference/CheckBoxPreference.java
@@ -26,6 +26,8 @@
 import android.widget.Checkable;
 import android.widget.CompoundButton;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.core.content.res.TypedArrayUtils;
 
@@ -41,11 +43,13 @@
 public class CheckBoxPreference extends TwoStatePreference {
     private final Listener mListener = new Listener();
 
-    public CheckBoxPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+    public CheckBoxPreference(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyleAttr) {
         this(context, attrs, defStyleAttr, 0);
     }
     public CheckBoxPreference(
-            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+            @NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr,
+            int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
 
         final TypedArray a = context.obtainStyledAttributes(attrs,
@@ -63,17 +67,17 @@
 
         a.recycle();
     }
-    public CheckBoxPreference(Context context, AttributeSet attrs) {
+    public CheckBoxPreference(@NonNull Context context, @Nullable AttributeSet attrs) {
         this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.checkBoxPreferenceStyle,
                 android.R.attr.checkBoxPreferenceStyle));
     }
 
-    public CheckBoxPreference(Context context) {
+    public CheckBoxPreference(@NonNull Context context) {
         this(context, null);
     }
 
     @Override
-    public void onBindViewHolder(PreferenceViewHolder holder) {
+    public void onBindViewHolder(@NonNull PreferenceViewHolder holder) {
         super.onBindViewHolder(holder);
 
         syncCheckboxView(holder.findViewById(android.R.id.checkbox));
@@ -86,12 +90,12 @@
      */
     @RestrictTo(LIBRARY)
     @Override
-    protected void performClick(View view) {
+    protected void performClick(@NonNull View view) {
         super.performClick(view);
         syncViewIfAccessibilityEnabled(view);
     }
 
-    private void syncViewIfAccessibilityEnabled(View view) {
+    private void syncViewIfAccessibilityEnabled(@NonNull View view) {
         AccessibilityManager accessibilityManager = (AccessibilityManager)
                 getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
         if (!accessibilityManager.isEnabled()) {
diff --git a/preference/preference/src/main/java/androidx/preference/DialogPreference.java b/preference/preference/src/main/java/androidx/preference/DialogPreference.java
index 057bc81..4856d07 100644
--- a/preference/preference/src/main/java/androidx/preference/DialogPreference.java
+++ b/preference/preference/src/main/java/androidx/preference/DialogPreference.java
@@ -48,7 +48,8 @@
     private int mDialogLayoutResId;
 
     public DialogPreference(
-            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+            @NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr,
+            int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
 
         final TypedArray a = context.obtainStyledAttributes(attrs,
@@ -83,16 +84,17 @@
         a.recycle();
     }
 
-    public DialogPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+    public DialogPreference(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyleAttr) {
         this(context, attrs, defStyleAttr, 0);
     }
 
-    public DialogPreference(Context context, AttributeSet attrs) {
+    public DialogPreference(@NonNull Context context, @Nullable AttributeSet attrs) {
         this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.dialogPreferenceStyle,
                 android.R.attr.dialogPreferenceStyle));
     }
 
-    public DialogPreference(Context context) {
+    public DialogPreference(@NonNull Context context) {
         this(context, null);
     }
 
@@ -101,7 +103,7 @@
      *
      * @param dialogTitle The title
      */
-    public void setDialogTitle(CharSequence dialogTitle) {
+    public void setDialogTitle(@Nullable CharSequence dialogTitle) {
         mDialogTitle = dialogTitle;
     }
 
@@ -118,6 +120,7 @@
      *
      * @return The title
      */
+    @Nullable
     public CharSequence getDialogTitle() {
         return mDialogTitle;
     }
@@ -132,7 +135,7 @@
      *
      * @param dialogMessage The message
      */
-    public void setDialogMessage(CharSequence dialogMessage) {
+    public void setDialogMessage(@Nullable CharSequence dialogMessage) {
         mDialogMessage = dialogMessage;
     }
 
@@ -149,6 +152,7 @@
      *
      * @return The message
      */
+    @Nullable
     public CharSequence getDialogMessage() {
         return mDialogMessage;
     }
@@ -158,7 +162,7 @@
      *
      * @param dialogIcon The icon, as a {@link Drawable}
      */
-    public void setDialogIcon(Drawable dialogIcon) {
+    public void setDialogIcon(@Nullable Drawable dialogIcon) {
         mDialogIcon = dialogIcon;
     }
 
@@ -176,6 +180,7 @@
      *
      * @return The icon, as a {@link Drawable}
      */
+    @Nullable
     public Drawable getDialogIcon() {
         return mDialogIcon;
     }
@@ -185,7 +190,7 @@
      *
      * @param positiveButtonText The text of the positive button
      */
-    public void setPositiveButtonText(CharSequence positiveButtonText) {
+    public void setPositiveButtonText(@Nullable CharSequence positiveButtonText) {
         mPositiveButtonText = positiveButtonText;
     }
 
@@ -202,6 +207,7 @@
      *
      * @return The text of the positive button
      */
+    @Nullable
     public CharSequence getPositiveButtonText() {
         return mPositiveButtonText;
     }
@@ -211,7 +217,7 @@
      *
      * @param negativeButtonText The text of the negative button
      */
-    public void setNegativeButtonText(CharSequence negativeButtonText) {
+    public void setNegativeButtonText(@Nullable CharSequence negativeButtonText) {
         mNegativeButtonText = negativeButtonText;
     }
 
@@ -228,6 +234,7 @@
      *
      * @return The text of the negative button
      */
+    @Nullable
     public CharSequence getNegativeButtonText() {
         return mNegativeButtonText;
     }
diff --git a/preference/preference/src/main/java/androidx/preference/DropDownPreference.java b/preference/preference/src/main/java/androidx/preference/DropDownPreference.java
index c9e38d6..5007aa9 100644
--- a/preference/preference/src/main/java/androidx/preference/DropDownPreference.java
+++ b/preference/preference/src/main/java/androidx/preference/DropDownPreference.java
@@ -26,6 +26,7 @@
 import android.widget.Spinner;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
 /**
  * A {@link ListPreference} that presents the options in a drop down menu rather than a dialog.
@@ -54,20 +55,21 @@
         }
     };
 
-    public DropDownPreference(Context context) {
+    public DropDownPreference(@NonNull Context context) {
         this(context, null);
     }
 
-    public DropDownPreference(Context context, AttributeSet attrs) {
+    public DropDownPreference(@NonNull Context context, @Nullable AttributeSet attrs) {
         this(context, attrs, R.attr.dropdownPreferenceStyle);
     }
 
-    public DropDownPreference(Context context, AttributeSet attrs, int defStyle) {
+    public DropDownPreference(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyle) {
         this(context, attrs, defStyle, 0);
     }
 
-    public DropDownPreference(Context context, AttributeSet attrs, int defStyleAttr,
-            int defStyleRes) {
+    public DropDownPreference(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyleAttr, int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
         mContext = context;
         mAdapter = createAdapter();
@@ -95,6 +97,7 @@
      *
      * @return The custom {@link ArrayAdapter} that needs to be used with this class
      */
+    @NonNull
     protected ArrayAdapter createAdapter() {
         return new ArrayAdapter<>(mContext, android.R.layout.simple_spinner_dropdown_item);
     }
@@ -125,7 +128,7 @@
     }
 
     @Override
-    public void onBindViewHolder(PreferenceViewHolder holder) {
+    public void onBindViewHolder(@NonNull PreferenceViewHolder holder) {
         mSpinner = holder.itemView.findViewById(R.id.spinner);
         mSpinner.setAdapter(mAdapter);
         mSpinner.setOnItemSelectedListener(mItemSelectedListener);
diff --git a/preference/preference/src/main/java/androidx/preference/EditTextPreference.java b/preference/preference/src/main/java/androidx/preference/EditTextPreference.java
index 725c93a..97dcadd 100644
--- a/preference/preference/src/main/java/androidx/preference/EditTextPreference.java
+++ b/preference/preference/src/main/java/androidx/preference/EditTextPreference.java
@@ -39,8 +39,8 @@
     @Nullable
     private OnBindEditTextListener mOnBindEditTextListener;
 
-    public EditTextPreference(Context context, AttributeSet attrs, int defStyleAttr,
-            int defStyleRes) {
+    public EditTextPreference(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyleAttr, int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
 
         TypedArray a = context.obtainStyledAttributes(
@@ -54,16 +54,17 @@
         a.recycle();
     }
 
-    public EditTextPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+    public EditTextPreference(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyleAttr) {
         this(context, attrs, defStyleAttr, 0);
     }
 
-    public EditTextPreference(Context context, AttributeSet attrs) {
+    public EditTextPreference(@NonNull Context context, @Nullable AttributeSet attrs) {
         this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.editTextPreferenceStyle,
                 android.R.attr.editTextPreferenceStyle));
     }
 
-    public EditTextPreference(Context context) {
+    public EditTextPreference(@NonNull Context context) {
         this(context, null);
     }
 
@@ -72,7 +73,7 @@
      *
      * @param text The text to save
      */
-    public void setText(String text) {
+    public void setText(@Nullable String text) {
         final boolean wasBlocking = shouldDisableDependents();
 
         mText = text;
@@ -92,12 +93,13 @@
      *
      * @return The current preference value
      */
+    @Nullable
     public String getText() {
         return mText;
     }
 
     @Override
-    protected Object onGetDefaultValue(TypedArray a, int index) {
+    protected Object onGetDefaultValue(@NonNull TypedArray a, int index) {
         return a.getString(index);
     }
 
@@ -111,6 +113,7 @@
         return TextUtils.isEmpty(mText) || super.shouldDisableDependents();
     }
 
+    @Nullable
     @Override
     protected Parcelable onSaveInstanceState() {
         final Parcelable superState = super.onSaveInstanceState();
@@ -125,7 +128,7 @@
     }
 
     @Override
-    protected void onRestoreInstanceState(Parcelable state) {
+    protected void onRestoreInstanceState(@Nullable Parcelable state) {
         if (state == null || !state.getClass().equals(SavedState.class)) {
             // Didn't save state for us in onSaveInstanceState
             super.onRestoreInstanceState(state);
@@ -227,6 +230,7 @@
          * @return a singleton instance of this simple
          * {@link androidx.preference.Preference.SummaryProvider} implementation
          */
+        @NonNull
         public static SimpleSummaryProvider getInstance() {
             if (sSimpleSummaryProvider == null) {
                 sSimpleSummaryProvider = new SimpleSummaryProvider();
@@ -234,8 +238,9 @@
             return sSimpleSummaryProvider;
         }
 
+        @Nullable
         @Override
-        public CharSequence provideSummary(EditTextPreference preference) {
+        public CharSequence provideSummary(@NonNull EditTextPreference preference) {
             if (TextUtils.isEmpty(preference.getText())) {
                 return (preference.getContext().getString(R.string.not_set));
             } else {
diff --git a/preference/preference/src/main/java/androidx/preference/EditTextPreferenceDialogFragment.java b/preference/preference/src/main/java/androidx/preference/EditTextPreferenceDialogFragment.java
index 82dfd99..d234000 100644
--- a/preference/preference/src/main/java/androidx/preference/EditTextPreferenceDialogFragment.java
+++ b/preference/preference/src/main/java/androidx/preference/EditTextPreferenceDialogFragment.java
@@ -23,6 +23,7 @@
 import android.widget.EditText;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 
 /**
@@ -47,6 +48,7 @@
     /**
      * @deprecated Use {@link EditTextPreferenceDialogFragmentCompat} instead
      */
+    @NonNull
     @Deprecated
     public static EditTextPreferenceDialogFragment newInstance(String key) {
         final EditTextPreferenceDialogFragment
@@ -58,7 +60,7 @@
     }
 
     @Override
-    public void onCreate(Bundle savedInstanceState) {
+    public void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         if (savedInstanceState == null) {
             mText = getEditTextPreference().getText();
@@ -74,7 +76,7 @@
     }
 
     @Override
-    protected void onBindDialogView(View view) {
+    protected void onBindDialogView(@NonNull View view) {
         super.onBindDialogView(view);
 
         mEditText = view.findViewById(android.R.id.edit);
diff --git a/preference/preference/src/main/java/androidx/preference/EditTextPreferenceDialogFragmentCompat.java b/preference/preference/src/main/java/androidx/preference/EditTextPreferenceDialogFragmentCompat.java
index c633bd5..83f81b5 100644
--- a/preference/preference/src/main/java/androidx/preference/EditTextPreferenceDialogFragmentCompat.java
+++ b/preference/preference/src/main/java/androidx/preference/EditTextPreferenceDialogFragmentCompat.java
@@ -26,6 +26,7 @@
 import android.widget.EditText;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 
 public class EditTextPreferenceDialogFragmentCompat extends PreferenceDialogFragmentCompat {
@@ -45,6 +46,7 @@
     private long mShowRequestTime = -1;
     private static final int SHOW_REQUEST_TIMEOUT = 1000;
 
+    @NonNull
     public static EditTextPreferenceDialogFragmentCompat newInstance(String key) {
         final EditTextPreferenceDialogFragmentCompat
                 fragment = new EditTextPreferenceDialogFragmentCompat();
@@ -55,7 +57,7 @@
     }
 
     @Override
-    public void onCreate(Bundle savedInstanceState) {
+    public void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         if (savedInstanceState == null) {
             mText = getEditTextPreference().getText();
@@ -71,7 +73,7 @@
     }
 
     @Override
-    protected void onBindDialogView(View view) {
+    protected void onBindDialogView(@NonNull View view) {
         super.onBindDialogView(view);
 
         mEditText = view.findViewById(android.R.id.edit);
diff --git a/preference/preference/src/main/java/androidx/preference/ExpandButton.java b/preference/preference/src/main/java/androidx/preference/ExpandButton.java
index b2a6b57..769758a 100644
--- a/preference/preference/src/main/java/androidx/preference/ExpandButton.java
+++ b/preference/preference/src/main/java/androidx/preference/ExpandButton.java
@@ -19,6 +19,8 @@
 import android.content.Context;
 import android.text.TextUtils;
 
+import androidx.annotation.NonNull;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -31,7 +33,7 @@
 final class ExpandButton extends Preference {
     private long mId;
 
-    ExpandButton(Context context, List<Preference> collapsedPreferences, long parentId) {
+    ExpandButton(@NonNull Context context, List<Preference> collapsedPreferences, long parentId) {
         super(context);
         initLayout();
         setSummary(collapsedPreferences);
@@ -82,7 +84,7 @@
     }
 
     @Override
-    public void onBindViewHolder(PreferenceViewHolder holder) {
+    public void onBindViewHolder(@NonNull PreferenceViewHolder holder) {
         super.onBindViewHolder(holder);
         holder.setDividerAllowedAbove(false);
     }
diff --git a/preference/preference/src/main/java/androidx/preference/ListPreference.java b/preference/preference/src/main/java/androidx/preference/ListPreference.java
index 3f1361d..89086f1 100644
--- a/preference/preference/src/main/java/androidx/preference/ListPreference.java
+++ b/preference/preference/src/main/java/androidx/preference/ListPreference.java
@@ -26,6 +26,7 @@
 
 import androidx.annotation.ArrayRes;
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.core.content.res.TypedArrayUtils;
 
 /**
@@ -45,7 +46,8 @@
     private String mSummary;
     private boolean mValueSet;
 
-    public ListPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+    public ListPreference(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr,
+            int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
 
         TypedArray a = context.obtainStyledAttributes(
@@ -74,16 +76,17 @@
         a.recycle();
     }
 
-    public ListPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+    public ListPreference(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyleAttr) {
         this(context, attrs, defStyleAttr, 0);
     }
 
-    public ListPreference(Context context, AttributeSet attrs) {
+    public ListPreference(@NonNull Context context, @Nullable AttributeSet attrs) {
         this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.dialogPreferenceStyle,
                 android.R.attr.dialogPreferenceStyle));
     }
 
-    public ListPreference(Context context) {
+    public ListPreference(@NonNull Context context) {
         this(context, null);
     }
 
@@ -146,7 +149,7 @@
     }
 
     @Override
-    public void setSummary(CharSequence summary) {
+    public void setSummary(@Nullable CharSequence summary) {
         super.setSummary(summary);
         if (summary == null) {
             mSummary = null;
@@ -156,6 +159,7 @@
     }
 
     @SuppressWarnings("unchecked")
+    @Nullable
     @Override
     public CharSequence getSummary() {
         if (getSummaryProvider() != null) {
@@ -208,6 +212,7 @@
      *
      * @return The entry corresponding to the current value, or {@code null}
      */
+    @Nullable
     public CharSequence getEntry() {
         int index = getValueIndex();
         return index >= 0 && mEntries != null ? mEntries[index] : null;
@@ -246,7 +251,7 @@
     }
 
     @Override
-    protected Object onGetDefaultValue(TypedArray a, int index) {
+    protected Object onGetDefaultValue(@NonNull TypedArray a, int index) {
         return a.getString(index);
     }
 
@@ -255,6 +260,7 @@
         setValue(getPersistedString((String) defaultValue));
     }
 
+    @Nullable
     @Override
     protected Parcelable onSaveInstanceState() {
         final Parcelable superState = super.onSaveInstanceState();
@@ -269,7 +275,7 @@
     }
 
     @Override
-    protected void onRestoreInstanceState(Parcelable state) {
+    protected void onRestoreInstanceState(@Nullable Parcelable state) {
         if (state == null || !state.getClass().equals(SavedState.class)) {
             // Didn't save state for us in onSaveInstanceState
             super.onRestoreInstanceState(state);
@@ -331,6 +337,7 @@
          * @return a singleton instance of this simple
          * {@link androidx.preference.Preference.SummaryProvider} implementation
          */
+        @NonNull
         public static SimpleSummaryProvider getInstance() {
             if (sSimpleSummaryProvider == null) {
                 sSimpleSummaryProvider = new SimpleSummaryProvider();
@@ -338,8 +345,9 @@
             return sSimpleSummaryProvider;
         }
 
+        @Nullable
         @Override
-        public CharSequence provideSummary(ListPreference preference) {
+        public CharSequence provideSummary(@NonNull ListPreference preference) {
             if (TextUtils.isEmpty(preference.getEntry())) {
                 return (preference.getContext().getString(R.string.not_set));
             } else {
diff --git a/preference/preference/src/main/java/androidx/preference/ListPreferenceDialogFragment.java b/preference/preference/src/main/java/androidx/preference/ListPreferenceDialogFragment.java
index cfaa3a7..e22d3c9 100644
--- a/preference/preference/src/main/java/androidx/preference/ListPreferenceDialogFragment.java
+++ b/preference/preference/src/main/java/androidx/preference/ListPreferenceDialogFragment.java
@@ -21,6 +21,7 @@
 import android.os.Bundle;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
 /**
  * @deprecated Use {@link ListPreferenceDialogFragmentCompat} instead
@@ -46,6 +47,7 @@
     /**
      * @deprecated Use {@link ListPreferenceDialogFragmentCompat} instead
      */
+    @NonNull
     @Deprecated
     public static ListPreferenceDialogFragment newInstance(String key) {
         final ListPreferenceDialogFragment fragment = new ListPreferenceDialogFragment();
@@ -56,7 +58,7 @@
     }
 
     @Override
-    public void onCreate(Bundle savedInstanceState) {
+    public void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         if (savedInstanceState == null) {
             final ListPreference preference = getListPreference();
@@ -89,7 +91,7 @@
     }
 
     @Override
-    protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
+    protected void onPrepareDialogBuilder(@NonNull AlertDialog.Builder builder) {
         super.onPrepareDialogBuilder(builder);
 
         builder.setSingleChoiceItems(mEntries, mClickedDialogEntryIndex,
diff --git a/preference/preference/src/main/java/androidx/preference/ListPreferenceDialogFragmentCompat.java b/preference/preference/src/main/java/androidx/preference/ListPreferenceDialogFragmentCompat.java
index 76a7c0e..686844a 100644
--- a/preference/preference/src/main/java/androidx/preference/ListPreferenceDialogFragmentCompat.java
+++ b/preference/preference/src/main/java/androidx/preference/ListPreferenceDialogFragmentCompat.java
@@ -20,6 +20,7 @@
 import android.os.Bundle;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.appcompat.app.AlertDialog;
 
 public class ListPreferenceDialogFragmentCompat extends PreferenceDialogFragmentCompat {
@@ -34,6 +35,7 @@
     private CharSequence[] mEntries;
     private CharSequence[] mEntryValues;
 
+    @NonNull
     public static ListPreferenceDialogFragmentCompat newInstance(String key) {
         final ListPreferenceDialogFragmentCompat fragment =
                 new ListPreferenceDialogFragmentCompat();
@@ -44,7 +46,7 @@
     }
 
     @Override
-    public void onCreate(Bundle savedInstanceState) {
+    public void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         if (savedInstanceState == null) {
             final ListPreference preference = getListPreference();
@@ -77,7 +79,7 @@
     }
 
     @Override
-    protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
+    protected void onPrepareDialogBuilder(@NonNull AlertDialog.Builder builder) {
         super.onPrepareDialogBuilder(builder);
 
         builder.setSingleChoiceItems(mEntries, mClickedDialogEntryIndex,
diff --git a/preference/preference/src/main/java/androidx/preference/MultiSelectListPreference.java b/preference/preference/src/main/java/androidx/preference/MultiSelectListPreference.java
index 008d326..c100dd3 100644
--- a/preference/preference/src/main/java/androidx/preference/MultiSelectListPreference.java
+++ b/preference/preference/src/main/java/androidx/preference/MultiSelectListPreference.java
@@ -25,6 +25,7 @@
 
 import androidx.annotation.ArrayRes;
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.core.content.res.TypedArrayUtils;
 
 import java.util.Collections;
@@ -46,7 +47,8 @@
     private Set<String> mValues = new HashSet<>();
 
     public MultiSelectListPreference(
-            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+            @NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr,
+            int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
 
         final TypedArray a = context.obtainStyledAttributes(attrs,
@@ -64,17 +66,18 @@
         a.recycle();
     }
 
-    public MultiSelectListPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+    public MultiSelectListPreference(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyleAttr) {
         this(context, attrs, defStyleAttr, 0);
     }
 
-    public MultiSelectListPreference(Context context, AttributeSet attrs) {
+    public MultiSelectListPreference(@NonNull Context context, @Nullable AttributeSet attrs) {
         this(context, attrs, TypedArrayUtils.getAttr(context,
                 R.attr.dialogPreferenceStyle,
                 android.R.attr.dialogPreferenceStyle));
     }
 
-    public MultiSelectListPreference(Context context) {
+    public MultiSelectListPreference(@NonNull Context context) {
         this(context, null);
     }
 
@@ -189,7 +192,7 @@
     }
 
     @Override
-    protected Object onGetDefaultValue(TypedArray a, int index) {
+    protected @Nullable Object onGetDefaultValue(@NonNull TypedArray a, int index) {
         final CharSequence[] defaultValues = a.getTextArray(index);
         final Set<String> result = new HashSet<>();
 
@@ -206,6 +209,7 @@
         setValues(getPersistedStringSet((Set<String>) defaultValue));
     }
 
+    @Nullable
     @Override
     protected Parcelable onSaveInstanceState() {
         final Parcelable superState = super.onSaveInstanceState();
@@ -220,7 +224,7 @@
     }
 
     @Override
-    protected void onRestoreInstanceState(Parcelable state) {
+    protected void onRestoreInstanceState(@Nullable Parcelable state) {
         if (state == null || !state.getClass().equals(SavedState.class)) {
             // Didn't save state for us in onSaveInstanceState
             super.onRestoreInstanceState(state);
diff --git a/preference/preference/src/main/java/androidx/preference/MultiSelectListPreferenceDialogFragment.java b/preference/preference/src/main/java/androidx/preference/MultiSelectListPreferenceDialogFragment.java
index c1c9bb9..23cad07 100644
--- a/preference/preference/src/main/java/androidx/preference/MultiSelectListPreferenceDialogFragment.java
+++ b/preference/preference/src/main/java/androidx/preference/MultiSelectListPreferenceDialogFragment.java
@@ -55,6 +55,7 @@
     /**
      * @deprecated Use {@link MultiSelectListPreferenceDialogFragmentCompat} instead
      */
+    @NonNull
     @Deprecated
     public static MultiSelectListPreferenceDialogFragment newInstance(String key) {
         final MultiSelectListPreferenceDialogFragment fragment =
@@ -106,7 +107,7 @@
     }
 
     @Override
-    protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
+    protected void onPrepareDialogBuilder(@NonNull AlertDialog.Builder builder) {
         super.onPrepareDialogBuilder(builder);
 
         final int entryCount = mEntryValues.length;
diff --git a/preference/preference/src/main/java/androidx/preference/MultiSelectListPreferenceDialogFragmentCompat.java b/preference/preference/src/main/java/androidx/preference/MultiSelectListPreferenceDialogFragmentCompat.java
index a2d353f..b660a46 100644
--- a/preference/preference/src/main/java/androidx/preference/MultiSelectListPreferenceDialogFragmentCompat.java
+++ b/preference/preference/src/main/java/androidx/preference/MultiSelectListPreferenceDialogFragmentCompat.java
@@ -20,6 +20,7 @@
 import android.os.Bundle;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.appcompat.app.AlertDialog;
 
 import java.util.ArrayList;
@@ -46,6 +47,7 @@
     @SuppressWarnings("WeakerAccess") /* synthetic access */
     CharSequence[] mEntryValues;
 
+    @NonNull
     public static MultiSelectListPreferenceDialogFragmentCompat newInstance(String key) {
         final MultiSelectListPreferenceDialogFragmentCompat fragment =
                 new MultiSelectListPreferenceDialogFragmentCompat();
@@ -56,7 +58,7 @@
     }
 
     @Override
-    public void onCreate(Bundle savedInstanceState) {
+    public void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
         if (savedInstanceState == null) {
@@ -96,7 +98,7 @@
     }
 
     @Override
-    protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
+    protected void onPrepareDialogBuilder(@NonNull AlertDialog.Builder builder) {
         super.onPrepareDialogBuilder(builder);
 
         final int entryCount = mEntryValues.length;
diff --git a/preference/preference/src/main/java/androidx/preference/Preference.java b/preference/preference/src/main/java/androidx/preference/Preference.java
index 69e874a..c1f7e0c 100644
--- a/preference/preference/src/main/java/androidx/preference/Preference.java
+++ b/preference/preference/src/main/java/androidx/preference/Preference.java
@@ -96,7 +96,8 @@
 
     private static final String CLIPBOARD_ID = "Preference";
 
-    private Context mContext;
+    @NonNull
+    private final Context mContext;
 
     @Nullable
     private PreferenceManager mPreferenceManager;
@@ -201,7 +202,8 @@
      *                     theme. Can be 0 to not look for defaults.
      * @see #Preference(Context, android.util.AttributeSet)
      */
-    public Preference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+    public Preference(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr,
+            int defStyleRes) {
         mContext = context;
 
         final TypedArray a = context.obtainStyledAttributes(
@@ -293,7 +295,7 @@
      *                     look for defaults.
      * @see #Preference(Context, AttributeSet)
      */
-    public Preference(Context context, AttributeSet attrs, int defStyleAttr) {
+    public Preference(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
         this(context, attrs, defStyleAttr, 0);
     }
 
@@ -308,7 +310,7 @@
      * @param attrs   The attributes of the XML tag that is inflating the preference
      * @see #Preference(Context, AttributeSet, int)
      */
-    public Preference(Context context, AttributeSet attrs) {
+    public Preference(@NonNull Context context, @Nullable AttributeSet attrs) {
         this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.preferenceStyle,
                 android.R.attr.preferenceStyle));
     }
@@ -319,7 +321,7 @@
      * @param context The Context this is associated with, through which it can access the
      *                current theme, resources, {@link SharedPreferences}, etc.
      */
-    public Preference(Context context) {
+    public Preference(@NonNull Context context) {
         this(context, null);
     }
 
@@ -335,7 +337,8 @@
      * @param index The index of the default value attribute
      * @return The default value of this preference type
      */
-    protected Object onGetDefaultValue(TypedArray a, int index) {
+    @Nullable
+    protected Object onGetDefaultValue(@NonNull TypedArray a, int index) {
         return null;
     }
 
@@ -345,7 +348,7 @@
      *
      * @param intent The intent associated with this preference
      */
-    public void setIntent(Intent intent) {
+    public void setIntent(@Nullable Intent intent) {
         mIntent = intent;
     }
 
@@ -354,6 +357,7 @@
      *
      * @return The {@link Intent} last set via {@link #setIntent(Intent)} or XML
      */
+    @Nullable
     public Intent getIntent() {
         return mIntent;
     }
@@ -363,7 +367,7 @@
      *
      * @param fragment The class name of the fragment associated with this preference
      */
-    public void setFragment(String fragment) {
+    public void setFragment(@Nullable String fragment) {
         mFragment = fragment;
     }
 
@@ -372,6 +376,7 @@
      *
      * @return The fragment class name last set via {@link #setFragment} or XML
      */
+    @Nullable
     public String getFragment() {
         return mFragment;
     }
@@ -387,7 +392,7 @@
      * @param dataStore The {@link PreferenceDataStore} to be used by this preference
      * @see PreferenceManager#setPreferenceDataStore(PreferenceDataStore)
      */
-    public void setPreferenceDataStore(PreferenceDataStore dataStore) {
+    public void setPreferenceDataStore(@Nullable PreferenceDataStore dataStore) {
         mPreferenceDataStore = dataStore;
     }
 
@@ -418,6 +423,7 @@
      * Return the extras Bundle object associated with this preference, creating a new Bundle if
      * there currently isn't one. You can use this to get and set individual extra key/value pairs.
      */
+    @NonNull
     public Bundle getExtras() {
         if (mExtras == null) {
             mExtras = new Bundle();
@@ -429,6 +435,8 @@
      * Return the extras Bundle object associated with this preference, returning {@code null} if
      * there is not currently one.
      */
+    @SuppressWarnings("NullableCollection")
+    @Nullable
     public Bundle peekExtras() {
         return mExtras;
     }
@@ -498,7 +506,7 @@
      *               will be recycled, so you should not hold a reference to them after this method
      *               returns.
      */
-    public void onBindViewHolder(PreferenceViewHolder holder) {
+    public void onBindViewHolder(@NonNull PreferenceViewHolder holder) {
         View itemView = holder.itemView;
         Integer summaryTextColor = null;
 
@@ -597,7 +605,7 @@
     /**
      * Makes sure the view (and any children) get the enabled state changed.
      */
-    private void setEnabledStateOnViews(View v, boolean enabled) {
+    private void setEnabledStateOnViews(@NonNull View v, boolean enabled) {
         v.setEnabled(enabled);
 
         if (v instanceof ViewGroup) {
@@ -655,7 +663,7 @@
      *
      * @param title The title for this preference
      */
-    public void setTitle(CharSequence title) {
+    public void setTitle(@Nullable CharSequence title) {
         if (!TextUtils.equals(title, mTitle)) {
             mTitle = title;
             notifyChanged();
@@ -678,6 +686,7 @@
      * @return The title
      * @see #setTitle(CharSequence)
      */
+    @Nullable
     public CharSequence getTitle() {
         return mTitle;
     }
@@ -689,7 +698,7 @@
      *
      * @param icon The optional icon for this preference
      */
-    public void setIcon(Drawable icon) {
+    public void setIcon(@Nullable Drawable icon) {
         if (mIcon != icon) {
             mIcon = icon;
             mIconResId = 0;
@@ -714,6 +723,7 @@
      * @return The icon
      * @see #setIcon(Drawable)
      */
+    @Nullable
     public Drawable getIcon() {
         if (mIcon == null && mIconResId != 0) {
             mIcon = AppCompatResources.getDrawable(mContext, mIconResId);
@@ -729,6 +739,7 @@
      * @see #setSummary(CharSequence)
      * @see #setSummaryProvider(SummaryProvider)
      */
+    @Nullable
     @SuppressWarnings("unchecked")
     public CharSequence getSummary() {
         if (getSummaryProvider() != null) {
@@ -747,7 +758,7 @@
      * @throws IllegalStateException If a {@link SummaryProvider} has already been set.
      * @see #setSummaryProvider(SummaryProvider)
      */
-    public void setSummary(CharSequence summary) {
+    public void setSummary(@Nullable CharSequence summary) {
         if (getSummaryProvider() != null) {
             throw new IllegalStateException("Preference already has a SummaryProvider set.");
         }
@@ -1127,7 +1138,7 @@
      * @param onPreferenceChangeListener The callback to be invoked
      */
     public void setOnPreferenceChangeListener(
-            OnPreferenceChangeListener onPreferenceChangeListener) {
+            @Nullable OnPreferenceChangeListener onPreferenceChangeListener) {
         mOnChangeListener = onPreferenceChangeListener;
     }
 
@@ -1137,6 +1148,7 @@
      *
      * @return The callback to be invoked
      */
+    @Nullable
     public OnPreferenceChangeListener getOnPreferenceChangeListener() {
         return mOnChangeListener;
     }
@@ -1146,7 +1158,8 @@
      *
      * @param onPreferenceClickListener The callback to be invoked
      */
-    public void setOnPreferenceClickListener(OnPreferenceClickListener onPreferenceClickListener) {
+    public void setOnPreferenceClickListener(
+            @Nullable OnPreferenceClickListener onPreferenceClickListener) {
         mOnClickListener = onPreferenceClickListener;
     }
 
@@ -1155,6 +1168,7 @@
      *
      * @return The callback to be invoked
      */
+    @Nullable
     public OnPreferenceClickListener getOnPreferenceClickListener() {
         return mOnClickListener;
     }
@@ -1164,7 +1178,7 @@
      * @hide
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    protected void performClick(View view) {
+    protected void performClick(@NonNull View view) {
         performClick();
     }
 
@@ -1210,6 +1224,7 @@
      *
      * @return The Context of this preference
      */
+    @NonNull
     public Context getContext() {
         return mContext;
     }
@@ -1226,6 +1241,7 @@
      * {@link PreferenceDataStore} has been set, this method returns {@code null}.
      * @see #setPreferenceDataStore(PreferenceDataStore)
      */
+    @Nullable
     public SharedPreferences getSharedPreferences() {
         if (mPreferenceManager == null || getPreferenceDataStore() != null) {
             return null;
@@ -1265,7 +1281,8 @@
      * @param listener The listener
      * @see #notifyChanged()
      */
-    final void setOnPreferenceChangeInternalListener(OnPreferenceChangeInternalListener listener) {
+    final void setOnPreferenceChangeInternalListener(
+            @Nullable OnPreferenceChangeInternalListener listener) {
         mListener = listener;
     }
 
@@ -1303,7 +1320,7 @@
      *
      * @param preferenceManager The PreferenceManager of the hierarchy
      */
-    protected void onAttachedToHierarchy(PreferenceManager preferenceManager) {
+    protected void onAttachedToHierarchy(@NonNull PreferenceManager preferenceManager) {
         mPreferenceManager = preferenceManager;
 
         if (!mHasId) {
@@ -1321,7 +1338,7 @@
      * @hide
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    protected void onAttachedToHierarchy(PreferenceManager preferenceManager, long id) {
+    protected void onAttachedToHierarchy(@NonNull PreferenceManager preferenceManager, long id) {
         mId = id;
         mHasId = true;
         try {
@@ -1481,7 +1498,7 @@
      * @param dependency       The preference that this preference depends on
      * @param disableDependent Set true to disable this preference
      */
-    public void onDependencyChanged(Preference dependency, boolean disableDependent) {
+    public void onDependencyChanged(@NonNull Preference dependency, boolean disableDependent) {
         if (mDependencyMet == disableDependent) {
             mDependencyMet = !disableDependent;
 
@@ -1498,7 +1515,7 @@
      * @param parent       The preference that this preference depends on
      * @param disableChild Set true to disable this preference
      */
-    public void onParentChanged(Preference parent, boolean disableChild) {
+    public void onParentChanged(@NonNull Preference parent, boolean disableChild) {
         if (mParentDependencyMet == disableChild) {
             mParentDependencyMet = !disableChild;
 
@@ -1524,7 +1541,7 @@
      *
      * @param dependencyKey The key of the preference that this depends on
      */
-    public void setDependency(String dependencyKey) {
+    public void setDependency(@Nullable String dependencyKey) {
         // Unregister the old dependency, if we had one
         unregisterDependency();
 
@@ -1539,6 +1556,7 @@
      * @return The key of the dependency
      * @see #setDependency(String)
      */
+    @Nullable
     public String getDependency() {
         return mDependencyKey;
     }
@@ -1957,6 +1975,7 @@
         return mPreferenceManager.getSharedPreferences().getBoolean(mKey, defaultReturnValue);
     }
 
+    @NonNull
     @Override
     public String toString() {
         return getFilterableStringBuilder().toString();
@@ -1971,6 +1990,7 @@
      * @return Text as a {@link StringBuilder} that will be used to filter this preference. By
      * default, this is the title and summary (concatenated with a space).
      */
+    @NonNull
     StringBuilder getFilterableStringBuilder() {
         StringBuilder sb = new StringBuilder();
         CharSequence title = getTitle();
@@ -1995,7 +2015,7 @@
      * @see #restoreHierarchyState
      * @see #onSaveInstanceState
      */
-    public void saveHierarchyState(Bundle container) {
+    public void saveHierarchyState(@NonNull Bundle container) {
         dispatchSaveInstanceState(container);
     }
 
@@ -2008,7 +2028,7 @@
      * @see #saveHierarchyState
      * @see #onSaveInstanceState
      */
-    void dispatchSaveInstanceState(Bundle container) {
+    void dispatchSaveInstanceState(@NonNull Bundle container) {
         if (hasKey()) {
             mBaseMethodCalled = false;
             Parcelable state = onSaveInstanceState();
@@ -2033,6 +2053,7 @@
      * @see #onRestoreInstanceState
      * @see #saveHierarchyState
      */
+    @Nullable
     protected Parcelable onSaveInstanceState() {
         mBaseMethodCalled = true;
         return BaseSavedState.EMPTY_STATE;
@@ -2045,7 +2066,7 @@
      * @see #saveHierarchyState
      * @see #onRestoreInstanceState
      */
-    public void restoreHierarchyState(Bundle container) {
+    public void restoreHierarchyState(@NonNull Bundle container) {
         dispatchRestoreInstanceState(container);
     }
 
@@ -2059,7 +2080,7 @@
      * @see #restoreHierarchyState
      * @see #onRestoreInstanceState
      */
-    void dispatchRestoreInstanceState(Bundle container) {
+    void dispatchRestoreInstanceState(@NonNull Bundle container) {
         if (hasKey()) {
             Parcelable state = container.getParcelable(mKey);
             if (state != null) {
@@ -2083,7 +2104,7 @@
      * @see #onSaveInstanceState
      * @see #restoreHierarchyState
      */
-    protected void onRestoreInstanceState(Parcelable state) {
+    protected void onRestoreInstanceState(@Nullable Parcelable state) {
         mBaseMethodCalled = true;
         if (state != BaseSavedState.EMPTY_STATE && state != null) {
             throw new IllegalArgumentException("Wrong state class -- expecting Preference State");
@@ -2116,7 +2137,7 @@
          * @param newValue   The new value of the preference
          * @return {@code true} to update the state of the preference with the new value
          */
-        boolean onPreferenceChange(Preference preference, Object newValue);
+        boolean onPreferenceChange(@NonNull Preference preference, Object newValue);
     }
 
     /**
@@ -2129,7 +2150,7 @@
          * @param preference The preference that was clicked
          * @return {@code true} if the click was handled
          */
-        boolean onPreferenceClick(Preference preference);
+        boolean onPreferenceClick(@NonNull Preference preference);
     }
 
     /**
@@ -2143,21 +2164,21 @@
          *
          * @param preference This preference
          */
-        void onPreferenceChange(Preference preference);
+        void onPreferenceChange(@NonNull Preference preference);
 
         /**
          * Called when this group has added/removed {@link Preference}(s).
          *
          * @param preference This preference
          */
-        void onPreferenceHierarchyChange(Preference preference);
+        void onPreferenceHierarchyChange(@NonNull Preference preference);
 
         /**
          * Called when this preference has changed its visibility.
          *
          * @param preference This preference
          */
-        void onPreferenceVisibilityChange(Preference preference);
+        void onPreferenceVisibilityChange(@NonNull Preference preference);
     }
 
     /**
@@ -2186,13 +2207,15 @@
          * @param preference This preference
          * @return A CharSequence that will be displayed as the summary for this preference
          */
-        CharSequence provideSummary(T preference);
+        @Nullable
+        CharSequence provideSummary(@NonNull T preference);
     }
 
     /**
      * A base class for managing the instance state of a {@link Preference}.
      */
     public static class BaseSavedState extends AbsSavedState {
+        @NonNull
         public static final Parcelable.Creator<BaseSavedState> CREATOR =
                 new Parcelable.Creator<BaseSavedState>() {
                     @Override
@@ -2226,7 +2249,7 @@
 
         private final Preference mPreference;
 
-        OnPreferenceCopyListener(Preference preference) {
+        OnPreferenceCopyListener(@NonNull Preference preference) {
             mPreference = preference;
         }
 
diff --git a/preference/preference/src/main/java/androidx/preference/PreferenceCategory.java b/preference/preference/src/main/java/androidx/preference/PreferenceCategory.java
index e4e1ca3..65a2da5 100644
--- a/preference/preference/src/main/java/androidx/preference/PreferenceCategory.java
+++ b/preference/preference/src/main/java/androidx/preference/PreferenceCategory.java
@@ -23,6 +23,8 @@
 import android.util.TypedValue;
 import android.widget.TextView;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.core.content.ContextCompat;
 import androidx.core.content.res.TypedArrayUtils;
 
@@ -39,20 +41,22 @@
 public class PreferenceCategory extends PreferenceGroup {
 
     public PreferenceCategory(
-            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+            @NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr,
+            int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
     }
 
-    public PreferenceCategory(Context context, AttributeSet attrs, int defStyleAttr) {
+    public PreferenceCategory(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyleAttr) {
         this(context, attrs, defStyleAttr, 0);
     }
 
-    public PreferenceCategory(Context context, AttributeSet attrs) {
+    public PreferenceCategory(@NonNull Context context, @Nullable AttributeSet attrs) {
         this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.preferenceCategoryStyle,
                 android.R.attr.preferenceCategoryStyle));
     }
 
-    public PreferenceCategory(Context context) {
+    public PreferenceCategory(@NonNull Context context) {
         this(context, null);
     }
 
@@ -67,7 +71,7 @@
     }
 
     @Override
-    public void onBindViewHolder(PreferenceViewHolder holder) {
+    public void onBindViewHolder(@NonNull PreferenceViewHolder holder) {
         super.onBindViewHolder(holder);
         if (Build.VERSION.SDK_INT >= VERSION_CODES.P) {
             holder.itemView.setAccessibilityHeading(true);
diff --git a/preference/preference/src/main/java/androidx/preference/PreferenceDialogFragment.java b/preference/preference/src/main/java/androidx/preference/PreferenceDialogFragment.java
index 0eb4020..13b45da 100644
--- a/preference/preference/src/main/java/androidx/preference/PreferenceDialogFragment.java
+++ b/preference/preference/src/main/java/androidx/preference/PreferenceDialogFragment.java
@@ -39,6 +39,7 @@
 import androidx.annotation.DoNotInline;
 import androidx.annotation.LayoutRes;
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 
@@ -89,7 +90,7 @@
     public PreferenceDialogFragment() {}
 
     @Override
-    public void onCreate(Bundle savedInstanceState) {
+    public void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
         final android.app.Fragment rawFragment = getTargetFragment();
@@ -150,7 +151,7 @@
 
     @NonNull
     @Override
-    public Dialog onCreateDialog(Bundle savedInstanceState) {
+    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
         final Context context = getActivity();
         mWhichButtonClicked = DialogInterface.BUTTON_NEGATIVE;
 
@@ -207,7 +208,7 @@
      * @deprecated Use {@link PreferenceDialogFragmentCompat} instead
      */
     @Deprecated
-    protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {}
+    protected void onPrepareDialogBuilder(@NonNull AlertDialog.Builder builder) {}
 
     /**
      * Returns whether the preference needs to display a soft input method when the dialog is
@@ -233,7 +234,7 @@
      * {@link WindowManager.LayoutParams#SOFT_INPUT_STATE_ALWAYS_VISIBLE} flag to show the
      * soft-input when there is no focused editor.</p>
      */
-    private void requestInputMethod(Dialog dialog) {
+    private void requestInputMethod(@NonNull Dialog dialog) {
         Window window = dialog.getWindow();
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
             Api30Impl.showIme(window);
@@ -252,7 +253,8 @@
      * @deprecated Use {@link PreferenceDialogFragmentCompat} instead
      */
     @Deprecated
-    protected View onCreateDialogView(Context context) {
+    @Nullable
+    protected View onCreateDialogView(@NonNull Context context) {
         final int resId = mDialogLayoutRes;
         if (resId == 0) {
             return null;
@@ -272,7 +274,7 @@
      * @deprecated Use {@link PreferenceDialogFragmentCompat} instead
      */
     @Deprecated
-    protected void onBindDialogView(View view) {
+    protected void onBindDialogView(@NonNull View view) {
         View dialogMessageView = view.findViewById(android.R.id.message);
 
         if (dialogMessageView != null) {
@@ -298,12 +300,12 @@
      */
     @Deprecated
     @Override
-    public void onClick(DialogInterface dialog, int which) {
+    public void onClick(@NonNull DialogInterface dialog, int which) {
         mWhichButtonClicked = which;
     }
 
     @Override
-    public void onDismiss(DialogInterface dialog) {
+    public void onDismiss(@NonNull DialogInterface dialog) {
         super.onDismiss(dialog);
         onDialogClosed(mWhichButtonClicked == DialogInterface.BUTTON_POSITIVE);
     }
diff --git a/preference/preference/src/main/java/androidx/preference/PreferenceDialogFragmentCompat.java b/preference/preference/src/main/java/androidx/preference/PreferenceDialogFragmentCompat.java
index fbc7b7f..689c634 100644
--- a/preference/preference/src/main/java/androidx/preference/PreferenceDialogFragmentCompat.java
+++ b/preference/preference/src/main/java/androidx/preference/PreferenceDialogFragmentCompat.java
@@ -36,6 +36,7 @@
 import androidx.annotation.DoNotInline;
 import androidx.annotation.LayoutRes;
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.app.AlertDialog;
@@ -76,7 +77,7 @@
 
     @SuppressWarnings("deprecation")
     @Override
-    public void onCreate(Bundle savedInstanceState) {
+    public void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
         final Fragment rawFragment = getTargetFragment();
@@ -88,7 +89,7 @@
         final DialogPreference.TargetFragment fragment =
                 (DialogPreference.TargetFragment) rawFragment;
 
-        final String key = getArguments().getString(ARG_KEY);
+        final String key = requireArguments().getString(ARG_KEY);
         if (savedInstanceState == null) {
             mPreference = fragment.findPreference(key);
             mDialogTitle = mPreference.getDialogTitle();
@@ -137,16 +138,16 @@
 
     @Override
     public @NonNull
-    Dialog onCreateDialog(Bundle savedInstanceState) {
+    Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
         mWhichButtonClicked = DialogInterface.BUTTON_NEGATIVE;
 
-        final AlertDialog.Builder builder = new AlertDialog.Builder(getContext())
+        final AlertDialog.Builder builder = new AlertDialog.Builder(requireContext())
                 .setTitle(mDialogTitle)
                 .setIcon(mDialogIcon)
                 .setPositiveButton(mPositiveButtonText, this)
                 .setNegativeButton(mNegativeButtonText, this);
 
-        View contentView = onCreateDialogView(getContext());
+        View contentView = onCreateDialogView(requireContext());
         if (contentView != null) {
             onBindDialogView(contentView);
             builder.setView(contentView);
@@ -174,7 +175,7 @@
     @SuppressWarnings("deprecation")
     public DialogPreference getPreference() {
         if (mPreference == null) {
-            final String key = getArguments().getString(ARG_KEY);
+            final String key = requireArguments().getString(ARG_KEY);
             final DialogPreference.TargetFragment fragment =
                     (DialogPreference.TargetFragment) getTargetFragment();
             mPreference = fragment.findPreference(key);
@@ -188,7 +189,7 @@
      *
      * <p>Do not {@link AlertDialog.Builder#create()} or {@link AlertDialog.Builder#show()}.
      */
-    protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {}
+    protected void onPrepareDialogBuilder(@NonNull AlertDialog.Builder builder) {}
 
     /**
      * Returns whether the preference needs to display a soft input method when the dialog is
@@ -225,7 +226,7 @@
      * on-demand, so there is no longer a need to schedule showing soft-input when input connection
      * established by the focused editor.</p>
      */
-    private void requestInputMethod(Dialog dialog) {
+    private void requestInputMethod(@NonNull Dialog dialog) {
         Window window = dialog.getWindow();
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
             Api30Impl.showIme(window);
@@ -241,7 +242,8 @@
      * @return The content view for the dialog
      * @see DialogPreference#setLayoutResource(int)
      */
-    protected View onCreateDialogView(Context context) {
+    @Nullable
+    protected View onCreateDialogView(@NonNull Context context) {
         final int resId = mDialogLayoutRes;
         if (resId == 0) {
             return null;
@@ -257,7 +259,7 @@
      *
      * @param view The content view of the dialog, if it is custom
      */
-    protected void onBindDialogView(View view) {
+    protected void onBindDialogView(@NonNull View view) {
         View dialogMessageView = view.findViewById(android.R.id.message);
 
         if (dialogMessageView != null) {
@@ -279,7 +281,7 @@
     }
 
     @Override
-    public void onClick(DialogInterface dialog, int which) {
+    public void onClick(@NonNull DialogInterface dialog, int which) {
         mWhichButtonClicked = which;
     }
 
diff --git a/preference/preference/src/main/java/androidx/preference/PreferenceFragment.java b/preference/preference/src/main/java/androidx/preference/PreferenceFragment.java
index c6e60e2..a61dcc9 100644
--- a/preference/preference/src/main/java/androidx/preference/PreferenceFragment.java
+++ b/preference/preference/src/main/java/androidx/preference/PreferenceFragment.java
@@ -128,7 +128,7 @@
     @SuppressWarnings("deprecation")
     private final Handler mHandler = new Handler() {
         @Override
-        public void handleMessage(Message msg) {
+        public void handleMessage(@NonNull Message msg) {
             switch (msg.what) {
                 case MSG_BIND_PREFERENCES:
                     bindPreferences();
@@ -145,7 +145,7 @@
     };
 
     @Override
-    public void onCreate(Bundle savedInstanceState) {
+    public void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         final TypedValue tv = new TypedValue();
         getActivity().getTheme().resolveAttribute(R.attr.preferenceTheme, tv, true);
@@ -181,11 +181,12 @@
      * @deprecated Use {@link PreferenceFragmentCompat} instead
      */
     @Deprecated
-    public abstract void onCreatePreferences(Bundle savedInstanceState, String rootKey);
+    public abstract void onCreatePreferences(@Nullable Bundle savedInstanceState, String rootKey);
 
+    @NonNull
     @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
+            @Nullable Bundle savedInstanceState) {
 
         TypedArray a = mStyledContext.obtainStyledAttributes(null,
                 R.styleable.PreferenceFragment,
@@ -250,7 +251,7 @@
      * @deprecated Use {@link PreferenceFragmentCompat} instead
      */
     @Deprecated
-    public void setDivider(Drawable divider) {
+    public void setDivider(@Nullable Drawable divider) {
         mDividerDecoration.setDivider(divider);
     }
 
@@ -269,7 +270,7 @@
     }
 
     @Override
-    public void onViewCreated(View view, Bundle savedInstanceState) {
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
 
         if (savedInstanceState != null) {
@@ -319,7 +320,7 @@
     }
 
     @Override
-    public void onSaveInstanceState(Bundle outState) {
+    public void onSaveInstanceState(@NonNull Bundle outState) {
         super.onSaveInstanceState(outState);
 
         final PreferenceScreen preferenceScreen = getPreferenceScreen();
@@ -426,7 +427,7 @@
      */
     @Deprecated
     @Override
-    public boolean onPreferenceTreeClick(Preference preference) {
+    public boolean onPreferenceTreeClick(@NonNull Preference preference) {
         if (preference.getFragment() != null) {
             boolean handled = false;
             if (getCallbackFragment() instanceof OnPreferenceStartFragmentCallback) {
@@ -455,7 +456,7 @@
      */
     @Deprecated
     @Override
-    public void onNavigateToScreen(PreferenceScreen preferenceScreen) {
+    public void onNavigateToScreen(@NonNull PreferenceScreen preferenceScreen) {
         boolean handled = false;
         if (getCallbackFragment() instanceof OnPreferenceStartScreenCallback) {
             handled = ((OnPreferenceStartScreenCallback) getCallbackFragment())
@@ -479,7 +480,7 @@
     @Deprecated
     @Override
     @SuppressWarnings("TypeParameterUnusedInFormals")
-    public <T extends Preference> T findPreference(CharSequence key) {
+    public <T extends Preference> T findPreference(@NonNull CharSequence key) {
         if (mPreferenceManager == null) {
             return null;
         }
@@ -546,8 +547,9 @@
      * @deprecated Use {@link PreferenceFragmentCompat} instead
      */
     @Deprecated
-    public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,
-            Bundle savedInstanceState) {
+    @NonNull
+    public RecyclerView onCreateRecyclerView(@NonNull LayoutInflater inflater,
+            @NonNull ViewGroup parent, @Nullable Bundle savedInstanceState) {
         // If device detected is Auto, use Auto's custom layout that contains a custom ViewGroup
         // wrapping a RecyclerView
         if (mStyledContext.getPackageManager().hasSystemFeature(PackageManager
@@ -576,6 +578,7 @@
      * @deprecated Use {@link PreferenceFragmentCompat} instead
      */
     @Deprecated
+    @NonNull
     public RecyclerView.LayoutManager onCreateLayoutManager() {
         return new LinearLayoutManager(getActivity());
     }
@@ -589,7 +592,8 @@
      * @deprecated Use {@link PreferenceFragmentCompat} instead
      */
     @Deprecated
-    protected RecyclerView.Adapter onCreateAdapter(PreferenceScreen preferenceScreen) {
+    @NonNull
+    protected RecyclerView.Adapter onCreateAdapter(@NonNull PreferenceScreen preferenceScreen) {
         return new PreferenceGroupAdapter(preferenceScreen);
     }
 
@@ -604,7 +608,7 @@
      */
     @Deprecated
     @Override
-    public void onDisplayPreferenceDialog(Preference preference) {
+    public void onDisplayPreferenceDialog(@NonNull Preference preference) {
 
         boolean handled = false;
         if (getCallbackFragment() instanceof OnPreferenceDisplayDialogCallback) {
@@ -655,7 +659,7 @@
      * @deprecated Use {@link PreferenceFragmentCompat} instead
      */
     @Deprecated
-    public void scrollToPreference(final String key) {
+    public void scrollToPreference(@NonNull String key) {
         scrollToPreferenceInternal(null, key);
     }
 
@@ -663,7 +667,7 @@
      * @deprecated Use {@link PreferenceFragmentCompat} instead
      */
     @Deprecated
-    public void scrollToPreference(final Preference preference) {
+    public void scrollToPreference(@NonNull Preference preference) {
         scrollToPreferenceInternal(preference, null);
     }
 
@@ -671,7 +675,7 @@
         final Runnable r = new Runnable() {
             @Override
             public void run() {
-                final RecyclerView.Adapter adapter = mList.getAdapter();
+                final RecyclerView.Adapter<?> adapter = mList.getAdapter();
                 if (!(adapter instanceof PreferenceGroup.PreferencePositionCallback)) {
                     if (adapter != null) {
                         throw new IllegalStateException("Adapter must implement "
@@ -719,7 +723,8 @@
          * @param pref   The preference requesting the fragment
          * @return {@code true} if the fragment creation has been handled
          */
-        boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref);
+        boolean onPreferenceStartFragment(@NonNull PreferenceFragment caller,
+                @NonNull Preference pref);
     }
 
     /**
@@ -735,7 +740,8 @@
          * @param pref   The preference screen to navigate to
          * @return {@code true} if the screen navigation has been handled
          */
-        boolean onPreferenceStartScreen(PreferenceFragment caller, PreferenceScreen pref);
+        boolean onPreferenceStartScreen(@NonNull PreferenceFragment caller,
+                @NonNull PreferenceScreen pref);
     }
 
     /**
@@ -748,17 +754,18 @@
          * @param pref   The preference requesting the dialog
          * @return {@code true} if the dialog creation has been handled
          */
-        boolean onPreferenceDisplayDialog(@NonNull PreferenceFragment caller, Preference pref);
+        boolean onPreferenceDisplayDialog(@NonNull PreferenceFragment caller,
+                @NonNull Preference pref);
     }
 
     private static class ScrollToPreferenceObserver extends RecyclerView.AdapterDataObserver {
-        private final RecyclerView.Adapter mAdapter;
+        private final RecyclerView.Adapter<?> mAdapter;
         private final RecyclerView mList;
         private final Preference mPreference;
         private final String mKey;
 
-        ScrollToPreferenceObserver(RecyclerView.Adapter adapter, RecyclerView list,
-                Preference preference, String key) {
+        ScrollToPreferenceObserver(@NonNull RecyclerView.Adapter<?> adapter,
+                @NonNull RecyclerView list, Preference preference, String key) {
             mAdapter = adapter;
             mList = list;
             mPreference = preference;
@@ -820,7 +827,8 @@
         DividerDecoration() {}
 
         @Override
-        public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
+        public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent,
+                @NonNull RecyclerView.State state) {
             if (mDivider == null) {
                 return;
             }
@@ -837,14 +845,14 @@
         }
 
         @Override
-        public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
-                RecyclerView.State state) {
+        public void getItemOffsets(@NonNull Rect outRect, @NonNull View view,
+                @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
             if (shouldDrawDividerBelow(view, parent)) {
                 outRect.bottom = mDividerHeight;
             }
         }
 
-        private boolean shouldDrawDividerBelow(View view, RecyclerView parent) {
+        private boolean shouldDrawDividerBelow(@NonNull View view, @NonNull RecyclerView parent) {
             final RecyclerView.ViewHolder holder = parent.getChildViewHolder(view);
             final boolean dividerAllowedBelow = holder instanceof PreferenceViewHolder
                     && ((PreferenceViewHolder) holder).isDividerAllowedBelow();
@@ -862,7 +870,7 @@
             return nextAllowed;
         }
 
-        public void setDivider(Drawable divider) {
+        public void setDivider(@Nullable Drawable divider) {
             if (divider != null) {
                 mDividerHeight = divider.getIntrinsicHeight();
             } else {
diff --git a/preference/preference/src/main/java/androidx/preference/PreferenceFragmentCompat.java b/preference/preference/src/main/java/androidx/preference/PreferenceFragmentCompat.java
index cda4118..a816db3 100644
--- a/preference/preference/src/main/java/androidx/preference/PreferenceFragmentCompat.java
+++ b/preference/preference/src/main/java/androidx/preference/PreferenceFragmentCompat.java
@@ -26,6 +26,7 @@
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.Looper;
 import android.os.Message;
 import android.util.Log;
 import android.util.TypedValue;
@@ -118,8 +119,7 @@
     private int mLayoutResId = R.layout.preference_list_fragment;
     private Runnable mSelectPreferenceRunnable;
 
-    @SuppressWarnings("deprecation")
-    private Handler mHandler = new Handler() {
+    private final Handler mHandler = new Handler(Looper.getMainLooper()) {
         @Override
         public void handleMessage(Message msg) {
             switch (msg.what) {
@@ -141,15 +141,15 @@
     public void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         final TypedValue tv = new TypedValue();
-        getContext().getTheme().resolveAttribute(R.attr.preferenceTheme, tv, true);
+        requireContext().getTheme().resolveAttribute(R.attr.preferenceTheme, tv, true);
         int theme = tv.resourceId;
         if (theme == 0) {
             // Fallback to default theme.
             theme = R.style.PreferenceThemeOverlay;
         }
-        getContext().getTheme().applyStyle(theme, false);
+        requireContext().getTheme().applyStyle(theme, false);
 
-        mPreferenceManager = new PreferenceManager(getContext());
+        mPreferenceManager = new PreferenceManager(requireContext());
         mPreferenceManager.setOnNavigateToScreenListener(this);
         final Bundle args = getArguments();
         final String rootKey;
@@ -171,13 +171,15 @@
      * @param rootKey            If non-null, this preference fragment should be rooted at the
      *                           {@link PreferenceScreen} with this key.
      */
-    public abstract void onCreatePreferences(Bundle savedInstanceState, String rootKey);
+    public abstract void onCreatePreferences(@Nullable Bundle savedInstanceState,
+            @Nullable String rootKey);
 
+    @NonNull
     @Override
     public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
             @Nullable Bundle savedInstanceState) {
 
-        TypedArray a = getContext().obtainStyledAttributes(null,
+        TypedArray a = requireContext().obtainStyledAttributes(null,
                 R.styleable.PreferenceFragmentCompat,
                 R.attr.preferenceFragmentCompatStyle,
                 0);
@@ -194,7 +196,7 @@
 
         a.recycle();
 
-        final LayoutInflater themedInflater = inflater.cloneInContext(getContext());
+        final LayoutInflater themedInflater = inflater.cloneInContext(requireContext());
 
         final View view = themedInflater.inflate(mLayoutResId, container, false);
 
@@ -240,7 +242,7 @@
      * @param divider The drawable to use
      * {@link android.R.attr#divider}
      */
-    public void setDivider(Drawable divider) {
+    public void setDivider(@Nullable Drawable divider) {
         mDividerDecoration.setDivider(divider);
     }
 
@@ -359,7 +361,7 @@
     public void addPreferencesFromResource(@XmlRes int preferencesResId) {
         requirePreferenceManager();
 
-        setPreferenceScreen(mPreferenceManager.inflateFromResource(getContext(),
+        setPreferenceScreen(mPreferenceManager.inflateFromResource(requireContext(),
                 preferencesResId, getPreferenceScreen()));
     }
 
@@ -375,7 +377,7 @@
     public void setPreferencesFromResource(@XmlRes int preferencesResId, @Nullable String key) {
         requirePreferenceManager();
 
-        final PreferenceScreen xmlRoot = mPreferenceManager.inflateFromResource(getContext(),
+        final PreferenceScreen xmlRoot = mPreferenceManager.inflateFromResource(requireContext(),
                 preferencesResId, null);
 
         final Preference root;
@@ -397,7 +399,7 @@
      */
     @SuppressWarnings("deprecation")
     @Override
-    public boolean onPreferenceTreeClick(Preference preference) {
+    public boolean onPreferenceTreeClick(@NonNull Preference preference) {
         if (preference.getFragment() != null) {
             boolean handled = false;
             if (getCallbackFragment() instanceof OnPreferenceStartFragmentCallback) {
@@ -442,7 +444,7 @@
                         // Attempt to replace this fragment in its root view - developers should
                         // implement onPreferenceStartFragment in their activity so that they can
                         // customize this behaviour and handle any transitions between fragments
-                        .replace(((View) getView().getParent()).getId(), fragment)
+                        .replace(((View) requireView().getParent()).getId(), fragment)
                         .addToBackStack(null)
                         .commit();
             }
@@ -461,12 +463,23 @@
      * @param preferenceScreen The {@link PreferenceScreen} to navigate to
      */
     @Override
-    public void onNavigateToScreen(PreferenceScreen preferenceScreen) {
+    public void onNavigateToScreen(@NonNull PreferenceScreen preferenceScreen) {
         boolean handled = false;
         if (getCallbackFragment() instanceof OnPreferenceStartScreenCallback) {
             handled = ((OnPreferenceStartScreenCallback) getCallbackFragment())
                     .onPreferenceStartScreen(this, preferenceScreen);
         }
+        //  If the callback fragment doesn't handle OnPreferenceStartScreenCallback, looks up
+        //  its parent fragment in the hierarchy that implements the callback until the first
+        //  one that returns true
+        Fragment callbackFragment = this;
+        while (!handled && callbackFragment != null) {
+            if (callbackFragment instanceof OnPreferenceStartScreenCallback) {
+                handled = ((OnPreferenceStartScreenCallback) callbackFragment)
+                        .onPreferenceStartScreen(this, preferenceScreen);
+            }
+            callbackFragment = callbackFragment.getParentFragment();
+        }
         if (!handled && getContext() instanceof OnPreferenceStartScreenCallback) {
             handled = ((OnPreferenceStartScreenCallback) getContext())
                     .onPreferenceStartScreen(this, preferenceScreen);
@@ -551,11 +564,12 @@
      * @return A new {@link RecyclerView} object to be placed into the view hierarchy
      */
     @SuppressWarnings("deprecation")
-    public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,
-            Bundle savedInstanceState) {
+    @NonNull
+    public RecyclerView onCreateRecyclerView(@NonNull LayoutInflater inflater,
+            @NonNull ViewGroup parent, @Nullable Bundle savedInstanceState) {
         // If device detected is Auto, use Auto's custom layout that contains a custom ViewGroup
         // wrapping a RecyclerView
-        if (getContext().getPackageManager().hasSystemFeature(PackageManager
+        if (requireContext().getPackageManager().hasSystemFeature(PackageManager
                 .FEATURE_AUTOMOTIVE)) {
             RecyclerView recyclerView = parent.findViewById(R.id.recycler_view);
             if (recyclerView != null) {
@@ -578,8 +592,9 @@
      *
      * @return A new {@link RecyclerView.LayoutManager} instance
      */
+    @NonNull
     public RecyclerView.LayoutManager onCreateLayoutManager() {
-        return new LinearLayoutManager(getContext());
+        return new LinearLayoutManager(requireContext());
     }
 
     /**
@@ -588,7 +603,8 @@
      * @param preferenceScreen The {@link PreferenceScreen} object to create the adapter for
      * @return An adapter that contains the preferences contained in this {@link PreferenceScreen}
      */
-    protected RecyclerView.Adapter onCreateAdapter(PreferenceScreen preferenceScreen) {
+    @NonNull
+    protected RecyclerView.Adapter onCreateAdapter(@NonNull PreferenceScreen preferenceScreen) {
         return new PreferenceGroupAdapter(preferenceScreen);
     }
 
@@ -601,13 +617,24 @@
      */
     @SuppressWarnings("deprecation")
     @Override
-    public void onDisplayPreferenceDialog(Preference preference) {
+    public void onDisplayPreferenceDialog(@NonNull Preference preference) {
 
         boolean handled = false;
         if (getCallbackFragment() instanceof OnPreferenceDisplayDialogCallback) {
             handled = ((OnPreferenceDisplayDialogCallback) getCallbackFragment())
                     .onPreferenceDisplayDialog(this, preference);
         }
+        //  If the callback fragment doesn't handle OnPreferenceDisplayDialogCallback, looks up
+        //  its parent fragment in the hierarchy that implements the callback until the first
+        //  one that returns true
+        Fragment callbackFragment = this;
+        while (!handled && callbackFragment != null) {
+            if (callbackFragment instanceof OnPreferenceDisplayDialogCallback) {
+                handled = ((OnPreferenceDisplayDialogCallback) callbackFragment)
+                        .onPreferenceDisplayDialog(this, preference);
+            }
+            callbackFragment = callbackFragment.getParentFragment();
+        }
         if (!handled && getContext() instanceof OnPreferenceDisplayDialogCallback) {
             handled = ((OnPreferenceDisplayDialogCallback) getContext())
                     .onPreferenceDisplayDialog(this, preference);
@@ -652,24 +679,26 @@
      * @return The {@link Fragment} to possibly use as a callback
      * @hide
      */
+    @Nullable
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     public Fragment getCallbackFragment() {
         return null;
     }
 
-    public void scrollToPreference(final String key) {
+    public void scrollToPreference(@NonNull String key) {
         scrollToPreferenceInternal(null, key);
     }
 
-    public void scrollToPreference(final Preference preference) {
+    public void scrollToPreference(@NonNull Preference preference) {
         scrollToPreferenceInternal(preference, null);
     }
 
-    private void scrollToPreferenceInternal(final Preference preference, final String key) {
+    private void scrollToPreferenceInternal(@Nullable final Preference preference,
+            @Nullable final String key) {
         final Runnable r = new Runnable() {
             @Override
             public void run() {
-                final RecyclerView.Adapter adapter = mList.getAdapter();
+                final RecyclerView.Adapter<?> adapter = mList.getAdapter();
                 if (!(adapter instanceof
                         PreferenceGroup.PreferencePositionCallback)) {
                     if (adapter != null) {
@@ -718,7 +747,8 @@
          * @param pref   The preference requesting the fragment
          * @return {@code true} if the fragment creation has been handled
          */
-        boolean onPreferenceStartFragment(PreferenceFragmentCompat caller, Preference pref);
+        boolean onPreferenceStartFragment(@NonNull PreferenceFragmentCompat caller,
+                @NonNull Preference pref);
     }
 
     /**
@@ -734,7 +764,8 @@
          * @param pref   The preference screen to navigate to
          * @return {@code true} if the screen navigation has been handled
          */
-        boolean onPreferenceStartScreen(PreferenceFragmentCompat caller, PreferenceScreen pref);
+        boolean onPreferenceStartScreen(@NonNull PreferenceFragmentCompat caller,
+                @NonNull PreferenceScreen pref);
     }
 
     /**
@@ -748,16 +779,16 @@
          * @return {@code true} if the dialog creation has been handled
          */
         boolean onPreferenceDisplayDialog(@NonNull PreferenceFragmentCompat caller,
-                Preference pref);
+                @NonNull Preference pref);
     }
 
     private static class ScrollToPreferenceObserver extends RecyclerView.AdapterDataObserver {
-        private final RecyclerView.Adapter mAdapter;
+        private final RecyclerView.Adapter<?> mAdapter;
         private final RecyclerView mList;
         private final Preference mPreference;
         private final String mKey;
 
-        public ScrollToPreferenceObserver(RecyclerView.Adapter adapter, RecyclerView list,
+        ScrollToPreferenceObserver(RecyclerView.Adapter<?> adapter, RecyclerView list,
                 Preference preference, String key) {
             mAdapter = adapter;
             mList = list;
@@ -820,7 +851,8 @@
         DividerDecoration() {}
 
         @Override
-        public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
+        public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent,
+                @NonNull RecyclerView.State state) {
             if (mDivider == null) {
                 return;
             }
@@ -837,8 +869,8 @@
         }
 
         @Override
-        public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
-                RecyclerView.State state) {
+        public void getItemOffsets(@NonNull Rect outRect, @NonNull View view,
+                @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
             if (shouldDrawDividerBelow(view, parent)) {
                 outRect.bottom = mDividerHeight;
             }
diff --git a/preference/preference/src/main/java/androidx/preference/PreferenceGroup.java b/preference/preference/src/main/java/androidx/preference/PreferenceGroup.java
index 7061087..7c30e99 100644
--- a/preference/preference/src/main/java/androidx/preference/PreferenceGroup.java
+++ b/preference/preference/src/main/java/androidx/preference/PreferenceGroup.java
@@ -23,6 +23,7 @@
 import android.content.res.TypedArray;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.Looper;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.text.TextUtils;
@@ -57,13 +58,12 @@
     private static final String TAG = "PreferenceGroup";
     @SuppressWarnings("WeakerAccess") /* synthetic access */
     final SimpleArrayMap<String, Long> mIdRecycleCache = new SimpleArrayMap<>();
-    @SuppressWarnings("deprecation")
-    private final Handler mHandler = new Handler();
+    private final Handler mHandler = new Handler(Looper.getMainLooper());
     /**
      * The container for child {@link Preference}s. This is sorted based on the ordering, please
      * use {@link #addPreference(Preference)} instead of adding to this directly.
      */
-    private List<Preference> mPreferences;
+    private final List<Preference> mPreferences;
     private boolean mOrderingAsAdded = true;
     private int mCurrentPreferenceOrder = 0;
     private boolean mAttachedToHierarchy = false;
@@ -79,7 +79,8 @@
         }
     };
 
-    public PreferenceGroup(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+    public PreferenceGroup(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyleAttr, int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
 
         mPreferences = new ArrayList<>();
@@ -99,11 +100,12 @@
         a.recycle();
     }
 
-    public PreferenceGroup(Context context, AttributeSet attrs, int defStyleAttr) {
+    public PreferenceGroup(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyleAttr) {
         this(context, attrs, defStyleAttr, 0);
     }
 
-    public PreferenceGroup(Context context, AttributeSet attrs) {
+    public PreferenceGroup(@NonNull Context context, @Nullable AttributeSet attrs) {
         this(context, attrs, 0);
     }
 
@@ -167,7 +169,7 @@
     /**
      * Called by the inflater to add an item to this group.
      */
-    public void addItemFromInflater(Preference preference) {
+    public void addItemFromInflater(@NonNull Preference preference) {
         addPreference(preference);
     }
 
@@ -186,6 +188,7 @@
      * @param index The index of the {@link Preference} to retrieve
      * @return The {@link Preference}
      */
+    @NonNull
     public Preference getPreference(int index) {
         return mPreferences.get(index);
     }
@@ -196,7 +199,7 @@
      * @param preference The preference to add
      * @return Whether the preference is now in this group
      */
-    public boolean addPreference(Preference preference) {
+    public boolean addPreference(@NonNull Preference preference) {
         if (mPreferences.contains(preference)) {
             return true;
         }
@@ -271,7 +274,7 @@
      * @return Whether the preference was found and removed
      * @see #removePreferenceRecursively(CharSequence)
      */
-    public boolean removePreference(Preference preference) {
+    public boolean removePreference(@NonNull Preference preference) {
         final boolean returnValue = removePreferenceInt(preference);
         notifyHierarchyChanged();
         return returnValue;
@@ -294,7 +297,7 @@
         return preference.getParent().removePreference(preference);
     }
 
-    private boolean removePreferenceInt(Preference preference) {
+    private boolean removePreferenceInt(@NonNull Preference preference) {
         synchronized (this) {
             preference.onPrepareForRemoval();
             if (preference.getParent() == this) {
@@ -347,7 +350,7 @@
      * @param preference The preference to add
      * @return Whether to allow adding the preference ({@code true}), or not ({@code false})
      */
-    protected boolean onPrepareAddPreference(Preference preference) {
+    protected boolean onPrepareAddPreference(@NonNull Preference preference) {
         preference.onParentChanged(this, shouldDisableDependents());
         return true;
     }
@@ -488,7 +491,7 @@
     }
 
     @Override
-    protected void dispatchSaveInstanceState(Bundle container) {
+    protected void dispatchSaveInstanceState(@NonNull Bundle container) {
         super.dispatchSaveInstanceState(container);
 
         // Dispatch to all contained preferences
@@ -499,7 +502,7 @@
     }
 
     @Override
-    protected void dispatchRestoreInstanceState(Bundle container) {
+    protected void dispatchRestoreInstanceState(@NonNull Bundle container) {
         super.dispatchRestoreInstanceState(container);
 
         // Dispatch to all contained preferences
@@ -509,6 +512,7 @@
         }
     }
 
+    @NonNull
     @Override
     protected Parcelable onSaveInstanceState() {
         final Parcelable superState = super.onSaveInstanceState();
@@ -516,7 +520,7 @@
     }
 
     @Override
-    protected void onRestoreInstanceState(Parcelable state) {
+    protected void onRestoreInstanceState(@Nullable Parcelable state) {
         if (state == null || !state.getClass().equals(SavedState.class)) {
             // Didn't save state for us in saveInstanceState
             super.onRestoreInstanceState(state);
@@ -542,7 +546,7 @@
          * @return Adapter position of the {@link Preference} or {@link RecyclerView#NO_POSITION}
          * if not found
          */
-        int getPreferenceAdapterPosition(String key);
+        int getPreferenceAdapterPosition(@NonNull String key);
 
         /**
          * Returns the adapter position of the specified {@link Preference} object
@@ -551,7 +555,7 @@
          * @return Adapter position of the {@link Preference} or {@link RecyclerView#NO_POSITION}
          * if not found
          */
-        int getPreferenceAdapterPosition(Preference preference);
+        int getPreferenceAdapterPosition(@NonNull Preference preference);
     }
 
     /**
diff --git a/preference/preference/src/main/java/androidx/preference/PreferenceGroupAdapter.java b/preference/preference/src/main/java/androidx/preference/PreferenceGroupAdapter.java
index 2dbb91a..e9b04d3 100644
--- a/preference/preference/src/main/java/androidx/preference/PreferenceGroupAdapter.java
+++ b/preference/preference/src/main/java/androidx/preference/PreferenceGroupAdapter.java
@@ -21,12 +21,14 @@
 import android.content.res.TypedArray;
 import android.graphics.drawable.Drawable;
 import android.os.Handler;
+import android.os.Looper;
 import android.text.TextUtils;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.content.res.AppCompatResources;
 import androidx.core.view.ViewCompat;
@@ -53,7 +55,7 @@
      * The {@link PreferenceGroup} that we build a list of preferences from. This should
      * typically be the root {@link PreferenceScreen} managed by a {@link PreferenceFragmentCompat}.
      */
-    private PreferenceGroup mPreferenceGroup;
+    private final PreferenceGroup mPreferenceGroup;
 
     /**
      * Contains a sorted list of all {@link Preference}s in this adapter regardless of visibility.
@@ -74,21 +76,20 @@
      * List of unique {@link PreferenceResourceDescriptor}s, used to cache item view types for
      * {@link RecyclerView}.
      */
-    private List<PreferenceResourceDescriptor> mPreferenceResourceDescriptors;
+    private final List<PreferenceResourceDescriptor> mPreferenceResourceDescriptors;
 
-    private Handler mHandler;
+    private final Handler mHandler;
 
-    private Runnable mSyncRunnable = new Runnable() {
+    private final Runnable mSyncRunnable = new Runnable() {
         @Override
         public void run() {
             updatePreferences();
         }
     };
 
-    @SuppressWarnings("deprecation")
-    public PreferenceGroupAdapter(PreferenceGroup preferenceGroup) {
+    public PreferenceGroupAdapter(@NonNull PreferenceGroup preferenceGroup) {
         mPreferenceGroup = preferenceGroup;
-        mHandler = new Handler();
+        mHandler = new Handler(Looper.getMainLooper());
 
         // This adapter should be notified when preferences are added or removed from the group
         mPreferenceGroup.setOnPreferenceChangeInternalListener(this);
@@ -293,7 +294,7 @@
         );
         preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
             @Override
-            public boolean onPreferenceClick(Preference preference) {
+            public boolean onPreferenceClick(@NonNull Preference preference) {
                 group.setInitialExpandedChildrenCount(Integer.MAX_VALUE);
                 onPreferenceHierarchyChange(preference);
                 final PreferenceGroup.OnExpandButtonClickListener listener =
@@ -325,6 +326,7 @@
      * @return The corresponding {@link Preference}, or {@code null} if the given position is out
      * of bounds
      */
+    @Nullable
     public Preference getItem(int position) {
         if (position < 0 || position >= getItemCount()) return null;
         return mVisiblePreferences.get(position);
@@ -344,7 +346,7 @@
     }
 
     @Override
-    public void onPreferenceChange(Preference preference) {
+    public void onPreferenceChange(@NonNull Preference preference) {
         final int index = mVisiblePreferences.indexOf(preference);
         // If we don't find the preference, we don't need to notify anyone
         if (index != -1) {
@@ -354,13 +356,13 @@
     }
 
     @Override
-    public void onPreferenceHierarchyChange(Preference preference) {
+    public void onPreferenceHierarchyChange(@NonNull Preference preference) {
         mHandler.removeCallbacks(mSyncRunnable);
         mHandler.post(mSyncRunnable);
     }
 
     @Override
-    public void onPreferenceVisibilityChange(Preference preference) {
+    public void onPreferenceVisibilityChange(@NonNull Preference preference) {
         onPreferenceHierarchyChange(preference);
     }
 
@@ -421,7 +423,7 @@
     }
 
     @Override
-    public int getPreferenceAdapterPosition(String key) {
+    public int getPreferenceAdapterPosition(@NonNull String key) {
         final int size = mVisiblePreferences.size();
         for (int i = 0; i < size; i++) {
             final Preference candidate = mVisiblePreferences.get(i);
@@ -433,7 +435,7 @@
     }
 
     @Override
-    public int getPreferenceAdapterPosition(Preference preference) {
+    public int getPreferenceAdapterPosition(@NonNull Preference preference) {
         final int size = mVisiblePreferences.size();
         for (int i = 0; i < size; i++) {
             final Preference candidate = mVisiblePreferences.get(i);
@@ -456,7 +458,7 @@
         int mWidgetLayoutResId;
         String mClassName;
 
-        PreferenceResourceDescriptor(Preference preference) {
+        PreferenceResourceDescriptor(@NonNull Preference preference) {
             mClassName = preference.getClass().getName();
             mLayoutResId = preference.getLayoutResource();
             mWidgetLayoutResId = preference.getWidgetLayoutResource();
diff --git a/preference/preference/src/main/java/androidx/preference/PreferenceHeaderFragmentCompat.kt b/preference/preference/src/main/java/androidx/preference/PreferenceHeaderFragmentCompat.kt
index 54220cac..2829d42 100644
--- a/preference/preference/src/main/java/androidx/preference/PreferenceHeaderFragmentCompat.kt
+++ b/preference/preference/src/main/java/androidx/preference/PreferenceHeaderFragmentCompat.kt
@@ -86,7 +86,7 @@
             // Opens an preference in detail pane.
             val frag = childFragmentManager.fragmentFactory.instantiate(
                 requireContext().classLoader,
-                pref.fragment
+                pref.fragment!!
             )
             frag.arguments = pref.extras
 
diff --git a/preference/preference/src/main/java/androidx/preference/PreferenceInflater.java b/preference/preference/src/main/java/androidx/preference/PreferenceInflater.java
index 4fc7aec..df0b2b0 100644
--- a/preference/preference/src/main/java/androidx/preference/PreferenceInflater.java
+++ b/preference/preference/src/main/java/androidx/preference/PreferenceInflater.java
@@ -40,15 +40,16 @@
     private static final Class<?>[] CONSTRUCTOR_SIGNATURE = new Class<?>[]{
             Context.class, AttributeSet.class};
 
-    private static final HashMap<String, Constructor> CONSTRUCTOR_MAP = new HashMap<>();
+    private static final HashMap<String, Constructor<?>> CONSTRUCTOR_MAP = new HashMap<>();
     private static final String INTENT_TAG_NAME = "intent";
     private static final String EXTRA_TAG_NAME = "extra";
+    @NonNull
     private final Context mContext;
     private final Object[] mConstructorArgs = new Object[2];
     private PreferenceManager mPreferenceManager;
     private String[] mDefaultPackages;
 
-    public PreferenceInflater(Context context, PreferenceManager preferenceManager) {
+    PreferenceInflater(@NonNull Context context, PreferenceManager preferenceManager) {
         mContext = context;
         init(preferenceManager);
     }
@@ -90,6 +91,7 @@
     /**
      * Return the context we are running in, for access to resources, class loader, etc.
      */
+    @NonNull
     public Context getContext() {
         return mContext;
     }
@@ -103,6 +105,7 @@
      * @return The root of the inflated hierarchy. If root was supplied, this is the root item;
      * otherwise it is the root of the inflated XML file.
      */
+    @NonNull
     public Preference inflate(int resource, @Nullable PreferenceGroup root) {
         XmlResourceParser parser = getContext().getResources().getXml(resource);
         try {
@@ -129,6 +132,7 @@
      * @return The root of the inflated hierarchy. If root was supplied, this is root; otherwise
      * it is the root of the inflated XML file.
      */
+    @NonNull
     public Preference inflate(XmlPullParser parser, @Nullable PreferenceGroup root) {
         synchronized (mConstructorArgs) {
             final AttributeSet attrs = Xml.asAttributeSet(parser);
@@ -202,7 +206,7 @@
     private Preference createItem(@NonNull String name, @Nullable String[] prefixes,
             AttributeSet attrs)
             throws ClassNotFoundException, InflateException {
-        Constructor constructor = CONSTRUCTOR_MAP.get(name);
+        Constructor<?> constructor = CONSTRUCTOR_MAP.get(name);
 
         try {
             if (constructor == null) {
@@ -302,7 +306,8 @@
      * Recursive method used to descend down the xml hierarchy and instantiate items, instantiate
      * their children, and then call onFinishInflate().
      */
-    private void rInflate(XmlPullParser parser, Preference parent, final AttributeSet attrs)
+    private void rInflate(@NonNull XmlPullParser parser, Preference parent,
+            final AttributeSet attrs)
             throws XmlPullParserException, IOException {
         final int depth = parser.getDepth();
 
@@ -349,7 +354,7 @@
 
     }
 
-    private static void skipCurrentTag(XmlPullParser parser)
+    private static void skipCurrentTag(@NonNull XmlPullParser parser)
             throws XmlPullParserException, IOException {
         int outerDepth = parser.getDepth();
         int type;
diff --git a/preference/preference/src/main/java/androidx/preference/PreferenceManager.java b/preference/preference/src/main/java/androidx/preference/PreferenceManager.java
index 8ee0bb3..3f4e92d 100644
--- a/preference/preference/src/main/java/androidx/preference/PreferenceManager.java
+++ b/preference/preference/src/main/java/androidx/preference/PreferenceManager.java
@@ -46,7 +46,7 @@
     /**
      * The context to use. This should always be set.
      */
-    private Context mContext;
+    private final Context mContext;
     /**
      * The counter for unique IDs.
      */
@@ -101,7 +101,7 @@
      * @hide
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public PreferenceManager(Context context) {
+    public PreferenceManager(@NonNull Context context) {
         mContext = context;
 
         setSharedPreferencesName(getDefaultSharedPreferencesName(context));
@@ -115,7 +115,7 @@
      * @return A {@link SharedPreferences} instance that can be used to retrieve and listen to
      * values of the preferences
      */
-    public static SharedPreferences getDefaultSharedPreferences(Context context) {
+    public static SharedPreferences getDefaultSharedPreferences(@NonNull Context context) {
         return context.getSharedPreferences(getDefaultSharedPreferencesName(context),
                 getDefaultSharedPreferencesMode());
     }
@@ -145,7 +145,7 @@
      *                  {@link PreferenceManager#getDefaultSharedPreferences(Context)} and clear
      *                  it followed by a call to this method with this parameter set to true.
      */
-    public static void setDefaultValues(Context context, int resId, boolean readAgain) {
+    public static void setDefaultValues(@NonNull Context context, int resId, boolean readAgain) {
         // Use the default shared preferences name and mode
         setDefaultValues(context, getDefaultSharedPreferencesName(context),
                 getDefaultSharedPreferencesMode(), resId, readAgain);
@@ -176,7 +176,7 @@
      * @see #setSharedPreferencesName(String)
      * @see #setSharedPreferencesMode(int)
      */
-    public static void setDefaultValues(Context context, String sharedPreferencesName,
+    public static void setDefaultValues(@NonNull Context context, String sharedPreferencesName,
             int sharedPreferencesMode, int resId, boolean readAgain) {
         final SharedPreferences defaultValueSp = context.getSharedPreferences(
                 KEY_HAS_SET_DEFAULT_VALUES, Context.MODE_PRIVATE);
@@ -207,8 +207,9 @@
      * @hide
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public PreferenceScreen inflateFromResource(Context context, int resId,
-            PreferenceScreen rootPreferences) {
+    @NonNull
+    public PreferenceScreen inflateFromResource(@NonNull Context context, int resId,
+            @Nullable PreferenceScreen rootPreferences) {
         // Block commits
         setNoCommit(true);
 
@@ -222,7 +223,8 @@
         return rootPreferences;
     }
 
-    public PreferenceScreen createPreferenceScreen(Context context) {
+    @NonNull
+    public PreferenceScreen createPreferenceScreen(@NonNull Context context) {
         final PreferenceScreen preferenceScreen = new PreferenceScreen(context, null);
         preferenceScreen.onAttachedToHierarchy(this);
         return preferenceScreen;
@@ -364,7 +366,7 @@
      * @param dataStore The {@link PreferenceDataStore} to be used by this manager
      * @see Preference#setPreferenceDataStore(PreferenceDataStore)
      */
-    public void setPreferenceDataStore(PreferenceDataStore dataStore) {
+    public void setPreferenceDataStore(@Nullable PreferenceDataStore dataStore) {
         mPreferenceDataStore = dataStore;
     }
 
@@ -507,25 +509,28 @@
      *
      * @return The {@link Context}
      */
+    @NonNull
     public Context getContext() {
         return mContext;
     }
 
+    @Nullable
     public PreferenceComparisonCallback getPreferenceComparisonCallback() {
         return mPreferenceComparisonCallback;
     }
 
     public void setPreferenceComparisonCallback(
-            PreferenceComparisonCallback preferenceComparisonCallback) {
+            @Nullable PreferenceComparisonCallback preferenceComparisonCallback) {
         mPreferenceComparisonCallback = preferenceComparisonCallback;
     }
 
+    @Nullable
     public OnDisplayPreferenceDialogListener getOnDisplayPreferenceDialogListener() {
         return mOnDisplayPreferenceDialogListener;
     }
 
     public void setOnDisplayPreferenceDialogListener(
-            OnDisplayPreferenceDialogListener onDisplayPreferenceDialogListener) {
+            @Nullable OnDisplayPreferenceDialogListener onDisplayPreferenceDialogListener) {
         mOnDisplayPreferenceDialogListener = onDisplayPreferenceDialogListener;
     }
 
@@ -534,7 +539,7 @@
      *
      * @param preference The preference requesting the dialog
      */
-    public void showDialog(Preference preference) {
+    public void showDialog(@NonNull Preference preference) {
         if (mOnDisplayPreferenceDialogListener != null) {
             mOnDisplayPreferenceDialogListener.onDisplayPreferenceDialog(preference);
         }
@@ -546,10 +551,12 @@
      *
      * @param listener The callback to be invoked
      */
-    public void setOnPreferenceTreeClickListener(OnPreferenceTreeClickListener listener) {
+    public void setOnPreferenceTreeClickListener(
+            @Nullable OnPreferenceTreeClickListener listener) {
         mOnPreferenceTreeClickListener = listener;
     }
 
+    @Nullable
     public OnPreferenceTreeClickListener getOnPreferenceTreeClickListener() {
         return mOnPreferenceTreeClickListener;
     }
@@ -560,13 +567,14 @@
      *
      * @param listener The callback to be invoked
      */
-    public void setOnNavigateToScreenListener(OnNavigateToScreenListener listener) {
+    public void setOnNavigateToScreenListener(@Nullable OnNavigateToScreenListener listener) {
         mOnNavigateToScreenListener = listener;
     }
 
     /**
      * Returns the {@link PreferenceManager.OnNavigateToScreenListener}, if one has been set.
      */
+    @Nullable
     public OnNavigateToScreenListener getOnNavigateToScreenListener() {
         return mOnNavigateToScreenListener;
     }
@@ -583,7 +591,7 @@
          * @param preference The preference that was clicked
          * @return Whether the click was handled
          */
-        boolean onPreferenceTreeClick(Preference preference);
+        boolean onPreferenceTreeClick(@NonNull Preference preference);
     }
 
     /**
@@ -597,7 +605,7 @@
          *
          * @param preference The Preference object requesting the dialog
          */
-        void onDisplayPreferenceDialog(Preference preference);
+        void onDisplayPreferenceDialog(@NonNull Preference preference);
     }
 
     /**
@@ -611,7 +619,7 @@
          *
          * @param preferenceScreen The PreferenceScreen requesting navigation
          */
-        void onNavigateToScreen(PreferenceScreen preferenceScreen);
+        void onNavigateToScreen(@NonNull PreferenceScreen preferenceScreen);
     }
 
     /**
@@ -628,7 +636,8 @@
          * @param p2 {@link Preference} object to compare
          * @return {@code true} if the objects represent the same item
          */
-        public abstract boolean arePreferenceItemsTheSame(Preference p1, Preference p2);
+        public abstract boolean arePreferenceItemsTheSame(@NonNull Preference p1,
+                @NonNull Preference p2);
 
         /**
          * Called to determine if two {@link Preference} objects will display the same data
@@ -637,7 +646,8 @@
          * @param p2 {@link Preference} object to compare
          * @return {@code true} if the objects are visually identical
          */
-        public abstract boolean arePreferenceContentsTheSame(Preference p1, Preference p2);
+        public abstract boolean arePreferenceContentsTheSame(@NonNull Preference p1,
+                @NonNull Preference p2);
     }
 
     /**
@@ -656,7 +666,7 @@
          * @see Preference#setKey(String)
          */
         @Override
-        public boolean arePreferenceItemsTheSame(Preference p1, Preference p2) {
+        public boolean arePreferenceItemsTheSame(@NonNull Preference p1, @NonNull Preference p2) {
             return p1.getId() == p2.getId();
         }
 
@@ -670,7 +680,8 @@
          * not modified after being removed from its containing {@link PreferenceGroup}.
          */
         @Override
-        public boolean arePreferenceContentsTheSame(Preference p1, Preference p2) {
+        public boolean arePreferenceContentsTheSame(@NonNull Preference p1,
+                @NonNull Preference p2) {
             if (p1.getClass() != p2.getClass()) {
                 return false;
             }
diff --git a/preference/preference/src/main/java/androidx/preference/PreferenceRecyclerViewAccessibilityDelegate.java b/preference/preference/src/main/java/androidx/preference/PreferenceRecyclerViewAccessibilityDelegate.java
index 4ec30e8..8a5f423 100644
--- a/preference/preference/src/main/java/androidx/preference/PreferenceRecyclerViewAccessibilityDelegate.java
+++ b/preference/preference/src/main/java/androidx/preference/PreferenceRecyclerViewAccessibilityDelegate.java
@@ -47,7 +47,7 @@
     @SuppressWarnings("WeakerAccess") /* synthetic access */
     final AccessibilityDelegateCompat mDefaultItemDelegate = super.getItemDelegate();
 
-    public PreferenceRecyclerViewAccessibilityDelegate(RecyclerView recyclerView) {
+    public PreferenceRecyclerViewAccessibilityDelegate(@NonNull RecyclerView recyclerView) {
         super(recyclerView);
         mRecyclerView = recyclerView;
     }
diff --git a/preference/preference/src/main/java/androidx/preference/PreferenceScreen.java b/preference/preference/src/main/java/androidx/preference/PreferenceScreen.java
index ba01728..44b3ea6 100644
--- a/preference/preference/src/main/java/androidx/preference/PreferenceScreen.java
+++ b/preference/preference/src/main/java/androidx/preference/PreferenceScreen.java
@@ -21,6 +21,8 @@
 import android.content.Context;
 import android.util.AttributeSet;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.core.content.res.TypedArrayUtils;
 
@@ -49,7 +51,7 @@
      * @hide
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public PreferenceScreen(Context context, AttributeSet attrs) {
+    public PreferenceScreen(@NonNull Context context, @Nullable AttributeSet attrs) {
         super(context, attrs, TypedArrayUtils.getAttr(context, R.attr.preferenceScreenStyle,
                 android.R.attr.preferenceScreenStyle));
     }
diff --git a/preference/preference/src/main/java/androidx/preference/PreferenceViewHolder.java b/preference/preference/src/main/java/androidx/preference/PreferenceViewHolder.java
index e465513..9ab1222 100644
--- a/preference/preference/src/main/java/androidx/preference/PreferenceViewHolder.java
+++ b/preference/preference/src/main/java/androidx/preference/PreferenceViewHolder.java
@@ -23,6 +23,7 @@
 import android.widget.TextView;
 
 import androidx.annotation.IdRes;
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.core.view.ViewCompat;
@@ -34,13 +35,13 @@
  */
 public class PreferenceViewHolder extends RecyclerView.ViewHolder {
     @Nullable
-    private Drawable mBackground;
+    private final Drawable mBackground;
     private ColorStateList mTitleTextColors;
     private final SparseArray<View> mCachedViews = new SparseArray<>(4);
     private boolean mDividerAllowedAbove;
     private boolean mDividerAllowedBelow;
 
-    PreferenceViewHolder(View itemView) {
+    PreferenceViewHolder(@NonNull View itemView) {
         super(itemView);
 
         final TextView titleView = itemView.findViewById(android.R.id.title);
@@ -61,7 +62,8 @@
 
     /** @hide */
     @RestrictTo(RestrictTo.Scope.TESTS)
-    public static PreferenceViewHolder createInstanceForTests(View itemView) {
+    @NonNull
+    public static PreferenceViewHolder createInstanceForTests(@NonNull View itemView) {
         return new PreferenceViewHolder(itemView);
     }
 
diff --git a/preference/preference/src/main/java/androidx/preference/SeekBarPreference.java b/preference/preference/src/main/java/androidx/preference/SeekBarPreference.java
index 6691fca..d3cb27b 100644
--- a/preference/preference/src/main/java/androidx/preference/SeekBarPreference.java
+++ b/preference/preference/src/main/java/androidx/preference/SeekBarPreference.java
@@ -28,6 +28,9 @@
 import android.widget.SeekBar.OnSeekBarChangeListener;
 import android.widget.TextView;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
 /**
  * Preference based on android.preference.SeekBarPreference but uses support preference as a base
  * . It contains a title and a {@link SeekBar} and an optional SeekBar value {@link TextView}.
@@ -71,7 +74,7 @@
     /**
      * Listener reacting to the {@link SeekBar} changing value by the user
      */
-    private OnSeekBarChangeListener mSeekBarChangeListener = new OnSeekBarChangeListener() {
+    private final OnSeekBarChangeListener mSeekBarChangeListener = new OnSeekBarChangeListener() {
         @Override
         public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
             if (fromUser && (mUpdatesContinuously || !mTrackingTouch)) {
@@ -101,7 +104,7 @@
      * adjustable} attribute is set to true; it transfers the key presses to the {@link SeekBar}
      * to be handled accordingly.
      */
-    private View.OnKeyListener mSeekBarKeyListener = new View.OnKeyListener() {
+    private final View.OnKeyListener mSeekBarKeyListener = new View.OnKeyListener() {
         @Override
         public boolean onKey(View v, int keyCode, KeyEvent event) {
             if (event.getAction() != KeyEvent.ACTION_DOWN) {
@@ -129,7 +132,8 @@
     };
 
     public SeekBarPreference(
-            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+            @NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr,
+            int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
 
         TypedArray a = context.obtainStyledAttributes(
@@ -148,20 +152,21 @@
         a.recycle();
     }
 
-    public SeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+    public SeekBarPreference(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyleAttr) {
         this(context, attrs, defStyleAttr, 0);
     }
 
-    public SeekBarPreference(Context context, AttributeSet attrs) {
+    public SeekBarPreference(@NonNull Context context, @Nullable AttributeSet attrs) {
         this(context, attrs, R.attr.seekBarPreferenceStyle);
     }
 
-    public SeekBarPreference(Context context) {
+    public SeekBarPreference(@NonNull Context context) {
         this(context, null);
     }
 
     @Override
-    public void onBindViewHolder(PreferenceViewHolder holder) {
+    public void onBindViewHolder(@NonNull PreferenceViewHolder holder) {
         super.onBindViewHolder(holder);
         holder.itemView.setOnKeyListener(mSeekBarKeyListener);
         mSeekBar = (SeekBar) holder.findViewById(R.id.seekbar);
@@ -203,7 +208,7 @@
     }
 
     @Override
-    protected Object onGetDefaultValue(TypedArray a, int index) {
+    protected @Nullable Object onGetDefaultValue(@NonNull TypedArray a, int index) {
         return a.getInt(index, 0);
     }
 
@@ -385,7 +390,7 @@
      * set the {@link SeekBar}'s value to the stored value.
      */
     @SuppressWarnings("WeakerAccess") /* synthetic access */
-    void syncValueInternal(SeekBar seekBar) {
+    void syncValueInternal(@NonNull SeekBar seekBar) {
         int seekBarValue = mMin + seekBar.getProgress();
         if (seekBarValue != mSeekBarValue) {
             if (callChangeListener(seekBarValue)) {
@@ -409,6 +414,7 @@
         }
     }
 
+    @Nullable
     @Override
     protected Parcelable onSaveInstanceState() {
         final Parcelable superState = super.onSaveInstanceState();
@@ -426,8 +432,8 @@
     }
 
     @Override
-    protected void onRestoreInstanceState(Parcelable state) {
-        if (!state.getClass().equals(SavedState.class)) {
+    protected void onRestoreInstanceState(@Nullable Parcelable state) {
+        if (state == null || !state.getClass().equals(SavedState.class)) {
             // Didn't save state for us in onSaveInstanceState
             super.onRestoreInstanceState(state);
             return;
diff --git a/preference/preference/src/main/java/androidx/preference/SwitchPreference.java b/preference/preference/src/main/java/androidx/preference/SwitchPreference.java
index 0c94255..77ecb7a 100644
--- a/preference/preference/src/main/java/androidx/preference/SwitchPreference.java
+++ b/preference/preference/src/main/java/androidx/preference/SwitchPreference.java
@@ -27,6 +27,8 @@
 import android.widget.CompoundButton;
 import android.widget.Switch;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.core.content.res.TypedArrayUtils;
 
@@ -60,8 +62,8 @@
      *                     for the view, used only if defStyleAttr is 0 or can not be found in the
      *                     theme. Can be 0 to not look for defaults.
      */
-    public SwitchPreference(Context context, AttributeSet attrs, int defStyleAttr,
-            int defStyleRes) {
+    public SwitchPreference(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyleAttr, int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
 
         TypedArray a = context.obtainStyledAttributes(attrs,
@@ -97,7 +99,8 @@
      *                     resource that supplies default values for the view. Can be 0 to not
      *                     look for defaults.
      */
-    public SwitchPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+    public SwitchPreference(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyleAttr) {
         this(context, attrs, defStyleAttr, 0);
     }
 
@@ -107,7 +110,7 @@
      * @param context The {@link Context} that will style this preference
      * @param attrs   Style attributes that differ from the default
      */
-    public SwitchPreference(Context context, AttributeSet attrs) {
+    public SwitchPreference(@NonNull Context context, @Nullable AttributeSet attrs) {
         this(context, attrs, TypedArrayUtils.getAttr(context,
                 androidx.preference.R.attr.switchPreferenceStyle,
                 android.R.attr.switchPreferenceStyle));
@@ -118,12 +121,12 @@
      *
      * @param context The {@link Context} that will style this preference
      */
-    public SwitchPreference(Context context) {
+    public SwitchPreference(@NonNull Context context) {
         this(context, null);
     }
 
     @Override
-    public void onBindViewHolder(PreferenceViewHolder holder) {
+    public void onBindViewHolder(@NonNull PreferenceViewHolder holder) {
         super.onBindViewHolder(holder);
         View switchView = holder.findViewById(AndroidResources.ANDROID_R_SWITCH_WIDGET);
         syncSwitchView(switchView);
@@ -136,7 +139,7 @@
      *
      * @param onText Text to display in the on state
      */
-    public void setSwitchTextOn(CharSequence onText) {
+    public void setSwitchTextOn(@Nullable CharSequence onText) {
         mSwitchOn = onText;
         notifyChanged();
     }
@@ -147,7 +150,7 @@
      *
      * @param offText Text to display in the off state
      */
-    public void setSwitchTextOff(CharSequence offText) {
+    public void setSwitchTextOff(@Nullable CharSequence offText) {
         mSwitchOff = offText;
         notifyChanged();
     }
@@ -155,6 +158,7 @@
     /**
      * @return The text that will be displayed on the switch widget in the on state
      */
+    @Nullable
     public CharSequence getSwitchTextOn() {
         return mSwitchOn;
     }
@@ -172,6 +176,7 @@
     /**
      * @return The text that will be displayed on the switch widget in the off state
      */
+    @Nullable
     public CharSequence getSwitchTextOff() {
         return mSwitchOff;
     }
@@ -188,10 +193,11 @@
 
     /**
      * @hide
+     * @param view
      */
     @RestrictTo(LIBRARY)
     @Override
-    protected void performClick(View view) {
+    protected void performClick(@NonNull View view) {
         super.performClick(view);
         syncViewIfAccessibilityEnabled(view);
     }
diff --git a/preference/preference/src/main/java/androidx/preference/SwitchPreferenceCompat.java b/preference/preference/src/main/java/androidx/preference/SwitchPreferenceCompat.java
index 11318dd..b5bea34 100644
--- a/preference/preference/src/main/java/androidx/preference/SwitchPreferenceCompat.java
+++ b/preference/preference/src/main/java/androidx/preference/SwitchPreferenceCompat.java
@@ -26,6 +26,8 @@
 import android.widget.Checkable;
 import android.widget.CompoundButton;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.widget.SwitchCompat;
 import androidx.core.content.res.TypedArrayUtils;
@@ -60,8 +62,8 @@
      *                     for the view, used only if defStyleAttr is 0 or can not be found in the
      *                     theme. Can be 0 to not look for defaults.
      */
-    public SwitchPreferenceCompat(Context context, AttributeSet attrs, int defStyleAttr,
-            int defStyleRes) {
+    public SwitchPreferenceCompat(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyleAttr, int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
 
         TypedArray a = context.obtainStyledAttributes(attrs,
@@ -97,7 +99,8 @@
      *                     resource that supplies default values for the view. Can be 0 to not
      *                     look for defaults.
      */
-    public SwitchPreferenceCompat(Context context, AttributeSet attrs, int defStyleAttr) {
+    public SwitchPreferenceCompat(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyleAttr) {
         this(context, attrs, defStyleAttr, 0);
     }
 
@@ -107,7 +110,7 @@
      * @param context The {@link Context} that will style this preference
      * @param attrs   Style attributes that differ from the default
      */
-    public SwitchPreferenceCompat(Context context, AttributeSet attrs) {
+    public SwitchPreferenceCompat(@NonNull Context context, @Nullable AttributeSet attrs) {
         this(context, attrs, R.attr.switchPreferenceCompatStyle);
     }
 
@@ -116,12 +119,12 @@
      *
      * @param context The {@link Context} that will style this preference
      */
-    public SwitchPreferenceCompat(Context context) {
+    public SwitchPreferenceCompat(@NonNull Context context) {
         this(context, null);
     }
 
     @Override
-    public void onBindViewHolder(PreferenceViewHolder holder) {
+    public void onBindViewHolder(@NonNull PreferenceViewHolder holder) {
         super.onBindViewHolder(holder);
         View switchView = holder.findViewById(R.id.switchWidget);
         syncSwitchView(switchView);
@@ -134,7 +137,7 @@
      *
      * @param onText Text to display in the on state
      */
-    public void setSwitchTextOn(CharSequence onText) {
+    public void setSwitchTextOn(@Nullable CharSequence onText) {
         mSwitchOn = onText;
         notifyChanged();
     }
@@ -145,7 +148,7 @@
      *
      * @param offText Text to display in the off state
      */
-    public void setSwitchTextOff(CharSequence offText) {
+    public void setSwitchTextOff(@Nullable CharSequence offText) {
         mSwitchOff = offText;
         notifyChanged();
     }
@@ -153,6 +156,7 @@
     /**
      * @return The text that will be displayed on the switch widget in the on state
      */
+    @Nullable
     public CharSequence getSwitchTextOn() {
         return mSwitchOn;
     }
@@ -170,6 +174,7 @@
     /**
      * @return The text that will be displayed on the switch widget in the off state
      */
+    @Nullable
     public CharSequence getSwitchTextOff() {
         return mSwitchOff;
     }
@@ -186,10 +191,11 @@
 
     /**
      * @hide
+     * @param view
      */
     @RestrictTo(LIBRARY)
     @Override
-    protected void performClick(View view) {
+    protected void performClick(@NonNull View view) {
         super.performClick(view);
         syncViewIfAccessibilityEnabled(view);
     }
diff --git a/preference/preference/src/main/java/androidx/preference/TwoStatePreference.java b/preference/preference/src/main/java/androidx/preference/TwoStatePreference.java
index f1e4a59..50189ad8 100644
--- a/preference/preference/src/main/java/androidx/preference/TwoStatePreference.java
+++ b/preference/preference/src/main/java/androidx/preference/TwoStatePreference.java
@@ -27,6 +27,8 @@
 import android.view.View;
 import android.widget.TextView;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 
 /**
@@ -43,19 +45,21 @@
     private boolean mDisableDependentsState;
 
     public TwoStatePreference(
-            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+            @NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr,
+            int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
     }
 
-    public TwoStatePreference(Context context, AttributeSet attrs, int defStyleAttr) {
+    public TwoStatePreference(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyleAttr) {
         this(context, attrs, defStyleAttr, 0);
     }
 
-    public TwoStatePreference(Context context, AttributeSet attrs) {
+    public TwoStatePreference(@NonNull Context context, @Nullable AttributeSet attrs) {
         this(context, attrs, 0);
     }
 
-    public TwoStatePreference(Context context) {
+    public TwoStatePreference(@NonNull Context context) {
         this(context, null);
     }
 
@@ -111,7 +115,7 @@
      *
      * @param summary The summary to be shown when checked
      */
-    public void setSummaryOn(CharSequence summary) {
+    public void setSummaryOn(@Nullable CharSequence summary) {
         mSummaryOn = summary;
         if (isChecked()) {
             notifyChanged();
@@ -123,6 +127,7 @@
      *
      * @return The summary
      */
+    @Nullable
     public CharSequence getSummaryOn() {
         return mSummaryOn;
     }
@@ -143,7 +148,7 @@
      *
      * @param summary The summary to be shown when unchecked
      */
-    public void setSummaryOff(CharSequence summary) {
+    public void setSummaryOff(@Nullable CharSequence summary) {
         mSummaryOff = summary;
         if (!isChecked()) {
             notifyChanged();
@@ -155,6 +160,7 @@
      *
      * @return The summary
      */
+    @Nullable
     public CharSequence getSummaryOff() {
         return mSummaryOff;
     }
@@ -189,7 +195,7 @@
     }
 
     @Override
-    protected Object onGetDefaultValue(TypedArray a, int index) {
+    protected @Nullable Object onGetDefaultValue(@NonNull TypedArray a, int index) {
         return a.getBoolean(index, false);
     }
 
@@ -206,7 +212,7 @@
      *
      * @param holder A {@link PreferenceViewHolder} which holds a reference to the summary view
      */
-    protected void syncSummaryView(PreferenceViewHolder holder) {
+    protected void syncSummaryView(@NonNull PreferenceViewHolder holder) {
         // Sync the summary holder
         View view = holder.findViewById(android.R.id.summary);
         syncSummaryView(view);
@@ -246,6 +252,7 @@
         }
     }
 
+    @Nullable
     @Override
     protected Parcelable onSaveInstanceState() {
         final Parcelable superState = super.onSaveInstanceState();
@@ -260,7 +267,7 @@
     }
 
     @Override
-    protected void onRestoreInstanceState(Parcelable state) {
+    protected void onRestoreInstanceState(@Nullable Parcelable state) {
         if (state == null || !state.getClass().equals(SavedState.class)) {
             // Didn't save state for us in onSaveInstanceState
             super.onRestoreInstanceState(state);
diff --git a/preference/preference/src/main/java/androidx/preference/UnPressableLinearLayout.java b/preference/preference/src/main/java/androidx/preference/UnPressableLinearLayout.java
index 75eba63..c685322 100644
--- a/preference/preference/src/main/java/androidx/preference/UnPressableLinearLayout.java
+++ b/preference/preference/src/main/java/androidx/preference/UnPressableLinearLayout.java
@@ -22,6 +22,8 @@
 import android.util.AttributeSet;
 import android.widget.LinearLayout;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 
 /**
@@ -35,11 +37,11 @@
  */
 @RestrictTo(LIBRARY_GROUP_PREFIX)
 public class UnPressableLinearLayout extends LinearLayout {
-    public UnPressableLinearLayout(Context context) {
+    public UnPressableLinearLayout(@NonNull Context context) {
         this(context, null);
     }
 
-    public UnPressableLinearLayout(Context context, AttributeSet attrs) {
+    public UnPressableLinearLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
         super(context, attrs);
     }
 
diff --git a/preference/preference/src/main/java/androidx/preference/internal/PreferenceImageView.java b/preference/preference/src/main/java/androidx/preference/internal/PreferenceImageView.java
index 12c5758..2e7a162 100644
--- a/preference/preference/src/main/java/androidx/preference/internal/PreferenceImageView.java
+++ b/preference/preference/src/main/java/androidx/preference/internal/PreferenceImageView.java
@@ -24,6 +24,8 @@
 import android.util.AttributeSet;
 import android.widget.ImageView;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.preference.R;
 
@@ -41,15 +43,16 @@
     private int mMaxWidth = Integer.MAX_VALUE;
     private int mMaxHeight = Integer.MAX_VALUE;
 
-    public PreferenceImageView(Context context) {
+    public PreferenceImageView(@NonNull Context context) {
         this(context, null);
     }
 
-    public PreferenceImageView(Context context, AttributeSet attrs) {
+    public PreferenceImageView(@NonNull Context context, @Nullable AttributeSet attrs) {
         this(context, attrs, 0);
     }
 
-    public PreferenceImageView(Context context, AttributeSet attrs, int defStyleAttr) {
+    public PreferenceImageView(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyleAttr) {
         super(context, attrs, defStyleAttr);
 
         final TypedArray a = context.obtainStyledAttributes(
diff --git a/profileinstaller/profileinstaller/api/1.1.0-beta02.txt b/profileinstaller/profileinstaller/api/1.1.0-beta02.txt
new file mode 100644
index 0000000..4fb75af
--- /dev/null
+++ b/profileinstaller/profileinstaller/api/1.1.0-beta02.txt
@@ -0,0 +1,44 @@
+// Signature format: 4.0
+package androidx.profileinstaller {
+
+  public class ProfileInstallReceiver extends android.content.BroadcastReceiver {
+    ctor public ProfileInstallReceiver();
+    method public void onReceive(android.content.Context, android.content.Intent?);
+    field public static final String ACTION_INSTALL_PROFILE = "androidx.profileinstaller.action.INSTALL_PROFILE";
+  }
+
+  public class ProfileInstaller {
+    method @WorkerThread public static void writeProfile(android.content.Context);
+    method @WorkerThread public static void writeProfile(android.content.Context, java.util.concurrent.Executor, androidx.profileinstaller.ProfileInstaller.DiagnosticsCallback);
+    field public static final int DIAGNOSTIC_CURRENT_PROFILE_DOES_NOT_EXIST = 2; // 0x2
+    field public static final int DIAGNOSTIC_CURRENT_PROFILE_EXISTS = 1; // 0x1
+    field public static final int DIAGNOSTIC_REF_PROFILE_DOES_NOT_EXIST = 4; // 0x4
+    field public static final int DIAGNOSTIC_REF_PROFILE_EXISTS = 3; // 0x3
+    field public static final int RESULT_ALREADY_INSTALLED = 2; // 0x2
+    field public static final int RESULT_BASELINE_PROFILE_NOT_FOUND = 6; // 0x6
+    field public static final int RESULT_DESIRED_FORMAT_UNSUPPORTED = 5; // 0x5
+    field public static final int RESULT_INSTALL_SUCCESS = 1; // 0x1
+    field public static final int RESULT_IO_EXCEPTION = 7; // 0x7
+    field public static final int RESULT_META_FILE_REQUIRED_BUT_NOT_FOUND = 9; // 0x9
+    field public static final int RESULT_NOT_WRITABLE = 4; // 0x4
+    field public static final int RESULT_PARSE_EXCEPTION = 8; // 0x8
+    field public static final int RESULT_UNSUPPORTED_ART_VERSION = 3; // 0x3
+  }
+
+  public static interface ProfileInstaller.DiagnosticsCallback {
+    method public void onDiagnosticReceived(int, Object?);
+    method public void onResultReceived(int, Object?);
+  }
+
+  public class ProfileInstallerInitializer implements androidx.startup.Initializer<androidx.profileinstaller.ProfileInstallerInitializer.Result> {
+    ctor public ProfileInstallerInitializer();
+    method public androidx.profileinstaller.ProfileInstallerInitializer.Result create(android.content.Context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
+  }
+
+  public static class ProfileInstallerInitializer.Result {
+    ctor public ProfileInstallerInitializer.Result();
+  }
+
+}
+
diff --git a/profileinstaller/profileinstaller/api/public_plus_experimental_1.1.0-beta02.txt b/profileinstaller/profileinstaller/api/public_plus_experimental_1.1.0-beta02.txt
new file mode 100644
index 0000000..4fb75af
--- /dev/null
+++ b/profileinstaller/profileinstaller/api/public_plus_experimental_1.1.0-beta02.txt
@@ -0,0 +1,44 @@
+// Signature format: 4.0
+package androidx.profileinstaller {
+
+  public class ProfileInstallReceiver extends android.content.BroadcastReceiver {
+    ctor public ProfileInstallReceiver();
+    method public void onReceive(android.content.Context, android.content.Intent?);
+    field public static final String ACTION_INSTALL_PROFILE = "androidx.profileinstaller.action.INSTALL_PROFILE";
+  }
+
+  public class ProfileInstaller {
+    method @WorkerThread public static void writeProfile(android.content.Context);
+    method @WorkerThread public static void writeProfile(android.content.Context, java.util.concurrent.Executor, androidx.profileinstaller.ProfileInstaller.DiagnosticsCallback);
+    field public static final int DIAGNOSTIC_CURRENT_PROFILE_DOES_NOT_EXIST = 2; // 0x2
+    field public static final int DIAGNOSTIC_CURRENT_PROFILE_EXISTS = 1; // 0x1
+    field public static final int DIAGNOSTIC_REF_PROFILE_DOES_NOT_EXIST = 4; // 0x4
+    field public static final int DIAGNOSTIC_REF_PROFILE_EXISTS = 3; // 0x3
+    field public static final int RESULT_ALREADY_INSTALLED = 2; // 0x2
+    field public static final int RESULT_BASELINE_PROFILE_NOT_FOUND = 6; // 0x6
+    field public static final int RESULT_DESIRED_FORMAT_UNSUPPORTED = 5; // 0x5
+    field public static final int RESULT_INSTALL_SUCCESS = 1; // 0x1
+    field public static final int RESULT_IO_EXCEPTION = 7; // 0x7
+    field public static final int RESULT_META_FILE_REQUIRED_BUT_NOT_FOUND = 9; // 0x9
+    field public static final int RESULT_NOT_WRITABLE = 4; // 0x4
+    field public static final int RESULT_PARSE_EXCEPTION = 8; // 0x8
+    field public static final int RESULT_UNSUPPORTED_ART_VERSION = 3; // 0x3
+  }
+
+  public static interface ProfileInstaller.DiagnosticsCallback {
+    method public void onDiagnosticReceived(int, Object?);
+    method public void onResultReceived(int, Object?);
+  }
+
+  public class ProfileInstallerInitializer implements androidx.startup.Initializer<androidx.profileinstaller.ProfileInstallerInitializer.Result> {
+    ctor public ProfileInstallerInitializer();
+    method public androidx.profileinstaller.ProfileInstallerInitializer.Result create(android.content.Context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
+  }
+
+  public static class ProfileInstallerInitializer.Result {
+    ctor public ProfileInstallerInitializer.Result();
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/profileinstaller/profileinstaller/api/res-1.1.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to profileinstaller/profileinstaller/api/res-1.1.0-beta02.txt
diff --git a/profileinstaller/profileinstaller/api/restricted_1.1.0-beta02.txt b/profileinstaller/profileinstaller/api/restricted_1.1.0-beta02.txt
new file mode 100644
index 0000000..4fb75af
--- /dev/null
+++ b/profileinstaller/profileinstaller/api/restricted_1.1.0-beta02.txt
@@ -0,0 +1,44 @@
+// Signature format: 4.0
+package androidx.profileinstaller {
+
+  public class ProfileInstallReceiver extends android.content.BroadcastReceiver {
+    ctor public ProfileInstallReceiver();
+    method public void onReceive(android.content.Context, android.content.Intent?);
+    field public static final String ACTION_INSTALL_PROFILE = "androidx.profileinstaller.action.INSTALL_PROFILE";
+  }
+
+  public class ProfileInstaller {
+    method @WorkerThread public static void writeProfile(android.content.Context);
+    method @WorkerThread public static void writeProfile(android.content.Context, java.util.concurrent.Executor, androidx.profileinstaller.ProfileInstaller.DiagnosticsCallback);
+    field public static final int DIAGNOSTIC_CURRENT_PROFILE_DOES_NOT_EXIST = 2; // 0x2
+    field public static final int DIAGNOSTIC_CURRENT_PROFILE_EXISTS = 1; // 0x1
+    field public static final int DIAGNOSTIC_REF_PROFILE_DOES_NOT_EXIST = 4; // 0x4
+    field public static final int DIAGNOSTIC_REF_PROFILE_EXISTS = 3; // 0x3
+    field public static final int RESULT_ALREADY_INSTALLED = 2; // 0x2
+    field public static final int RESULT_BASELINE_PROFILE_NOT_FOUND = 6; // 0x6
+    field public static final int RESULT_DESIRED_FORMAT_UNSUPPORTED = 5; // 0x5
+    field public static final int RESULT_INSTALL_SUCCESS = 1; // 0x1
+    field public static final int RESULT_IO_EXCEPTION = 7; // 0x7
+    field public static final int RESULT_META_FILE_REQUIRED_BUT_NOT_FOUND = 9; // 0x9
+    field public static final int RESULT_NOT_WRITABLE = 4; // 0x4
+    field public static final int RESULT_PARSE_EXCEPTION = 8; // 0x8
+    field public static final int RESULT_UNSUPPORTED_ART_VERSION = 3; // 0x3
+  }
+
+  public static interface ProfileInstaller.DiagnosticsCallback {
+    method public void onDiagnosticReceived(int, Object?);
+    method public void onResultReceived(int, Object?);
+  }
+
+  public class ProfileInstallerInitializer implements androidx.startup.Initializer<androidx.profileinstaller.ProfileInstallerInitializer.Result> {
+    ctor public ProfileInstallerInitializer();
+    method public androidx.profileinstaller.ProfileInstallerInitializer.Result create(android.content.Context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
+  }
+
+  public static class ProfileInstallerInitializer.Result {
+    ctor public ProfileInstallerInitializer.Result();
+  }
+
+}
+
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/AlteredTableColumnOrderTest.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/AlteredTableColumnOrderTest.kt
index b6d1017..624daee 100644
--- a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/AlteredTableColumnOrderTest.kt
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/AlteredTableColumnOrderTest.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.room.androidx.room.integration.kotlintestapp.test
+package androidx.room.integration.kotlintestapp.test
 
 import android.content.Context
 import androidx.room.ColumnInfo
diff --git a/room/room-runtime/api/restricted_current.ignore b/room/room-runtime/api/restricted_current.ignore
deleted file mode 100644
index aeb6a9e..0000000
--- a/room/room-runtime/api/restricted_current.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-RemovedClass: androidx.room.MultiInstanceInvalidationService:
-    Removed class androidx.room.MultiInstanceInvalidationService
diff --git a/room/room-runtime/src/androidTest/java/androidx/room/AutoCloserTest.kt b/room/room-runtime/src/androidTest/java/androidx/room/AutoCloserTest.kt
index 23e3258..e8775c7 100644
--- a/room/room-runtime/src/androidTest/java/androidx/room/AutoCloserTest.kt
+++ b/room/room-runtime/src/androidTest/java/androidx/room/AutoCloserTest.kt
@@ -147,6 +147,7 @@
         assertThat(autoCloser.delegateDatabase).isNull()
     }
 
+    @FlakyTest(bugId = 189775887)
     @Test
     public fun getDelegatedDatabaseReturnsUnwrappedDatabase() {
         assertThat(autoCloser.delegateDatabase).isNull()
@@ -209,4 +210,4 @@
             autoCloser.incrementCountAndEnsureDbIsOpen()
         }
     }
-}
\ No newline at end of file
+}
diff --git a/samples/SupportPreferenceDemos/src/main/AndroidManifest.xml b/samples/SupportPreferenceDemos/src/main/AndroidManifest.xml
index 1c0a55da..a743e90a 100644
--- a/samples/SupportPreferenceDemos/src/main/AndroidManifest.xml
+++ b/samples/SupportPreferenceDemos/src/main/AndroidManifest.xml
@@ -20,7 +20,10 @@
     package="com.example.androidx.preference">
 
     <uses-sdk
-        tools:overrideLibrary="androidx.leanback.preference, androidx.leanback"/>
+        tools:overrideLibrary="
+            androidx.leanback.preference,
+            androidx.leanback,
+            androidx.leanback.widget"/>
 
     <uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
     <uses-feature android:name="android.software.leanback" android:required="false"/>
diff --git a/savedstate/savedstate/src/main/java/androidx/savedstate/SavedStateRegistry.java b/savedstate/savedstate/src/main/java/androidx/savedstate/SavedStateRegistry.java
index be99367..9f6328d 100644
--- a/savedstate/savedstate/src/main/java/androidx/savedstate/SavedStateRegistry.java
+++ b/savedstate/savedstate/src/main/java/androidx/savedstate/SavedStateRegistry.java
@@ -136,7 +136,7 @@
 
     /**
      * Subclasses of this interface will be automatically recreated if they were previously
-     * registered via {{@link #runOnNextRecreation(Class)}}.
+     * registered via {@link #runOnNextRecreation(Class)}.
      * <p>
      * Subclasses must have a default constructor
      */
diff --git a/settings.gradle b/settings.gradle
index 515e915..b6fcfd3 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -15,6 +15,20 @@
     }
 }
 
+buildscript {
+    repositories {
+        maven {
+            url = new File(buildscript.sourceFile.parent + "/../../prebuilts/androidx/external").getCanonicalFile()
+        }
+    }
+
+    dependencies {
+        classpath("com.gradle:gradle-enterprise-gradle-plugin:3.6.3")
+    }
+}
+
+apply(plugin: "com.gradle.enterprise")
+
 rootProject.name = "androidx"
 
 enableFeaturePreview("VERSION_CATALOGS")
@@ -412,6 +426,7 @@
 includeProject(":core:core-google-shortcuts", "core/core-google-shortcuts", [BuildType.MAIN])
 includeProject(":core:core-ktx", "core/core-ktx", [BuildType.MAIN])
 includeProject(":core:core-remoteviews", "core/core-remoteviews", [BuildType.MAIN])
+includeProject(":core:core-remoteviews:integration-tests:demos", "core/core-remoteviews/integration-tests/demos", [BuildType.MAIN])
 includeProject(":core:core-splashscreen", "core/core-splashscreen", [BuildType.MAIN])
 includeProject(":core:core-splashscreen:core-splashscreen-samples", "core/core-splashscreen/samples", [BuildType.MAIN])
 includeProject(":core:core-role", "core/core-role", [BuildType.MAIN])
@@ -434,6 +449,7 @@
 includeProject(":datastore:datastore-sampleapp", "datastore/datastore-sampleapp", [BuildType.MAIN])
 includeProject(":documentfile:documentfile", "documentfile/documentfile", [BuildType.MAIN])
 includeProject(":draganddrop:draganddrop", "draganddrop/draganddrop", [BuildType.MAIN])
+includeProject(":draganddrop:integration-tests:sampleapp", "draganddrop/integration-tests/sampleapp", [BuildType.MAIN])
 includeProject(":drawerlayout:drawerlayout", "drawerlayout/drawerlayout", [BuildType.MAIN])
 includeProject(":dynamicanimation", "dynamicanimation", [BuildType.MAIN])
 includeProject(":dynamicanimation:dynamicanimation", "dynamicanimation/dynamicanimation", [BuildType.MAIN])
@@ -487,6 +503,7 @@
 includeProject(":jetifier:jetifier-processor", "jetifier/jetifier/processor", [BuildType.MAIN])
 includeProject(":jetifier:jetifier-standalone", "jetifier/jetifier/standalone", [BuildType.MAIN])
 includeProject(":leanback:leanback", "leanback/leanback", [BuildType.MAIN])
+includeProject(":leanback:leanback-grid", "leanback/leanback-grid", [BuildType.MAIN])
 includeProject(":leanback:leanback-paging", "leanback/leanback-paging", [BuildType.MAIN])
 includeProject(":leanback:leanback-preference", "leanback/leanback-preference", [BuildType.MAIN])
 includeProject(":leanback:leanback-tab", "leanback/leanback-tab", [BuildType.MAIN])
diff --git a/slice/slice-builders-ktx/src/androidTest/java/androidx/slice/builders/SliceBuildersKtxTest.kt b/slice/slice-builders-ktx/src/androidTest/java/androidx/slice/builders/SliceBuildersKtxTest.kt
index fa14c4f..a05802a 100644
--- a/slice/slice-builders-ktx/src/androidTest/java/androidx/slice/builders/SliceBuildersKtxTest.kt
+++ b/slice/slice-builders-ktx/src/androidTest/java/androidx/slice/builders/SliceBuildersKtxTest.kt
@@ -17,6 +17,7 @@
 package androidx.slice.builders
 
 import android.app.PendingIntent
+import android.app.PendingIntent.FLAG_IMMUTABLE
 import android.content.Intent
 import android.net.Uri
 import androidx.core.graphics.drawable.IconCompat
@@ -43,7 +44,7 @@
 
     private fun pendingIntentToTestActivity() =
         PendingIntent.getActivity(
-            context, 0, Intent(context, TestActivity::class.java), 0
+            context, 0, Intent(context, TestActivity::class.java), FLAG_IMMUTABLE
         )
 
     private val accentColor = 0xff3949
diff --git a/testutils/testutils-macrobenchmark/build.gradle b/testutils/testutils-macrobenchmark/build.gradle
index 51aa39d..f698e9a 100644
--- a/testutils/testutils-macrobenchmark/build.gradle
+++ b/testutils/testutils-macrobenchmark/build.gradle
@@ -29,6 +29,6 @@
 
 android {
     defaultConfig {
-        minSdkVersion 21
+        minSdkVersion 23
     }
 }
diff --git a/testutils/testutils-macrobenchmark/src/main/java/androidx/testutils/MacrobenchUtils.kt b/testutils/testutils-macrobenchmark/src/main/java/androidx/testutils/MacrobenchUtils.kt
index f484f58..790c8bb 100644
--- a/testutils/testutils-macrobenchmark/src/main/java/androidx/testutils/MacrobenchUtils.kt
+++ b/testutils/testutils-macrobenchmark/src/main/java/androidx/testutils/MacrobenchUtils.kt
@@ -17,14 +17,26 @@
 package androidx.testutils
 
 import android.content.Intent
+import android.os.Build
 import androidx.annotation.RequiresApi
 import androidx.benchmark.macro.CompilationMode
 import androidx.benchmark.macro.StartupMode
+import androidx.benchmark.macro.StartupTimingLegacyMetric
 import androidx.benchmark.macro.StartupTimingMetric
 import androidx.benchmark.macro.isSupportedWithVmSettings
 import androidx.benchmark.macro.junit4.MacrobenchmarkRule
 
-@RequiresApi(29)
+/**
+ * Temporary, while transitioning to new metrics
+ */
+@RequiresApi(23)
+fun getStartupMetrics() = if (Build.VERSION.SDK_INT >= 29) {
+    listOf(StartupTimingMetric(), StartupTimingLegacyMetric())
+} else {
+    listOf(StartupTimingMetric())
+}
+
+@RequiresApi(23)
 fun MacrobenchmarkRule.measureStartup(
     compilationMode: CompilationMode,
     startupMode: StartupMode,
@@ -33,7 +45,7 @@
     setupIntent: Intent.() -> Unit = {}
 ) = measureRepeated(
     packageName = packageName,
-    metrics = listOf(StartupTimingMetric()),
+    metrics = getStartupMetrics(),
     compilationMode = compilationMode,
     iterations = iterations,
     startupMode = startupMode
diff --git a/textclassifier/textclassifier/src/main/res/values-te/strings.xml b/textclassifier/textclassifier/src/main/res/values-te/strings.xml
index 8a67e8e..5a654e0 100644
--- a/textclassifier/textclassifier/src/main/res/values-te/strings.xml
+++ b/textclassifier/textclassifier/src/main/res/values-te/strings.xml
@@ -16,8 +16,8 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="email" msgid="6099716515489216517">"ఇమెయిల్ పంపు"</string>
-    <string name="email_desc" msgid="2189760120923982860">"ఎంచుకున్న అడ్రస్‌కు ఇమెయిల్‌ను పంపుతుంది"</string>
+    <string name="email" msgid="6099716515489216517">"ఈమెయిల్‌ పంపు"</string>
+    <string name="email_desc" msgid="2189760120923982860">"ఎంచుకున్న అడ్రస్‌కు ఈమెయిల్‌ను పంపుతుంది"</string>
     <string name="dial" msgid="2101464860090311277">"కాల్ చేయి"</string>
     <string name="dial_desc" msgid="1195407206406821463">"ఎంచుకున్న ఫోన్ నంబర్‌కు కాల్ చేస్తుంది"</string>
     <string name="browse" msgid="4753676368851695348">"తెరువు"</string>
diff --git a/vectordrawable/vectordrawable/src/androidTest/java/androidx/vectordrawable/graphics/drawable/tests/VectorDrawableTest.java b/vectordrawable/vectordrawable/src/androidTest/java/androidx/vectordrawable/graphics/drawable/tests/VectorDrawableTest.java
index 6933388..a74bd23 100644
--- a/vectordrawable/vectordrawable/src/androidTest/java/androidx/vectordrawable/graphics/drawable/tests/VectorDrawableTest.java
+++ b/vectordrawable/vectordrawable/src/androidTest/java/androidx/vectordrawable/graphics/drawable/tests/VectorDrawableTest.java
@@ -473,23 +473,17 @@
         // d1 will be mutated, while d2 / d3 will not.
         int originalAlpha = d2.getAlpha();
 
-        d1.setAlpha(0x80);
-        assertEquals(0x80, d1.getAlpha());
-        assertEquals(0x80, d2.getAlpha());
-        assertEquals(0x80, d3.getAlpha());
-
         d1.mutate();
         d1.setAlpha(0x40);
         assertEquals(0x40, d1.getAlpha());
-        assertEquals(0x80, d2.getAlpha());
-        assertEquals(0x80, d3.getAlpha());
+        assertEquals(originalAlpha, d2.getAlpha());
+        assertEquals(originalAlpha, d3.getAlpha());
 
+        d2.mutate();
         d2.setAlpha(0x20);
         assertEquals(0x40, d1.getAlpha());
         assertEquals(0x20, d2.getAlpha());
-        assertEquals(0x20, d3.getAlpha());
-
-        d2.setAlpha(originalAlpha);
+        assertEquals(originalAlpha, d3.getAlpha());
     }
 
     @Test
diff --git a/viewpager/viewpager/src/androidTest/java/androidx/viewpager/widget/BaseViewPagerTest.java b/viewpager/viewpager/src/androidTest/java/androidx/viewpager/widget/BaseViewPagerTest.java
index 52100a6..ca37f4c 100644
--- a/viewpager/viewpager/src/androidTest/java/androidx/viewpager/widget/BaseViewPagerTest.java
+++ b/viewpager/viewpager/src/androidTest/java/androidx/viewpager/widget/BaseViewPagerTest.java
@@ -72,6 +72,7 @@
 import androidx.test.filters.FlakyTest;
 import androidx.test.filters.LargeTest;
 import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
 import androidx.test.rule.ActivityTestRule;
 import androidx.viewpager.test.R;
 
@@ -463,6 +464,7 @@
                 mViewPager.getCurrentItem());
     }
 
+    @SdkSuppress(maxSdkVersion = 30) // b/202408966
     @Test
     @MediumTest
     public void testFlingAfterStretchAtLeft() {
@@ -475,6 +477,7 @@
         }
     }
 
+    @SdkSuppress(maxSdkVersion = 30) // b/202408966
     @Test
     @MediumTest
     public void testFlingAfterStretchAtRight() throws Throwable {
diff --git a/wear/compose/compose-foundation/build.gradle b/wear/compose/compose-foundation/build.gradle
index 0747374..af7e706 100644
--- a/wear/compose/compose-foundation/build.gradle
+++ b/wear/compose/compose-foundation/build.gradle
@@ -43,9 +43,9 @@
         testImplementation(libs.testRunner)
         testImplementation(libs.junit)
 
-        androidTestImplementation project(path: ':compose:ui:ui-test')
-        androidTestImplementation project(path: ':compose:ui:ui-test-junit4')
-        androidTestImplementation project(path: ':compose:test-utils')
+        androidTestImplementation(project(":compose:ui:ui-test"))
+        androidTestImplementation(project(":compose:ui:ui-test-junit4"))
+        androidTestImplementation(project(":compose:test-utils"))
         androidTestImplementation(libs.testRunner)
 
         samples(project(":wear:compose:compose-foundation-samples"))
diff --git a/wear/compose/compose-material/api/current.txt b/wear/compose/compose-material/api/current.txt
index 028bbf2..c9abe985 100644
--- a/wear/compose/compose-material/api/current.txt
+++ b/wear/compose/compose-material/api/current.txt
@@ -126,10 +126,12 @@
 
   public final class ContentAlphaKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float> getLocalContentAlpha();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float> LocalContentAlpha;
   }
 
   public final class ContentColorKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> LocalContentColor;
   }
 
   public final class CurvedTextKt {
@@ -145,6 +147,19 @@
     method @androidx.compose.runtime.Composable public static void Icon(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
   }
 
+  @androidx.compose.runtime.Stable public interface InlineSliderColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> backgroundColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> barColor(boolean enabled, boolean selected);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> spacerColor(boolean enabled);
+  }
+
+  public final class InlineSliderDefaults {
+    method @androidx.compose.runtime.Composable public androidx.wear.compose.material.InlineSliderColors colors(optional long backgroundColor, optional long spacerColor, optional long selectedBarColor, optional long unselectedBarColor, optional long disabledBackgroundColor, optional long disabledSpacerColor, optional long disabledSelectedBarColor, optional long disabledUnselectedBarColor);
+    method public androidx.compose.ui.graphics.vector.ImageVector getDecreaseIcon();
+    property public final androidx.compose.ui.graphics.vector.ImageVector DecreaseIcon;
+    field public static final androidx.wear.compose.material.InlineSliderDefaults INSTANCE;
+  }
+
   public final class ListHeaderKt {
     method @androidx.compose.runtime.Composable public static void ListHeader(optional androidx.compose.ui.Modifier modifier, optional long contentColor, optional long backgroundColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
@@ -282,6 +297,10 @@
   public final class ShapesKt {
   }
 
+  public final class SliderKt {
+    method @androidx.compose.runtime.Composable public static void InlineSlider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, int steps, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional boolean segmented, optional kotlin.jvm.functions.Function0<kotlin.Unit> decreaseIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit> increaseIcon, optional androidx.wear.compose.material.InlineSliderColors colors);
+  }
+
   public final class SwipeToDismissBoxKt {
   }
 
@@ -293,6 +312,7 @@
     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();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> LocalTextStyle;
   }
 
   public final class TimeTextKt {
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 08ee56a..aba14a3 100644
--- a/wear/compose/compose-material/api/public_plus_experimental_current.txt
+++ b/wear/compose/compose-material/api/public_plus_experimental_current.txt
@@ -126,10 +126,12 @@
 
   public final class ContentAlphaKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float> getLocalContentAlpha();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float> LocalContentAlpha;
   }
 
   public final class ContentColorKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> LocalContentColor;
   }
 
   public final class CurvedTextKt {
@@ -160,6 +162,19 @@
     method @androidx.compose.runtime.Composable public static void Icon(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
   }
 
+  @androidx.compose.runtime.Stable public interface InlineSliderColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> backgroundColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> barColor(boolean enabled, boolean selected);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> spacerColor(boolean enabled);
+  }
+
+  public final class InlineSliderDefaults {
+    method @androidx.compose.runtime.Composable public androidx.wear.compose.material.InlineSliderColors colors(optional long backgroundColor, optional long spacerColor, optional long selectedBarColor, optional long unselectedBarColor, optional long disabledBackgroundColor, optional long disabledSpacerColor, optional long disabledSelectedBarColor, optional long disabledUnselectedBarColor);
+    method public androidx.compose.ui.graphics.vector.ImageVector getDecreaseIcon();
+    property public final androidx.compose.ui.graphics.vector.ImageVector DecreaseIcon;
+    field public static final androidx.wear.compose.material.InlineSliderDefaults INSTANCE;
+  }
+
   public final class ListHeaderKt {
     method @androidx.compose.runtime.Composable public static void ListHeader(optional androidx.compose.ui.Modifier modifier, optional long contentColor, optional long backgroundColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
@@ -308,6 +323,10 @@
   public final class ShapesKt {
   }
 
+  public final class SliderKt {
+    method @androidx.compose.runtime.Composable public static void InlineSlider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, int steps, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional boolean segmented, optional kotlin.jvm.functions.Function0<kotlin.Unit> decreaseIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit> increaseIcon, optional androidx.wear.compose.material.InlineSliderColors colors);
+  }
+
   @androidx.wear.compose.material.ExperimentalWearMaterialApi public enum SwipeDismissTarget {
     enum_constant public static final androidx.wear.compose.material.SwipeDismissTarget Dismissal;
     enum_constant public static final androidx.wear.compose.material.SwipeDismissTarget Original;
@@ -394,6 +413,7 @@
     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();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> LocalTextStyle;
   }
 
   @androidx.compose.runtime.Stable @androidx.wear.compose.material.ExperimentalWearMaterialApi public interface ThresholdConfig {
diff --git a/wear/compose/compose-material/api/restricted_current.txt b/wear/compose/compose-material/api/restricted_current.txt
index 028bbf2..c9abe985 100644
--- a/wear/compose/compose-material/api/restricted_current.txt
+++ b/wear/compose/compose-material/api/restricted_current.txt
@@ -126,10 +126,12 @@
 
   public final class ContentAlphaKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float> getLocalContentAlpha();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Float> LocalContentAlpha;
   }
 
   public final class ContentColorKt {
     method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> getLocalContentColor();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.graphics.Color> LocalContentColor;
   }
 
   public final class CurvedTextKt {
@@ -145,6 +147,19 @@
     method @androidx.compose.runtime.Composable public static void Icon(androidx.compose.ui.graphics.painter.Painter painter, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional long tint);
   }
 
+  @androidx.compose.runtime.Stable public interface InlineSliderColors {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> backgroundColor(boolean enabled);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> barColor(boolean enabled, boolean selected);
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> spacerColor(boolean enabled);
+  }
+
+  public final class InlineSliderDefaults {
+    method @androidx.compose.runtime.Composable public androidx.wear.compose.material.InlineSliderColors colors(optional long backgroundColor, optional long spacerColor, optional long selectedBarColor, optional long unselectedBarColor, optional long disabledBackgroundColor, optional long disabledSpacerColor, optional long disabledSelectedBarColor, optional long disabledUnselectedBarColor);
+    method public androidx.compose.ui.graphics.vector.ImageVector getDecreaseIcon();
+    property public final androidx.compose.ui.graphics.vector.ImageVector DecreaseIcon;
+    field public static final androidx.wear.compose.material.InlineSliderDefaults INSTANCE;
+  }
+
   public final class ListHeaderKt {
     method @androidx.compose.runtime.Composable public static void ListHeader(optional androidx.compose.ui.Modifier modifier, optional long contentColor, optional long backgroundColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
   }
@@ -282,6 +297,10 @@
   public final class ShapesKt {
   }
 
+  public final class SliderKt {
+    method @androidx.compose.runtime.Composable public static void InlineSlider(float value, kotlin.jvm.functions.Function1<? super java.lang.Float,kotlin.Unit> onValueChange, int steps, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.ranges.ClosedFloatingPointRange<java.lang.Float> valueRange, optional boolean segmented, optional kotlin.jvm.functions.Function0<kotlin.Unit> decreaseIcon, optional kotlin.jvm.functions.Function0<kotlin.Unit> increaseIcon, optional androidx.wear.compose.material.InlineSliderColors colors);
+  }
+
   public final class SwipeToDismissBoxKt {
   }
 
@@ -293,6 +312,7 @@
     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();
+    property public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.TextStyle> LocalTextStyle;
   }
 
   public final class TimeTextKt {
diff --git a/wear/compose/compose-material/benchmark/build.gradle b/wear/compose/compose-material/benchmark/build.gradle
index 4c7b67e..f97e85b 100644
--- a/wear/compose/compose-material/benchmark/build.gradle
+++ b/wear/compose/compose-material/benchmark/build.gradle
@@ -35,7 +35,6 @@
     kotlinPlugin project(":compose:compiler:compiler")
 
     androidTestImplementation project(":benchmark:benchmark-junit4")
-    androidTestImplementation project(":benchmark:benchmark-macro-junit4")
     androidTestImplementation project(":compose:runtime:runtime")
     androidTestImplementation project(":compose:ui:ui-text:ui-text-benchmark")
     androidTestImplementation project(":compose:foundation:foundation")
diff --git a/wear/compose/compose-material/build.gradle b/wear/compose/compose-material/build.gradle
index 892cfc4..9393dcf 100644
--- a/wear/compose/compose-material/build.gradle
+++ b/wear/compose/compose-material/build.gradle
@@ -37,15 +37,17 @@
         api(project(":compose:runtime:runtime"))
 
         implementation(libs.kotlinStdlib)
+        implementation(project(":compose:animation:animation"))
         implementation(project(":compose:material:material"))
         implementation(project(":compose:material:material-ripple"))
         implementation(project(":compose:ui:ui-util"))
         implementation(project(":wear:compose:compose-foundation"))
 
-        androidTestImplementation project(path: ':compose:ui:ui-test')
-        androidTestImplementation project(path: ':compose:ui:ui-test-junit4')
-        androidTestImplementation project(path: ':compose:test-utils')
-        androidTestImplementation project(":test:screenshot:screenshot")
+        androidTestImplementation(project(":compose:ui:ui-test"))
+        androidTestImplementation(project(":compose:ui:ui-test-junit4"))
+        androidTestImplementation(project(":compose:test-utils"))
+
+        androidTestImplementation(project(":test:screenshot:screenshot"))
         androidTestImplementation(libs.testRunner)
         androidTestImplementation(libs.truth)
 
@@ -72,6 +74,7 @@
                 api(project(":compose:runtime:runtime"))
                 api("androidx.annotation:annotation:1.1.0")
 
+                implementation(project(":compose:animation:animation"))
                 implementation(project(":compose:material:material"))
                 implementation(project(":compose:material:material-ripple"))
                 implementation(project(":compose:ui:ui-util"))
@@ -96,9 +99,9 @@
                 implementation(libs.testRunner)
                 implementation(libs.truth)
                 implementation(project(":compose:ui:ui-util"))
-                implementation(project(path: ':compose:ui:ui-test'))
-                implementation(project(path: ':compose:ui:ui-test-junit4'))
-                implementation(project(path: ':compose:test-utils'))
+                implementation(project(":compose:ui:ui-test"))
+                implementation(project(":compose:ui:ui-test-junit4"))
+                implementation(project(":compose:test-utils"))
                 implementation(project(":test:screenshot:screenshot"))
             }
         }
diff --git a/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/SliderSample.kt b/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/SliderSample.kt
new file mode 100644
index 0000000..060f8bc
--- /dev/null
+++ b/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/SliderSample.kt
@@ -0,0 +1,51 @@
+/*
+ * 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.material.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.wear.compose.material.InlineSlider
+
+@Sampled
+@Composable
+fun InlineSliderSample() {
+    var value by remember { mutableStateOf(4.5f) }
+    InlineSlider(
+        value = value,
+        onValueChange = { value = it },
+        valueRange = 3f..6f,
+        steps = 5,
+        segmented = false
+    )
+}
+
+@Sampled
+@Composable
+fun InlineSliderSegmentedSample() {
+    var value by remember { mutableStateOf(2f) }
+    InlineSlider(
+        value = value,
+        onValueChange = { value = it },
+        valueRange = 1f..4f,
+        steps = 7,
+        segmented = true
+    )
+}
diff --git a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/InlineSliderTest.kt b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/InlineSliderTest.kt
new file mode 100644
index 0000000..156e9f1
--- /dev/null
+++ b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/InlineSliderTest.kt
@@ -0,0 +1,163 @@
+/*
+ * 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.material
+
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.ProgressBarRangeInfo
+import androidx.compose.ui.test.assertRangeInfoEquals
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import org.junit.Rule
+import org.junit.Test
+
+@ExperimentalWearMaterialApi
+class InlineSliderTest {
+    @get:Rule
+    val rule = createComposeRule()
+
+    @Test
+    fun supports_testtag() {
+        rule.setContentWithTheme {
+            InlineSlider(
+                value = 1f,
+                onValueChange = {},
+                steps = 5,
+                modifier = Modifier.testTag(TEST_TAG)
+            )
+        }
+
+        rule.onNodeWithTag(TEST_TAG).assertExists()
+    }
+
+    @Test
+    fun coerces_value_top_limit() {
+        val state = mutableStateOf(4f)
+
+        rule.setContentWithTheme {
+            InlineSlider(
+                value = state.value,
+                onValueChange = { state.value = it },
+                valueRange = 0f..10f,
+                steps = 4,
+                modifier = Modifier.testTag(TEST_TAG)
+            )
+        }
+        rule.runOnIdle {
+            state.value = 20f
+        }
+        rule.onNodeWithTag(TEST_TAG)
+            .assertRangeInfoEquals(ProgressBarRangeInfo(10f, 0f..10f, 4))
+    }
+
+    @Test
+    fun coerces_value_lower_limit() {
+        val state = mutableStateOf(4f)
+
+        rule.setContentWithTheme {
+            InlineSlider(
+                value = state.value,
+                onValueChange = { state.value = it },
+                valueRange = 0f..10f,
+                steps = 4,
+                modifier = Modifier.testTag(TEST_TAG)
+            )
+        }
+        rule.runOnIdle {
+            state.value = -20f
+        }
+        rule.onNodeWithTag(TEST_TAG)
+            .assertRangeInfoEquals(ProgressBarRangeInfo(0f, 0f..10f, 4))
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun throws_when_steps_negative() {
+        rule.setContent {
+            InlineSlider(value = 0f, onValueChange = {}, steps = -1)
+        }
+    }
+
+    @Test
+    fun snaps_value_exactly() {
+        val state = mutableStateOf(0f)
+        val range = 0f..1f
+
+        rule.setContentWithTheme {
+            InlineSlider(
+                modifier = Modifier.testTag(TEST_TAG),
+                value = state.value,
+                onValueChange = { state.value = it },
+                steps = 4,
+                valueRange = range
+            )
+        }
+
+        rule.runOnUiThread {
+            state.value = 0.6f
+        }
+
+        rule.onNodeWithTag(TEST_TAG)
+            .assertRangeInfoEquals(ProgressBarRangeInfo(0.6f, range, 4))
+    }
+
+    @Test
+    fun snaps_value_to_previous() {
+        val state = mutableStateOf(0f)
+        val range = 0f..1f
+
+        rule.setContentWithTheme {
+            InlineSlider(
+                modifier = Modifier.testTag(TEST_TAG),
+                value = state.value,
+                onValueChange = { state.value = it },
+                steps = 4,
+                valueRange = range
+            )
+        }
+
+        rule.runOnUiThread {
+            state.value = 0.65f
+        }
+
+        rule.onNodeWithTag(TEST_TAG)
+            .assertRangeInfoEquals(ProgressBarRangeInfo(0.6f, range, 4))
+    }
+
+    @Test
+    fun snaps_value_to_next() {
+        val state = mutableStateOf(0f)
+        val range = 0f..1f
+
+        rule.setContentWithTheme {
+            InlineSlider(
+                modifier = Modifier.testTag(TEST_TAG),
+                value = state.value,
+                onValueChange = { state.value = it },
+                steps = 4,
+                valueRange = range
+            )
+        }
+
+        rule.runOnUiThread {
+            state.value = 0.55f
+        }
+
+        rule.onNodeWithTag(TEST_TAG)
+            .assertRangeInfoEquals(ProgressBarRangeInfo(0.6f, range, 4))
+    }
+}
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 1ba7a69..96f1798d 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
@@ -18,7 +18,6 @@
 
 import androidx.compose.ui.geometry.lerp
 import androidx.compose.animation.AnimatedVisibility
-import androidx.compose.animation.ExperimentalAnimationApi
 import androidx.compose.animation.fadeIn
 import androidx.compose.animation.fadeOut
 import androidx.compose.foundation.ScrollState
@@ -96,7 +95,6 @@
  * @param scrollState the scrollState 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(
     scrollState: ScrollState,
@@ -123,7 +121,6 @@
  * PositionIndicatorState.
  * @param modifier The modifier to be applied to the component
  */
-@OptIn(ExperimentalAnimationApi::class)
 @Composable
 public fun PositionIndicator(
     scalingLazyListState: ScalingLazyListState,
@@ -152,7 +149,6 @@
  * PositionIndicatorState.
  * @param modifier The modifier to be applied to the component
  */
-@OptIn(ExperimentalAnimationApi::class)
 @Composable
 public fun PositionIndicator(
     lazyListState: LazyListState,
@@ -182,7 +178,6 @@
  * @param modifier The modifier to be applied to the component
  * @param color the color to draw the indicator on.
  */
-@OptIn(ExperimentalAnimationApi::class)
 @Composable
 public fun PositionIndicator(
     rsbRatio: Float,
@@ -229,7 +224,6 @@
  * @param background the color to draw the non-active part of the position indicator.
  * @param autoHide whether the indicator should be automatically hidden after showing the change in
  */
-@OptIn(ExperimentalAnimationApi::class)
 @Composable
 public fun PositionIndicator(
     state: PositionIndicatorState,
diff --git a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Slider.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Slider.kt
new file mode 100644
index 0000000..4db4d33
--- /dev/null
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Slider.kt
@@ -0,0 +1,477 @@
+/*
+ * 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.material
+
+import androidx.compose.animation.animateColorAsState
+import androidx.compose.animation.core.animateFloatAsState
+import androidx.compose.foundation.background
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.progressSemantics
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Add
+import androidx.compose.material.icons.materialIcon
+import androidx.compose.material.icons.materialPath
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.Immutable
+import androidx.compose.runtime.Stable
+import androidx.compose.runtime.State
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.draw.drawWithContent
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.platform.LocalLayoutDirection
+import androidx.compose.ui.semantics.disabled
+import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.semantics.setProgress
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.util.lerp
+import kotlin.math.roundToInt
+
+/**
+ * [InlineSlider] allows users to make a selection from a range of values. The range of selections
+ * is shown as a bar between the minimum and maximum values of the range,
+ * from which users may select a single value.
+ * InlineSlider is ideal for adjusting settings such as volume or brightness.
+ *
+ * Value can be increased and decreased by clicking on the increase and decrease buttons, located
+ * accordingly to the start and end of the control. Buttons can have custom icons -
+ * [decreaseIcon] and [increaseIcon].
+ *
+ * The selection bar in the middle of control can have separators if [segmented] flag is set to true.
+ * A single step value is calculated as the difference between min and max values of [valueRange]
+ * divided by [steps] value.
+ *
+ * A continuous non-segmented slider sample:
+ * @sample androidx.wear.compose.material.samples.InlineSliderSample
+ *
+ * A segmented slider sample:
+ * @sample androidx.wear.compose.material.samples.InlineSliderSegmentedSample
+ *
+ * @param value Current value of the Slider. If outside of [valueRange] provided, value will be
+ * coerced to this range.
+ * @param onValueChange Lambda in which value should be updated
+ * @param steps Specifies the number of discrete values, evenly distributed
+ * between across the whole value range. Must not be negative. If 0, slider will have only
+ * min and max values and no steps in between
+ * @param modifier Modifiers for the Slider layout
+ * @param enabled Controls the enabled state of the slider.
+ * When `false`, this slider will not be clickable
+ * @param valueRange Range of values that Slider value can take. Passed [value] will be coerced to
+ * this range
+ * @param segmented A boolean value which specifies whether a bar will be split into
+ * segments or not. Recommendation is while using this flag do not have more than 8 [steps]
+ * as it might affect user experience. By default true if number of [steps] is <=8.
+ * @param decreaseIcon A slot for an icon which is placed on the decrease (start) button
+ * @param increaseIcon A slot for an icon which is placed on the increase (end) button
+ * @param colors [InlineSliderColors] that will be used to resolve the background and content
+ * color for this slider in different states
+ */
+@Composable
+fun InlineSlider(
+    value: Float,
+    onValueChange: (Float) -> Unit,
+    steps: Int,
+    modifier: Modifier = Modifier,
+    enabled: Boolean = true,
+    valueRange: ClosedFloatingPointRange<Float> = 0f..(steps + 1).toFloat(),
+    segmented: Boolean = steps <= 8,
+    decreaseIcon: @Composable () -> Unit = {
+        Icon(
+            imageVector = InlineSliderDefaults.DecreaseIcon,
+            contentDescription = "Decrease" // TODO(b/204187777) i18n
+        )
+    },
+    increaseIcon: @Composable () -> Unit = {
+        Icon(
+            imageVector = Icons.Filled.Add,
+            contentDescription = "Increase" // TODO(b/204187777) i18n
+        )
+    },
+    colors: InlineSliderColors = InlineSliderDefaults.colors(),
+) {
+    require(steps >= 0) { "steps should be >= 0" }
+    val currentStep =
+        remember(value, valueRange, steps) { snapValueToStep(value, valueRange, steps) }
+    Box(
+        modifier = modifier
+            .fillMaxWidth()
+            .inlineSliderSemantics(
+                currentStep,
+                enabled,
+                onValueChange,
+                valueRange,
+                steps
+            )
+            .height(InlineSliderDefaults.SliderHeight)
+            .clip(MaterialTheme.shapes.small),
+    ) {
+
+        val visibleSegments = if (segmented) steps + 1 else 1
+
+        val updateValue: (Int) -> Unit = { stepDiff ->
+            val newValue = calculateCurrentStepValue(currentStep + stepDiff, steps, valueRange)
+            if (newValue != value) onValueChange(newValue)
+        }
+        val selectedBarColor = colors.barColor(enabled, true)
+        val unselectedBarColor = colors.barColor(enabled, false)
+        val backgroundColor = colors.backgroundColor(enabled)
+
+        Row(
+            verticalAlignment = Alignment.CenterVertically,
+            horizontalArrangement = Arrangement.Start,
+            modifier = Modifier.fillMaxWidth().background(backgroundColor.value)
+        ) {
+            ActionButton(
+                enabled = enabled,
+                onClick = { updateValue(-1) },
+                contentAlignment = Alignment.CenterStart,
+                modifier = Modifier
+                    .padding(start = InlineSliderDefaults.OuterHorizontalMargin),
+                content = decreaseIcon
+            )
+
+            Box(
+                Modifier.width(InlineSliderDefaults.SpacersWidth)
+                    .fillMaxHeight()
+                    .background(colors.spacerColor(enabled).value)
+            )
+
+            val valueRatio by animateFloatAsState(currentStep.toFloat() / (steps + 1).toFloat())
+
+            Box(
+                modifier = Modifier
+                    .padding(horizontal = InlineSliderDefaults.BarMargin)
+                    .height(InlineSliderDefaults.BarHeight)
+                    .weight(1f)
+                    .clip(MaterialTheme.shapes.small)
+                    .drawProgressBar(
+                        selectedBarColor = selectedBarColor,
+                        unselectedBarColor = unselectedBarColor,
+                        backgroundColor = backgroundColor,
+                        visibleSegments = visibleSegments,
+                        valueRatio = valueRatio,
+                        direction = LocalLayoutDirection.current
+                    )
+            )
+
+            Box(
+                Modifier.width(InlineSliderDefaults.SpacersWidth)
+                    .fillMaxHeight()
+                    .background(colors.spacerColor(enabled).value)
+            )
+
+            ActionButton(
+                enabled = enabled,
+                onClick = { updateValue(1) },
+                contentAlignment = Alignment.CenterEnd,
+                modifier = Modifier.padding(end = InlineSliderDefaults.OuterHorizontalMargin),
+                content = increaseIcon
+            )
+        }
+    }
+}
+
+/**
+ * Represents the background and content colors used in [InlineSlider] in different states.
+ */
+@Stable
+public interface InlineSliderColors {
+    /**
+     * Represents the background color for this slider, depending on [enabled].
+     * @param enabled Whether the slider is enabled
+     */
+    @Composable
+    public fun backgroundColor(enabled: Boolean): State<Color>
+
+    /**
+     * Represents the color of the progress bar in the middle of the slider,
+     * depending on the [enabled] and [selected].
+     *
+     * @param enabled Whether the slider is enabled
+     * @param selected Whether color is for selected part of the slider
+     */
+    @Composable
+    public fun barColor(enabled: Boolean, selected: Boolean): State<Color>
+
+    /**
+     * Represents the color of the spacer between buttons and a progress bar,
+     * depending on the [enabled]
+     *
+     * @param enabled Whether the slider is enabled
+     */
+    @Composable
+    public fun spacerColor(enabled: Boolean): State<Color>
+}
+
+/**
+ * Defaults used by [InlineSlider]
+ */
+object InlineSliderDefaults {
+
+    /**
+     * The default height applied for the [InlineSlider].
+     * Note that you can override it by applying Modifier.size directly on [InlineSlider].
+     */
+    internal val SliderHeight = 52.dp
+
+    internal val ControlSize = 36.dp
+
+    internal val OuterHorizontalMargin = 8.dp
+
+    internal val SpacersWidth = 1.dp
+
+    internal val BarMargin = 7.dp
+
+    internal val BarHeight = 6.dp
+
+    internal val BarSeparatorWidth = 1.dp
+
+    /**
+     * Creates a [InlineSliderColors] that represents the default background
+     * and content colors used in an [InlineSlider].
+     *
+     * @param backgroundColor The background color of this [InlineSlider] when enabled
+     * @param spacerColor The color of the spacer between buttons and a progress bar when enabled
+     * @param selectedBarColor The color of the progress bar when enabled
+     * @param unselectedBarColor The background color of the progress bar when enabled
+     * @param disabledBackgroundColor The background color of this [InlineSlider] when disabled
+     * @param disabledSpacerColor The color of the spacer between buttons and a progress bar
+     * when disabled
+     * @param disabledSelectedBarColor The color of the progress bar when disabled
+     * @param disabledUnselectedBarColor The background color of the progress bar when disabled
+     */
+    @Composable
+    fun colors(
+        backgroundColor: Color = MaterialTheme.colors.surface,
+        spacerColor: Color = MaterialTheme.colors.background,
+        selectedBarColor: Color = MaterialTheme.colors.secondary,
+        unselectedBarColor: Color = MaterialTheme.colors.onSurface.copy(0.1f),
+        disabledBackgroundColor: Color = backgroundColor.copy(alpha = ContentAlpha.disabled),
+        disabledSpacerColor: Color = spacerColor,
+        disabledSelectedBarColor: Color = selectedBarColor.copy(alpha = ContentAlpha.disabled),
+        disabledUnselectedBarColor: Color = unselectedBarColor.copy(alpha = 0.05f),
+    ): InlineSliderColors = DefaultInlineSliderColors(
+        backgroundColor = backgroundColor,
+        spacerColor = spacerColor,
+        selectedBarColor = selectedBarColor,
+        unselectedBarColor = unselectedBarColor,
+        disabledBackgroundColor = disabledBackgroundColor,
+        disabledSpacerColor = disabledSpacerColor,
+        disabledSelectedBarColor = disabledSelectedBarColor,
+        disabledUnselectedBarColor = disabledUnselectedBarColor
+    )
+
+    /**
+     * An [Icon] with a minus sign.
+     */
+    val DecreaseIcon: ImageVector
+        get() = if (_decreaseIcon != null) _decreaseIcon!!
+        else {
+            _decreaseIcon = materialIcon(name = "DecreaseIcon") {
+                materialPath {
+                    moveTo(19.0f, 13.0f)
+                    horizontalLineTo(5.0f)
+                    verticalLineToRelative(-2.0f)
+                    horizontalLineToRelative(14.0f)
+                    verticalLineToRelative(2.0f)
+                    close()
+                }
+            }
+            _decreaseIcon!!
+        }
+
+    private var _decreaseIcon: ImageVector? = null
+}
+
+@Immutable
+private class DefaultInlineSliderColors(
+    private val backgroundColor: Color,
+    private val spacerColor: Color,
+    private val selectedBarColor: Color,
+    private val unselectedBarColor: Color,
+    private val disabledBackgroundColor: Color,
+    private val disabledSpacerColor: Color,
+    private val disabledSelectedBarColor: Color,
+    private val disabledUnselectedBarColor: Color,
+) : InlineSliderColors {
+    @Composable
+    override fun backgroundColor(enabled: Boolean): State<Color> =
+        animateColorAsState(if (enabled) backgroundColor else disabledBackgroundColor)
+
+    @Composable
+    override fun spacerColor(enabled: Boolean): State<Color> =
+        animateColorAsState(
+            if (enabled) spacerColor else disabledSpacerColor
+        )
+
+    @Composable
+    override fun barColor(enabled: Boolean, selected: Boolean): State<Color> =
+        animateColorAsState(
+            if (enabled) {
+                if (selected) selectedBarColor else unselectedBarColor
+            } else {
+                if (selected) disabledSelectedBarColor else disabledUnselectedBarColor
+            }
+        )
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other == null || this::class != other::class) return false
+
+        other as DefaultInlineSliderColors
+
+        if (backgroundColor != other.backgroundColor) return false
+        if (spacerColor != other.spacerColor) return false
+        if (selectedBarColor != other.selectedBarColor) return false
+        if (unselectedBarColor != other.unselectedBarColor) return false
+        if (disabledBackgroundColor != other.disabledBackgroundColor) return false
+        if (disabledSpacerColor != other.disabledSpacerColor) return false
+        if (disabledSelectedBarColor != other.disabledSelectedBarColor) return false
+        if (disabledUnselectedBarColor != other.disabledUnselectedBarColor) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = backgroundColor.hashCode()
+        result = 31 * result + spacerColor.hashCode()
+        result = 31 * result + selectedBarColor.hashCode()
+        result = 31 * result + unselectedBarColor.hashCode()
+        result = 31 * result + disabledBackgroundColor.hashCode()
+        result = 31 * result + disabledSpacerColor.hashCode()
+        result = 31 * result + disabledSelectedBarColor.hashCode()
+        result = 31 * result + disabledUnselectedBarColor.hashCode()
+        return result
+    }
+}
+
+@Composable
+private fun ActionButton(
+    enabled: Boolean,
+    onClick: () -> Unit,
+    contentAlignment: Alignment,
+    modifier: Modifier,
+    content: @Composable () -> Unit
+) {
+    Box(
+        modifier = Modifier.width(InlineSliderDefaults.ControlSize)
+            .fillMaxHeight()
+            .clickable(enabled = enabled, onClick = onClick)
+            .then(modifier),
+        contentAlignment = contentAlignment
+    ) {
+        CompositionLocalProvider(
+            LocalContentAlpha provides
+                if (enabled) LocalContentAlpha.current else ContentAlpha.disabled,
+            content = content
+        )
+    }
+}
+
+private fun calculateCurrentStepValue(
+    currentStep: Int,
+    steps: Int,
+    valueRange: ClosedFloatingPointRange<Float>
+): Float = lerp(
+    valueRange.start, valueRange.endInclusive,
+    currentStep.toFloat() / (steps + 1).toFloat()
+).coerceIn(valueRange)
+
+private fun snapValueToStep(
+    value: Float,
+    valueRange: ClosedFloatingPointRange<Float>,
+    steps: Int
+): Int = ((value - valueRange.start) / (valueRange.endInclusive - valueRange.start) * (steps + 1))
+    .roundToInt().coerceIn(0, steps + 1)
+
+private fun Modifier.inlineSliderSemantics(
+    step: Int,
+    enabled: Boolean,
+    onValueChange: (Float) -> Unit,
+    valueRange: ClosedFloatingPointRange<Float>,
+    steps: Int
+): Modifier = semantics(mergeDescendants = true) {
+    if (!enabled) disabled()
+    setProgress(
+        action = { targetValue ->
+            val newStepIndex = snapValueToStep(targetValue, valueRange, steps)
+            if (step == newStepIndex) {
+                false
+            } else {
+                onValueChange(targetValue)
+                true
+            }
+        }
+    )
+}.progressSemantics(calculateCurrentStepValue(step, steps, valueRange), valueRange, steps)
+
+private fun Modifier.drawProgressBar(
+    selectedBarColor: State<Color>,
+    unselectedBarColor: State<Color>,
+    backgroundColor: State<Color>,
+    visibleSegments: Int,
+    valueRatio: Float,
+    direction: LayoutDirection,
+): Modifier = drawWithContent {
+    drawLine(
+        selectedBarColor.value,
+        Offset(
+            directedValue(direction, 0f, size.width * (1 - valueRatio)), size.height / 2
+        ),
+        Offset(
+            directedValue(direction, size.width * valueRatio, size.width), size.height / 2
+        ),
+        strokeWidth = InlineSliderDefaults.BarHeight.toPx()
+    )
+    drawLine(
+        unselectedBarColor.value,
+        Offset(
+            directedValue(direction, size.width * valueRatio, 0f), size.height / 2
+        ),
+        Offset(
+            directedValue(direction, size.width, size.width * (1 - valueRatio)), size.height / 2
+        ),
+        strokeWidth = InlineSliderDefaults.BarHeight.toPx()
+    )
+    for (separator in 1 until visibleSegments) {
+        val x = separator * size.width / visibleSegments
+        drawLine(
+            backgroundColor.value,
+            Offset(x, size.height / 2 - InlineSliderDefaults.BarHeight.toPx() / 2),
+            Offset(x, size.height / 2 + InlineSliderDefaults.BarHeight.toPx() / 2),
+            strokeWidth = InlineSliderDefaults.BarSeparatorWidth.toPx()
+        )
+    }
+}
+
+private fun <T> directedValue(layoutDirection: LayoutDirection, ltrValue: T, rtlValue: T): T =
+    if (layoutDirection == LayoutDirection.Ltr) ltrValue else rtlValue
\ No newline at end of file
diff --git a/wear/compose/compose-navigation/build.gradle b/wear/compose/compose-navigation/build.gradle
index effbc0e..5477573 100644
--- a/wear/compose/compose-navigation/build.gradle
+++ b/wear/compose/compose-navigation/build.gradle
@@ -36,11 +36,12 @@
     implementation(libs.kotlinStdlib)
     implementation("androidx.navigation:navigation-compose:2.4.0-alpha10")
 
-    androidTestImplementation project(path: ':compose:ui:ui-test')
-    androidTestImplementation project(path: ':compose:ui:ui-test-junit4')
-    androidTestImplementation project(path: ':compose:test-utils')
+    androidTestImplementation(project(":compose:test-utils"))
+    androidTestImplementation(project(":compose:ui:ui-test-junit4"))
+    androidTestImplementation(project(":compose:test-utils"))
     androidTestImplementation(libs.testRunner)
     androidTestImplementation(project(":wear:compose:compose-material"))
+    androidTestImplementation(libs.truth)
 }
 
 android {
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 5cab501..64f4b73 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
@@ -34,12 +34,15 @@
 import androidx.compose.ui.test.performClick
 import androidx.compose.ui.test.performTouchInput
 import androidx.compose.ui.test.swipeRight
+import androidx.lifecycle.Lifecycle
+import androidx.navigation.NavHostController
 import androidx.wear.compose.material.Button
 import androidx.wear.compose.material.CompactChip
 import androidx.wear.compose.material.ExperimentalWearMaterialApi
 import androidx.wear.compose.material.MaterialTheme
 import androidx.wear.compose.material.Text
 import androidx.wear.compose.material.ToggleButton
+import com.google.common.truth.Truth.assertThat
 import org.junit.Rule
 import org.junit.Test
 
@@ -170,9 +173,61 @@
         rule.onNodeWithText("On").assertExists()
     }
 
+    @Test
+    fun updates_lifecycle_for_initial_destination() {
+        lateinit var navController: NavHostController
+        rule.mainClock.autoAdvance = false
+        rule.setContentWithTheme {
+            navController = rememberSwipeDismissableNavController()
+            SwipeDismissWithNavigation(navController)
+        }
+
+        val entry = navController.getBackStackEntry(START)
+
+        rule.runOnIdle {
+            assertThat(entry.lifecycle.currentState).isEqualTo(Lifecycle.State.RESUMED)
+        }
+    }
+
+    @Test
+    fun updates_lifecycle_after_navigation() {
+        lateinit var navController: NavHostController
+        rule.setContentWithTheme {
+            navController = rememberSwipeDismissableNavController()
+            SwipeDismissWithNavigation(navController)
+        }
+
+        // Click to move to next destination then swipe back.
+        rule.onNodeWithText(START).performClick()
+
+        rule.runOnIdle {
+            assertThat(navController.currentBackStackEntry?.lifecycle?.currentState)
+                .isEqualTo(Lifecycle.State.RESUMED)
+        }
+    }
+
+    @Test
+    fun updates_lifecycle_after_navigation_and_swipe_back() {
+        lateinit var navController: NavHostController
+        rule.setContentWithTheme {
+            navController = rememberSwipeDismissableNavController()
+            SwipeDismissWithNavigation(navController)
+        }
+
+        // Click to move to next destination then swipe back.
+        rule.onNodeWithText(START).performClick()
+        rule.onNodeWithTag(TEST_TAG).performTouchInput({ swipeRight() })
+
+        rule.runOnIdle {
+            assertThat(navController.currentBackStackEntry?.lifecycle?.currentState)
+                .isEqualTo(Lifecycle.State.RESUMED)
+        }
+    }
+
     @Composable
-    fun SwipeDismissWithNavigation() {
-        val navController = rememberSwipeDismissableNavController()
+    fun SwipeDismissWithNavigation(
+        navController: NavHostController = rememberSwipeDismissableNavController()
+    ) {
         SwipeDismissableNavHost(
             navController = navController,
             startDestination = START,
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 c2ff968..69ed2e0 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
@@ -19,8 +19,11 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.SideEffect
 import androidx.compose.runtime.collectAsState
 import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.saveable.SaveableStateHolder
 import androidx.compose.runtime.saveable.rememberSaveableStateHolder
@@ -121,12 +124,15 @@
 
     val stateHolder = rememberSaveableStateHolder()
 
-    // Find the ComposeNavigator, returning early if it isn't found
-    // (such as is the case when using TestNavHostController)
-    val composeNavigator = navController.navigatorProvider.get<Navigator<out NavDestination>>(
+    // Find the WearNavigator, returning early if it isn't found
+    // (such as is the case when using TestNavHostController).
+    val wearNavigator = navController.navigatorProvider.get<Navigator<out NavDestination>>(
         WearNavigator.NAME
     ) as? WearNavigator ?: return
-    val backStack by composeNavigator.backStack.collectAsState()
+    val backStack by wearNavigator.backStack.collectAsState()
+    val transitionsInProgress by wearNavigator.transitionsInProgress.collectAsState()
+    var initialContent by remember { mutableStateOf(true) }
+
     val previous = if (backStack.size <= 1) null else backStack[backStack.lastIndex - 1]
     val current = if (backStack.isNotEmpty()) backStack.last() else throw IllegalArgumentException(
         "No WearNavigation.Destination has been added to the WearNavigator in this NavGraph. " +
@@ -135,11 +141,23 @@
 
     val state = rememberSwipeToDismissBoxState()
     LaunchedEffect(state.currentValue) {
+        // This effect operates when the swipe gesture is complete:
+        // 1) Resets the screen offset (otherwise, the next destination is draw off-screen)
+        // 2) Pops the navigation back stack to return to the previous level
         if (state.currentValue == SwipeDismissTarget.Dismissal) {
             state.snapTo(SwipeDismissTarget.Original)
             navController.popBackStack()
         }
     }
+    LaunchedEffect(state.isAnimationRunning) {
+        // This effect marks the transitions completed when swipe animations finish,
+        // so that the navigation backstack entries can go to Lifecycle.State.RESUMED.
+        if (state.isAnimationRunning == false) {
+                transitionsInProgress.forEach { entry ->
+                    wearNavigator.onTransitionComplete(entry)
+                }
+        }
+    }
 
     SwipeToDismissBox(
         state = state,
@@ -151,6 +169,17 @@
             BoxedStackEntryContent(if (isBackground) previous else current, stateHolder, modifier)
         }
     )
+
+    SideEffect {
+        if (initialContent) {
+            // There are no animations for showing the initial content, so mark transitions complete,
+            // allowing the navigation backstack entry to go to Lifecycle.State.RESUMED.
+            transitionsInProgress.forEach { entry ->
+                wearNavigator.onTransitionComplete(entry)
+            }
+            initialContent = false
+        }
+    }
 }
 
 @Composable
diff --git a/wear/compose/compose-navigation/src/main/java/androidx/wear/compose/navigation/WearNavigator.kt b/wear/compose/compose-navigation/src/main/java/androidx/wear/compose/navigation/WearNavigator.kt
index e90e7af..d6adcc6 100644
--- a/wear/compose/compose-navigation/src/main/java/androidx/wear/compose/navigation/WearNavigator.kt
+++ b/wear/compose/compose-navigation/src/main/java/androidx/wear/compose/navigation/WearNavigator.kt
@@ -30,6 +30,11 @@
 @Navigator.Name("wear-navigator")
 public class WearNavigator : Navigator<WearNavigator.Destination>() {
     /**
+     * Get the map of transitions currently in progress from the [state].
+     */
+    internal val transitionsInProgress get() = state.transitionsInProgress
+
+    /**
      * Get the back stack from the [state].
      */
     internal val backStack get() = state.backStack
@@ -40,7 +45,7 @@
         navigatorExtras: Extras?
     ) {
         entries.forEach { entry ->
-            state.pushWithTransition(entry)
+            state.push(entry)
         }
     }
 
@@ -51,6 +56,18 @@
     }
 
     /**
+     * Callback that removes the given [NavBackStackEntry] from the [map of the transitions in
+     * progress][transitionsInProgress]. This should be called in conjunction with [navigate] and
+     * [popBackStack] as those call are responsible for adding entries to [transitionsInProgress].
+     *
+     * Failing to call this method could result in entries being prevented from reaching their
+     * final Lifecycle.State.
+     */
+    internal fun onTransitionComplete(entry: NavBackStackEntry) {
+        state.markTransitionComplete(entry)
+    }
+
+    /**
      * NavDestination specific to [WearNavigator]
      */
     @NavDestination.ClassType(Composable::class)
diff --git a/wear/compose/integration-tests/demos/build.gradle b/wear/compose/integration-tests/demos/build.gradle
index 6ddb2f4..0e2074b 100644
--- a/wear/compose/integration-tests/demos/build.gradle
+++ b/wear/compose/integration-tests/demos/build.gradle
@@ -47,13 +47,14 @@
 dependencies {
     kotlinPlugin(project(":compose:compiler:compiler"))
 
-    implementation 'androidx.wear:wear:1.1.0'
+    implementation("androidx.wear:wear:1.1.0")
     implementation(project(":compose:ui:ui"))
-    implementation(project(':compose:integration-tests:demos:common'))
+    implementation(project(":compose:integration-tests:demos:common"))
     implementation(project(":compose:foundation:foundation"))
     implementation(project(":compose:foundation:foundation-layout"))
 
     implementation(project(":compose:runtime:runtime"))
+
     implementation(project(':wear:compose:compose-material'))
     implementation(project(':wear:compose:compose-foundation'))
     implementation(project(":wear:compose:compose-foundation-samples"))
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 200d8b6..03d281e 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
@@ -26,6 +26,8 @@
 import androidx.wear.compose.material.samples.CompactButtonWithIcon
 import androidx.wear.compose.material.samples.CompactChipWithIconAndLabel
 import androidx.wear.compose.material.samples.CurvedTextDemo
+import androidx.wear.compose.material.samples.InlineSliderSample
+import androidx.wear.compose.material.samples.InlineSliderSegmentedSample
 import androidx.wear.compose.material.samples.ScalingLazyColumnWithHeaders
 import androidx.wear.compose.material.samples.ScalingLazyColumnWithHeadersReversed
 import androidx.wear.compose.material.samples.SimpleScaffoldWithScrollIndicator
@@ -77,6 +79,28 @@
     "Material",
     listOf(
         DemoCategory(
+            "Slider",
+            listOf(
+                DemoCategory(
+                    "Samples",
+                    listOf(
+                        ComposableDemo("Inline slider") { Centralize { InlineSliderSample() } },
+                        ComposableDemo("Segmented inline slider") {
+                            Centralize { InlineSliderSegmentedSample() }
+                        },
+                    )
+                ),
+                DemoCategory(
+                    "Demos",
+                    listOf(
+                        ComposableDemo("Inline slider") { InlineSliderDemo() },
+                        ComposableDemo("RTL Inline slider") { InlineSliderRTLDemo() },
+                        ComposableDemo("Inline slider segmented") { InlineSliderSegmented() },
+                    )
+                )
+            )
+        ),
+        DemoCategory(
             "TimeText",
             listOf(
                 DemoCategory(
diff --git a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/SliderDemo.kt b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/SliderDemo.kt
new file mode 100644
index 0000000..768565c
--- /dev/null
+++ b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/SliderDemo.kt
@@ -0,0 +1,125 @@
+/*
+ * 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.integration.demos
+
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalLayoutDirection
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.dp
+import androidx.wear.compose.material.InlineSlider
+import androidx.wear.compose.material.ScalingLazyColumn
+import androidx.wear.compose.material.Text
+import androidx.wear.compose.material.ToggleChip
+import androidx.wear.compose.material.ToggleChipDefaults
+
+@Composable
+fun InlineSliderDemo() {
+    var valueWithoutSegments by remember { mutableStateOf(5f) }
+    var valueWithSegments by remember { mutableStateOf(2f) }
+    var enabled by remember { mutableStateOf(true) }
+
+    ScalingLazyColumn(
+        horizontalAlignment = Alignment.CenterHorizontally,
+        verticalArrangement = Arrangement.spacedBy(
+            space = 4.dp,
+            alignment = Alignment.CenterVertically
+        ),
+        contentPadding = PaddingValues(horizontal = 8.dp, vertical = 30.dp),
+        modifier = Modifier.fillMaxSize()
+    ) {
+        item { Text("No segments, value = $valueWithoutSegments") }
+        item {
+            InlineSlider(
+                value = valueWithoutSegments,
+                enabled = enabled,
+                valueRange = 1f..100f,
+                steps = 98,
+                onValueChange = { valueWithoutSegments = it })
+        }
+        item { Text("With segments, value = $valueWithSegments") }
+        item {
+            InlineSlider(
+                value = valueWithSegments,
+                enabled = enabled,
+                onValueChange = { valueWithSegments = it },
+                valueRange = 1f..10f,
+                steps = 8,
+                segmented = true
+            )
+        }
+        item {
+            ToggleChip(
+                checked = enabled,
+                onCheckedChange = { enabled = it },
+                label = { Text("Sliders enabled") },
+                toggleIcon = { ToggleChipDefaults.SwitchIcon(checked = enabled) }
+            )
+        }
+    }
+}
+
+@Composable
+fun InlineSliderRTLDemo() {
+    CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
+        InlineSliderDemo()
+    }
+}
+
+@Composable
+fun InlineSliderSegmented() {
+    var numberOfSegments by remember { mutableStateOf(5f) }
+    var progress by remember { mutableStateOf(10f) }
+
+    Column(
+        horizontalAlignment = Alignment.CenterHorizontally,
+        verticalArrangement = Arrangement.spacedBy(
+            space = 4.dp,
+            alignment = Alignment.CenterVertically
+        ),
+        modifier = Modifier.fillMaxSize()
+    ) {
+        Text("Num of segments ${numberOfSegments.toInt()}")
+
+        InlineSlider(
+            value = numberOfSegments,
+            valueRange = 0f..30f,
+            onValueChange = { numberOfSegments = it },
+            steps = 29
+        )
+
+        Text("Progress: $progress/20")
+
+        InlineSlider(
+            value = progress,
+            onValueChange = { progress = it },
+            valueRange = 1f..20f,
+            segmented = numberOfSegments <= 8,
+            steps = numberOfSegments.toInt()
+        )
+    }
+}
\ No newline at end of file
diff --git a/wear/watchface/watchface-client-guava/api/1.0.0-beta02.txt b/wear/watchface/watchface-client-guava/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..5115180
--- /dev/null
+++ b/wear/watchface/watchface-client-guava/api/1.0.0-beta02.txt
@@ -0,0 +1,22 @@
+// Signature format: 4.0
+package androidx.wear.watchface.client {
+
+  public class ListenableWatchFaceControlClient implements androidx.wear.watchface.client.WatchFaceControlClient {
+    ctor public ListenableWatchFaceControlClient(androidx.wear.watchface.client.WatchFaceControlClient watchFaceControlClient);
+    method public void close();
+    method public androidx.wear.watchface.client.HeadlessWatchFaceClient? createHeadlessWatchFaceClient(android.content.ComponentName watchFaceName, androidx.wear.watchface.client.DeviceConfig deviceConfig, int surfaceWidth, int surfaceHeight);
+    method public static final com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.ListenableWatchFaceControlClient> createWatchFaceControlClient(android.content.Context context, String watchFacePackageName);
+    method public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.DefaultComplicationDataSourcePolicyAndType> getDefaultComplicationDataSourcePoliciesAndType(android.content.ComponentName watchFaceName);
+    method public androidx.wear.watchface.client.EditorServiceClient getEditorServiceClient();
+    method public androidx.wear.watchface.client.InteractiveWatchFaceClient? getInteractiveWatchFaceClientInstance(String instanceId);
+    method public suspend Object? getOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient> p);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.InteractiveWatchFaceClient> listenableGetOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData);
+    field public static final androidx.wear.watchface.client.ListenableWatchFaceControlClient.Companion Companion;
+  }
+
+  public static final class ListenableWatchFaceControlClient.Companion {
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.ListenableWatchFaceControlClient> createWatchFaceControlClient(android.content.Context context, String watchFacePackageName);
+  }
+
+}
+
diff --git a/wear/watchface/watchface-client-guava/api/api_lint.ignore b/wear/watchface/watchface-client-guava/api/api_lint.ignore
index fe4686d..2449cb9 100644
--- a/wear/watchface/watchface-client-guava/api/api_lint.ignore
+++ b/wear/watchface/watchface-client-guava/api/api_lint.ignore
@@ -1,7 +1,5 @@
 // Baseline format: 1.0
 AsyncSuffixFuture: androidx.wear.watchface.client.ListenableWatchFaceControlClient#createWatchFaceControlClient(android.content.Context, String):
     Methods returning com.google.common.util.concurrent.ListenableFuture should have a suffix *Async to reserve unmodified name for a suspend function
-AsyncSuffixFuture: androidx.wear.watchface.client.ListenableWatchFaceControlClient#listenableGetOrCreateInteractiveWatchFaceClient(String, androidx.wear.watchface.client.DeviceConfig, androidx.wear.watchface.client.WatchUiState, androidx.wear.watchface.style.UserStyleData, java.util.Map<java.lang.Integer,? extends androidx.wear.complications.data.ComplicationData>):
-    Methods returning com.google.common.util.concurrent.ListenableFuture should have a suffix *Async to reserve unmodified name for a suspend function
 AsyncSuffixFuture: androidx.wear.watchface.client.ListenableWatchFaceControlClient.Companion#createWatchFaceControlClient(android.content.Context, String):
     Methods returning com.google.common.util.concurrent.ListenableFuture should have a suffix *Async to reserve unmodified name for a suspend function
diff --git a/wear/watchface/watchface-client-guava/api/public_plus_experimental_1.0.0-beta02.txt b/wear/watchface/watchface-client-guava/api/public_plus_experimental_1.0.0-beta02.txt
new file mode 100644
index 0000000..030cf28
--- /dev/null
+++ b/wear/watchface/watchface-client-guava/api/public_plus_experimental_1.0.0-beta02.txt
@@ -0,0 +1,32 @@
+// Signature format: 4.0
+package androidx.wear.watchface.client {
+
+  public class ListenableWatchFaceControlClient implements androidx.wear.watchface.client.WatchFaceControlClient {
+    ctor public ListenableWatchFaceControlClient(androidx.wear.watchface.client.WatchFaceControlClient watchFaceControlClient);
+    method public void close();
+    method public androidx.wear.watchface.client.HeadlessWatchFaceClient? createHeadlessWatchFaceClient(android.content.ComponentName watchFaceName, androidx.wear.watchface.client.DeviceConfig deviceConfig, int surfaceWidth, int surfaceHeight);
+    method public static final com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.ListenableWatchFaceControlClient> createWatchFaceControlClient(android.content.Context context, String watchFacePackageName);
+    method public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.DefaultComplicationDataSourcePolicyAndType> getDefaultComplicationDataSourcePoliciesAndType(android.content.ComponentName watchFaceName);
+    method public androidx.wear.watchface.client.EditorServiceClient getEditorServiceClient();
+    method public androidx.wear.watchface.client.InteractiveWatchFaceClient? getInteractiveWatchFaceClientInstance(String instanceId);
+    method public suspend Object? getOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient> p);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.InteractiveWatchFaceClient> listenableGetOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData);
+    field public static final androidx.wear.watchface.client.ListenableWatchFaceControlClient.Companion Companion;
+  }
+
+  public static final class ListenableWatchFaceControlClient.Companion {
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.ListenableWatchFaceControlClient> createWatchFaceControlClient(android.content.Context context, String watchFacePackageName);
+  }
+
+  @androidx.wear.watchface.client.WatchFaceClientExperimental public final class ListenableWatchFaceMetadataClient {
+    ctor public ListenableWatchFaceMetadataClient();
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.WatchFaceMetadataClient> createListenableWatchFaceMetadataClient(android.content.Context context, android.content.ComponentName watchFaceName);
+    field public static final androidx.wear.watchface.client.ListenableWatchFaceMetadataClient.Companion Companion;
+  }
+
+  public static final class ListenableWatchFaceMetadataClient.Companion {
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.WatchFaceMetadataClient> createListenableWatchFaceMetadataClient(android.content.Context context, android.content.ComponentName watchFaceName);
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/wear/watchface/watchface-client-guava/api/res-1.0.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to wear/watchface/watchface-client-guava/api/res-1.0.0-beta02.txt
diff --git a/wear/watchface/watchface-client-guava/api/restricted_1.0.0-beta02.txt b/wear/watchface/watchface-client-guava/api/restricted_1.0.0-beta02.txt
new file mode 100644
index 0000000..5115180
--- /dev/null
+++ b/wear/watchface/watchface-client-guava/api/restricted_1.0.0-beta02.txt
@@ -0,0 +1,22 @@
+// Signature format: 4.0
+package androidx.wear.watchface.client {
+
+  public class ListenableWatchFaceControlClient implements androidx.wear.watchface.client.WatchFaceControlClient {
+    ctor public ListenableWatchFaceControlClient(androidx.wear.watchface.client.WatchFaceControlClient watchFaceControlClient);
+    method public void close();
+    method public androidx.wear.watchface.client.HeadlessWatchFaceClient? createHeadlessWatchFaceClient(android.content.ComponentName watchFaceName, androidx.wear.watchface.client.DeviceConfig deviceConfig, int surfaceWidth, int surfaceHeight);
+    method public static final com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.ListenableWatchFaceControlClient> createWatchFaceControlClient(android.content.Context context, String watchFacePackageName);
+    method public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.DefaultComplicationDataSourcePolicyAndType> getDefaultComplicationDataSourcePoliciesAndType(android.content.ComponentName watchFaceName);
+    method public androidx.wear.watchface.client.EditorServiceClient getEditorServiceClient();
+    method public androidx.wear.watchface.client.InteractiveWatchFaceClient? getInteractiveWatchFaceClientInstance(String instanceId);
+    method public suspend Object? getOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient> p);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.InteractiveWatchFaceClient> listenableGetOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData);
+    field public static final androidx.wear.watchface.client.ListenableWatchFaceControlClient.Companion Companion;
+  }
+
+  public static final class ListenableWatchFaceControlClient.Companion {
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.client.ListenableWatchFaceControlClient> createWatchFaceControlClient(android.content.Context context, String watchFacePackageName);
+  }
+
+}
+
diff --git a/wear/watchface/watchface-client/api/1.0.0-beta02.txt b/wear/watchface/watchface-client/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..ae220e2
--- /dev/null
+++ b/wear/watchface/watchface-client/api/1.0.0-beta02.txt
@@ -0,0 +1,184 @@
+// Signature format: 4.0
+package androidx.wear.watchface.client {
+
+  public final class ComplicationSlotState {
+    ctor public ComplicationSlotState(android.graphics.Rect bounds, int boundsType, java.util.List<? extends androidx.wear.watchface.complications.data.ComplicationType> supportedTypes, androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy, androidx.wear.watchface.complications.data.ComplicationType defaultDataSourceType, boolean isEnabled, boolean isInitiallyEnabled, androidx.wear.watchface.complications.data.ComplicationType currentType, boolean fixedComplicationDataSource, android.os.Bundle complicationConfigExtras);
+    method public android.graphics.Rect getBounds();
+    method public int getBoundsType();
+    method public android.os.Bundle getComplicationConfigExtras();
+    method public androidx.wear.watchface.complications.data.ComplicationType getCurrentType();
+    method public androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy getDefaultDataSourcePolicy();
+    method public androidx.wear.watchface.complications.data.ComplicationType getDefaultDataSourceType();
+    method public boolean getFixedComplicationDataSource();
+    method public java.util.List<androidx.wear.watchface.complications.data.ComplicationType> getSupportedTypes();
+    method public boolean isEnabled();
+    method public boolean isInitiallyEnabled();
+    property public final android.graphics.Rect bounds;
+    property public final int boundsType;
+    property public final android.os.Bundle complicationConfigExtras;
+    property public final androidx.wear.watchface.complications.data.ComplicationType currentType;
+    property public final androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy;
+    property public final androidx.wear.watchface.complications.data.ComplicationType defaultDataSourceType;
+    property public final boolean fixedComplicationDataSource;
+    property public final boolean isEnabled;
+    property public final boolean isInitiallyEnabled;
+    property public final java.util.List<androidx.wear.watchface.complications.data.ComplicationType> supportedTypes;
+  }
+
+  public final class DefaultComplicationDataSourcePolicyAndType {
+    ctor public DefaultComplicationDataSourcePolicyAndType(androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy policy, androidx.wear.watchface.complications.data.ComplicationType type);
+    method public androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy getPolicy();
+    method public androidx.wear.watchface.complications.data.ComplicationType getType();
+    property public final androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy policy;
+    property public final androidx.wear.watchface.complications.data.ComplicationType type;
+  }
+
+  public final class DeviceConfig {
+    ctor public DeviceConfig(boolean hasLowBitAmbient, boolean hasBurnInProtection, long analogPreviewReferenceTimeMillis, long digitalPreviewReferenceTimeMillis);
+    method public long getAnalogPreviewReferenceTimeMillis();
+    method public long getDigitalPreviewReferenceTimeMillis();
+    method public boolean getHasBurnInProtection();
+    method public boolean getHasLowBitAmbient();
+    property public final long analogPreviewReferenceTimeMillis;
+    property public final long digitalPreviewReferenceTimeMillis;
+    property public final boolean hasBurnInProtection;
+    property public final boolean hasLowBitAmbient;
+  }
+
+  public final class DeviceConfigKt {
+  }
+
+  public interface EditorListener {
+    method public void onEditorStateChanged(androidx.wear.watchface.client.EditorState editorState);
+  }
+
+  public interface EditorServiceClient {
+    method public void addListener(androidx.wear.watchface.client.EditorListener editorListener, java.util.concurrent.Executor listenerExecutor);
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void closeEditor() throws android.os.RemoteException;
+    method public void removeListener(androidx.wear.watchface.client.EditorListener editorListener);
+  }
+
+  public final class EditorState {
+    method public java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData> getPreviewComplicationsData();
+    method public android.graphics.Bitmap? getPreviewImage();
+    method public boolean getShouldCommitChanges();
+    method public androidx.wear.watchface.style.UserStyleData getUserStyle();
+    method public androidx.wear.watchface.client.WatchFaceId getWatchFaceId();
+    property public final java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData> previewComplicationsData;
+    property public final android.graphics.Bitmap? previewImage;
+    property public final boolean shouldCommitChanges;
+    property public final androidx.wear.watchface.style.UserStyleData userStyle;
+    property public final androidx.wear.watchface.client.WatchFaceId watchFaceId;
+  }
+
+  public final class EditorStateKt {
+  }
+
+  public interface HeadlessWatchFaceClient extends java.lang.AutoCloseable {
+    method @AnyThread public void addClientDisconnectListener(androidx.wear.watchface.client.HeadlessWatchFaceClient.ClientDisconnectListener listener, java.util.concurrent.Executor executor);
+    method public default static androidx.wear.watchface.client.HeadlessWatchFaceClient createFromBundle(android.os.Bundle bundle);
+    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.time.Instant getPreviewReferenceInstant();
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public androidx.wear.watchface.style.UserStyleSchema getUserStyleSchema();
+    method @AnyThread public boolean isConnectionAlive();
+    method @AnyThread public void removeClientDisconnectListener(androidx.wear.watchface.client.HeadlessWatchFaceClient.ClientDisconnectListener listener);
+    method @RequiresApi(27) @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public android.graphics.Bitmap? renderComplicationToBitmap(int complicationSlotId, androidx.wear.watchface.RenderParameters renderParameters, java.time.Instant instant, androidx.wear.watchface.complications.data.ComplicationData complicationData, androidx.wear.watchface.style.UserStyle? userStyle) throws android.os.RemoteException;
+    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.watchface.complications.data.ComplicationData>? slotIdToComplicationData) throws android.os.RemoteException;
+    method public android.os.Bundle toBundle();
+    property @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public abstract java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState> complicationSlotsState;
+    property @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public abstract java.time.Instant previewReferenceInstant;
+    property @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public abstract androidx.wear.watchface.style.UserStyleSchema userStyleSchema;
+    field public static final String BINDER_KEY = "HeadlessWatchFaceClient";
+    field public static final androidx.wear.watchface.client.HeadlessWatchFaceClient.Companion Companion;
+  }
+
+  public static interface HeadlessWatchFaceClient.ClientDisconnectListener {
+    method public void onClientDisconnected();
+  }
+
+  public static final class HeadlessWatchFaceClient.Companion {
+    method public androidx.wear.watchface.client.HeadlessWatchFaceClient createFromBundle(android.os.Bundle bundle);
+  }
+
+  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 addOnWatchFaceReadyListener(java.util.concurrent.Executor executor, androidx.wear.watchface.client.InteractiveWatchFaceClient.OnWatchFaceReadyListener listener);
+    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();
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public String getInstanceId();
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public java.time.Instant getPreviewReferenceInstant();
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public androidx.wear.watchface.style.UserStyleSchema getUserStyleSchema();
+    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 removeOnWatchFaceReadyListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.OnWatchFaceReadyListener 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.watchface.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;
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void updateComplicationData(java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData> slotIdToComplicationData) throws android.os.RemoteException;
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void updateWatchFaceInstance(String newInstanceId, androidx.wear.watchface.style.UserStyle userStyle) throws android.os.RemoteException;
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void updateWatchFaceInstance(String newInstanceId, androidx.wear.watchface.style.UserStyleData userStyle) throws android.os.RemoteException;
+    property @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public abstract java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState> complicationSlotsState;
+    property @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public abstract java.util.List<androidx.wear.watchface.ContentDescriptionLabel> contentDescriptionLabels;
+    property @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public abstract String instanceId;
+    property @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public abstract java.time.Instant previewReferenceInstant;
+    property @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public abstract androidx.wear.watchface.style.UserStyleSchema userStyleSchema;
+    field public static final androidx.wear.watchface.client.InteractiveWatchFaceClient.Companion Companion;
+    field public static final int TAP_TYPE_CANCEL = 1; // 0x1
+    field public static final int TAP_TYPE_DOWN = 0; // 0x0
+    field public static final int TAP_TYPE_UP = 2; // 0x2
+  }
+
+  public static interface InteractiveWatchFaceClient.ClientDisconnectListener {
+    method public void onClientDisconnected();
+  }
+
+  public static final class InteractiveWatchFaceClient.Companion {
+    field public static final int TAP_TYPE_CANCEL = 1; // 0x1
+    field public static final int TAP_TYPE_DOWN = 0; // 0x0
+    field public static final int TAP_TYPE_UP = 2; // 0x2
+  }
+
+  public static fun interface InteractiveWatchFaceClient.OnWatchFaceReadyListener {
+    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;
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.DefaultComplicationDataSourcePolicyAndType> getDefaultComplicationDataSourcePoliciesAndType(android.content.ComponentName watchFaceName) throws android.os.RemoteException;
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public androidx.wear.watchface.client.EditorServiceClient getEditorServiceClient() throws android.os.RemoteException;
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public androidx.wear.watchface.client.InteractiveWatchFaceClient? getInteractiveWatchFaceClientInstance(String instanceId) throws android.os.RemoteException;
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public suspend Object? getOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient> p) throws android.os.RemoteException;
+    field public static final androidx.wear.watchface.client.WatchFaceControlClient.Companion Companion;
+  }
+
+  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;
+  }
+
+  public static final class WatchFaceControlClient.ServiceNotBoundException extends java.lang.Exception {
+    ctor public WatchFaceControlClient.ServiceNotBoundException();
+  }
+
+  public static final class WatchFaceControlClient.ServiceStartFailureException extends java.lang.Exception {
+    ctor public WatchFaceControlClient.ServiceStartFailureException(optional String message);
+  }
+
+  public final class WatchFaceId {
+    ctor public WatchFaceId(String id);
+    method public String getId();
+    property public final String id;
+  }
+
+  public final class WatchUiState {
+    ctor public WatchUiState(boolean inAmbientMode, int interruptionFilter);
+    method public boolean getInAmbientMode();
+    method public int getInterruptionFilter();
+    property public final boolean inAmbientMode;
+    property public final int interruptionFilter;
+  }
+
+}
+
diff --git a/wear/watchface/watchface-client/api/public_plus_experimental_1.0.0-beta02.txt b/wear/watchface/watchface-client/api/public_plus_experimental_1.0.0-beta02.txt
new file mode 100644
index 0000000..63f8385
--- /dev/null
+++ b/wear/watchface/watchface-client/api/public_plus_experimental_1.0.0-beta02.txt
@@ -0,0 +1,226 @@
+// Signature format: 4.0
+package androidx.wear.watchface.client {
+
+  @androidx.wear.watchface.client.WatchFaceClientExperimental public final class ComplicationSlotMetadata {
+    ctor public ComplicationSlotMetadata(androidx.wear.watchface.complications.ComplicationSlotBounds? bounds, int boundsType, java.util.List<? extends androidx.wear.watchface.complications.data.ComplicationType> supportedTypes, androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy, androidx.wear.watchface.complications.data.ComplicationType defaultDataSourceType, boolean isInitiallyEnabled, boolean fixedComplicationDataSource, android.os.Bundle complicationConfigExtras);
+    method public androidx.wear.watchface.complications.ComplicationSlotBounds? getBounds();
+    method public int getBoundsType();
+    method public android.os.Bundle getComplicationConfigExtras();
+    method public androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy getDefaultDataSourcePolicy();
+    method public androidx.wear.watchface.complications.data.ComplicationType getDefaultDataSourceType();
+    method public boolean getFixedComplicationDataSource();
+    method public java.util.List<androidx.wear.watchface.complications.data.ComplicationType> getSupportedTypes();
+    method public boolean isInitiallyEnabled();
+    property public final androidx.wear.watchface.complications.ComplicationSlotBounds? bounds;
+    property public final int boundsType;
+    property public final android.os.Bundle complicationConfigExtras;
+    property public final androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy;
+    property public final androidx.wear.watchface.complications.data.ComplicationType defaultDataSourceType;
+    property public final boolean fixedComplicationDataSource;
+    property public final boolean isInitiallyEnabled;
+    property public final java.util.List<androidx.wear.watchface.complications.data.ComplicationType> supportedTypes;
+  }
+
+  public final class ComplicationSlotState {
+    ctor public ComplicationSlotState(android.graphics.Rect bounds, int boundsType, java.util.List<? extends androidx.wear.watchface.complications.data.ComplicationType> supportedTypes, androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy, androidx.wear.watchface.complications.data.ComplicationType defaultDataSourceType, boolean isEnabled, boolean isInitiallyEnabled, androidx.wear.watchface.complications.data.ComplicationType currentType, boolean fixedComplicationDataSource, android.os.Bundle complicationConfigExtras);
+    method public android.graphics.Rect getBounds();
+    method public int getBoundsType();
+    method public android.os.Bundle getComplicationConfigExtras();
+    method public androidx.wear.watchface.complications.data.ComplicationType getCurrentType();
+    method public androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy getDefaultDataSourcePolicy();
+    method public androidx.wear.watchface.complications.data.ComplicationType getDefaultDataSourceType();
+    method public boolean getFixedComplicationDataSource();
+    method public java.util.List<androidx.wear.watchface.complications.data.ComplicationType> getSupportedTypes();
+    method public boolean isEnabled();
+    method public boolean isInitiallyEnabled();
+    property public final android.graphics.Rect bounds;
+    property public final int boundsType;
+    property public final android.os.Bundle complicationConfigExtras;
+    property public final androidx.wear.watchface.complications.data.ComplicationType currentType;
+    property public final androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy;
+    property public final androidx.wear.watchface.complications.data.ComplicationType defaultDataSourceType;
+    property public final boolean fixedComplicationDataSource;
+    property public final boolean isEnabled;
+    property public final boolean isInitiallyEnabled;
+    property public final java.util.List<androidx.wear.watchface.complications.data.ComplicationType> supportedTypes;
+  }
+
+  public final class DefaultComplicationDataSourcePolicyAndType {
+    ctor public DefaultComplicationDataSourcePolicyAndType(androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy policy, androidx.wear.watchface.complications.data.ComplicationType type);
+    method public androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy getPolicy();
+    method public androidx.wear.watchface.complications.data.ComplicationType getType();
+    property public final androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy policy;
+    property public final androidx.wear.watchface.complications.data.ComplicationType type;
+  }
+
+  public final class DeviceConfig {
+    ctor public DeviceConfig(boolean hasLowBitAmbient, boolean hasBurnInProtection, long analogPreviewReferenceTimeMillis, long digitalPreviewReferenceTimeMillis);
+    method public long getAnalogPreviewReferenceTimeMillis();
+    method public long getDigitalPreviewReferenceTimeMillis();
+    method public boolean getHasBurnInProtection();
+    method public boolean getHasLowBitAmbient();
+    property public final long analogPreviewReferenceTimeMillis;
+    property public final long digitalPreviewReferenceTimeMillis;
+    property public final boolean hasBurnInProtection;
+    property public final boolean hasLowBitAmbient;
+  }
+
+  public final class DeviceConfigKt {
+  }
+
+  public interface EditorListener {
+    method public void onEditorStateChanged(androidx.wear.watchface.client.EditorState editorState);
+  }
+
+  public interface EditorServiceClient {
+    method public void addListener(androidx.wear.watchface.client.EditorListener editorListener, java.util.concurrent.Executor listenerExecutor);
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void closeEditor() throws android.os.RemoteException;
+    method public void removeListener(androidx.wear.watchface.client.EditorListener editorListener);
+  }
+
+  public final class EditorState {
+    method public java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData> getPreviewComplicationsData();
+    method public android.graphics.Bitmap? getPreviewImage();
+    method public boolean getShouldCommitChanges();
+    method public androidx.wear.watchface.style.UserStyleData getUserStyle();
+    method public androidx.wear.watchface.client.WatchFaceId getWatchFaceId();
+    property public final java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData> previewComplicationsData;
+    property public final android.graphics.Bitmap? previewImage;
+    property public final boolean shouldCommitChanges;
+    property public final androidx.wear.watchface.style.UserStyleData userStyle;
+    property public final androidx.wear.watchface.client.WatchFaceId watchFaceId;
+  }
+
+  public final class EditorStateKt {
+  }
+
+  public interface HeadlessWatchFaceClient extends java.lang.AutoCloseable {
+    method @AnyThread public void addClientDisconnectListener(androidx.wear.watchface.client.HeadlessWatchFaceClient.ClientDisconnectListener listener, java.util.concurrent.Executor executor);
+    method public default static androidx.wear.watchface.client.HeadlessWatchFaceClient createFromBundle(android.os.Bundle bundle);
+    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.time.Instant getPreviewReferenceInstant();
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public androidx.wear.watchface.style.UserStyleSchema getUserStyleSchema();
+    method @AnyThread public boolean isConnectionAlive();
+    method @AnyThread public void removeClientDisconnectListener(androidx.wear.watchface.client.HeadlessWatchFaceClient.ClientDisconnectListener listener);
+    method @RequiresApi(27) @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public android.graphics.Bitmap? renderComplicationToBitmap(int complicationSlotId, androidx.wear.watchface.RenderParameters renderParameters, java.time.Instant instant, androidx.wear.watchface.complications.data.ComplicationData complicationData, androidx.wear.watchface.style.UserStyle? userStyle) throws android.os.RemoteException;
+    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.watchface.complications.data.ComplicationData>? slotIdToComplicationData) throws android.os.RemoteException;
+    method public android.os.Bundle toBundle();
+    property @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public abstract java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState> complicationSlotsState;
+    property @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public abstract java.time.Instant previewReferenceInstant;
+    property @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public abstract androidx.wear.watchface.style.UserStyleSchema userStyleSchema;
+    field public static final String BINDER_KEY = "HeadlessWatchFaceClient";
+    field public static final androidx.wear.watchface.client.HeadlessWatchFaceClient.Companion Companion;
+  }
+
+  public static interface HeadlessWatchFaceClient.ClientDisconnectListener {
+    method public void onClientDisconnected();
+  }
+
+  public static final class HeadlessWatchFaceClient.Companion {
+    method public androidx.wear.watchface.client.HeadlessWatchFaceClient createFromBundle(android.os.Bundle bundle);
+  }
+
+  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 addOnWatchFaceReadyListener(java.util.concurrent.Executor executor, androidx.wear.watchface.client.InteractiveWatchFaceClient.OnWatchFaceReadyListener listener);
+    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();
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public String getInstanceId();
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public java.time.Instant getPreviewReferenceInstant();
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public androidx.wear.watchface.style.UserStyleSchema getUserStyleSchema();
+    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 removeOnWatchFaceReadyListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.OnWatchFaceReadyListener 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.watchface.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;
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void updateComplicationData(java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData> slotIdToComplicationData) throws android.os.RemoteException;
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void updateWatchFaceInstance(String newInstanceId, androidx.wear.watchface.style.UserStyle userStyle) throws android.os.RemoteException;
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void updateWatchFaceInstance(String newInstanceId, androidx.wear.watchface.style.UserStyleData userStyle) throws android.os.RemoteException;
+    property @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public abstract java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState> complicationSlotsState;
+    property @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public abstract java.util.List<androidx.wear.watchface.ContentDescriptionLabel> contentDescriptionLabels;
+    property @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public abstract String instanceId;
+    property @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public abstract java.time.Instant previewReferenceInstant;
+    property @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public abstract androidx.wear.watchface.style.UserStyleSchema userStyleSchema;
+    field public static final androidx.wear.watchface.client.InteractiveWatchFaceClient.Companion Companion;
+    field public static final int TAP_TYPE_CANCEL = 1; // 0x1
+    field public static final int TAP_TYPE_DOWN = 0; // 0x0
+    field public static final int TAP_TYPE_UP = 2; // 0x2
+  }
+
+  public static interface InteractiveWatchFaceClient.ClientDisconnectListener {
+    method public void onClientDisconnected();
+  }
+
+  public static final class InteractiveWatchFaceClient.Companion {
+    field public static final int TAP_TYPE_CANCEL = 1; // 0x1
+    field public static final int TAP_TYPE_DOWN = 0; // 0x0
+    field public static final int TAP_TYPE_UP = 2; // 0x2
+  }
+
+  public static fun interface InteractiveWatchFaceClient.OnWatchFaceReadyListener {
+    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 {
+  }
+
+  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;
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.DefaultComplicationDataSourcePolicyAndType> getDefaultComplicationDataSourcePoliciesAndType(android.content.ComponentName watchFaceName) throws android.os.RemoteException;
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public androidx.wear.watchface.client.EditorServiceClient getEditorServiceClient() throws android.os.RemoteException;
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public androidx.wear.watchface.client.InteractiveWatchFaceClient? getInteractiveWatchFaceClientInstance(String instanceId) throws android.os.RemoteException;
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public suspend Object? getOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient> p) throws android.os.RemoteException;
+    field public static final androidx.wear.watchface.client.WatchFaceControlClient.Companion Companion;
+  }
+
+  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;
+  }
+
+  public static final class WatchFaceControlClient.ServiceNotBoundException extends java.lang.Exception {
+    ctor public WatchFaceControlClient.ServiceNotBoundException();
+  }
+
+  public static final class WatchFaceControlClient.ServiceStartFailureException extends java.lang.Exception {
+    ctor public WatchFaceControlClient.ServiceStartFailureException(optional String message);
+  }
+
+  public final class WatchFaceId {
+    ctor public WatchFaceId(String id);
+    method public String getId();
+    property public final String id;
+  }
+
+  @androidx.wear.watchface.client.WatchFaceClientExperimental public interface WatchFaceMetadataClient extends java.lang.AutoCloseable {
+    method @kotlin.jvm.Throws(exceptionClasses={ServiceNotBoundException::class, ServiceStartFailureException::class}) public default static suspend Object? createWatchFaceMetadataClient(android.content.Context context, android.content.ComponentName watchFaceName, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.WatchFaceMetadataClient> p) throws androidx.wear.watchface.client.WatchFaceMetadataClient.ServiceNotBoundException, androidx.wear.watchface.client.WatchFaceMetadataClient.ServiceStartFailureException;
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotMetadata> getComplicationSlotMetadataMap() throws android.os.RemoteException;
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public androidx.wear.watchface.style.UserStyleSchema getUserStyleSchema() throws android.os.RemoteException;
+    field public static final androidx.wear.watchface.client.WatchFaceMetadataClient.Companion Companion;
+  }
+
+  public static final class WatchFaceMetadataClient.Companion {
+    method @kotlin.jvm.Throws(exceptionClasses={ServiceNotBoundException::class, ServiceStartFailureException::class}) public suspend Object? createWatchFaceMetadataClient(android.content.Context context, android.content.ComponentName watchFaceName, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.WatchFaceMetadataClient> p) throws androidx.wear.watchface.client.WatchFaceMetadataClient.ServiceNotBoundException, androidx.wear.watchface.client.WatchFaceMetadataClient.ServiceStartFailureException;
+  }
+
+  public static final class WatchFaceMetadataClient.ServiceNotBoundException extends java.lang.Exception {
+    ctor public WatchFaceMetadataClient.ServiceNotBoundException();
+  }
+
+  public static final class WatchFaceMetadataClient.ServiceStartFailureException extends java.lang.Exception {
+    ctor public WatchFaceMetadataClient.ServiceStartFailureException(optional String message);
+  }
+
+  public final class WatchUiState {
+    ctor public WatchUiState(boolean inAmbientMode, int interruptionFilter);
+    method public boolean getInAmbientMode();
+    method public int getInterruptionFilter();
+    property public final boolean inAmbientMode;
+    property public final int interruptionFilter;
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/wear/watchface/watchface-client/api/res-1.0.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to wear/watchface/watchface-client/api/res-1.0.0-beta02.txt
diff --git a/wear/watchface/watchface-client/api/restricted_1.0.0-beta02.txt b/wear/watchface/watchface-client/api/restricted_1.0.0-beta02.txt
new file mode 100644
index 0000000..19c1c16
--- /dev/null
+++ b/wear/watchface/watchface-client/api/restricted_1.0.0-beta02.txt
@@ -0,0 +1,184 @@
+// Signature format: 4.0
+package androidx.wear.watchface.client {
+
+  public final class ComplicationSlotState {
+    ctor public ComplicationSlotState(android.graphics.Rect bounds, @androidx.wear.watchface.ComplicationSlotBoundsType int boundsType, java.util.List<? extends androidx.wear.watchface.complications.data.ComplicationType> supportedTypes, androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy, androidx.wear.watchface.complications.data.ComplicationType defaultDataSourceType, boolean isEnabled, boolean isInitiallyEnabled, androidx.wear.watchface.complications.data.ComplicationType currentType, boolean fixedComplicationDataSource, android.os.Bundle complicationConfigExtras);
+    method public android.graphics.Rect getBounds();
+    method public int getBoundsType();
+    method public android.os.Bundle getComplicationConfigExtras();
+    method public androidx.wear.watchface.complications.data.ComplicationType getCurrentType();
+    method public androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy getDefaultDataSourcePolicy();
+    method public androidx.wear.watchface.complications.data.ComplicationType getDefaultDataSourceType();
+    method public boolean getFixedComplicationDataSource();
+    method public java.util.List<androidx.wear.watchface.complications.data.ComplicationType> getSupportedTypes();
+    method public boolean isEnabled();
+    method public boolean isInitiallyEnabled();
+    property public final android.graphics.Rect bounds;
+    property public final int boundsType;
+    property public final android.os.Bundle complicationConfigExtras;
+    property public final androidx.wear.watchface.complications.data.ComplicationType currentType;
+    property public final androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy;
+    property public final androidx.wear.watchface.complications.data.ComplicationType defaultDataSourceType;
+    property public final boolean fixedComplicationDataSource;
+    property public final boolean isEnabled;
+    property public final boolean isInitiallyEnabled;
+    property public final java.util.List<androidx.wear.watchface.complications.data.ComplicationType> supportedTypes;
+  }
+
+  public final class DefaultComplicationDataSourcePolicyAndType {
+    ctor public DefaultComplicationDataSourcePolicyAndType(androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy policy, androidx.wear.watchface.complications.data.ComplicationType type);
+    method public androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy getPolicy();
+    method public androidx.wear.watchface.complications.data.ComplicationType getType();
+    property public final androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy policy;
+    property public final androidx.wear.watchface.complications.data.ComplicationType type;
+  }
+
+  public final class DeviceConfig {
+    ctor public DeviceConfig(boolean hasLowBitAmbient, boolean hasBurnInProtection, long analogPreviewReferenceTimeMillis, long digitalPreviewReferenceTimeMillis);
+    method public long getAnalogPreviewReferenceTimeMillis();
+    method public long getDigitalPreviewReferenceTimeMillis();
+    method public boolean getHasBurnInProtection();
+    method public boolean getHasLowBitAmbient();
+    property public final long analogPreviewReferenceTimeMillis;
+    property public final long digitalPreviewReferenceTimeMillis;
+    property public final boolean hasBurnInProtection;
+    property public final boolean hasLowBitAmbient;
+  }
+
+  public final class DeviceConfigKt {
+  }
+
+  public interface EditorListener {
+    method public void onEditorStateChanged(androidx.wear.watchface.client.EditorState editorState);
+  }
+
+  public interface EditorServiceClient {
+    method public void addListener(androidx.wear.watchface.client.EditorListener editorListener, java.util.concurrent.Executor listenerExecutor);
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void closeEditor() throws android.os.RemoteException;
+    method public void removeListener(androidx.wear.watchface.client.EditorListener editorListener);
+  }
+
+  public final class EditorState {
+    method public java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData> getPreviewComplicationsData();
+    method public android.graphics.Bitmap? getPreviewImage();
+    method public boolean getShouldCommitChanges();
+    method public androidx.wear.watchface.style.UserStyleData getUserStyle();
+    method public androidx.wear.watchface.client.WatchFaceId getWatchFaceId();
+    property public final java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData> previewComplicationsData;
+    property public final android.graphics.Bitmap? previewImage;
+    property public final boolean shouldCommitChanges;
+    property public final androidx.wear.watchface.style.UserStyleData userStyle;
+    property public final androidx.wear.watchface.client.WatchFaceId watchFaceId;
+  }
+
+  public final class EditorStateKt {
+  }
+
+  public interface HeadlessWatchFaceClient extends java.lang.AutoCloseable {
+    method @AnyThread public void addClientDisconnectListener(androidx.wear.watchface.client.HeadlessWatchFaceClient.ClientDisconnectListener listener, java.util.concurrent.Executor executor);
+    method public default static androidx.wear.watchface.client.HeadlessWatchFaceClient createFromBundle(android.os.Bundle bundle);
+    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.time.Instant getPreviewReferenceInstant();
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public androidx.wear.watchface.style.UserStyleSchema getUserStyleSchema();
+    method @AnyThread public boolean isConnectionAlive();
+    method @AnyThread public void removeClientDisconnectListener(androidx.wear.watchface.client.HeadlessWatchFaceClient.ClientDisconnectListener listener);
+    method @RequiresApi(27) @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public android.graphics.Bitmap? renderComplicationToBitmap(int complicationSlotId, androidx.wear.watchface.RenderParameters renderParameters, java.time.Instant instant, androidx.wear.watchface.complications.data.ComplicationData complicationData, androidx.wear.watchface.style.UserStyle? userStyle) throws android.os.RemoteException;
+    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.watchface.complications.data.ComplicationData>? slotIdToComplicationData) throws android.os.RemoteException;
+    method public android.os.Bundle toBundle();
+    property @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public abstract java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState> complicationSlotsState;
+    property @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public abstract java.time.Instant previewReferenceInstant;
+    property @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public abstract androidx.wear.watchface.style.UserStyleSchema userStyleSchema;
+    field public static final String BINDER_KEY = "HeadlessWatchFaceClient";
+    field public static final androidx.wear.watchface.client.HeadlessWatchFaceClient.Companion Companion;
+  }
+
+  public static interface HeadlessWatchFaceClient.ClientDisconnectListener {
+    method public void onClientDisconnected();
+  }
+
+  public static final class HeadlessWatchFaceClient.Companion {
+    method public androidx.wear.watchface.client.HeadlessWatchFaceClient createFromBundle(android.os.Bundle bundle);
+  }
+
+  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 addOnWatchFaceReadyListener(java.util.concurrent.Executor executor, androidx.wear.watchface.client.InteractiveWatchFaceClient.OnWatchFaceReadyListener listener);
+    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();
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public String getInstanceId();
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public java.time.Instant getPreviewReferenceInstant();
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public androidx.wear.watchface.style.UserStyleSchema getUserStyleSchema();
+    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 removeOnWatchFaceReadyListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.OnWatchFaceReadyListener 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.watchface.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;
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void updateComplicationData(java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData> slotIdToComplicationData) throws android.os.RemoteException;
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void updateWatchFaceInstance(String newInstanceId, androidx.wear.watchface.style.UserStyle userStyle) throws android.os.RemoteException;
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void updateWatchFaceInstance(String newInstanceId, androidx.wear.watchface.style.UserStyleData userStyle) throws android.os.RemoteException;
+    property @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public abstract java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState> complicationSlotsState;
+    property @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public abstract java.util.List<androidx.wear.watchface.ContentDescriptionLabel> contentDescriptionLabels;
+    property @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public abstract String instanceId;
+    property @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public abstract java.time.Instant previewReferenceInstant;
+    property @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public abstract androidx.wear.watchface.style.UserStyleSchema userStyleSchema;
+    field public static final androidx.wear.watchface.client.InteractiveWatchFaceClient.Companion Companion;
+    field public static final int TAP_TYPE_CANCEL = 1; // 0x1
+    field public static final int TAP_TYPE_DOWN = 0; // 0x0
+    field public static final int TAP_TYPE_UP = 2; // 0x2
+  }
+
+  public static interface InteractiveWatchFaceClient.ClientDisconnectListener {
+    method public void onClientDisconnected();
+  }
+
+  public static final class InteractiveWatchFaceClient.Companion {
+    field public static final int TAP_TYPE_CANCEL = 1; // 0x1
+    field public static final int TAP_TYPE_DOWN = 0; // 0x0
+    field public static final int TAP_TYPE_UP = 2; // 0x2
+  }
+
+  public static fun interface InteractiveWatchFaceClient.OnWatchFaceReadyListener {
+    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;
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.DefaultComplicationDataSourcePolicyAndType> getDefaultComplicationDataSourcePoliciesAndType(android.content.ComponentName watchFaceName) throws android.os.RemoteException;
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public androidx.wear.watchface.client.EditorServiceClient getEditorServiceClient() throws android.os.RemoteException;
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public androidx.wear.watchface.client.InteractiveWatchFaceClient? getInteractiveWatchFaceClientInstance(String instanceId) throws android.os.RemoteException;
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public suspend Object? getOrCreateInteractiveWatchFaceClient(String id, androidx.wear.watchface.client.DeviceConfig deviceConfig, androidx.wear.watchface.client.WatchUiState watchUiState, androidx.wear.watchface.style.UserStyleData? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? slotIdToComplicationData, kotlin.coroutines.Continuation<? super androidx.wear.watchface.client.InteractiveWatchFaceClient> p) throws android.os.RemoteException;
+    field public static final androidx.wear.watchface.client.WatchFaceControlClient.Companion Companion;
+  }
+
+  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;
+  }
+
+  public static final class WatchFaceControlClient.ServiceNotBoundException extends java.lang.Exception {
+    ctor public WatchFaceControlClient.ServiceNotBoundException();
+  }
+
+  public static final class WatchFaceControlClient.ServiceStartFailureException extends java.lang.Exception {
+    ctor public WatchFaceControlClient.ServiceStartFailureException(optional String message);
+  }
+
+  public final class WatchFaceId {
+    ctor public WatchFaceId(String id);
+    method public String getId();
+    property public final String id;
+  }
+
+  public final class WatchUiState {
+    ctor public WatchUiState(boolean inAmbientMode, int interruptionFilter);
+    method public boolean getInAmbientMode();
+    method public int getInterruptionFilter();
+    property public final boolean inAmbientMode;
+    property public final int interruptionFilter;
+  }
+
+}
+
diff --git a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
index 144992a..435cb4e 100644
--- a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
+++ b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
@@ -1251,6 +1251,28 @@
             interactiveInstance.close()
         }
     }
+
+    @Test
+    fun isConnectionAlive_false_after_close() {
+        val deferredInteractiveInstance = handlerCoroutineScope.async {
+            service.getOrCreateInteractiveWatchFaceClient(
+                "testId",
+                deviceConfig,
+                systemState,
+                null,
+                complications
+            )
+        }
+
+        // Create the engine which triggers creation of InteractiveWatchFaceClient.
+        createEngine()
+
+        val interactiveInstance = awaitWithTimeout(deferredInteractiveInstance)
+        assertThat(interactiveInstance.isConnectionAlive()).isTrue()
+
+        interactiveInstance.close()
+        assertThat(interactiveInstance.isConnectionAlive()).isFalse()
+    }
 }
 
 internal class TestExampleCanvasAnalogWatchFaceService(
diff --git a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/InteractiveWatchFaceClient.kt b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/InteractiveWatchFaceClient.kt
index 3f7b551..1a3a85a 100644
--- a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/InteractiveWatchFaceClient.kt
+++ b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/InteractiveWatchFaceClient.kt
@@ -257,6 +257,7 @@
     private val readyListeners =
         HashMap<InteractiveWatchFaceClient.OnWatchFaceReadyListener, Executor>()
     private var watchfaceReadyListenerRegistered = false
+    private var closed = false
 
     init {
         iInteractiveWatchFace.asBinder().linkToDeath(
@@ -347,6 +348,9 @@
 
     override fun close() = TraceEvent("InteractiveWatchFaceClientImpl.close").use {
         iInteractiveWatchFace.release()
+        synchronized(lock) {
+            closed = true
+        }
     }
 
     override fun sendTouchEvent(
@@ -405,7 +409,8 @@
         }
     }
 
-    override fun isConnectionAlive() = iInteractiveWatchFace.asBinder().isBinderAlive
+    override fun isConnectionAlive() =
+        iInteractiveWatchFace.asBinder().isBinderAlive && synchronized(lock) { !closed }
 
     private fun registerWatchfaceReadyListener() {
         if (watchfaceReadyListenerRegistered) {
diff --git a/wear/watchface/watchface-complications-data-source-ktx/api/1.0.0-beta02.txt b/wear/watchface/watchface-complications-data-source-ktx/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..eabce2c
--- /dev/null
+++ b/wear/watchface/watchface-complications-data-source-ktx/api/1.0.0-beta02.txt
@@ -0,0 +1,11 @@
+// Signature format: 4.0
+package androidx.wear.watchface.complications.datasource {
+
+  public abstract class SuspendingComplicationDataSourceService extends androidx.wear.watchface.complications.datasource.ComplicationDataSourceService {
+    ctor public SuspendingComplicationDataSourceService();
+    method public final void onComplicationRequest(androidx.wear.watchface.complications.datasource.ComplicationRequest request, androidx.wear.watchface.complications.datasource.ComplicationDataSourceService.ComplicationRequestListener listener);
+    method @UiThread public abstract suspend Object? onComplicationRequest(androidx.wear.watchface.complications.datasource.ComplicationRequest request, kotlin.coroutines.Continuation<? super androidx.wear.watchface.complications.data.ComplicationData> p);
+  }
+
+}
+
diff --git a/wear/watchface/watchface-complications-data-source-ktx/api/public_plus_experimental_1.0.0-beta02.txt b/wear/watchface/watchface-complications-data-source-ktx/api/public_plus_experimental_1.0.0-beta02.txt
new file mode 100644
index 0000000..eabce2c
--- /dev/null
+++ b/wear/watchface/watchface-complications-data-source-ktx/api/public_plus_experimental_1.0.0-beta02.txt
@@ -0,0 +1,11 @@
+// Signature format: 4.0
+package androidx.wear.watchface.complications.datasource {
+
+  public abstract class SuspendingComplicationDataSourceService extends androidx.wear.watchface.complications.datasource.ComplicationDataSourceService {
+    ctor public SuspendingComplicationDataSourceService();
+    method public final void onComplicationRequest(androidx.wear.watchface.complications.datasource.ComplicationRequest request, androidx.wear.watchface.complications.datasource.ComplicationDataSourceService.ComplicationRequestListener listener);
+    method @UiThread public abstract suspend Object? onComplicationRequest(androidx.wear.watchface.complications.datasource.ComplicationRequest request, kotlin.coroutines.Continuation<? super androidx.wear.watchface.complications.data.ComplicationData> p);
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/wear/watchface/watchface-complications-data-source-ktx/api/res-1.0.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to wear/watchface/watchface-complications-data-source-ktx/api/res-1.0.0-beta02.txt
diff --git a/wear/watchface/watchface-complications-data-source-ktx/api/restricted_1.0.0-beta02.txt b/wear/watchface/watchface-complications-data-source-ktx/api/restricted_1.0.0-beta02.txt
new file mode 100644
index 0000000..eabce2c
--- /dev/null
+++ b/wear/watchface/watchface-complications-data-source-ktx/api/restricted_1.0.0-beta02.txt
@@ -0,0 +1,11 @@
+// Signature format: 4.0
+package androidx.wear.watchface.complications.datasource {
+
+  public abstract class SuspendingComplicationDataSourceService extends androidx.wear.watchface.complications.datasource.ComplicationDataSourceService {
+    ctor public SuspendingComplicationDataSourceService();
+    method public final void onComplicationRequest(androidx.wear.watchface.complications.datasource.ComplicationRequest request, androidx.wear.watchface.complications.datasource.ComplicationDataSourceService.ComplicationRequestListener listener);
+    method @UiThread public abstract suspend Object? onComplicationRequest(androidx.wear.watchface.complications.datasource.ComplicationRequest request, kotlin.coroutines.Continuation<? super androidx.wear.watchface.complications.data.ComplicationData> p);
+  }
+
+}
+
diff --git a/wear/watchface/watchface-complications-data-source/api/1.0.0-beta02.txt b/wear/watchface/watchface-complications-data-source/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..9ab81f6
--- /dev/null
+++ b/wear/watchface/watchface-complications-data-source/api/1.0.0-beta02.txt
@@ -0,0 +1,50 @@
+// Signature format: 4.0
+package androidx.wear.watchface.complications.datasource {
+
+  public abstract class ComplicationDataSourceService extends android.app.Service {
+    ctor public ComplicationDataSourceService();
+    method public abstract androidx.wear.watchface.complications.data.ComplicationData? getPreviewData(androidx.wear.watchface.complications.data.ComplicationType type);
+    method public final android.os.IBinder? onBind(android.content.Intent intent);
+    method @UiThread public void onComplicationActivated(int complicationInstanceId, androidx.wear.watchface.complications.data.ComplicationType type);
+    method @UiThread public void onComplicationDeactivated(int complicationInstanceId);
+    method @UiThread public abstract void onComplicationRequest(androidx.wear.watchface.complications.datasource.ComplicationRequest request, androidx.wear.watchface.complications.datasource.ComplicationDataSourceService.ComplicationRequestListener listener);
+    field public static final String ACTION_COMPLICATION_UPDATE_REQUEST = "android.support.wearable.complications.ACTION_COMPLICATION_UPDATE_REQUEST";
+    field public static final String CATEGORY_DATA_SOURCE_CONFIG = "android.support.wearable.complications.category.PROVIDER_CONFIG";
+    field public static final androidx.wear.watchface.complications.datasource.ComplicationDataSourceService.Companion Companion;
+    field public static final String EXTRA_CONFIG_COMPLICATION_ID = "android.support.wearable.complications.EXTRA_CONFIG_COMPLICATION_ID";
+    field public static final String EXTRA_CONFIG_COMPLICATION_TYPE = "android.support.wearable.complications.EXTRA_CONFIG_COMPLICATION_TYPE";
+    field public static final String EXTRA_CONFIG_DATA_SOURCE_COMPONENT = "android.support.wearable.complications.EXTRA_CONFIG_PROVIDER_COMPONENT";
+    field public static final String METADATA_KEY_DATA_SOURCE_CONFIG_ACTION = "android.support.wearable.complications.PROVIDER_CONFIG_ACTION";
+    field public static final String METADATA_KEY_SAFE_WATCH_FACES = "android.support.wearable.complications.SAFE_WATCH_FACES";
+    field public static final String METADATA_KEY_SUPPORTED_TYPES = "android.support.wearable.complications.SUPPORTED_TYPES";
+    field public static final String METADATA_KEY_UPDATE_PERIOD_SECONDS = "android.support.wearable.complications.UPDATE_PERIOD_SECONDS";
+  }
+
+  public static final class ComplicationDataSourceService.Companion {
+  }
+
+  public static interface ComplicationDataSourceService.ComplicationRequestListener {
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void onComplicationData(androidx.wear.watchface.complications.data.ComplicationData? complicationData) throws android.os.RemoteException;
+  }
+
+  public interface ComplicationDataSourceUpdateRequester {
+    method public default static androidx.wear.watchface.complications.datasource.ComplicationDataSourceUpdateRequester create(android.content.Context context, android.content.ComponentName complicationDataSourceComponent);
+    method public void requestUpdate(int... complicationInstanceIds);
+    method public void requestUpdateAll();
+    field public static final androidx.wear.watchface.complications.datasource.ComplicationDataSourceUpdateRequester.Companion Companion;
+  }
+
+  public static final class ComplicationDataSourceUpdateRequester.Companion {
+    method public androidx.wear.watchface.complications.datasource.ComplicationDataSourceUpdateRequester create(android.content.Context context, android.content.ComponentName complicationDataSourceComponent);
+  }
+
+  public final class ComplicationRequest {
+    ctor public ComplicationRequest(int complicationInstanceId, androidx.wear.watchface.complications.data.ComplicationType complicationType);
+    method public int getComplicationInstanceId();
+    method public androidx.wear.watchface.complications.data.ComplicationType getComplicationType();
+    property public final int complicationInstanceId;
+    property public final androidx.wear.watchface.complications.data.ComplicationType complicationType;
+  }
+
+}
+
diff --git a/wear/watchface/watchface-complications-data-source/api/public_plus_experimental_1.0.0-beta02.txt b/wear/watchface/watchface-complications-data-source/api/public_plus_experimental_1.0.0-beta02.txt
new file mode 100644
index 0000000..9ab81f6
--- /dev/null
+++ b/wear/watchface/watchface-complications-data-source/api/public_plus_experimental_1.0.0-beta02.txt
@@ -0,0 +1,50 @@
+// Signature format: 4.0
+package androidx.wear.watchface.complications.datasource {
+
+  public abstract class ComplicationDataSourceService extends android.app.Service {
+    ctor public ComplicationDataSourceService();
+    method public abstract androidx.wear.watchface.complications.data.ComplicationData? getPreviewData(androidx.wear.watchface.complications.data.ComplicationType type);
+    method public final android.os.IBinder? onBind(android.content.Intent intent);
+    method @UiThread public void onComplicationActivated(int complicationInstanceId, androidx.wear.watchface.complications.data.ComplicationType type);
+    method @UiThread public void onComplicationDeactivated(int complicationInstanceId);
+    method @UiThread public abstract void onComplicationRequest(androidx.wear.watchface.complications.datasource.ComplicationRequest request, androidx.wear.watchface.complications.datasource.ComplicationDataSourceService.ComplicationRequestListener listener);
+    field public static final String ACTION_COMPLICATION_UPDATE_REQUEST = "android.support.wearable.complications.ACTION_COMPLICATION_UPDATE_REQUEST";
+    field public static final String CATEGORY_DATA_SOURCE_CONFIG = "android.support.wearable.complications.category.PROVIDER_CONFIG";
+    field public static final androidx.wear.watchface.complications.datasource.ComplicationDataSourceService.Companion Companion;
+    field public static final String EXTRA_CONFIG_COMPLICATION_ID = "android.support.wearable.complications.EXTRA_CONFIG_COMPLICATION_ID";
+    field public static final String EXTRA_CONFIG_COMPLICATION_TYPE = "android.support.wearable.complications.EXTRA_CONFIG_COMPLICATION_TYPE";
+    field public static final String EXTRA_CONFIG_DATA_SOURCE_COMPONENT = "android.support.wearable.complications.EXTRA_CONFIG_PROVIDER_COMPONENT";
+    field public static final String METADATA_KEY_DATA_SOURCE_CONFIG_ACTION = "android.support.wearable.complications.PROVIDER_CONFIG_ACTION";
+    field public static final String METADATA_KEY_SAFE_WATCH_FACES = "android.support.wearable.complications.SAFE_WATCH_FACES";
+    field public static final String METADATA_KEY_SUPPORTED_TYPES = "android.support.wearable.complications.SUPPORTED_TYPES";
+    field public static final String METADATA_KEY_UPDATE_PERIOD_SECONDS = "android.support.wearable.complications.UPDATE_PERIOD_SECONDS";
+  }
+
+  public static final class ComplicationDataSourceService.Companion {
+  }
+
+  public static interface ComplicationDataSourceService.ComplicationRequestListener {
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void onComplicationData(androidx.wear.watchface.complications.data.ComplicationData? complicationData) throws android.os.RemoteException;
+  }
+
+  public interface ComplicationDataSourceUpdateRequester {
+    method public default static androidx.wear.watchface.complications.datasource.ComplicationDataSourceUpdateRequester create(android.content.Context context, android.content.ComponentName complicationDataSourceComponent);
+    method public void requestUpdate(int... complicationInstanceIds);
+    method public void requestUpdateAll();
+    field public static final androidx.wear.watchface.complications.datasource.ComplicationDataSourceUpdateRequester.Companion Companion;
+  }
+
+  public static final class ComplicationDataSourceUpdateRequester.Companion {
+    method public androidx.wear.watchface.complications.datasource.ComplicationDataSourceUpdateRequester create(android.content.Context context, android.content.ComponentName complicationDataSourceComponent);
+  }
+
+  public final class ComplicationRequest {
+    ctor public ComplicationRequest(int complicationInstanceId, androidx.wear.watchface.complications.data.ComplicationType complicationType);
+    method public int getComplicationInstanceId();
+    method public androidx.wear.watchface.complications.data.ComplicationType getComplicationType();
+    property public final int complicationInstanceId;
+    property public final androidx.wear.watchface.complications.data.ComplicationType complicationType;
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/wear/watchface/watchface-complications-data-source/api/res-1.0.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to wear/watchface/watchface-complications-data-source/api/res-1.0.0-beta02.txt
diff --git a/wear/watchface/watchface-complications-data-source/api/restricted_1.0.0-beta02.txt b/wear/watchface/watchface-complications-data-source/api/restricted_1.0.0-beta02.txt
new file mode 100644
index 0000000..9ab81f6
--- /dev/null
+++ b/wear/watchface/watchface-complications-data-source/api/restricted_1.0.0-beta02.txt
@@ -0,0 +1,50 @@
+// Signature format: 4.0
+package androidx.wear.watchface.complications.datasource {
+
+  public abstract class ComplicationDataSourceService extends android.app.Service {
+    ctor public ComplicationDataSourceService();
+    method public abstract androidx.wear.watchface.complications.data.ComplicationData? getPreviewData(androidx.wear.watchface.complications.data.ComplicationType type);
+    method public final android.os.IBinder? onBind(android.content.Intent intent);
+    method @UiThread public void onComplicationActivated(int complicationInstanceId, androidx.wear.watchface.complications.data.ComplicationType type);
+    method @UiThread public void onComplicationDeactivated(int complicationInstanceId);
+    method @UiThread public abstract void onComplicationRequest(androidx.wear.watchface.complications.datasource.ComplicationRequest request, androidx.wear.watchface.complications.datasource.ComplicationDataSourceService.ComplicationRequestListener listener);
+    field public static final String ACTION_COMPLICATION_UPDATE_REQUEST = "android.support.wearable.complications.ACTION_COMPLICATION_UPDATE_REQUEST";
+    field public static final String CATEGORY_DATA_SOURCE_CONFIG = "android.support.wearable.complications.category.PROVIDER_CONFIG";
+    field public static final androidx.wear.watchface.complications.datasource.ComplicationDataSourceService.Companion Companion;
+    field public static final String EXTRA_CONFIG_COMPLICATION_ID = "android.support.wearable.complications.EXTRA_CONFIG_COMPLICATION_ID";
+    field public static final String EXTRA_CONFIG_COMPLICATION_TYPE = "android.support.wearable.complications.EXTRA_CONFIG_COMPLICATION_TYPE";
+    field public static final String EXTRA_CONFIG_DATA_SOURCE_COMPONENT = "android.support.wearable.complications.EXTRA_CONFIG_PROVIDER_COMPONENT";
+    field public static final String METADATA_KEY_DATA_SOURCE_CONFIG_ACTION = "android.support.wearable.complications.PROVIDER_CONFIG_ACTION";
+    field public static final String METADATA_KEY_SAFE_WATCH_FACES = "android.support.wearable.complications.SAFE_WATCH_FACES";
+    field public static final String METADATA_KEY_SUPPORTED_TYPES = "android.support.wearable.complications.SUPPORTED_TYPES";
+    field public static final String METADATA_KEY_UPDATE_PERIOD_SECONDS = "android.support.wearable.complications.UPDATE_PERIOD_SECONDS";
+  }
+
+  public static final class ComplicationDataSourceService.Companion {
+  }
+
+  public static interface ComplicationDataSourceService.ComplicationRequestListener {
+    method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void onComplicationData(androidx.wear.watchface.complications.data.ComplicationData? complicationData) throws android.os.RemoteException;
+  }
+
+  public interface ComplicationDataSourceUpdateRequester {
+    method public default static androidx.wear.watchface.complications.datasource.ComplicationDataSourceUpdateRequester create(android.content.Context context, android.content.ComponentName complicationDataSourceComponent);
+    method public void requestUpdate(int... complicationInstanceIds);
+    method public void requestUpdateAll();
+    field public static final androidx.wear.watchface.complications.datasource.ComplicationDataSourceUpdateRequester.Companion Companion;
+  }
+
+  public static final class ComplicationDataSourceUpdateRequester.Companion {
+    method public androidx.wear.watchface.complications.datasource.ComplicationDataSourceUpdateRequester create(android.content.Context context, android.content.ComponentName complicationDataSourceComponent);
+  }
+
+  public final class ComplicationRequest {
+    ctor public ComplicationRequest(int complicationInstanceId, androidx.wear.watchface.complications.data.ComplicationType complicationType);
+    method public int getComplicationInstanceId();
+    method public androidx.wear.watchface.complications.data.ComplicationType getComplicationType();
+    property public final int complicationInstanceId;
+    property public final androidx.wear.watchface.complications.data.ComplicationType complicationType;
+  }
+
+}
+
diff --git a/wear/watchface/watchface-complications-data/api/1.0.0-beta02.txt b/wear/watchface/watchface-complications-data/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..34377b0
--- /dev/null
+++ b/wear/watchface/watchface-complications-data/api/1.0.0-beta02.txt
@@ -0,0 +1,317 @@
+// Signature format: 4.0
+package androidx.wear.watchface.complications.data {
+
+  public abstract sealed class ComplicationData {
+    method public final android.app.PendingIntent? getTapAction();
+    method public final androidx.wear.watchface.complications.data.ComplicationType getType();
+    method public final androidx.wear.watchface.complications.data.TimeRange getValidTimeRange();
+    property public final android.app.PendingIntent? tapAction;
+    property public final androidx.wear.watchface.complications.data.ComplicationType type;
+    property public final androidx.wear.watchface.complications.data.TimeRange validTimeRange;
+  }
+
+  public interface ComplicationText {
+    method public java.time.Instant getNextChangeTime(java.time.Instant afterInstant);
+    method public CharSequence getTextAt(android.content.res.Resources resources, java.time.Instant instant);
+    method public boolean isAlwaysEmpty();
+    method public boolean returnsSameText(java.time.Instant firstInstant, java.time.Instant secondInstant);
+    field public static final androidx.wear.watchface.complications.data.ComplicationText.Companion Companion;
+    field public static final androidx.wear.watchface.complications.data.ComplicationText EMPTY;
+  }
+
+  public static final class ComplicationText.Companion {
+  }
+
+  public enum ComplicationType {
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType EMPTY;
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType LONG_TEXT;
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType MONOCHROMATIC_IMAGE;
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType NOT_CONFIGURED;
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType NO_DATA;
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType NO_PERMISSION;
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType PHOTO_IMAGE;
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType RANGED_VALUE;
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType SHORT_TEXT;
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType SMALL_IMAGE;
+  }
+
+  public final class CountDownTimeReference {
+    ctor public CountDownTimeReference(java.time.Instant instant);
+    method public java.time.Instant getInstant();
+    property public final java.time.Instant instant;
+  }
+
+  public final class CountUpTimeReference {
+    ctor public CountUpTimeReference(java.time.Instant instant);
+    method public java.time.Instant getInstant();
+    property public final java.time.Instant instant;
+  }
+
+  public final class DataKt {
+  }
+
+  public final class EmptyComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    ctor public EmptyComplicationData();
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public final class LongTextComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
+    method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
+    method public androidx.wear.watchface.complications.data.SmallImage? getSmallImage();
+    method public androidx.wear.watchface.complications.data.ComplicationText getText();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
+    property public final androidx.wear.watchface.complications.data.ComplicationText? contentDescription;
+    property public final androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage;
+    property public final androidx.wear.watchface.complications.data.SmallImage? smallImage;
+    property public final androidx.wear.watchface.complications.data.ComplicationText text;
+    property public final androidx.wear.watchface.complications.data.ComplicationText? title;
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public static final class LongTextComplicationData.Builder {
+    ctor public LongTextComplicationData.Builder(androidx.wear.watchface.complications.data.ComplicationText text, androidx.wear.watchface.complications.data.ComplicationText contentDescription);
+    method public androidx.wear.watchface.complications.data.LongTextComplicationData build();
+    method public androidx.wear.watchface.complications.data.LongTextComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? icon);
+    method public androidx.wear.watchface.complications.data.LongTextComplicationData.Builder setSmallImage(androidx.wear.watchface.complications.data.SmallImage? smallImage);
+    method public androidx.wear.watchface.complications.data.LongTextComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
+    method public androidx.wear.watchface.complications.data.LongTextComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
+    method public androidx.wear.watchface.complications.data.LongTextComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
+  }
+
+  public final class MonochromaticImage {
+    method public android.graphics.drawable.Icon? getAmbientImage();
+    method public android.graphics.drawable.Icon getImage();
+    property public final android.graphics.drawable.Icon? ambientImage;
+    property public final android.graphics.drawable.Icon image;
+  }
+
+  public static final class MonochromaticImage.Builder {
+    ctor public MonochromaticImage.Builder(android.graphics.drawable.Icon image);
+    method public androidx.wear.watchface.complications.data.MonochromaticImage build();
+    method public androidx.wear.watchface.complications.data.MonochromaticImage.Builder setAmbientImage(android.graphics.drawable.Icon? ambientImage);
+  }
+
+  public final class MonochromaticImageComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
+    method public androidx.wear.watchface.complications.data.MonochromaticImage getMonochromaticImage();
+    property public final androidx.wear.watchface.complications.data.ComplicationText? contentDescription;
+    property public final androidx.wear.watchface.complications.data.MonochromaticImage monochromaticImage;
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public static final class MonochromaticImageComplicationData.Builder {
+    ctor public MonochromaticImageComplicationData.Builder(androidx.wear.watchface.complications.data.MonochromaticImage monochromaticImage, androidx.wear.watchface.complications.data.ComplicationText contentDescription);
+    method public androidx.wear.watchface.complications.data.MonochromaticImageComplicationData build();
+    method public androidx.wear.watchface.complications.data.MonochromaticImageComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
+    method public androidx.wear.watchface.complications.data.MonochromaticImageComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
+  }
+
+  public final class NoDataComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    ctor public NoDataComplicationData();
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public final class NoPermissionComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getText();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
+    property public final androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage;
+    property public final androidx.wear.watchface.complications.data.ComplicationText? text;
+    property public final androidx.wear.watchface.complications.data.ComplicationText? title;
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public static final class NoPermissionComplicationData.Builder {
+    ctor public NoPermissionComplicationData.Builder();
+    method public androidx.wear.watchface.complications.data.NoPermissionComplicationData build();
+    method public androidx.wear.watchface.complications.data.NoPermissionComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage);
+    method public androidx.wear.watchface.complications.data.NoPermissionComplicationData.Builder setText(androidx.wear.watchface.complications.data.ComplicationText? text);
+    method public androidx.wear.watchface.complications.data.NoPermissionComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
+  }
+
+  public final class NotConfiguredComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    ctor public NotConfiguredComplicationData();
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public final class PhotoImageComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
+    method public android.graphics.drawable.Icon getPhotoImage();
+    property public final androidx.wear.watchface.complications.data.ComplicationText? contentDescription;
+    property public final android.graphics.drawable.Icon photoImage;
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public static final class PhotoImageComplicationData.Builder {
+    ctor public PhotoImageComplicationData.Builder(android.graphics.drawable.Icon photoImage, androidx.wear.watchface.complications.data.ComplicationText contentDescription);
+    method public androidx.wear.watchface.complications.data.PhotoImageComplicationData build();
+    method public androidx.wear.watchface.complications.data.PhotoImageComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
+    method public androidx.wear.watchface.complications.data.PhotoImageComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
+  }
+
+  public final class PlainComplicationText implements androidx.wear.watchface.complications.data.ComplicationText {
+  }
+
+  public static final class PlainComplicationText.Builder {
+    ctor public PlainComplicationText.Builder(CharSequence text);
+    method public androidx.wear.watchface.complications.data.PlainComplicationText build();
+  }
+
+  public final class RangedValueComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
+    method public float getMax();
+    method public float getMin();
+    method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getText();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
+    method public float getValue();
+    property public final androidx.wear.watchface.complications.data.ComplicationText? contentDescription;
+    property public final float max;
+    property public final float min;
+    property public final androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage;
+    property public final androidx.wear.watchface.complications.data.ComplicationText? text;
+    property public final androidx.wear.watchface.complications.data.ComplicationText? title;
+    property public final float value;
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public static final class RangedValueComplicationData.Builder {
+    ctor public RangedValueComplicationData.Builder(float value, float min, float max, androidx.wear.watchface.complications.data.ComplicationText contentDescription);
+    method public androidx.wear.watchface.complications.data.RangedValueComplicationData build();
+    method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage);
+    method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
+    method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setText(androidx.wear.watchface.complications.data.ComplicationText? text);
+    method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
+    method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
+  }
+
+  public final class ShortTextComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
+    method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
+    method public androidx.wear.watchface.complications.data.ComplicationText getText();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
+    property public final androidx.wear.watchface.complications.data.ComplicationText? contentDescription;
+    property public final androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage;
+    property public final androidx.wear.watchface.complications.data.ComplicationText text;
+    property public final androidx.wear.watchface.complications.data.ComplicationText? title;
+    field public static final int MAX_TEXT_LENGTH;
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public static final class ShortTextComplicationData.Builder {
+    ctor public ShortTextComplicationData.Builder(androidx.wear.watchface.complications.data.ComplicationText text, androidx.wear.watchface.complications.data.ComplicationText contentDescription);
+    method public androidx.wear.watchface.complications.data.ShortTextComplicationData build();
+    method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage);
+    method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
+    method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
+    method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
+  }
+
+  public final class SmallImage {
+    method public android.graphics.drawable.Icon? getAmbientImage();
+    method public android.graphics.drawable.Icon getImage();
+    method public androidx.wear.watchface.complications.data.SmallImageType getType();
+    property public final android.graphics.drawable.Icon? ambientImage;
+    property public final android.graphics.drawable.Icon image;
+    property public final androidx.wear.watchface.complications.data.SmallImageType type;
+  }
+
+  public static final class SmallImage.Builder {
+    ctor public SmallImage.Builder(android.graphics.drawable.Icon image, androidx.wear.watchface.complications.data.SmallImageType type);
+    method public androidx.wear.watchface.complications.data.SmallImage build();
+    method public androidx.wear.watchface.complications.data.SmallImage.Builder setAmbientImage(android.graphics.drawable.Icon? ambientImage);
+  }
+
+  public final class SmallImageComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
+    method public androidx.wear.watchface.complications.data.SmallImage getSmallImage();
+    property public final androidx.wear.watchface.complications.data.ComplicationText? contentDescription;
+    property public final androidx.wear.watchface.complications.data.SmallImage smallImage;
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public static final class SmallImageComplicationData.Builder {
+    ctor public SmallImageComplicationData.Builder(androidx.wear.watchface.complications.data.SmallImage smallImage, androidx.wear.watchface.complications.data.ComplicationText contentDescription);
+    method public androidx.wear.watchface.complications.data.SmallImageComplicationData build();
+    method public androidx.wear.watchface.complications.data.SmallImageComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
+    method public androidx.wear.watchface.complications.data.SmallImageComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
+  }
+
+  public enum SmallImageType {
+    enum_constant public static final androidx.wear.watchface.complications.data.SmallImageType ICON;
+    enum_constant public static final androidx.wear.watchface.complications.data.SmallImageType PHOTO;
+  }
+
+  public final class TextKt {
+  }
+
+  public final class TimeDifferenceComplicationText implements androidx.wear.watchface.complications.data.ComplicationText {
+    method public java.util.concurrent.TimeUnit? getMinimumTimeUnit();
+  }
+
+  public static final class TimeDifferenceComplicationText.Builder {
+    ctor public TimeDifferenceComplicationText.Builder(androidx.wear.watchface.complications.data.TimeDifferenceStyle style, androidx.wear.watchface.complications.data.CountUpTimeReference countUpTimeReference);
+    ctor public TimeDifferenceComplicationText.Builder(androidx.wear.watchface.complications.data.TimeDifferenceStyle style, androidx.wear.watchface.complications.data.CountDownTimeReference countDownTimeReference);
+    method public androidx.wear.watchface.complications.data.TimeDifferenceComplicationText build();
+    method public androidx.wear.watchface.complications.data.TimeDifferenceComplicationText.Builder setDisplayAsNow(boolean displayAsNow);
+    method public androidx.wear.watchface.complications.data.TimeDifferenceComplicationText.Builder setMinimumTimeUnit(java.util.concurrent.TimeUnit? minimumUnit);
+    method public androidx.wear.watchface.complications.data.TimeDifferenceComplicationText.Builder setText(CharSequence? text);
+  }
+
+  public enum TimeDifferenceStyle {
+    enum_constant public static final androidx.wear.watchface.complications.data.TimeDifferenceStyle SHORT_DUAL_UNIT;
+    enum_constant public static final androidx.wear.watchface.complications.data.TimeDifferenceStyle SHORT_SINGLE_UNIT;
+    enum_constant public static final androidx.wear.watchface.complications.data.TimeDifferenceStyle SHORT_WORDS_SINGLE_UNIT;
+    enum_constant public static final androidx.wear.watchface.complications.data.TimeDifferenceStyle STOPWATCH;
+    enum_constant public static final androidx.wear.watchface.complications.data.TimeDifferenceStyle WORDS_SINGLE_UNIT;
+  }
+
+  public final class TimeFormatComplicationText implements androidx.wear.watchface.complications.data.ComplicationText {
+  }
+
+  public static final class TimeFormatComplicationText.Builder {
+    ctor public TimeFormatComplicationText.Builder(String format);
+    method public androidx.wear.watchface.complications.data.TimeFormatComplicationText build();
+    method public androidx.wear.watchface.complications.data.TimeFormatComplicationText.Builder setStyle(androidx.wear.watchface.complications.data.TimeFormatStyle style);
+    method public androidx.wear.watchface.complications.data.TimeFormatComplicationText.Builder setText(CharSequence text);
+    method public androidx.wear.watchface.complications.data.TimeFormatComplicationText.Builder setTimeZone(android.icu.util.TimeZone timeZone);
+  }
+
+  public enum TimeFormatStyle {
+    enum_constant public static final androidx.wear.watchface.complications.data.TimeFormatStyle DEFAULT;
+    enum_constant public static final androidx.wear.watchface.complications.data.TimeFormatStyle LOWER_CASE;
+    enum_constant public static final androidx.wear.watchface.complications.data.TimeFormatStyle UPPER_CASE;
+  }
+
+  public final class TimeRange {
+    method public static androidx.wear.watchface.complications.data.TimeRange after(java.time.Instant startInstant);
+    method public static androidx.wear.watchface.complications.data.TimeRange before(java.time.Instant endInstant);
+    method public static androidx.wear.watchface.complications.data.TimeRange between(java.time.Instant startInstant, java.time.Instant endInstant);
+    method public operator boolean contains(java.time.Instant dateTimeMillis);
+    method public java.time.Instant getEndDateTimeMillis();
+    method public java.time.Instant getStartDateTimeMillis();
+    property public final java.time.Instant endDateTimeMillis;
+    property public final java.time.Instant startDateTimeMillis;
+    field public static final androidx.wear.watchface.complications.data.TimeRange ALWAYS;
+    field public static final androidx.wear.watchface.complications.data.TimeRange.Companion Companion;
+  }
+
+  public static final class TimeRange.Companion {
+    method public androidx.wear.watchface.complications.data.TimeRange after(java.time.Instant startInstant);
+    method public androidx.wear.watchface.complications.data.TimeRange before(java.time.Instant endInstant);
+    method public androidx.wear.watchface.complications.data.TimeRange between(java.time.Instant startInstant, java.time.Instant endInstant);
+  }
+
+  public final class TypeKt {
+  }
+
+}
+
+package androidx.wear.watchface.utility {
+
+  public final class TraceEventKt {
+  }
+
+}
+
diff --git a/wear/watchface/watchface-complications-data/api/public_plus_experimental_1.0.0-beta02.txt b/wear/watchface/watchface-complications-data/api/public_plus_experimental_1.0.0-beta02.txt
new file mode 100644
index 0000000..34377b0
--- /dev/null
+++ b/wear/watchface/watchface-complications-data/api/public_plus_experimental_1.0.0-beta02.txt
@@ -0,0 +1,317 @@
+// Signature format: 4.0
+package androidx.wear.watchface.complications.data {
+
+  public abstract sealed class ComplicationData {
+    method public final android.app.PendingIntent? getTapAction();
+    method public final androidx.wear.watchface.complications.data.ComplicationType getType();
+    method public final androidx.wear.watchface.complications.data.TimeRange getValidTimeRange();
+    property public final android.app.PendingIntent? tapAction;
+    property public final androidx.wear.watchface.complications.data.ComplicationType type;
+    property public final androidx.wear.watchface.complications.data.TimeRange validTimeRange;
+  }
+
+  public interface ComplicationText {
+    method public java.time.Instant getNextChangeTime(java.time.Instant afterInstant);
+    method public CharSequence getTextAt(android.content.res.Resources resources, java.time.Instant instant);
+    method public boolean isAlwaysEmpty();
+    method public boolean returnsSameText(java.time.Instant firstInstant, java.time.Instant secondInstant);
+    field public static final androidx.wear.watchface.complications.data.ComplicationText.Companion Companion;
+    field public static final androidx.wear.watchface.complications.data.ComplicationText EMPTY;
+  }
+
+  public static final class ComplicationText.Companion {
+  }
+
+  public enum ComplicationType {
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType EMPTY;
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType LONG_TEXT;
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType MONOCHROMATIC_IMAGE;
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType NOT_CONFIGURED;
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType NO_DATA;
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType NO_PERMISSION;
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType PHOTO_IMAGE;
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType RANGED_VALUE;
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType SHORT_TEXT;
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType SMALL_IMAGE;
+  }
+
+  public final class CountDownTimeReference {
+    ctor public CountDownTimeReference(java.time.Instant instant);
+    method public java.time.Instant getInstant();
+    property public final java.time.Instant instant;
+  }
+
+  public final class CountUpTimeReference {
+    ctor public CountUpTimeReference(java.time.Instant instant);
+    method public java.time.Instant getInstant();
+    property public final java.time.Instant instant;
+  }
+
+  public final class DataKt {
+  }
+
+  public final class EmptyComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    ctor public EmptyComplicationData();
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public final class LongTextComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
+    method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
+    method public androidx.wear.watchface.complications.data.SmallImage? getSmallImage();
+    method public androidx.wear.watchface.complications.data.ComplicationText getText();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
+    property public final androidx.wear.watchface.complications.data.ComplicationText? contentDescription;
+    property public final androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage;
+    property public final androidx.wear.watchface.complications.data.SmallImage? smallImage;
+    property public final androidx.wear.watchface.complications.data.ComplicationText text;
+    property public final androidx.wear.watchface.complications.data.ComplicationText? title;
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public static final class LongTextComplicationData.Builder {
+    ctor public LongTextComplicationData.Builder(androidx.wear.watchface.complications.data.ComplicationText text, androidx.wear.watchface.complications.data.ComplicationText contentDescription);
+    method public androidx.wear.watchface.complications.data.LongTextComplicationData build();
+    method public androidx.wear.watchface.complications.data.LongTextComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? icon);
+    method public androidx.wear.watchface.complications.data.LongTextComplicationData.Builder setSmallImage(androidx.wear.watchface.complications.data.SmallImage? smallImage);
+    method public androidx.wear.watchface.complications.data.LongTextComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
+    method public androidx.wear.watchface.complications.data.LongTextComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
+    method public androidx.wear.watchface.complications.data.LongTextComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
+  }
+
+  public final class MonochromaticImage {
+    method public android.graphics.drawable.Icon? getAmbientImage();
+    method public android.graphics.drawable.Icon getImage();
+    property public final android.graphics.drawable.Icon? ambientImage;
+    property public final android.graphics.drawable.Icon image;
+  }
+
+  public static final class MonochromaticImage.Builder {
+    ctor public MonochromaticImage.Builder(android.graphics.drawable.Icon image);
+    method public androidx.wear.watchface.complications.data.MonochromaticImage build();
+    method public androidx.wear.watchface.complications.data.MonochromaticImage.Builder setAmbientImage(android.graphics.drawable.Icon? ambientImage);
+  }
+
+  public final class MonochromaticImageComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
+    method public androidx.wear.watchface.complications.data.MonochromaticImage getMonochromaticImage();
+    property public final androidx.wear.watchface.complications.data.ComplicationText? contentDescription;
+    property public final androidx.wear.watchface.complications.data.MonochromaticImage monochromaticImage;
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public static final class MonochromaticImageComplicationData.Builder {
+    ctor public MonochromaticImageComplicationData.Builder(androidx.wear.watchface.complications.data.MonochromaticImage monochromaticImage, androidx.wear.watchface.complications.data.ComplicationText contentDescription);
+    method public androidx.wear.watchface.complications.data.MonochromaticImageComplicationData build();
+    method public androidx.wear.watchface.complications.data.MonochromaticImageComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
+    method public androidx.wear.watchface.complications.data.MonochromaticImageComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
+  }
+
+  public final class NoDataComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    ctor public NoDataComplicationData();
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public final class NoPermissionComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getText();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
+    property public final androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage;
+    property public final androidx.wear.watchface.complications.data.ComplicationText? text;
+    property public final androidx.wear.watchface.complications.data.ComplicationText? title;
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public static final class NoPermissionComplicationData.Builder {
+    ctor public NoPermissionComplicationData.Builder();
+    method public androidx.wear.watchface.complications.data.NoPermissionComplicationData build();
+    method public androidx.wear.watchface.complications.data.NoPermissionComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage);
+    method public androidx.wear.watchface.complications.data.NoPermissionComplicationData.Builder setText(androidx.wear.watchface.complications.data.ComplicationText? text);
+    method public androidx.wear.watchface.complications.data.NoPermissionComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
+  }
+
+  public final class NotConfiguredComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    ctor public NotConfiguredComplicationData();
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public final class PhotoImageComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
+    method public android.graphics.drawable.Icon getPhotoImage();
+    property public final androidx.wear.watchface.complications.data.ComplicationText? contentDescription;
+    property public final android.graphics.drawable.Icon photoImage;
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public static final class PhotoImageComplicationData.Builder {
+    ctor public PhotoImageComplicationData.Builder(android.graphics.drawable.Icon photoImage, androidx.wear.watchface.complications.data.ComplicationText contentDescription);
+    method public androidx.wear.watchface.complications.data.PhotoImageComplicationData build();
+    method public androidx.wear.watchface.complications.data.PhotoImageComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
+    method public androidx.wear.watchface.complications.data.PhotoImageComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
+  }
+
+  public final class PlainComplicationText implements androidx.wear.watchface.complications.data.ComplicationText {
+  }
+
+  public static final class PlainComplicationText.Builder {
+    ctor public PlainComplicationText.Builder(CharSequence text);
+    method public androidx.wear.watchface.complications.data.PlainComplicationText build();
+  }
+
+  public final class RangedValueComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
+    method public float getMax();
+    method public float getMin();
+    method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getText();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
+    method public float getValue();
+    property public final androidx.wear.watchface.complications.data.ComplicationText? contentDescription;
+    property public final float max;
+    property public final float min;
+    property public final androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage;
+    property public final androidx.wear.watchface.complications.data.ComplicationText? text;
+    property public final androidx.wear.watchface.complications.data.ComplicationText? title;
+    property public final float value;
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public static final class RangedValueComplicationData.Builder {
+    ctor public RangedValueComplicationData.Builder(float value, float min, float max, androidx.wear.watchface.complications.data.ComplicationText contentDescription);
+    method public androidx.wear.watchface.complications.data.RangedValueComplicationData build();
+    method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage);
+    method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
+    method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setText(androidx.wear.watchface.complications.data.ComplicationText? text);
+    method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
+    method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
+  }
+
+  public final class ShortTextComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
+    method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
+    method public androidx.wear.watchface.complications.data.ComplicationText getText();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
+    property public final androidx.wear.watchface.complications.data.ComplicationText? contentDescription;
+    property public final androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage;
+    property public final androidx.wear.watchface.complications.data.ComplicationText text;
+    property public final androidx.wear.watchface.complications.data.ComplicationText? title;
+    field public static final int MAX_TEXT_LENGTH;
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public static final class ShortTextComplicationData.Builder {
+    ctor public ShortTextComplicationData.Builder(androidx.wear.watchface.complications.data.ComplicationText text, androidx.wear.watchface.complications.data.ComplicationText contentDescription);
+    method public androidx.wear.watchface.complications.data.ShortTextComplicationData build();
+    method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage);
+    method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
+    method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
+    method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
+  }
+
+  public final class SmallImage {
+    method public android.graphics.drawable.Icon? getAmbientImage();
+    method public android.graphics.drawable.Icon getImage();
+    method public androidx.wear.watchface.complications.data.SmallImageType getType();
+    property public final android.graphics.drawable.Icon? ambientImage;
+    property public final android.graphics.drawable.Icon image;
+    property public final androidx.wear.watchface.complications.data.SmallImageType type;
+  }
+
+  public static final class SmallImage.Builder {
+    ctor public SmallImage.Builder(android.graphics.drawable.Icon image, androidx.wear.watchface.complications.data.SmallImageType type);
+    method public androidx.wear.watchface.complications.data.SmallImage build();
+    method public androidx.wear.watchface.complications.data.SmallImage.Builder setAmbientImage(android.graphics.drawable.Icon? ambientImage);
+  }
+
+  public final class SmallImageComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
+    method public androidx.wear.watchface.complications.data.SmallImage getSmallImage();
+    property public final androidx.wear.watchface.complications.data.ComplicationText? contentDescription;
+    property public final androidx.wear.watchface.complications.data.SmallImage smallImage;
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public static final class SmallImageComplicationData.Builder {
+    ctor public SmallImageComplicationData.Builder(androidx.wear.watchface.complications.data.SmallImage smallImage, androidx.wear.watchface.complications.data.ComplicationText contentDescription);
+    method public androidx.wear.watchface.complications.data.SmallImageComplicationData build();
+    method public androidx.wear.watchface.complications.data.SmallImageComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
+    method public androidx.wear.watchface.complications.data.SmallImageComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
+  }
+
+  public enum SmallImageType {
+    enum_constant public static final androidx.wear.watchface.complications.data.SmallImageType ICON;
+    enum_constant public static final androidx.wear.watchface.complications.data.SmallImageType PHOTO;
+  }
+
+  public final class TextKt {
+  }
+
+  public final class TimeDifferenceComplicationText implements androidx.wear.watchface.complications.data.ComplicationText {
+    method public java.util.concurrent.TimeUnit? getMinimumTimeUnit();
+  }
+
+  public static final class TimeDifferenceComplicationText.Builder {
+    ctor public TimeDifferenceComplicationText.Builder(androidx.wear.watchface.complications.data.TimeDifferenceStyle style, androidx.wear.watchface.complications.data.CountUpTimeReference countUpTimeReference);
+    ctor public TimeDifferenceComplicationText.Builder(androidx.wear.watchface.complications.data.TimeDifferenceStyle style, androidx.wear.watchface.complications.data.CountDownTimeReference countDownTimeReference);
+    method public androidx.wear.watchface.complications.data.TimeDifferenceComplicationText build();
+    method public androidx.wear.watchface.complications.data.TimeDifferenceComplicationText.Builder setDisplayAsNow(boolean displayAsNow);
+    method public androidx.wear.watchface.complications.data.TimeDifferenceComplicationText.Builder setMinimumTimeUnit(java.util.concurrent.TimeUnit? minimumUnit);
+    method public androidx.wear.watchface.complications.data.TimeDifferenceComplicationText.Builder setText(CharSequence? text);
+  }
+
+  public enum TimeDifferenceStyle {
+    enum_constant public static final androidx.wear.watchface.complications.data.TimeDifferenceStyle SHORT_DUAL_UNIT;
+    enum_constant public static final androidx.wear.watchface.complications.data.TimeDifferenceStyle SHORT_SINGLE_UNIT;
+    enum_constant public static final androidx.wear.watchface.complications.data.TimeDifferenceStyle SHORT_WORDS_SINGLE_UNIT;
+    enum_constant public static final androidx.wear.watchface.complications.data.TimeDifferenceStyle STOPWATCH;
+    enum_constant public static final androidx.wear.watchface.complications.data.TimeDifferenceStyle WORDS_SINGLE_UNIT;
+  }
+
+  public final class TimeFormatComplicationText implements androidx.wear.watchface.complications.data.ComplicationText {
+  }
+
+  public static final class TimeFormatComplicationText.Builder {
+    ctor public TimeFormatComplicationText.Builder(String format);
+    method public androidx.wear.watchface.complications.data.TimeFormatComplicationText build();
+    method public androidx.wear.watchface.complications.data.TimeFormatComplicationText.Builder setStyle(androidx.wear.watchface.complications.data.TimeFormatStyle style);
+    method public androidx.wear.watchface.complications.data.TimeFormatComplicationText.Builder setText(CharSequence text);
+    method public androidx.wear.watchface.complications.data.TimeFormatComplicationText.Builder setTimeZone(android.icu.util.TimeZone timeZone);
+  }
+
+  public enum TimeFormatStyle {
+    enum_constant public static final androidx.wear.watchface.complications.data.TimeFormatStyle DEFAULT;
+    enum_constant public static final androidx.wear.watchface.complications.data.TimeFormatStyle LOWER_CASE;
+    enum_constant public static final androidx.wear.watchface.complications.data.TimeFormatStyle UPPER_CASE;
+  }
+
+  public final class TimeRange {
+    method public static androidx.wear.watchface.complications.data.TimeRange after(java.time.Instant startInstant);
+    method public static androidx.wear.watchface.complications.data.TimeRange before(java.time.Instant endInstant);
+    method public static androidx.wear.watchface.complications.data.TimeRange between(java.time.Instant startInstant, java.time.Instant endInstant);
+    method public operator boolean contains(java.time.Instant dateTimeMillis);
+    method public java.time.Instant getEndDateTimeMillis();
+    method public java.time.Instant getStartDateTimeMillis();
+    property public final java.time.Instant endDateTimeMillis;
+    property public final java.time.Instant startDateTimeMillis;
+    field public static final androidx.wear.watchface.complications.data.TimeRange ALWAYS;
+    field public static final androidx.wear.watchface.complications.data.TimeRange.Companion Companion;
+  }
+
+  public static final class TimeRange.Companion {
+    method public androidx.wear.watchface.complications.data.TimeRange after(java.time.Instant startInstant);
+    method public androidx.wear.watchface.complications.data.TimeRange before(java.time.Instant endInstant);
+    method public androidx.wear.watchface.complications.data.TimeRange between(java.time.Instant startInstant, java.time.Instant endInstant);
+  }
+
+  public final class TypeKt {
+  }
+
+}
+
+package androidx.wear.watchface.utility {
+
+  public final class TraceEventKt {
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/wear/watchface/watchface-complications-data/api/res-1.0.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to wear/watchface/watchface-complications-data/api/res-1.0.0-beta02.txt
diff --git a/wear/watchface/watchface-complications-data/api/restricted_1.0.0-beta02.txt b/wear/watchface/watchface-complications-data/api/restricted_1.0.0-beta02.txt
new file mode 100644
index 0000000..534b61d
--- /dev/null
+++ b/wear/watchface/watchface-complications-data/api/restricted_1.0.0-beta02.txt
@@ -0,0 +1,327 @@
+// Signature format: 4.0
+package androidx.wear.watchface.complications.data {
+
+  public abstract sealed class ComplicationData {
+    method public final android.app.PendingIntent? getTapAction();
+    method public final androidx.wear.watchface.complications.data.ComplicationType getType();
+    method public final androidx.wear.watchface.complications.data.TimeRange getValidTimeRange();
+    property public final android.app.PendingIntent? tapAction;
+    property public final androidx.wear.watchface.complications.data.ComplicationType type;
+    property public final androidx.wear.watchface.complications.data.TimeRange validTimeRange;
+  }
+
+  public interface ComplicationText {
+    method public java.time.Instant getNextChangeTime(java.time.Instant afterInstant);
+    method public CharSequence getTextAt(android.content.res.Resources resources, java.time.Instant instant);
+    method public boolean isAlwaysEmpty();
+    method public boolean returnsSameText(java.time.Instant firstInstant, java.time.Instant secondInstant);
+    field public static final androidx.wear.watchface.complications.data.ComplicationText.Companion Companion;
+    field public static final androidx.wear.watchface.complications.data.ComplicationText EMPTY;
+  }
+
+  public static final class ComplicationText.Companion {
+  }
+
+  public enum ComplicationType {
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType EMPTY;
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType LONG_TEXT;
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType MONOCHROMATIC_IMAGE;
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType NOT_CONFIGURED;
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType NO_DATA;
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType NO_PERMISSION;
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType PHOTO_IMAGE;
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType RANGED_VALUE;
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType SHORT_TEXT;
+    enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType SMALL_IMAGE;
+  }
+
+  public final class CountDownTimeReference {
+    ctor public CountDownTimeReference(java.time.Instant instant);
+    method public java.time.Instant getInstant();
+    property public final java.time.Instant instant;
+  }
+
+  public final class CountUpTimeReference {
+    ctor public CountUpTimeReference(java.time.Instant instant);
+    method public java.time.Instant getInstant();
+    property public final java.time.Instant instant;
+  }
+
+  public final class DataKt {
+  }
+
+  public final class EmptyComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    ctor public EmptyComplicationData();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public final class LongTextComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
+    method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
+    method public androidx.wear.watchface.complications.data.SmallImage? getSmallImage();
+    method public androidx.wear.watchface.complications.data.ComplicationText getText();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
+    property public final androidx.wear.watchface.complications.data.ComplicationText? contentDescription;
+    property public final androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage;
+    property public final androidx.wear.watchface.complications.data.SmallImage? smallImage;
+    property public final androidx.wear.watchface.complications.data.ComplicationText text;
+    property public final androidx.wear.watchface.complications.data.ComplicationText? title;
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public static final class LongTextComplicationData.Builder {
+    ctor public LongTextComplicationData.Builder(androidx.wear.watchface.complications.data.ComplicationText text, androidx.wear.watchface.complications.data.ComplicationText contentDescription);
+    method public androidx.wear.watchface.complications.data.LongTextComplicationData build();
+    method public androidx.wear.watchface.complications.data.LongTextComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? icon);
+    method public androidx.wear.watchface.complications.data.LongTextComplicationData.Builder setSmallImage(androidx.wear.watchface.complications.data.SmallImage? smallImage);
+    method public androidx.wear.watchface.complications.data.LongTextComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
+    method public androidx.wear.watchface.complications.data.LongTextComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
+    method public androidx.wear.watchface.complications.data.LongTextComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
+  }
+
+  public final class MonochromaticImage {
+    method public android.graphics.drawable.Icon? getAmbientImage();
+    method public android.graphics.drawable.Icon getImage();
+    property public final android.graphics.drawable.Icon? ambientImage;
+    property public final android.graphics.drawable.Icon image;
+  }
+
+  public static final class MonochromaticImage.Builder {
+    ctor public MonochromaticImage.Builder(android.graphics.drawable.Icon image);
+    method public androidx.wear.watchface.complications.data.MonochromaticImage build();
+    method public androidx.wear.watchface.complications.data.MonochromaticImage.Builder setAmbientImage(android.graphics.drawable.Icon? ambientImage);
+  }
+
+  public final class MonochromaticImageComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
+    method public androidx.wear.watchface.complications.data.MonochromaticImage getMonochromaticImage();
+    property public final androidx.wear.watchface.complications.data.ComplicationText? contentDescription;
+    property public final androidx.wear.watchface.complications.data.MonochromaticImage monochromaticImage;
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public static final class MonochromaticImageComplicationData.Builder {
+    ctor public MonochromaticImageComplicationData.Builder(androidx.wear.watchface.complications.data.MonochromaticImage monochromaticImage, androidx.wear.watchface.complications.data.ComplicationText contentDescription);
+    method public androidx.wear.watchface.complications.data.MonochromaticImageComplicationData build();
+    method public androidx.wear.watchface.complications.data.MonochromaticImageComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
+    method public androidx.wear.watchface.complications.data.MonochromaticImageComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
+  }
+
+  public final class NoDataComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    ctor public NoDataComplicationData();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public final class NoPermissionComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getText();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
+    property public final androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage;
+    property public final androidx.wear.watchface.complications.data.ComplicationText? text;
+    property public final androidx.wear.watchface.complications.data.ComplicationText? title;
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public static final class NoPermissionComplicationData.Builder {
+    ctor public NoPermissionComplicationData.Builder();
+    method public androidx.wear.watchface.complications.data.NoPermissionComplicationData build();
+    method public androidx.wear.watchface.complications.data.NoPermissionComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage);
+    method public androidx.wear.watchface.complications.data.NoPermissionComplicationData.Builder setText(androidx.wear.watchface.complications.data.ComplicationText? text);
+    method public androidx.wear.watchface.complications.data.NoPermissionComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
+  }
+
+  public final class NotConfiguredComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    ctor public NotConfiguredComplicationData();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public final class PhotoImageComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
+    method public android.graphics.drawable.Icon getPhotoImage();
+    property public final androidx.wear.watchface.complications.data.ComplicationText? contentDescription;
+    property public final android.graphics.drawable.Icon photoImage;
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public static final class PhotoImageComplicationData.Builder {
+    ctor public PhotoImageComplicationData.Builder(android.graphics.drawable.Icon photoImage, androidx.wear.watchface.complications.data.ComplicationText contentDescription);
+    method public androidx.wear.watchface.complications.data.PhotoImageComplicationData build();
+    method public androidx.wear.watchface.complications.data.PhotoImageComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
+    method public androidx.wear.watchface.complications.data.PhotoImageComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
+  }
+
+  public final class PlainComplicationText implements androidx.wear.watchface.complications.data.ComplicationText {
+  }
+
+  public static final class PlainComplicationText.Builder {
+    ctor public PlainComplicationText.Builder(CharSequence text);
+    method public androidx.wear.watchface.complications.data.PlainComplicationText build();
+  }
+
+  public final class RangedValueComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
+    method public float getMax();
+    method public float getMin();
+    method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getText();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
+    method public float getValue();
+    property public final androidx.wear.watchface.complications.data.ComplicationText? contentDescription;
+    property public final float max;
+    property public final float min;
+    property public final androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage;
+    property public final androidx.wear.watchface.complications.data.ComplicationText? text;
+    property public final androidx.wear.watchface.complications.data.ComplicationText? title;
+    property public final float value;
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public static final class RangedValueComplicationData.Builder {
+    ctor public RangedValueComplicationData.Builder(float value, float min, float max, androidx.wear.watchface.complications.data.ComplicationText contentDescription);
+    method public androidx.wear.watchface.complications.data.RangedValueComplicationData build();
+    method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage);
+    method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
+    method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setText(androidx.wear.watchface.complications.data.ComplicationText? text);
+    method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
+    method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
+  }
+
+  public final class ShortTextComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
+    method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
+    method public androidx.wear.watchface.complications.data.ComplicationText getText();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
+    property public final androidx.wear.watchface.complications.data.ComplicationText? contentDescription;
+    property public final androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage;
+    property public final androidx.wear.watchface.complications.data.ComplicationText text;
+    property public final androidx.wear.watchface.complications.data.ComplicationText? title;
+    field public static final int MAX_TEXT_LENGTH;
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public static final class ShortTextComplicationData.Builder {
+    ctor public ShortTextComplicationData.Builder(androidx.wear.watchface.complications.data.ComplicationText text, androidx.wear.watchface.complications.data.ComplicationText contentDescription);
+    method public androidx.wear.watchface.complications.data.ShortTextComplicationData build();
+    method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage);
+    method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
+    method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
+    method public androidx.wear.watchface.complications.data.ShortTextComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
+  }
+
+  public final class SmallImage {
+    method public android.graphics.drawable.Icon? getAmbientImage();
+    method public android.graphics.drawable.Icon getImage();
+    method public androidx.wear.watchface.complications.data.SmallImageType getType();
+    property public final android.graphics.drawable.Icon? ambientImage;
+    property public final android.graphics.drawable.Icon image;
+    property public final androidx.wear.watchface.complications.data.SmallImageType type;
+  }
+
+  public static final class SmallImage.Builder {
+    ctor public SmallImage.Builder(android.graphics.drawable.Icon image, androidx.wear.watchface.complications.data.SmallImageType type);
+    method public androidx.wear.watchface.complications.data.SmallImage build();
+    method public androidx.wear.watchface.complications.data.SmallImage.Builder setAmbientImage(android.graphics.drawable.Icon? ambientImage);
+  }
+
+  public final class SmallImageComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public android.support.wearable.complications.ComplicationData asWireComplicationData();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
+    method public androidx.wear.watchface.complications.data.SmallImage getSmallImage();
+    property public final androidx.wear.watchface.complications.data.ComplicationText? contentDescription;
+    property public final androidx.wear.watchface.complications.data.SmallImage smallImage;
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public static final class SmallImageComplicationData.Builder {
+    ctor public SmallImageComplicationData.Builder(androidx.wear.watchface.complications.data.SmallImage smallImage, androidx.wear.watchface.complications.data.ComplicationText contentDescription);
+    method public androidx.wear.watchface.complications.data.SmallImageComplicationData build();
+    method public androidx.wear.watchface.complications.data.SmallImageComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
+    method public androidx.wear.watchface.complications.data.SmallImageComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
+  }
+
+  public enum SmallImageType {
+    enum_constant public static final androidx.wear.watchface.complications.data.SmallImageType ICON;
+    enum_constant public static final androidx.wear.watchface.complications.data.SmallImageType PHOTO;
+  }
+
+  public final class TextKt {
+  }
+
+  public final class TimeDifferenceComplicationText implements androidx.wear.watchface.complications.data.ComplicationText {
+    method public java.util.concurrent.TimeUnit? getMinimumTimeUnit();
+  }
+
+  public static final class TimeDifferenceComplicationText.Builder {
+    ctor public TimeDifferenceComplicationText.Builder(androidx.wear.watchface.complications.data.TimeDifferenceStyle style, androidx.wear.watchface.complications.data.CountUpTimeReference countUpTimeReference);
+    ctor public TimeDifferenceComplicationText.Builder(androidx.wear.watchface.complications.data.TimeDifferenceStyle style, androidx.wear.watchface.complications.data.CountDownTimeReference countDownTimeReference);
+    method public androidx.wear.watchface.complications.data.TimeDifferenceComplicationText build();
+    method public androidx.wear.watchface.complications.data.TimeDifferenceComplicationText.Builder setDisplayAsNow(boolean displayAsNow);
+    method public androidx.wear.watchface.complications.data.TimeDifferenceComplicationText.Builder setMinimumTimeUnit(java.util.concurrent.TimeUnit? minimumUnit);
+    method public androidx.wear.watchface.complications.data.TimeDifferenceComplicationText.Builder setText(CharSequence? text);
+  }
+
+  public enum TimeDifferenceStyle {
+    enum_constant public static final androidx.wear.watchface.complications.data.TimeDifferenceStyle SHORT_DUAL_UNIT;
+    enum_constant public static final androidx.wear.watchface.complications.data.TimeDifferenceStyle SHORT_SINGLE_UNIT;
+    enum_constant public static final androidx.wear.watchface.complications.data.TimeDifferenceStyle SHORT_WORDS_SINGLE_UNIT;
+    enum_constant public static final androidx.wear.watchface.complications.data.TimeDifferenceStyle STOPWATCH;
+    enum_constant public static final androidx.wear.watchface.complications.data.TimeDifferenceStyle WORDS_SINGLE_UNIT;
+  }
+
+  public final class TimeFormatComplicationText implements androidx.wear.watchface.complications.data.ComplicationText {
+  }
+
+  public static final class TimeFormatComplicationText.Builder {
+    ctor public TimeFormatComplicationText.Builder(String format);
+    method public androidx.wear.watchface.complications.data.TimeFormatComplicationText build();
+    method public androidx.wear.watchface.complications.data.TimeFormatComplicationText.Builder setStyle(androidx.wear.watchface.complications.data.TimeFormatStyle style);
+    method public androidx.wear.watchface.complications.data.TimeFormatComplicationText.Builder setText(CharSequence text);
+    method public androidx.wear.watchface.complications.data.TimeFormatComplicationText.Builder setTimeZone(android.icu.util.TimeZone timeZone);
+  }
+
+  public enum TimeFormatStyle {
+    enum_constant public static final androidx.wear.watchface.complications.data.TimeFormatStyle DEFAULT;
+    enum_constant public static final androidx.wear.watchface.complications.data.TimeFormatStyle LOWER_CASE;
+    enum_constant public static final androidx.wear.watchface.complications.data.TimeFormatStyle UPPER_CASE;
+  }
+
+  public final class TimeRange {
+    method public static androidx.wear.watchface.complications.data.TimeRange after(java.time.Instant startInstant);
+    method public static androidx.wear.watchface.complications.data.TimeRange before(java.time.Instant endInstant);
+    method public static androidx.wear.watchface.complications.data.TimeRange between(java.time.Instant startInstant, java.time.Instant endInstant);
+    method public operator boolean contains(java.time.Instant dateTimeMillis);
+    method public java.time.Instant getEndDateTimeMillis();
+    method public java.time.Instant getStartDateTimeMillis();
+    property public final java.time.Instant endDateTimeMillis;
+    property public final java.time.Instant startDateTimeMillis;
+    field public static final androidx.wear.watchface.complications.data.TimeRange ALWAYS;
+    field public static final androidx.wear.watchface.complications.data.TimeRange.Companion Companion;
+  }
+
+  public static final class TimeRange.Companion {
+    method public androidx.wear.watchface.complications.data.TimeRange after(java.time.Instant startInstant);
+    method public androidx.wear.watchface.complications.data.TimeRange before(java.time.Instant endInstant);
+    method public androidx.wear.watchface.complications.data.TimeRange between(java.time.Instant startInstant, java.time.Instant endInstant);
+  }
+
+  public final class TypeKt {
+  }
+
+}
+
+package androidx.wear.watchface.utility {
+
+  public final class TraceEventKt {
+  }
+
+}
+
diff --git a/wear/watchface/watchface-complications-rendering/api/1.0.0-beta02.txt b/wear/watchface/watchface-complications-rendering/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..2a0aaa0
--- /dev/null
+++ b/wear/watchface/watchface-complications-rendering/api/1.0.0-beta02.txt
@@ -0,0 +1,153 @@
+// Signature format: 4.0
+package androidx.wear.watchface.complications.rendering {
+
+  public class CanvasComplicationDrawable implements androidx.wear.watchface.CanvasComplication {
+    ctor public CanvasComplicationDrawable(androidx.wear.watchface.complications.rendering.ComplicationDrawable drawable, androidx.wear.watchface.WatchState watchState, androidx.wear.watchface.CanvasComplication.InvalidateCallback invalidateCallback);
+    method public void drawHighlight(android.graphics.Canvas canvas, android.graphics.Rect bounds, int boundsType, java.time.ZonedDateTime zonedDateTime, @ColorInt int color);
+    method public androidx.wear.watchface.complications.data.ComplicationData getData();
+    method public final androidx.wear.watchface.complications.rendering.ComplicationDrawable getDrawable();
+    method @CallSuper public void loadData(androidx.wear.watchface.complications.data.ComplicationData complicationData, boolean loadDrawablesAsynchronous);
+    method public void render(android.graphics.Canvas canvas, android.graphics.Rect bounds, java.time.ZonedDateTime zonedDateTime, androidx.wear.watchface.RenderParameters renderParameters, int slotId);
+    method public final void setDrawable(androidx.wear.watchface.complications.rendering.ComplicationDrawable value);
+    property public final androidx.wear.watchface.complications.rendering.ComplicationDrawable drawable;
+  }
+
+  public final class ComplicationDrawable extends android.graphics.drawable.Drawable {
+    ctor public ComplicationDrawable();
+    ctor public ComplicationDrawable(android.content.Context context);
+    ctor public ComplicationDrawable(androidx.wear.watchface.complications.rendering.ComplicationDrawable drawable);
+    method public void draw(android.graphics.Canvas canvas);
+    method public androidx.wear.watchface.complications.rendering.ComplicationStyle getActiveStyle();
+    method public androidx.wear.watchface.complications.rendering.ComplicationStyle getAmbientStyle();
+    method public androidx.wear.watchface.complications.data.ComplicationData getComplicationData();
+    method public android.content.Context? getContext();
+    method public java.time.Instant getCurrentTime();
+    method public static androidx.wear.watchface.complications.rendering.ComplicationDrawable? getDrawable(android.content.Context context, int id);
+    method public long getHighlightDuration();
+    method public CharSequence? getNoDataText();
+    method @Deprecated public int getOpacity();
+    method public boolean isBurnInProtectionOn();
+    method public boolean isHighlighted();
+    method public boolean isInAmbientMode();
+    method public boolean isLowBitAmbient();
+    method public boolean isRangedValueProgressHidden();
+    method public boolean onTap(@Px int x, @Px int y);
+    method public void setAlpha(@IntRange(from=0, to=255) int alpha);
+    method public void setBurnInProtectionOn(boolean isBurnInProtectionOn);
+    method public void setColorFilter(android.graphics.ColorFilter? colorFilter);
+    method public void setComplicationData(androidx.wear.watchface.complications.data.ComplicationData complicationData, boolean loadDrawablesAsync);
+    method public void setContext(android.content.Context context);
+    method public void setCurrentTime(java.time.Instant currentTime);
+    method public void setHighlightDuration(@IntRange(from=0) long highlightDurationMillis);
+    method public void setHighlighted(boolean isHighlighted);
+    method public void setInAmbientMode(boolean isInAmbientMode);
+    method public void setLowBitAmbient(boolean isLowBitAmbient);
+    method public void setNoDataText(CharSequence? noDataText);
+    method public void setRangedValueProgressHidden(boolean rangedValueProgressHidden);
+    property public final androidx.wear.watchface.complications.rendering.ComplicationStyle activeStyle;
+    property public final androidx.wear.watchface.complications.rendering.ComplicationStyle ambientStyle;
+    property public final androidx.wear.watchface.complications.data.ComplicationData complicationData;
+    property public final android.content.Context? context;
+    property public final java.time.Instant currentTime;
+    property public final long highlightDuration;
+    property public final boolean isBurnInProtectionOn;
+    property public final boolean isHighlighted;
+    property public final boolean isInAmbientMode;
+    property public final boolean isLowBitAmbient;
+    property public final boolean isRangedValueProgressHidden;
+    property public final CharSequence? noDataText;
+    field public static final androidx.wear.watchface.complications.rendering.ComplicationDrawable.Companion Companion;
+  }
+
+  public static final class ComplicationDrawable.Companion {
+    method public androidx.wear.watchface.complications.rendering.ComplicationDrawable? getDrawable(android.content.Context context, int id);
+  }
+
+  public final class ComplicationHighlightRenderer {
+    ctor public ComplicationHighlightRenderer(@Px float outlineExpansion, @Px float outlineStrokeWidth);
+    method public void drawComplicationHighlight(android.graphics.Canvas canvas, android.graphics.Rect bounds, @ColorInt int color);
+  }
+
+  public final class ComplicationStyle {
+    ctor public ComplicationStyle();
+    ctor public ComplicationStyle(androidx.wear.watchface.complications.rendering.ComplicationStyle style);
+    method @ColorInt public int getBackgroundColor();
+    method public android.graphics.drawable.Drawable? getBackgroundDrawable();
+    method @ColorInt public int getBorderColor();
+    method @Px public int getBorderDashGap();
+    method @Px public int getBorderDashWidth();
+    method @Px public int getBorderRadius();
+    method public int getBorderStyle();
+    method @Px public int getBorderWidth();
+    method @ColorInt public int getHighlightColor();
+    method @ColorInt public int getIconColor();
+    method public android.graphics.ColorFilter? getImageColorFilter();
+    method @ColorInt public int getRangedValuePrimaryColor();
+    method @Px public int getRangedValueRingWidth();
+    method @ColorInt public int getRangedValueSecondaryColor();
+    method @ColorInt public int getTextColor();
+    method @Px public int getTextSize();
+    method public android.graphics.Typeface getTextTypeface();
+    method @ColorInt public int getTitleColor();
+    method @Px public int getTitleSize();
+    method public android.graphics.Typeface getTitleTypeface();
+    method public void setBackgroundColor(@ColorInt int backgroundColor);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable? backgroundDrawable);
+    method public void setBorderColor(@ColorInt int borderColor);
+    method public void setBorderDashGap(@Px int borderDashGap);
+    method public void setBorderDashWidth(@Px int borderDashWidth);
+    method public void setBorderRadius(@Px int borderRadius);
+    method public void setBorderStyle(int borderStyle);
+    method public void setBorderWidth(@Px int borderWidth);
+    method public void setHighlightColor(@ColorInt int highlightColor);
+    method public void setIconColor(@ColorInt int iconColor);
+    method public void setImageColorFilter(android.graphics.ColorFilter? colorFilter);
+    method public void setRangedValuePrimaryColor(@ColorInt int rangedValuePrimaryColor);
+    method public void setRangedValueRingWidth(@Px int rangedValueRingWidth);
+    method public void setRangedValueSecondaryColor(@ColorInt int rangedValueSecondaryColor);
+    method public void setTextColor(@ColorInt int textColor);
+    method public void setTextSize(@Px int textSize);
+    method public void setTextTypeface(android.graphics.Typeface textTypeface);
+    method public void setTitleColor(@ColorInt int titleColor);
+    method public void setTitleSize(@Px int titleSize);
+    method public void setTitleTypeface(android.graphics.Typeface titleTypeface);
+    property @ColorInt public final int backgroundColor;
+    property public final android.graphics.drawable.Drawable? backgroundDrawable;
+    property @ColorInt public final int borderColor;
+    property @Px public final int borderDashGap;
+    property @Px public final int borderDashWidth;
+    property @Px public final int borderRadius;
+    property public final int borderStyle;
+    property @Px public final int borderWidth;
+    property @ColorInt public final int highlightColor;
+    property @ColorInt public final int iconColor;
+    property public final android.graphics.ColorFilter? imageColorFilter;
+    property @ColorInt public final int rangedValuePrimaryColor;
+    property @Px public final int rangedValueRingWidth;
+    property @ColorInt public final int rangedValueSecondaryColor;
+    property @ColorInt public final int textColor;
+    property @Px public final int textSize;
+    property public final android.graphics.Typeface textTypeface;
+    property @ColorInt public final int titleColor;
+    property @Px public final int titleSize;
+    property public final android.graphics.Typeface titleTypeface;
+    field @Px public static final int BORDER_RADIUS_DEFAULT = 2147483647; // 0x7fffffff
+    field public static final int BORDER_STYLE_DASHED = 2; // 0x2
+    field public static final int BORDER_STYLE_NONE = 0; // 0x0
+    field public static final int BORDER_STYLE_SOLID = 1; // 0x1
+    field public static final androidx.wear.watchface.complications.rendering.ComplicationStyle.Companion Companion;
+  }
+
+  public static final class ComplicationStyle.Companion {
+  }
+
+  public final class GlesTextureComplication {
+    ctor public GlesTextureComplication(androidx.wear.watchface.ComplicationSlot complicationSlot, @Px int textureWidth, @Px int textureHeight, int textureType);
+    method public void bind();
+    method public androidx.wear.watchface.ComplicationSlot getComplicationSlot();
+    method public void renderToTexture(java.time.ZonedDateTime zonedDateTime, androidx.wear.watchface.RenderParameters renderParameters);
+    property public final androidx.wear.watchface.ComplicationSlot complicationSlot;
+  }
+
+}
+
diff --git a/wear/watchface/watchface-complications-rendering/api/public_plus_experimental_1.0.0-beta02.txt b/wear/watchface/watchface-complications-rendering/api/public_plus_experimental_1.0.0-beta02.txt
new file mode 100644
index 0000000..2a0aaa0
--- /dev/null
+++ b/wear/watchface/watchface-complications-rendering/api/public_plus_experimental_1.0.0-beta02.txt
@@ -0,0 +1,153 @@
+// Signature format: 4.0
+package androidx.wear.watchface.complications.rendering {
+
+  public class CanvasComplicationDrawable implements androidx.wear.watchface.CanvasComplication {
+    ctor public CanvasComplicationDrawable(androidx.wear.watchface.complications.rendering.ComplicationDrawable drawable, androidx.wear.watchface.WatchState watchState, androidx.wear.watchface.CanvasComplication.InvalidateCallback invalidateCallback);
+    method public void drawHighlight(android.graphics.Canvas canvas, android.graphics.Rect bounds, int boundsType, java.time.ZonedDateTime zonedDateTime, @ColorInt int color);
+    method public androidx.wear.watchface.complications.data.ComplicationData getData();
+    method public final androidx.wear.watchface.complications.rendering.ComplicationDrawable getDrawable();
+    method @CallSuper public void loadData(androidx.wear.watchface.complications.data.ComplicationData complicationData, boolean loadDrawablesAsynchronous);
+    method public void render(android.graphics.Canvas canvas, android.graphics.Rect bounds, java.time.ZonedDateTime zonedDateTime, androidx.wear.watchface.RenderParameters renderParameters, int slotId);
+    method public final void setDrawable(androidx.wear.watchface.complications.rendering.ComplicationDrawable value);
+    property public final androidx.wear.watchface.complications.rendering.ComplicationDrawable drawable;
+  }
+
+  public final class ComplicationDrawable extends android.graphics.drawable.Drawable {
+    ctor public ComplicationDrawable();
+    ctor public ComplicationDrawable(android.content.Context context);
+    ctor public ComplicationDrawable(androidx.wear.watchface.complications.rendering.ComplicationDrawable drawable);
+    method public void draw(android.graphics.Canvas canvas);
+    method public androidx.wear.watchface.complications.rendering.ComplicationStyle getActiveStyle();
+    method public androidx.wear.watchface.complications.rendering.ComplicationStyle getAmbientStyle();
+    method public androidx.wear.watchface.complications.data.ComplicationData getComplicationData();
+    method public android.content.Context? getContext();
+    method public java.time.Instant getCurrentTime();
+    method public static androidx.wear.watchface.complications.rendering.ComplicationDrawable? getDrawable(android.content.Context context, int id);
+    method public long getHighlightDuration();
+    method public CharSequence? getNoDataText();
+    method @Deprecated public int getOpacity();
+    method public boolean isBurnInProtectionOn();
+    method public boolean isHighlighted();
+    method public boolean isInAmbientMode();
+    method public boolean isLowBitAmbient();
+    method public boolean isRangedValueProgressHidden();
+    method public boolean onTap(@Px int x, @Px int y);
+    method public void setAlpha(@IntRange(from=0, to=255) int alpha);
+    method public void setBurnInProtectionOn(boolean isBurnInProtectionOn);
+    method public void setColorFilter(android.graphics.ColorFilter? colorFilter);
+    method public void setComplicationData(androidx.wear.watchface.complications.data.ComplicationData complicationData, boolean loadDrawablesAsync);
+    method public void setContext(android.content.Context context);
+    method public void setCurrentTime(java.time.Instant currentTime);
+    method public void setHighlightDuration(@IntRange(from=0) long highlightDurationMillis);
+    method public void setHighlighted(boolean isHighlighted);
+    method public void setInAmbientMode(boolean isInAmbientMode);
+    method public void setLowBitAmbient(boolean isLowBitAmbient);
+    method public void setNoDataText(CharSequence? noDataText);
+    method public void setRangedValueProgressHidden(boolean rangedValueProgressHidden);
+    property public final androidx.wear.watchface.complications.rendering.ComplicationStyle activeStyle;
+    property public final androidx.wear.watchface.complications.rendering.ComplicationStyle ambientStyle;
+    property public final androidx.wear.watchface.complications.data.ComplicationData complicationData;
+    property public final android.content.Context? context;
+    property public final java.time.Instant currentTime;
+    property public final long highlightDuration;
+    property public final boolean isBurnInProtectionOn;
+    property public final boolean isHighlighted;
+    property public final boolean isInAmbientMode;
+    property public final boolean isLowBitAmbient;
+    property public final boolean isRangedValueProgressHidden;
+    property public final CharSequence? noDataText;
+    field public static final androidx.wear.watchface.complications.rendering.ComplicationDrawable.Companion Companion;
+  }
+
+  public static final class ComplicationDrawable.Companion {
+    method public androidx.wear.watchface.complications.rendering.ComplicationDrawable? getDrawable(android.content.Context context, int id);
+  }
+
+  public final class ComplicationHighlightRenderer {
+    ctor public ComplicationHighlightRenderer(@Px float outlineExpansion, @Px float outlineStrokeWidth);
+    method public void drawComplicationHighlight(android.graphics.Canvas canvas, android.graphics.Rect bounds, @ColorInt int color);
+  }
+
+  public final class ComplicationStyle {
+    ctor public ComplicationStyle();
+    ctor public ComplicationStyle(androidx.wear.watchface.complications.rendering.ComplicationStyle style);
+    method @ColorInt public int getBackgroundColor();
+    method public android.graphics.drawable.Drawable? getBackgroundDrawable();
+    method @ColorInt public int getBorderColor();
+    method @Px public int getBorderDashGap();
+    method @Px public int getBorderDashWidth();
+    method @Px public int getBorderRadius();
+    method public int getBorderStyle();
+    method @Px public int getBorderWidth();
+    method @ColorInt public int getHighlightColor();
+    method @ColorInt public int getIconColor();
+    method public android.graphics.ColorFilter? getImageColorFilter();
+    method @ColorInt public int getRangedValuePrimaryColor();
+    method @Px public int getRangedValueRingWidth();
+    method @ColorInt public int getRangedValueSecondaryColor();
+    method @ColorInt public int getTextColor();
+    method @Px public int getTextSize();
+    method public android.graphics.Typeface getTextTypeface();
+    method @ColorInt public int getTitleColor();
+    method @Px public int getTitleSize();
+    method public android.graphics.Typeface getTitleTypeface();
+    method public void setBackgroundColor(@ColorInt int backgroundColor);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable? backgroundDrawable);
+    method public void setBorderColor(@ColorInt int borderColor);
+    method public void setBorderDashGap(@Px int borderDashGap);
+    method public void setBorderDashWidth(@Px int borderDashWidth);
+    method public void setBorderRadius(@Px int borderRadius);
+    method public void setBorderStyle(int borderStyle);
+    method public void setBorderWidth(@Px int borderWidth);
+    method public void setHighlightColor(@ColorInt int highlightColor);
+    method public void setIconColor(@ColorInt int iconColor);
+    method public void setImageColorFilter(android.graphics.ColorFilter? colorFilter);
+    method public void setRangedValuePrimaryColor(@ColorInt int rangedValuePrimaryColor);
+    method public void setRangedValueRingWidth(@Px int rangedValueRingWidth);
+    method public void setRangedValueSecondaryColor(@ColorInt int rangedValueSecondaryColor);
+    method public void setTextColor(@ColorInt int textColor);
+    method public void setTextSize(@Px int textSize);
+    method public void setTextTypeface(android.graphics.Typeface textTypeface);
+    method public void setTitleColor(@ColorInt int titleColor);
+    method public void setTitleSize(@Px int titleSize);
+    method public void setTitleTypeface(android.graphics.Typeface titleTypeface);
+    property @ColorInt public final int backgroundColor;
+    property public final android.graphics.drawable.Drawable? backgroundDrawable;
+    property @ColorInt public final int borderColor;
+    property @Px public final int borderDashGap;
+    property @Px public final int borderDashWidth;
+    property @Px public final int borderRadius;
+    property public final int borderStyle;
+    property @Px public final int borderWidth;
+    property @ColorInt public final int highlightColor;
+    property @ColorInt public final int iconColor;
+    property public final android.graphics.ColorFilter? imageColorFilter;
+    property @ColorInt public final int rangedValuePrimaryColor;
+    property @Px public final int rangedValueRingWidth;
+    property @ColorInt public final int rangedValueSecondaryColor;
+    property @ColorInt public final int textColor;
+    property @Px public final int textSize;
+    property public final android.graphics.Typeface textTypeface;
+    property @ColorInt public final int titleColor;
+    property @Px public final int titleSize;
+    property public final android.graphics.Typeface titleTypeface;
+    field @Px public static final int BORDER_RADIUS_DEFAULT = 2147483647; // 0x7fffffff
+    field public static final int BORDER_STYLE_DASHED = 2; // 0x2
+    field public static final int BORDER_STYLE_NONE = 0; // 0x0
+    field public static final int BORDER_STYLE_SOLID = 1; // 0x1
+    field public static final androidx.wear.watchface.complications.rendering.ComplicationStyle.Companion Companion;
+  }
+
+  public static final class ComplicationStyle.Companion {
+  }
+
+  public final class GlesTextureComplication {
+    ctor public GlesTextureComplication(androidx.wear.watchface.ComplicationSlot complicationSlot, @Px int textureWidth, @Px int textureHeight, int textureType);
+    method public void bind();
+    method public androidx.wear.watchface.ComplicationSlot getComplicationSlot();
+    method public void renderToTexture(java.time.ZonedDateTime zonedDateTime, androidx.wear.watchface.RenderParameters renderParameters);
+    property public final androidx.wear.watchface.ComplicationSlot complicationSlot;
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/wear/watchface/watchface-complications-rendering/api/res-1.0.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to wear/watchface/watchface-complications-rendering/api/res-1.0.0-beta02.txt
diff --git a/wear/watchface/watchface-complications-rendering/api/restricted_1.0.0-beta02.txt b/wear/watchface/watchface-complications-rendering/api/restricted_1.0.0-beta02.txt
new file mode 100644
index 0000000..2a0aaa0
--- /dev/null
+++ b/wear/watchface/watchface-complications-rendering/api/restricted_1.0.0-beta02.txt
@@ -0,0 +1,153 @@
+// Signature format: 4.0
+package androidx.wear.watchface.complications.rendering {
+
+  public class CanvasComplicationDrawable implements androidx.wear.watchface.CanvasComplication {
+    ctor public CanvasComplicationDrawable(androidx.wear.watchface.complications.rendering.ComplicationDrawable drawable, androidx.wear.watchface.WatchState watchState, androidx.wear.watchface.CanvasComplication.InvalidateCallback invalidateCallback);
+    method public void drawHighlight(android.graphics.Canvas canvas, android.graphics.Rect bounds, int boundsType, java.time.ZonedDateTime zonedDateTime, @ColorInt int color);
+    method public androidx.wear.watchface.complications.data.ComplicationData getData();
+    method public final androidx.wear.watchface.complications.rendering.ComplicationDrawable getDrawable();
+    method @CallSuper public void loadData(androidx.wear.watchface.complications.data.ComplicationData complicationData, boolean loadDrawablesAsynchronous);
+    method public void render(android.graphics.Canvas canvas, android.graphics.Rect bounds, java.time.ZonedDateTime zonedDateTime, androidx.wear.watchface.RenderParameters renderParameters, int slotId);
+    method public final void setDrawable(androidx.wear.watchface.complications.rendering.ComplicationDrawable value);
+    property public final androidx.wear.watchface.complications.rendering.ComplicationDrawable drawable;
+  }
+
+  public final class ComplicationDrawable extends android.graphics.drawable.Drawable {
+    ctor public ComplicationDrawable();
+    ctor public ComplicationDrawable(android.content.Context context);
+    ctor public ComplicationDrawable(androidx.wear.watchface.complications.rendering.ComplicationDrawable drawable);
+    method public void draw(android.graphics.Canvas canvas);
+    method public androidx.wear.watchface.complications.rendering.ComplicationStyle getActiveStyle();
+    method public androidx.wear.watchface.complications.rendering.ComplicationStyle getAmbientStyle();
+    method public androidx.wear.watchface.complications.data.ComplicationData getComplicationData();
+    method public android.content.Context? getContext();
+    method public java.time.Instant getCurrentTime();
+    method public static androidx.wear.watchface.complications.rendering.ComplicationDrawable? getDrawable(android.content.Context context, int id);
+    method public long getHighlightDuration();
+    method public CharSequence? getNoDataText();
+    method @Deprecated public int getOpacity();
+    method public boolean isBurnInProtectionOn();
+    method public boolean isHighlighted();
+    method public boolean isInAmbientMode();
+    method public boolean isLowBitAmbient();
+    method public boolean isRangedValueProgressHidden();
+    method public boolean onTap(@Px int x, @Px int y);
+    method public void setAlpha(@IntRange(from=0, to=255) int alpha);
+    method public void setBurnInProtectionOn(boolean isBurnInProtectionOn);
+    method public void setColorFilter(android.graphics.ColorFilter? colorFilter);
+    method public void setComplicationData(androidx.wear.watchface.complications.data.ComplicationData complicationData, boolean loadDrawablesAsync);
+    method public void setContext(android.content.Context context);
+    method public void setCurrentTime(java.time.Instant currentTime);
+    method public void setHighlightDuration(@IntRange(from=0) long highlightDurationMillis);
+    method public void setHighlighted(boolean isHighlighted);
+    method public void setInAmbientMode(boolean isInAmbientMode);
+    method public void setLowBitAmbient(boolean isLowBitAmbient);
+    method public void setNoDataText(CharSequence? noDataText);
+    method public void setRangedValueProgressHidden(boolean rangedValueProgressHidden);
+    property public final androidx.wear.watchface.complications.rendering.ComplicationStyle activeStyle;
+    property public final androidx.wear.watchface.complications.rendering.ComplicationStyle ambientStyle;
+    property public final androidx.wear.watchface.complications.data.ComplicationData complicationData;
+    property public final android.content.Context? context;
+    property public final java.time.Instant currentTime;
+    property public final long highlightDuration;
+    property public final boolean isBurnInProtectionOn;
+    property public final boolean isHighlighted;
+    property public final boolean isInAmbientMode;
+    property public final boolean isLowBitAmbient;
+    property public final boolean isRangedValueProgressHidden;
+    property public final CharSequence? noDataText;
+    field public static final androidx.wear.watchface.complications.rendering.ComplicationDrawable.Companion Companion;
+  }
+
+  public static final class ComplicationDrawable.Companion {
+    method public androidx.wear.watchface.complications.rendering.ComplicationDrawable? getDrawable(android.content.Context context, int id);
+  }
+
+  public final class ComplicationHighlightRenderer {
+    ctor public ComplicationHighlightRenderer(@Px float outlineExpansion, @Px float outlineStrokeWidth);
+    method public void drawComplicationHighlight(android.graphics.Canvas canvas, android.graphics.Rect bounds, @ColorInt int color);
+  }
+
+  public final class ComplicationStyle {
+    ctor public ComplicationStyle();
+    ctor public ComplicationStyle(androidx.wear.watchface.complications.rendering.ComplicationStyle style);
+    method @ColorInt public int getBackgroundColor();
+    method public android.graphics.drawable.Drawable? getBackgroundDrawable();
+    method @ColorInt public int getBorderColor();
+    method @Px public int getBorderDashGap();
+    method @Px public int getBorderDashWidth();
+    method @Px public int getBorderRadius();
+    method public int getBorderStyle();
+    method @Px public int getBorderWidth();
+    method @ColorInt public int getHighlightColor();
+    method @ColorInt public int getIconColor();
+    method public android.graphics.ColorFilter? getImageColorFilter();
+    method @ColorInt public int getRangedValuePrimaryColor();
+    method @Px public int getRangedValueRingWidth();
+    method @ColorInt public int getRangedValueSecondaryColor();
+    method @ColorInt public int getTextColor();
+    method @Px public int getTextSize();
+    method public android.graphics.Typeface getTextTypeface();
+    method @ColorInt public int getTitleColor();
+    method @Px public int getTitleSize();
+    method public android.graphics.Typeface getTitleTypeface();
+    method public void setBackgroundColor(@ColorInt int backgroundColor);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable? backgroundDrawable);
+    method public void setBorderColor(@ColorInt int borderColor);
+    method public void setBorderDashGap(@Px int borderDashGap);
+    method public void setBorderDashWidth(@Px int borderDashWidth);
+    method public void setBorderRadius(@Px int borderRadius);
+    method public void setBorderStyle(int borderStyle);
+    method public void setBorderWidth(@Px int borderWidth);
+    method public void setHighlightColor(@ColorInt int highlightColor);
+    method public void setIconColor(@ColorInt int iconColor);
+    method public void setImageColorFilter(android.graphics.ColorFilter? colorFilter);
+    method public void setRangedValuePrimaryColor(@ColorInt int rangedValuePrimaryColor);
+    method public void setRangedValueRingWidth(@Px int rangedValueRingWidth);
+    method public void setRangedValueSecondaryColor(@ColorInt int rangedValueSecondaryColor);
+    method public void setTextColor(@ColorInt int textColor);
+    method public void setTextSize(@Px int textSize);
+    method public void setTextTypeface(android.graphics.Typeface textTypeface);
+    method public void setTitleColor(@ColorInt int titleColor);
+    method public void setTitleSize(@Px int titleSize);
+    method public void setTitleTypeface(android.graphics.Typeface titleTypeface);
+    property @ColorInt public final int backgroundColor;
+    property public final android.graphics.drawable.Drawable? backgroundDrawable;
+    property @ColorInt public final int borderColor;
+    property @Px public final int borderDashGap;
+    property @Px public final int borderDashWidth;
+    property @Px public final int borderRadius;
+    property public final int borderStyle;
+    property @Px public final int borderWidth;
+    property @ColorInt public final int highlightColor;
+    property @ColorInt public final int iconColor;
+    property public final android.graphics.ColorFilter? imageColorFilter;
+    property @ColorInt public final int rangedValuePrimaryColor;
+    property @Px public final int rangedValueRingWidth;
+    property @ColorInt public final int rangedValueSecondaryColor;
+    property @ColorInt public final int textColor;
+    property @Px public final int textSize;
+    property public final android.graphics.Typeface textTypeface;
+    property @ColorInt public final int titleColor;
+    property @Px public final int titleSize;
+    property public final android.graphics.Typeface titleTypeface;
+    field @Px public static final int BORDER_RADIUS_DEFAULT = 2147483647; // 0x7fffffff
+    field public static final int BORDER_STYLE_DASHED = 2; // 0x2
+    field public static final int BORDER_STYLE_NONE = 0; // 0x0
+    field public static final int BORDER_STYLE_SOLID = 1; // 0x1
+    field public static final androidx.wear.watchface.complications.rendering.ComplicationStyle.Companion Companion;
+  }
+
+  public static final class ComplicationStyle.Companion {
+  }
+
+  public final class GlesTextureComplication {
+    ctor public GlesTextureComplication(androidx.wear.watchface.ComplicationSlot complicationSlot, @Px int textureWidth, @Px int textureHeight, int textureType);
+    method public void bind();
+    method public androidx.wear.watchface.ComplicationSlot getComplicationSlot();
+    method public void renderToTexture(java.time.ZonedDateTime zonedDateTime, androidx.wear.watchface.RenderParameters renderParameters);
+    property public final androidx.wear.watchface.ComplicationSlot complicationSlot;
+  }
+
+}
+
diff --git a/wear/watchface/watchface-complications/api/1.0.0-beta02.txt b/wear/watchface/watchface-complications/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..60a49fa
--- /dev/null
+++ b/wear/watchface/watchface-complications/api/1.0.0-beta02.txt
@@ -0,0 +1,83 @@
+// Signature format: 4.0
+package androidx.wear.watchface.complications {
+
+  public final class ComplicationDataSourceInfo {
+    ctor public ComplicationDataSourceInfo(String appName, String name, android.graphics.drawable.Icon icon, androidx.wear.watchface.complications.data.ComplicationType type, android.content.ComponentName? componentName);
+    method public String getAppName();
+    method public android.content.ComponentName? getComponentName();
+    method public androidx.wear.watchface.complications.data.ComplicationData getFallbackPreviewData();
+    method public android.graphics.drawable.Icon getIcon();
+    method public String getName();
+    method public androidx.wear.watchface.complications.data.ComplicationType getType();
+    property public final String appName;
+    property public final android.content.ComponentName? componentName;
+    property public final androidx.wear.watchface.complications.data.ComplicationData fallbackPreviewData;
+    property public final android.graphics.drawable.Icon icon;
+    property public final String name;
+    property public final androidx.wear.watchface.complications.data.ComplicationType type;
+  }
+
+  public final class ComplicationDataSourceInfoRetriever implements java.lang.AutoCloseable {
+    ctor public ComplicationDataSourceInfoRetriever(android.content.Context context);
+    method public void close();
+    method @kotlin.jvm.Throws(exceptionClasses=ServiceDisconnectedException::class) public suspend Object? retrieveComplicationDataSourceInfo(android.content.ComponentName watchFaceComponent, int[] watchFaceComplicationIds, kotlin.coroutines.Continuation<? super androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.Result[]> p) throws androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.ServiceDisconnectedException;
+    method @RequiresApi(android.os.Build.VERSION_CODES.R) @kotlin.jvm.Throws(exceptionClasses=ServiceDisconnectedException::class) public suspend Object? retrievePreviewComplicationData(android.content.ComponentName complicationDataSourceComponent, androidx.wear.watchface.complications.data.ComplicationType complicationType, kotlin.coroutines.Continuation<? super androidx.wear.watchface.complications.data.ComplicationData> p) throws androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.ServiceDisconnectedException;
+  }
+
+  public static final class ComplicationDataSourceInfoRetriever.Result {
+    method public androidx.wear.watchface.complications.ComplicationDataSourceInfo? getInfo();
+    method public int getSlotId();
+    property public final androidx.wear.watchface.complications.ComplicationDataSourceInfo? info;
+    property public final int slotId;
+  }
+
+  public static final class ComplicationDataSourceInfoRetriever.ServiceDisconnectedException extends java.lang.Exception {
+    ctor public ComplicationDataSourceInfoRetriever.ServiceDisconnectedException();
+  }
+
+  public final class ComplicationDataSourceInfoRetrieverKt {
+  }
+
+  public final class ComplicationSlotBounds {
+    ctor public ComplicationSlotBounds(java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,? extends android.graphics.RectF> perComplicationTypeBounds);
+    ctor public ComplicationSlotBounds(android.graphics.RectF bounds);
+    method public java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,android.graphics.RectF> getPerComplicationTypeBounds();
+    property public final java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,android.graphics.RectF> perComplicationTypeBounds;
+  }
+
+  public final class DefaultComplicationDataSourcePolicy {
+    ctor public DefaultComplicationDataSourcePolicy();
+    ctor public DefaultComplicationDataSourcePolicy(int systemProvider);
+    ctor public DefaultComplicationDataSourcePolicy(android.content.ComponentName dataSource, int systemDataSourceFallback);
+    ctor public DefaultComplicationDataSourcePolicy(android.content.ComponentName primaryDataSource, android.content.ComponentName secondaryDataSource, int systemDataSourceFallback);
+    method public android.content.ComponentName? getPrimaryDataSource();
+    method public android.content.ComponentName? getSecondaryDataSource();
+    method public int getSystemDataSourceFallback();
+    method public boolean isEmpty();
+    property public final android.content.ComponentName? primaryDataSource;
+    property public final android.content.ComponentName? secondaryDataSource;
+    property public final int systemDataSourceFallback;
+  }
+
+  public final class SystemDataSources {
+    field public static final androidx.wear.watchface.complications.SystemDataSources.Companion Companion;
+    field public static final int DATA_SOURCE_APP_SHORTCUT = 6; // 0x6
+    field public static final int DATA_SOURCE_DATE = 2; // 0x2
+    field public static final int DATA_SOURCE_DAY_AND_DATE = 16; // 0x10
+    field public static final int DATA_SOURCE_DAY_OF_WEEK = 13; // 0xd
+    field public static final int DATA_SOURCE_FAVORITE_CONTACT = 14; // 0xe
+    field public static final int DATA_SOURCE_NEXT_EVENT = 9; // 0x9
+    field public static final int DATA_SOURCE_STEP_COUNT = 4; // 0x4
+    field public static final int DATA_SOURCE_SUNRISE_SUNSET = 12; // 0xc
+    field public static final int DATA_SOURCE_TIME_AND_DATE = 3; // 0x3
+    field public static final int DATA_SOURCE_UNREAD_NOTIFICATION_COUNT = 7; // 0x7
+    field public static final int DATA_SOURCE_WATCH_BATTERY = 1; // 0x1
+    field public static final int DATA_SOURCE_WORLD_CLOCK = 5; // 0x5
+    field public static final int NO_DATA_SOURCE = -1; // 0xffffffff
+  }
+
+  public static final class SystemDataSources.Companion {
+  }
+
+}
+
diff --git a/wear/watchface/watchface-complications/api/public_plus_experimental_1.0.0-beta02.txt b/wear/watchface/watchface-complications/api/public_plus_experimental_1.0.0-beta02.txt
new file mode 100644
index 0000000..60a49fa
--- /dev/null
+++ b/wear/watchface/watchface-complications/api/public_plus_experimental_1.0.0-beta02.txt
@@ -0,0 +1,83 @@
+// Signature format: 4.0
+package androidx.wear.watchface.complications {
+
+  public final class ComplicationDataSourceInfo {
+    ctor public ComplicationDataSourceInfo(String appName, String name, android.graphics.drawable.Icon icon, androidx.wear.watchface.complications.data.ComplicationType type, android.content.ComponentName? componentName);
+    method public String getAppName();
+    method public android.content.ComponentName? getComponentName();
+    method public androidx.wear.watchface.complications.data.ComplicationData getFallbackPreviewData();
+    method public android.graphics.drawable.Icon getIcon();
+    method public String getName();
+    method public androidx.wear.watchface.complications.data.ComplicationType getType();
+    property public final String appName;
+    property public final android.content.ComponentName? componentName;
+    property public final androidx.wear.watchface.complications.data.ComplicationData fallbackPreviewData;
+    property public final android.graphics.drawable.Icon icon;
+    property public final String name;
+    property public final androidx.wear.watchface.complications.data.ComplicationType type;
+  }
+
+  public final class ComplicationDataSourceInfoRetriever implements java.lang.AutoCloseable {
+    ctor public ComplicationDataSourceInfoRetriever(android.content.Context context);
+    method public void close();
+    method @kotlin.jvm.Throws(exceptionClasses=ServiceDisconnectedException::class) public suspend Object? retrieveComplicationDataSourceInfo(android.content.ComponentName watchFaceComponent, int[] watchFaceComplicationIds, kotlin.coroutines.Continuation<? super androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.Result[]> p) throws androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.ServiceDisconnectedException;
+    method @RequiresApi(android.os.Build.VERSION_CODES.R) @kotlin.jvm.Throws(exceptionClasses=ServiceDisconnectedException::class) public suspend Object? retrievePreviewComplicationData(android.content.ComponentName complicationDataSourceComponent, androidx.wear.watchface.complications.data.ComplicationType complicationType, kotlin.coroutines.Continuation<? super androidx.wear.watchface.complications.data.ComplicationData> p) throws androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.ServiceDisconnectedException;
+  }
+
+  public static final class ComplicationDataSourceInfoRetriever.Result {
+    method public androidx.wear.watchface.complications.ComplicationDataSourceInfo? getInfo();
+    method public int getSlotId();
+    property public final androidx.wear.watchface.complications.ComplicationDataSourceInfo? info;
+    property public final int slotId;
+  }
+
+  public static final class ComplicationDataSourceInfoRetriever.ServiceDisconnectedException extends java.lang.Exception {
+    ctor public ComplicationDataSourceInfoRetriever.ServiceDisconnectedException();
+  }
+
+  public final class ComplicationDataSourceInfoRetrieverKt {
+  }
+
+  public final class ComplicationSlotBounds {
+    ctor public ComplicationSlotBounds(java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,? extends android.graphics.RectF> perComplicationTypeBounds);
+    ctor public ComplicationSlotBounds(android.graphics.RectF bounds);
+    method public java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,android.graphics.RectF> getPerComplicationTypeBounds();
+    property public final java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,android.graphics.RectF> perComplicationTypeBounds;
+  }
+
+  public final class DefaultComplicationDataSourcePolicy {
+    ctor public DefaultComplicationDataSourcePolicy();
+    ctor public DefaultComplicationDataSourcePolicy(int systemProvider);
+    ctor public DefaultComplicationDataSourcePolicy(android.content.ComponentName dataSource, int systemDataSourceFallback);
+    ctor public DefaultComplicationDataSourcePolicy(android.content.ComponentName primaryDataSource, android.content.ComponentName secondaryDataSource, int systemDataSourceFallback);
+    method public android.content.ComponentName? getPrimaryDataSource();
+    method public android.content.ComponentName? getSecondaryDataSource();
+    method public int getSystemDataSourceFallback();
+    method public boolean isEmpty();
+    property public final android.content.ComponentName? primaryDataSource;
+    property public final android.content.ComponentName? secondaryDataSource;
+    property public final int systemDataSourceFallback;
+  }
+
+  public final class SystemDataSources {
+    field public static final androidx.wear.watchface.complications.SystemDataSources.Companion Companion;
+    field public static final int DATA_SOURCE_APP_SHORTCUT = 6; // 0x6
+    field public static final int DATA_SOURCE_DATE = 2; // 0x2
+    field public static final int DATA_SOURCE_DAY_AND_DATE = 16; // 0x10
+    field public static final int DATA_SOURCE_DAY_OF_WEEK = 13; // 0xd
+    field public static final int DATA_SOURCE_FAVORITE_CONTACT = 14; // 0xe
+    field public static final int DATA_SOURCE_NEXT_EVENT = 9; // 0x9
+    field public static final int DATA_SOURCE_STEP_COUNT = 4; // 0x4
+    field public static final int DATA_SOURCE_SUNRISE_SUNSET = 12; // 0xc
+    field public static final int DATA_SOURCE_TIME_AND_DATE = 3; // 0x3
+    field public static final int DATA_SOURCE_UNREAD_NOTIFICATION_COUNT = 7; // 0x7
+    field public static final int DATA_SOURCE_WATCH_BATTERY = 1; // 0x1
+    field public static final int DATA_SOURCE_WORLD_CLOCK = 5; // 0x5
+    field public static final int NO_DATA_SOURCE = -1; // 0xffffffff
+  }
+
+  public static final class SystemDataSources.Companion {
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/wear/watchface/watchface-complications/api/res-1.0.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to wear/watchface/watchface-complications/api/res-1.0.0-beta02.txt
diff --git a/wear/watchface/watchface-complications/api/restricted_1.0.0-beta02.txt b/wear/watchface/watchface-complications/api/restricted_1.0.0-beta02.txt
new file mode 100644
index 0000000..60a49fa
--- /dev/null
+++ b/wear/watchface/watchface-complications/api/restricted_1.0.0-beta02.txt
@@ -0,0 +1,83 @@
+// Signature format: 4.0
+package androidx.wear.watchface.complications {
+
+  public final class ComplicationDataSourceInfo {
+    ctor public ComplicationDataSourceInfo(String appName, String name, android.graphics.drawable.Icon icon, androidx.wear.watchface.complications.data.ComplicationType type, android.content.ComponentName? componentName);
+    method public String getAppName();
+    method public android.content.ComponentName? getComponentName();
+    method public androidx.wear.watchface.complications.data.ComplicationData getFallbackPreviewData();
+    method public android.graphics.drawable.Icon getIcon();
+    method public String getName();
+    method public androidx.wear.watchface.complications.data.ComplicationType getType();
+    property public final String appName;
+    property public final android.content.ComponentName? componentName;
+    property public final androidx.wear.watchface.complications.data.ComplicationData fallbackPreviewData;
+    property public final android.graphics.drawable.Icon icon;
+    property public final String name;
+    property public final androidx.wear.watchface.complications.data.ComplicationType type;
+  }
+
+  public final class ComplicationDataSourceInfoRetriever implements java.lang.AutoCloseable {
+    ctor public ComplicationDataSourceInfoRetriever(android.content.Context context);
+    method public void close();
+    method @kotlin.jvm.Throws(exceptionClasses=ServiceDisconnectedException::class) public suspend Object? retrieveComplicationDataSourceInfo(android.content.ComponentName watchFaceComponent, int[] watchFaceComplicationIds, kotlin.coroutines.Continuation<? super androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.Result[]> p) throws androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.ServiceDisconnectedException;
+    method @RequiresApi(android.os.Build.VERSION_CODES.R) @kotlin.jvm.Throws(exceptionClasses=ServiceDisconnectedException::class) public suspend Object? retrievePreviewComplicationData(android.content.ComponentName complicationDataSourceComponent, androidx.wear.watchface.complications.data.ComplicationType complicationType, kotlin.coroutines.Continuation<? super androidx.wear.watchface.complications.data.ComplicationData> p) throws androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.ServiceDisconnectedException;
+  }
+
+  public static final class ComplicationDataSourceInfoRetriever.Result {
+    method public androidx.wear.watchface.complications.ComplicationDataSourceInfo? getInfo();
+    method public int getSlotId();
+    property public final androidx.wear.watchface.complications.ComplicationDataSourceInfo? info;
+    property public final int slotId;
+  }
+
+  public static final class ComplicationDataSourceInfoRetriever.ServiceDisconnectedException extends java.lang.Exception {
+    ctor public ComplicationDataSourceInfoRetriever.ServiceDisconnectedException();
+  }
+
+  public final class ComplicationDataSourceInfoRetrieverKt {
+  }
+
+  public final class ComplicationSlotBounds {
+    ctor public ComplicationSlotBounds(java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,? extends android.graphics.RectF> perComplicationTypeBounds);
+    ctor public ComplicationSlotBounds(android.graphics.RectF bounds);
+    method public java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,android.graphics.RectF> getPerComplicationTypeBounds();
+    property public final java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,android.graphics.RectF> perComplicationTypeBounds;
+  }
+
+  public final class DefaultComplicationDataSourcePolicy {
+    ctor public DefaultComplicationDataSourcePolicy();
+    ctor public DefaultComplicationDataSourcePolicy(int systemProvider);
+    ctor public DefaultComplicationDataSourcePolicy(android.content.ComponentName dataSource, int systemDataSourceFallback);
+    ctor public DefaultComplicationDataSourcePolicy(android.content.ComponentName primaryDataSource, android.content.ComponentName secondaryDataSource, int systemDataSourceFallback);
+    method public android.content.ComponentName? getPrimaryDataSource();
+    method public android.content.ComponentName? getSecondaryDataSource();
+    method public int getSystemDataSourceFallback();
+    method public boolean isEmpty();
+    property public final android.content.ComponentName? primaryDataSource;
+    property public final android.content.ComponentName? secondaryDataSource;
+    property public final int systemDataSourceFallback;
+  }
+
+  public final class SystemDataSources {
+    field public static final androidx.wear.watchface.complications.SystemDataSources.Companion Companion;
+    field public static final int DATA_SOURCE_APP_SHORTCUT = 6; // 0x6
+    field public static final int DATA_SOURCE_DATE = 2; // 0x2
+    field public static final int DATA_SOURCE_DAY_AND_DATE = 16; // 0x10
+    field public static final int DATA_SOURCE_DAY_OF_WEEK = 13; // 0xd
+    field public static final int DATA_SOURCE_FAVORITE_CONTACT = 14; // 0xe
+    field public static final int DATA_SOURCE_NEXT_EVENT = 9; // 0x9
+    field public static final int DATA_SOURCE_STEP_COUNT = 4; // 0x4
+    field public static final int DATA_SOURCE_SUNRISE_SUNSET = 12; // 0xc
+    field public static final int DATA_SOURCE_TIME_AND_DATE = 3; // 0x3
+    field public static final int DATA_SOURCE_UNREAD_NOTIFICATION_COUNT = 7; // 0x7
+    field public static final int DATA_SOURCE_WATCH_BATTERY = 1; // 0x1
+    field public static final int DATA_SOURCE_WORLD_CLOCK = 5; // 0x5
+    field public static final int NO_DATA_SOURCE = -1; // 0xffffffff
+  }
+
+  public static final class SystemDataSources.Companion {
+  }
+
+}
+
diff --git a/wear/watchface/watchface-data/api/1.0.0-beta02.txt b/wear/watchface/watchface-data/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/wear/watchface/watchface-data/api/1.0.0-beta02.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/wear/watchface/watchface-data/api/public_plus_experimental_1.0.0-beta02.txt b/wear/watchface/watchface-data/api/public_plus_experimental_1.0.0-beta02.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/wear/watchface/watchface-data/api/public_plus_experimental_1.0.0-beta02.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/wear/watchface/watchface-data/api/res-1.0.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to wear/watchface/watchface-data/api/res-1.0.0-beta02.txt
diff --git a/wear/watchface/watchface-data/api/restricted_1.0.0-beta02.txt b/wear/watchface/watchface-data/api/restricted_1.0.0-beta02.txt
new file mode 100644
index 0000000..9342af9
--- /dev/null
+++ b/wear/watchface/watchface-data/api/restricted_1.0.0-beta02.txt
@@ -0,0 +1,339 @@
+// Signature format: 4.0
+package androidx.wear.watchface.control.data {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class ComplicationRenderParams implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
+    ctor public ComplicationRenderParams(int, androidx.wear.watchface.data.RenderParametersWireFormat, long, android.support.wearable.complications.ComplicationData?, androidx.wear.watchface.style.data.UserStyleWireFormat?);
+    method public int describeContents();
+    method public long getCalendarTimeMillis();
+    method public android.support.wearable.complications.ComplicationData? getComplicationData();
+    method public int getComplicationSlotId();
+    method public androidx.wear.watchface.data.RenderParametersWireFormat getRenderParametersWireFormat();
+    method public androidx.wear.watchface.style.data.UserStyleWireFormat? getUserStyle();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.control.data.ComplicationRenderParams!>! CREATOR;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class CrashInfoParcel implements android.os.Parcelable {
+    ctor public CrashInfoParcel(Throwable);
+    method public int describeContents();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.control.data.CrashInfoParcel!>! CREATOR;
+    field public final android.app.ApplicationErrorReport.CrashInfo crashInfo;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class DefaultProviderPoliciesParams implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
+    ctor public DefaultProviderPoliciesParams(android.content.ComponentName);
+    method public int describeContents();
+    method public android.content.ComponentName getWatchFaceName();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.control.data.DefaultProviderPoliciesParams!>! CREATOR;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class GetComplicationSlotMetadataParams implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
+    ctor public GetComplicationSlotMetadataParams(android.content.ComponentName);
+    method public int describeContents();
+    method public android.content.ComponentName getWatchFaceName();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.control.data.GetComplicationSlotMetadataParams!>! CREATOR;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class GetUserStyleSchemaParams implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
+    ctor public GetUserStyleSchemaParams(android.content.ComponentName);
+    method public int describeContents();
+    method public android.content.ComponentName getWatchFaceName();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.control.data.GetUserStyleSchemaParams!>! CREATOR;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class HeadlessWatchFaceInstanceParams implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
+    ctor public HeadlessWatchFaceInstanceParams(android.content.ComponentName, androidx.wear.watchface.data.DeviceConfig, int, int);
+    method public int describeContents();
+    method public androidx.wear.watchface.data.DeviceConfig getDeviceConfig();
+    method public int getHeight();
+    method public android.content.ComponentName getWatchFaceName();
+    method public int getWidth();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.control.data.HeadlessWatchFaceInstanceParams!>! CREATOR;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public final class IdTypeAndDefaultProviderPolicyWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
+    ctor public IdTypeAndDefaultProviderPolicyWireFormat(int, java.util.List<android.content.ComponentName!>?, int, @android.support.wearable.complications.ComplicationData.ComplicationType int);
+    method public int describeContents();
+    method @android.support.wearable.complications.ComplicationData.ComplicationType public int getDefaultProviderType();
+    method public java.util.List<android.content.ComponentName!>? getDefaultProvidersToTry();
+    method public int getFallbackSystemProvider();
+    method public int getId();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.control.data.IdTypeAndDefaultProviderPolicyWireFormat!>! CREATOR;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize(allowSerialization=true) public class WallpaperInteractiveWatchFaceInstanceParams implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
+    ctor public WallpaperInteractiveWatchFaceInstanceParams(String, androidx.wear.watchface.data.DeviceConfig, androidx.wear.watchface.data.WatchUiState, androidx.wear.watchface.style.data.UserStyleWireFormat, java.util.List<androidx.wear.watchface.data.IdAndComplicationDataWireFormat!>?);
+    method public int describeContents();
+    method public androidx.wear.watchface.data.DeviceConfig getDeviceConfig();
+    method public java.util.List<androidx.wear.watchface.data.IdAndComplicationDataWireFormat!>? getIdAndComplicationDataWireFormats();
+    method public String getInstanceId();
+    method public androidx.wear.watchface.style.data.UserStyleWireFormat getUserStyle();
+    method public androidx.wear.watchface.data.WatchUiState getWatchUiState();
+    method public void setIdAndComplicationDataWireFormats(java.util.List<androidx.wear.watchface.data.IdAndComplicationDataWireFormat!>?);
+    method public void setUserStyle(androidx.wear.watchface.style.data.UserStyleWireFormat);
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.control.data.WallpaperInteractiveWatchFaceInstanceParams!>! CREATOR;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class WatchFaceRenderParams implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
+    ctor public WatchFaceRenderParams(androidx.wear.watchface.data.RenderParametersWireFormat, long, androidx.wear.watchface.style.data.UserStyleWireFormat?, java.util.List<androidx.wear.watchface.data.IdAndComplicationDataWireFormat!>?);
+    method public int describeContents();
+    method public long getCalendarTimeMillis();
+    method public java.util.List<androidx.wear.watchface.data.IdAndComplicationDataWireFormat!>? getIdAndComplicationDatumWireFormats();
+    method public androidx.wear.watchface.data.RenderParametersWireFormat getRenderParametersWireFormat();
+    method public androidx.wear.watchface.style.data.UserStyleWireFormat? getUserStyle();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.control.data.WatchFaceRenderParams!>! CREATOR;
+  }
+
+}
+
+package androidx.wear.watchface.data {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public final class ComplicationSlotMetadataWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
+    ctor public ComplicationSlotMetadataWireFormat(int, int[], android.graphics.RectF![], int, @android.support.wearable.complications.ComplicationData.ComplicationType int[], java.util.List<android.content.ComponentName!>?, int, @android.support.wearable.complications.ComplicationData.ComplicationType int, boolean, boolean, android.os.Bundle);
+    method public int describeContents();
+    method public int getBoundsType();
+    method public android.graphics.RectF![] getComplicationBounds();
+    method public int[] getComplicationBoundsType();
+    method public android.os.Bundle getComplicationConfigExtras();
+    method @android.support.wearable.complications.ComplicationData.ComplicationType public int getDefaultDataSourceType();
+    method public java.util.List<android.content.ComponentName!>? getDefaultDataSourcesToTry();
+    method public int getFallbackSystemDataSource();
+    method public int getId();
+    method @android.support.wearable.complications.ComplicationData.ComplicationType public int[] getSupportedTypes();
+    method public boolean isFixedComplicationDataSource();
+    method public boolean isInitiallyEnabled();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.data.ComplicationSlotMetadataWireFormat!>! CREATOR;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public final class ComplicationStateWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
+    ctor public ComplicationStateWireFormat(android.graphics.Rect, int, @android.support.wearable.complications.ComplicationData.ComplicationType int[], java.util.List<android.content.ComponentName!>?, int, @android.support.wearable.complications.ComplicationData.ComplicationType int, boolean, boolean, @android.support.wearable.complications.ComplicationData.ComplicationType int, boolean, android.os.Bundle);
+    method public int describeContents();
+    method public android.graphics.Rect getBounds();
+    method public int getBoundsType();
+    method public android.os.Bundle getComplicationConfigExtras();
+    method @android.support.wearable.complications.ComplicationData.ComplicationType public int getCurrentType();
+    method @android.support.wearable.complications.ComplicationData.ComplicationType public int getDefaultProviderType();
+    method public java.util.List<android.content.ComponentName!>? getDefaultProvidersToTry();
+    method public int getFallbackSystemProvider();
+    method @android.support.wearable.complications.ComplicationData.ComplicationType public int[] getSupportedTypes();
+    method public boolean isEnabled();
+    method public boolean isFixedComplicationProvider();
+    method public boolean isInitiallyEnabled();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.data.ComplicationStateWireFormat!>! CREATOR;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize(allowSerialization=true) public final class DeviceConfig implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
+    ctor public DeviceConfig(boolean, boolean, long, long);
+    method public int describeContents();
+    method public long getAnalogPreviewReferenceTimeMillis();
+    method public long getDigitalPreviewReferenceTimeMillis();
+    method public boolean getHasBurnInProtection();
+    method public boolean getHasLowBitAmbient();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.data.DeviceConfig!>! CREATOR;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public final class IdAndComplicationDataWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
+    ctor public IdAndComplicationDataWireFormat(int, android.support.wearable.complications.ComplicationData);
+    method public int describeContents();
+    method public android.support.wearable.complications.ComplicationData getComplicationData();
+    method public int getId();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.data.IdAndComplicationDataWireFormat!>! CREATOR;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public final class IdAndComplicationStateWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
+    ctor public IdAndComplicationStateWireFormat(int, androidx.wear.watchface.data.ComplicationStateWireFormat);
+    method public int describeContents();
+    method public androidx.wear.watchface.data.ComplicationStateWireFormat getComplicationState();
+    method public int getId();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.data.IdAndComplicationStateWireFormat!>! CREATOR;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize(allowSerialization=true) public final class IdAndTapEventWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
+    ctor public IdAndTapEventWireFormat(int, int, int, long);
+    method public int describeContents();
+    method public long getCalendarTapTimeMillis();
+    method public int getId();
+    method public int getX();
+    method public int getY();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.data.IdAndTapEventWireFormat!>! CREATOR;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class LayerParameterWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
+    ctor public LayerParameterWireFormat(int, int);
+    method public int describeContents();
+    method public int getLayer();
+    method public int getLayerMode();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.data.LayerParameterWireFormat!>! CREATOR;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class RenderParametersWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
+    ctor public RenderParametersWireFormat(int, int, int, int, String?, @ColorInt int, @ColorInt int, java.util.List<androidx.wear.watchface.data.IdAndTapEventWireFormat!>);
+    method public int describeContents();
+    method @ColorInt public int getBackgroundTint();
+    method public int getDrawMode();
+    method public int getElementComplicationSlotId();
+    method public int getElementType();
+    method public String? getElementUserStyleSettingId();
+    method @ColorInt public int getHighlightTint();
+    method public java.util.List<androidx.wear.watchface.data.IdAndTapEventWireFormat!>? getIdAndTapEventWireFormat();
+    method public int getWatchFaceLayerSetBitfield();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.data.RenderParametersWireFormat!>! CREATOR;
+    field public static int ELEMENT_TYPE_ALL_COMPLICATIONS;
+    field public static int ELEMENT_TYPE_COMPLICATION;
+    field public static int ELEMENT_TYPE_NONE;
+    field public static int ELEMENT_TYPE_USER_STYLE;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize(allowSerialization=true) public final class WatchUiState implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
+    ctor public WatchUiState(boolean, int);
+    method public int describeContents();
+    method public boolean getInAmbientMode();
+    method public int getInterruptionFilter();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.data.WatchUiState!>! CREATOR;
+  }
+
+}
+
+package androidx.wear.watchface.editor.data {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize(allowSerialization=true) public final class EditorStateWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
+    ctor public EditorStateWireFormat(String?, androidx.wear.watchface.style.data.UserStyleWireFormat, java.util.List<androidx.wear.watchface.data.IdAndComplicationDataWireFormat!>, boolean, android.os.Bundle?);
+    method public int describeContents();
+    method public boolean getCommitChanges();
+    method public java.util.List<androidx.wear.watchface.data.IdAndComplicationDataWireFormat!> getPreviewComplicationData();
+    method public android.os.Bundle? getPreviewImageBundle();
+    method public androidx.wear.watchface.style.data.UserStyleWireFormat getUserStyle();
+    method public String? getWatchFaceInstanceId();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.editor.data.EditorStateWireFormat!>! CREATOR;
+  }
+
+}
+
+package androidx.wear.watchface.style.data {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class BooleanOptionWireFormat extends androidx.wear.watchface.style.data.OptionWireFormat {
+    ctor public BooleanOptionWireFormat(byte[]);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class BooleanUserStyleSettingWireFormat extends androidx.wear.watchface.style.data.UserStyleSettingWireFormat {
+    ctor public BooleanUserStyleSettingWireFormat(String, CharSequence, CharSequence, android.graphics.drawable.Icon?, java.util.List<androidx.wear.watchface.style.data.OptionWireFormat!>, int, java.util.List<java.lang.Integer!>);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class ComplicationOverlayWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
+    ctor public ComplicationOverlayWireFormat(int, Boolean?, java.util.Map<java.lang.Integer!,android.graphics.RectF!>?, Integer?);
+    method public int describeContents();
+    method public Integer? getAccessibilityTraversalIndex();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.style.data.ComplicationOverlayWireFormat!>! CREATOR;
+    field public static final int ENABLED_NO = 0; // 0x0
+    field public static final int ENABLED_UNKNOWN = -1; // 0xffffffff
+    field public static final int ENABLED_YES = 1; // 0x1
+    field public static final long NULL_ACCESSIBILITY_TRAVERSAL_INDEX = 4294967296L; // 0x100000000L
+    field @androidx.versionedparcelable.ParcelField(1) public int mComplicationSlotId;
+    field @androidx.versionedparcelable.ParcelField(2) public int mEnabled;
+    field @androidx.versionedparcelable.ParcelField(3) public java.util.Map<java.lang.Integer!,android.graphics.RectF!>? mPerComplicationTypeBounds;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class ComplicationsOptionWireFormat extends androidx.wear.watchface.style.data.OptionWireFormat {
+    ctor public ComplicationsOptionWireFormat(byte[], CharSequence, android.graphics.drawable.Icon?, androidx.wear.watchface.style.data.ComplicationOverlayWireFormat![]);
+    field @androidx.versionedparcelable.ParcelField(100) public androidx.wear.watchface.style.data.ComplicationOverlayWireFormat![] mComplicationOverlays;
+    field @androidx.versionedparcelable.ParcelField(2) public CharSequence mDisplayName;
+    field @androidx.versionedparcelable.ParcelField(3) public android.graphics.drawable.Icon? mIcon;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class ComplicationsUserStyleSettingWireFormat extends androidx.wear.watchface.style.data.UserStyleSettingWireFormat {
+    ctor public ComplicationsUserStyleSettingWireFormat(String, CharSequence, CharSequence, android.graphics.drawable.Icon?, java.util.List<androidx.wear.watchface.style.data.OptionWireFormat!>, int, java.util.List<java.lang.Integer!>);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class CustomValueOptionWireFormat extends androidx.wear.watchface.style.data.OptionWireFormat {
+    ctor public CustomValueOptionWireFormat(byte[]);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class CustomValueUserStyleSettingWireFormat extends androidx.wear.watchface.style.data.UserStyleSettingWireFormat {
+    ctor public CustomValueUserStyleSettingWireFormat(String, CharSequence, CharSequence, android.graphics.drawable.Icon?, java.util.List<androidx.wear.watchface.style.data.OptionWireFormat!>, java.util.List<java.lang.Integer!>);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class DoubleRangeOptionWireFormat extends androidx.wear.watchface.style.data.OptionWireFormat {
+    ctor public DoubleRangeOptionWireFormat(byte[]);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class DoubleRangeUserStyleSettingWireFormat extends androidx.wear.watchface.style.data.UserStyleSettingWireFormat {
+    ctor public DoubleRangeUserStyleSettingWireFormat(String, CharSequence, CharSequence, android.graphics.drawable.Icon?, java.util.List<androidx.wear.watchface.style.data.OptionWireFormat!>, int, java.util.List<java.lang.Integer!>);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class ListOptionWireFormat extends androidx.wear.watchface.style.data.OptionWireFormat {
+    ctor public ListOptionWireFormat(byte[], CharSequence, android.graphics.drawable.Icon?);
+    field @androidx.versionedparcelable.ParcelField(2) public CharSequence mDisplayName;
+    field @androidx.versionedparcelable.ParcelField(3) public android.graphics.drawable.Icon? mIcon;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class ListUserStyleSettingWireFormat extends androidx.wear.watchface.style.data.UserStyleSettingWireFormat {
+    ctor public ListUserStyleSettingWireFormat(String, CharSequence, CharSequence, android.graphics.drawable.Icon?, java.util.List<androidx.wear.watchface.style.data.OptionWireFormat!>, int, java.util.List<java.lang.Integer!>);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class LongRangeOptionWireFormat extends androidx.wear.watchface.style.data.OptionWireFormat {
+    ctor public LongRangeOptionWireFormat(byte[]);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class LongRangeUserStyleSettingWireFormat extends androidx.wear.watchface.style.data.UserStyleSettingWireFormat {
+    ctor public LongRangeUserStyleSettingWireFormat(String, CharSequence, CharSequence, android.graphics.drawable.Icon?, java.util.List<androidx.wear.watchface.style.data.OptionWireFormat!>, int, java.util.List<java.lang.Integer!>);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class OptionWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
+    ctor public OptionWireFormat(byte[]);
+    method public int describeContents();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.style.data.OptionWireFormat!>! CREATOR;
+    field @androidx.versionedparcelable.ParcelField(1) public byte[] mId;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class UserStyleSchemaWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
+    ctor public UserStyleSchemaWireFormat(java.util.List<androidx.wear.watchface.style.data.UserStyleSettingWireFormat!>);
+    method public int describeContents();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.style.data.UserStyleSchemaWireFormat!>! CREATOR;
+    field @androidx.versionedparcelable.ParcelField(1) public java.util.List<androidx.wear.watchface.style.data.UserStyleSettingWireFormat!> mSchema;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize public class UserStyleSettingWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
+    ctor public UserStyleSettingWireFormat(String, CharSequence, CharSequence, android.graphics.drawable.Icon?, java.util.List<androidx.wear.watchface.style.data.OptionWireFormat!>, int, java.util.List<java.lang.Integer!>);
+    method public int describeContents();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.style.data.UserStyleSettingWireFormat!>! CREATOR;
+    field @androidx.versionedparcelable.ParcelField(6) public java.util.List<java.lang.Integer!> mAffectsLayers;
+    field @androidx.versionedparcelable.ParcelField(5) public int mDefaultOptionIndex;
+    field @androidx.versionedparcelable.ParcelField(3) public CharSequence mDescription;
+    field @androidx.versionedparcelable.ParcelField(2) public CharSequence mDisplayName;
+    field @androidx.versionedparcelable.ParcelField(4) public android.graphics.drawable.Icon? mIcon;
+    field @androidx.versionedparcelable.ParcelField(1) public String mId;
+    field @androidx.versionedparcelable.ParcelField(100) public java.util.List<androidx.wear.watchface.style.data.OptionWireFormat!> mOptions;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.VersionedParcelize(allowSerialization=true) public class UserStyleWireFormat implements android.os.Parcelable androidx.versionedparcelable.VersionedParcelable {
+    ctor public UserStyleWireFormat(java.util.Map<java.lang.String!,byte[]!>);
+    method public int describeContents();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<androidx.wear.watchface.style.data.UserStyleWireFormat!>! CREATOR;
+    field @androidx.versionedparcelable.ParcelField(1) public java.util.Map<java.lang.String!,byte[]!> mUserStyle;
+  }
+
+}
+
diff --git a/wear/watchface/watchface-editor-guava/api/1.0.0-beta02.txt b/wear/watchface/watchface-editor-guava/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..5592a04
--- /dev/null
+++ b/wear/watchface/watchface-editor-guava/api/1.0.0-beta02.txt
@@ -0,0 +1,43 @@
+// Signature format: 4.0
+package androidx.wear.watchface.editor {
+
+  public final class ListenableEditorSession implements androidx.wear.watchface.editor.EditorSession {
+    ctor public ListenableEditorSession(androidx.wear.watchface.editor.EditorSession wrappedEditorSession);
+    method public void close();
+    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 kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> getComplicationSlotsState();
+    method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.ComplicationDataSourceInfo>> getComplicationsDataSourceInfo();
+    method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData>> getComplicationsPreviewData();
+    method public java.time.Instant getPreviewReferenceInstant();
+    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();
+    method public boolean isCommitChangesOnClose();
+    method @UiThread public static com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.editor.ListenableEditorSession> listenableCreateOnWatchEditorSession(androidx.activity.ComponentActivity activity);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.editor.ChosenComplicationDataSource> listenableOpenComplicationDataSourceChooser(int complicationSlotId);
+    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.watchface.complications.data.ComplicationData>? slotIdToComplicationData);
+    method public void setCommitChangesOnClose(boolean commitChangesOnClose);
+    property public Integer? backgroundComplicationSlotId;
+    property public boolean commitChangesOnClose;
+    property public kotlinx.coroutines.flow.StateFlow<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.complications.ComplicationDataSourceInfo>> complicationsDataSourceInfo;
+    property public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData>> complicationsPreviewData;
+    property public java.time.Instant previewReferenceInstant;
+    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;
+    field public static final androidx.wear.watchface.editor.ListenableEditorSession.Companion Companion;
+  }
+
+  public static final class ListenableEditorSession.Companion {
+    method @RequiresApi(27) @UiThread public androidx.wear.watchface.editor.ListenableEditorSession createHeadlessEditorSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent, androidx.wear.watchface.client.HeadlessWatchFaceClient headlessWatchFaceClient);
+    method @UiThread public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.editor.ListenableEditorSession> listenableCreateOnWatchEditorSession(androidx.activity.ComponentActivity activity);
+  }
+
+}
+
diff --git a/wear/watchface/watchface-editor-guava/api/api_lint.ignore b/wear/watchface/watchface-editor-guava/api/api_lint.ignore
index 16ace53..1276c29 100644
--- a/wear/watchface/watchface-editor-guava/api/api_lint.ignore
+++ b/wear/watchface/watchface-editor-guava/api/api_lint.ignore
@@ -1,8 +1,4 @@
 // Baseline format: 1.0
-AsyncSuffixFuture: androidx.wear.watchface.editor.ListenableEditorSession#getListenableComplicationPreviewData():
-    Methods returning com.google.common.util.concurrent.ListenableFuture should have a suffix *Async to reserve unmodified name for a suspend function
-AsyncSuffixFuture: androidx.wear.watchface.editor.ListenableEditorSession#getListenableComplicationsProviderInfo():
-    Methods returning com.google.common.util.concurrent.ListenableFuture should have a suffix *Async to reserve unmodified name for a suspend function
 AsyncSuffixFuture: androidx.wear.watchface.editor.ListenableEditorSession#listenableCreateOnWatchEditorSession(androidx.activity.ComponentActivity):
     Methods returning com.google.common.util.concurrent.ListenableFuture should have a suffix *Async to reserve unmodified name for a suspend function
 AsyncSuffixFuture: androidx.wear.watchface.editor.ListenableEditorSession#listenableOpenComplicationDataSourceChooser(int):
diff --git a/wear/watchface/watchface-editor-guava/api/public_plus_experimental_1.0.0-beta02.txt b/wear/watchface/watchface-editor-guava/api/public_plus_experimental_1.0.0-beta02.txt
new file mode 100644
index 0000000..5592a04
--- /dev/null
+++ b/wear/watchface/watchface-editor-guava/api/public_plus_experimental_1.0.0-beta02.txt
@@ -0,0 +1,43 @@
+// Signature format: 4.0
+package androidx.wear.watchface.editor {
+
+  public final class ListenableEditorSession implements androidx.wear.watchface.editor.EditorSession {
+    ctor public ListenableEditorSession(androidx.wear.watchface.editor.EditorSession wrappedEditorSession);
+    method public void close();
+    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 kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> getComplicationSlotsState();
+    method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.ComplicationDataSourceInfo>> getComplicationsDataSourceInfo();
+    method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData>> getComplicationsPreviewData();
+    method public java.time.Instant getPreviewReferenceInstant();
+    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();
+    method public boolean isCommitChangesOnClose();
+    method @UiThread public static com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.editor.ListenableEditorSession> listenableCreateOnWatchEditorSession(androidx.activity.ComponentActivity activity);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.editor.ChosenComplicationDataSource> listenableOpenComplicationDataSourceChooser(int complicationSlotId);
+    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.watchface.complications.data.ComplicationData>? slotIdToComplicationData);
+    method public void setCommitChangesOnClose(boolean commitChangesOnClose);
+    property public Integer? backgroundComplicationSlotId;
+    property public boolean commitChangesOnClose;
+    property public kotlinx.coroutines.flow.StateFlow<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.complications.ComplicationDataSourceInfo>> complicationsDataSourceInfo;
+    property public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData>> complicationsPreviewData;
+    property public java.time.Instant previewReferenceInstant;
+    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;
+    field public static final androidx.wear.watchface.editor.ListenableEditorSession.Companion Companion;
+  }
+
+  public static final class ListenableEditorSession.Companion {
+    method @RequiresApi(27) @UiThread public androidx.wear.watchface.editor.ListenableEditorSession createHeadlessEditorSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent, androidx.wear.watchface.client.HeadlessWatchFaceClient headlessWatchFaceClient);
+    method @UiThread public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.editor.ListenableEditorSession> listenableCreateOnWatchEditorSession(androidx.activity.ComponentActivity activity);
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/wear/watchface/watchface-editor-guava/api/res-1.0.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to wear/watchface/watchface-editor-guava/api/res-1.0.0-beta02.txt
diff --git a/wear/watchface/watchface-editor-guava/api/restricted_1.0.0-beta02.txt b/wear/watchface/watchface-editor-guava/api/restricted_1.0.0-beta02.txt
new file mode 100644
index 0000000..5592a04
--- /dev/null
+++ b/wear/watchface/watchface-editor-guava/api/restricted_1.0.0-beta02.txt
@@ -0,0 +1,43 @@
+// Signature format: 4.0
+package androidx.wear.watchface.editor {
+
+  public final class ListenableEditorSession implements androidx.wear.watchface.editor.EditorSession {
+    ctor public ListenableEditorSession(androidx.wear.watchface.editor.EditorSession wrappedEditorSession);
+    method public void close();
+    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 kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> getComplicationSlotsState();
+    method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.ComplicationDataSourceInfo>> getComplicationsDataSourceInfo();
+    method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData>> getComplicationsPreviewData();
+    method public java.time.Instant getPreviewReferenceInstant();
+    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();
+    method public boolean isCommitChangesOnClose();
+    method @UiThread public static com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.editor.ListenableEditorSession> listenableCreateOnWatchEditorSession(androidx.activity.ComponentActivity activity);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.editor.ChosenComplicationDataSource> listenableOpenComplicationDataSourceChooser(int complicationSlotId);
+    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.watchface.complications.data.ComplicationData>? slotIdToComplicationData);
+    method public void setCommitChangesOnClose(boolean commitChangesOnClose);
+    property public Integer? backgroundComplicationSlotId;
+    property public boolean commitChangesOnClose;
+    property public kotlinx.coroutines.flow.StateFlow<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.complications.ComplicationDataSourceInfo>> complicationsDataSourceInfo;
+    property public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData>> complicationsPreviewData;
+    property public java.time.Instant previewReferenceInstant;
+    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;
+    field public static final androidx.wear.watchface.editor.ListenableEditorSession.Companion Companion;
+  }
+
+  public static final class ListenableEditorSession.Companion {
+    method @RequiresApi(27) @UiThread public androidx.wear.watchface.editor.ListenableEditorSession createHeadlessEditorSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent, androidx.wear.watchface.client.HeadlessWatchFaceClient headlessWatchFaceClient);
+    method @UiThread public com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.editor.ListenableEditorSession> listenableCreateOnWatchEditorSession(androidx.activity.ComponentActivity activity);
+  }
+
+}
+
diff --git a/wear/watchface/watchface-editor/api/1.0.0-beta01.txt b/wear/watchface/watchface-editor/api/1.0.0-beta01.txt
index 29c54f0..406d86a 100644
--- a/wear/watchface/watchface-editor/api/1.0.0-beta01.txt
+++ b/wear/watchface/watchface-editor/api/1.0.0-beta01.txt
@@ -12,7 +12,7 @@
   }
 
   public final class EditorRequest {
-    ctor @RequiresApi(android.os.Build.VERSION_CODES.R) public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle, @RequiresApi androidx.wear.watchface.client.WatchFaceId watchFaceId, androidx.wear.watchface.client.DeviceConfig? headlessDeviceConfig, androidx.wear.watchface.editor.PreviewScreenshotParams? previewScreenshotParams);
+    ctor @RequiresApi(android.os.Build.VERSION_CODES.R) public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle, @RequiresApi(android.os.Build.VERSION_CODES.R) androidx.wear.watchface.client.WatchFaceId watchFaceId, androidx.wear.watchface.client.DeviceConfig? headlessDeviceConfig, androidx.wear.watchface.editor.PreviewScreenshotParams? previewScreenshotParams);
     ctor public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle);
     method @kotlin.jvm.Throws(exceptionClasses=TimeoutCancellationException::class) public static androidx.wear.watchface.editor.EditorRequest createFromIntent(android.content.Intent intent) throws kotlinx.coroutines.TimeoutCancellationException;
     method public String getEditorPackageName();
diff --git a/wear/watchface/watchface-editor/api/1.0.0-beta02.txt b/wear/watchface/watchface-editor/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..29c54f0
--- /dev/null
+++ b/wear/watchface/watchface-editor/api/1.0.0-beta02.txt
@@ -0,0 +1,100 @@
+// Signature format: 4.0
+package androidx.wear.watchface.editor {
+
+  public final class ChosenComplicationDataSource {
+    ctor public ChosenComplicationDataSource(int complicationSlotId, androidx.wear.watchface.complications.ComplicationDataSourceInfo? complicationDataSourceInfo, android.os.Bundle extras);
+    method public androidx.wear.watchface.complications.ComplicationDataSourceInfo? getComplicationDataSourceInfo();
+    method public int getComplicationSlotId();
+    method public android.os.Bundle getExtras();
+    property public final androidx.wear.watchface.complications.ComplicationDataSourceInfo? complicationDataSourceInfo;
+    property public final int complicationSlotId;
+    property public final android.os.Bundle extras;
+  }
+
+  public final class EditorRequest {
+    ctor @RequiresApi(android.os.Build.VERSION_CODES.R) public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle, @RequiresApi androidx.wear.watchface.client.WatchFaceId watchFaceId, androidx.wear.watchface.client.DeviceConfig? headlessDeviceConfig, androidx.wear.watchface.editor.PreviewScreenshotParams? previewScreenshotParams);
+    ctor public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle);
+    method @kotlin.jvm.Throws(exceptionClasses=TimeoutCancellationException::class) public static androidx.wear.watchface.editor.EditorRequest createFromIntent(android.content.Intent intent) throws kotlinx.coroutines.TimeoutCancellationException;
+    method public String getEditorPackageName();
+    method public androidx.wear.watchface.client.DeviceConfig? getHeadlessDeviceConfig();
+    method public androidx.wear.watchface.style.UserStyleData? getInitialUserStyle();
+    method public androidx.wear.watchface.editor.PreviewScreenshotParams? getPreviewScreenshotParams();
+    method public android.content.ComponentName getWatchFaceComponentName();
+    method @RequiresApi(android.os.Build.VERSION_CODES.R) public androidx.wear.watchface.client.WatchFaceId getWatchFaceId();
+    property public final String editorPackageName;
+    property public final androidx.wear.watchface.client.DeviceConfig? headlessDeviceConfig;
+    property public final androidx.wear.watchface.style.UserStyleData? initialUserStyle;
+    property public final androidx.wear.watchface.editor.PreviewScreenshotParams? previewScreenshotParams;
+    property public final android.content.ComponentName watchFaceComponentName;
+    property @RequiresApi(android.os.Build.VERSION_CODES.R) public final androidx.wear.watchface.client.WatchFaceId watchFaceId;
+    field public static final androidx.wear.watchface.editor.EditorRequest.Companion Companion;
+  }
+
+  public static final class EditorRequest.Companion {
+    method @kotlin.jvm.Throws(exceptionClasses=TimeoutCancellationException::class) public androidx.wear.watchface.editor.EditorRequest createFromIntent(android.content.Intent intent) throws kotlinx.coroutines.TimeoutCancellationException;
+  }
+
+  public interface EditorSession extends java.lang.AutoCloseable {
+    method @RequiresApi(27) @UiThread public default static androidx.wear.watchface.editor.EditorSession createHeadlessEditorSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent, androidx.wear.watchface.client.HeadlessWatchFaceClient headlessWatchFaceClient);
+    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 kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> getComplicationSlotsState();
+    method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.ComplicationDataSourceInfo>> getComplicationsDataSourceInfo();
+    method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData>> getComplicationsPreviewData();
+    method public java.time.Instant getPreviewReferenceInstant();
+    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();
+    method @UiThread public boolean isCommitChangesOnClose();
+    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.watchface.complications.data.ComplicationData>? slotIdToComplicationData);
+    method @UiThread public void setCommitChangesOnClose(boolean commitChangesOnClose);
+    property public abstract Integer? backgroundComplicationSlotId;
+    property @UiThread public abstract boolean commitChangesOnClose;
+    property public abstract kotlinx.coroutines.flow.StateFlow<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.complications.ComplicationDataSourceInfo>> complicationsDataSourceInfo;
+    property public abstract kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData>> complicationsPreviewData;
+    property public abstract java.time.Instant previewReferenceInstant;
+    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;
+    field public static final androidx.wear.watchface.editor.EditorSession.Companion Companion;
+    field public static final java.time.Instant DEFAULT_PREVIEW_INSTANT;
+    field public static final java.time.Duration EDITING_SESSION_TIMEOUT;
+  }
+
+  public static final class EditorSession.Companion {
+    method @RequiresApi(27) @UiThread public androidx.wear.watchface.editor.EditorSession createHeadlessEditorSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent, androidx.wear.watchface.client.HeadlessWatchFaceClient headlessWatchFaceClient);
+    method @UiThread @kotlin.jvm.Throws(exceptionClasses=TimeoutCancellationException::class) public suspend Object? createOnWatchEditorSession(androidx.activity.ComponentActivity activity, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.EditorSession> p) throws kotlinx.coroutines.TimeoutCancellationException;
+  }
+
+  public final class EditorSessionKt {
+  }
+
+  public final class PreviewScreenshotParams {
+    ctor public PreviewScreenshotParams(androidx.wear.watchface.RenderParameters renderParameters, java.time.Instant instant);
+    method public java.time.Instant getInstant();
+    method public androidx.wear.watchface.RenderParameters getRenderParameters();
+    property public final java.time.Instant instant;
+    property public final androidx.wear.watchface.RenderParameters renderParameters;
+  }
+
+  public class WatchFaceEditorContract extends androidx.activity.result.contract.ActivityResultContract<androidx.wear.watchface.editor.EditorRequest,kotlin.Unit> {
+    ctor public WatchFaceEditorContract();
+    method public android.content.Intent createIntent(android.content.Context context, androidx.wear.watchface.editor.EditorRequest input);
+    method public void parseResult(int resultCode, android.content.Intent? intent);
+    field public static final String ACTION_WATCH_FACE_EDITOR = "androidx.wear.watchface.editor.action.WATCH_FACE_EDITOR";
+    field public static final androidx.wear.watchface.editor.WatchFaceEditorContract.Companion Companion;
+  }
+
+  public static final class WatchFaceEditorContract.Companion {
+  }
+
+  public final class WatchFaceEditorContractKt {
+  }
+
+}
+
diff --git a/wear/watchface/watchface-editor/api/current.txt b/wear/watchface/watchface-editor/api/current.txt
index 29c54f0..406d86a 100644
--- a/wear/watchface/watchface-editor/api/current.txt
+++ b/wear/watchface/watchface-editor/api/current.txt
@@ -12,7 +12,7 @@
   }
 
   public final class EditorRequest {
-    ctor @RequiresApi(android.os.Build.VERSION_CODES.R) public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle, @RequiresApi androidx.wear.watchface.client.WatchFaceId watchFaceId, androidx.wear.watchface.client.DeviceConfig? headlessDeviceConfig, androidx.wear.watchface.editor.PreviewScreenshotParams? previewScreenshotParams);
+    ctor @RequiresApi(android.os.Build.VERSION_CODES.R) public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle, @RequiresApi(android.os.Build.VERSION_CODES.R) androidx.wear.watchface.client.WatchFaceId watchFaceId, androidx.wear.watchface.client.DeviceConfig? headlessDeviceConfig, androidx.wear.watchface.editor.PreviewScreenshotParams? previewScreenshotParams);
     ctor public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle);
     method @kotlin.jvm.Throws(exceptionClasses=TimeoutCancellationException::class) public static androidx.wear.watchface.editor.EditorRequest createFromIntent(android.content.Intent intent) throws kotlinx.coroutines.TimeoutCancellationException;
     method public String getEditorPackageName();
diff --git a/wear/watchface/watchface-editor/api/public_plus_experimental_1.0.0-beta01.txt b/wear/watchface/watchface-editor/api/public_plus_experimental_1.0.0-beta01.txt
index 29c54f0..406d86a 100644
--- a/wear/watchface/watchface-editor/api/public_plus_experimental_1.0.0-beta01.txt
+++ b/wear/watchface/watchface-editor/api/public_plus_experimental_1.0.0-beta01.txt
@@ -12,7 +12,7 @@
   }
 
   public final class EditorRequest {
-    ctor @RequiresApi(android.os.Build.VERSION_CODES.R) public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle, @RequiresApi androidx.wear.watchface.client.WatchFaceId watchFaceId, androidx.wear.watchface.client.DeviceConfig? headlessDeviceConfig, androidx.wear.watchface.editor.PreviewScreenshotParams? previewScreenshotParams);
+    ctor @RequiresApi(android.os.Build.VERSION_CODES.R) public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle, @RequiresApi(android.os.Build.VERSION_CODES.R) androidx.wear.watchface.client.WatchFaceId watchFaceId, androidx.wear.watchface.client.DeviceConfig? headlessDeviceConfig, androidx.wear.watchface.editor.PreviewScreenshotParams? previewScreenshotParams);
     ctor public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle);
     method @kotlin.jvm.Throws(exceptionClasses=TimeoutCancellationException::class) public static androidx.wear.watchface.editor.EditorRequest createFromIntent(android.content.Intent intent) throws kotlinx.coroutines.TimeoutCancellationException;
     method public String getEditorPackageName();
diff --git a/wear/watchface/watchface-editor/api/public_plus_experimental_1.0.0-beta02.txt b/wear/watchface/watchface-editor/api/public_plus_experimental_1.0.0-beta02.txt
new file mode 100644
index 0000000..29c54f0
--- /dev/null
+++ b/wear/watchface/watchface-editor/api/public_plus_experimental_1.0.0-beta02.txt
@@ -0,0 +1,100 @@
+// Signature format: 4.0
+package androidx.wear.watchface.editor {
+
+  public final class ChosenComplicationDataSource {
+    ctor public ChosenComplicationDataSource(int complicationSlotId, androidx.wear.watchface.complications.ComplicationDataSourceInfo? complicationDataSourceInfo, android.os.Bundle extras);
+    method public androidx.wear.watchface.complications.ComplicationDataSourceInfo? getComplicationDataSourceInfo();
+    method public int getComplicationSlotId();
+    method public android.os.Bundle getExtras();
+    property public final androidx.wear.watchface.complications.ComplicationDataSourceInfo? complicationDataSourceInfo;
+    property public final int complicationSlotId;
+    property public final android.os.Bundle extras;
+  }
+
+  public final class EditorRequest {
+    ctor @RequiresApi(android.os.Build.VERSION_CODES.R) public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle, @RequiresApi androidx.wear.watchface.client.WatchFaceId watchFaceId, androidx.wear.watchface.client.DeviceConfig? headlessDeviceConfig, androidx.wear.watchface.editor.PreviewScreenshotParams? previewScreenshotParams);
+    ctor public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle);
+    method @kotlin.jvm.Throws(exceptionClasses=TimeoutCancellationException::class) public static androidx.wear.watchface.editor.EditorRequest createFromIntent(android.content.Intent intent) throws kotlinx.coroutines.TimeoutCancellationException;
+    method public String getEditorPackageName();
+    method public androidx.wear.watchface.client.DeviceConfig? getHeadlessDeviceConfig();
+    method public androidx.wear.watchface.style.UserStyleData? getInitialUserStyle();
+    method public androidx.wear.watchface.editor.PreviewScreenshotParams? getPreviewScreenshotParams();
+    method public android.content.ComponentName getWatchFaceComponentName();
+    method @RequiresApi(android.os.Build.VERSION_CODES.R) public androidx.wear.watchface.client.WatchFaceId getWatchFaceId();
+    property public final String editorPackageName;
+    property public final androidx.wear.watchface.client.DeviceConfig? headlessDeviceConfig;
+    property public final androidx.wear.watchface.style.UserStyleData? initialUserStyle;
+    property public final androidx.wear.watchface.editor.PreviewScreenshotParams? previewScreenshotParams;
+    property public final android.content.ComponentName watchFaceComponentName;
+    property @RequiresApi(android.os.Build.VERSION_CODES.R) public final androidx.wear.watchface.client.WatchFaceId watchFaceId;
+    field public static final androidx.wear.watchface.editor.EditorRequest.Companion Companion;
+  }
+
+  public static final class EditorRequest.Companion {
+    method @kotlin.jvm.Throws(exceptionClasses=TimeoutCancellationException::class) public androidx.wear.watchface.editor.EditorRequest createFromIntent(android.content.Intent intent) throws kotlinx.coroutines.TimeoutCancellationException;
+  }
+
+  public interface EditorSession extends java.lang.AutoCloseable {
+    method @RequiresApi(27) @UiThread public default static androidx.wear.watchface.editor.EditorSession createHeadlessEditorSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent, androidx.wear.watchface.client.HeadlessWatchFaceClient headlessWatchFaceClient);
+    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 kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> getComplicationSlotsState();
+    method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.ComplicationDataSourceInfo>> getComplicationsDataSourceInfo();
+    method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData>> getComplicationsPreviewData();
+    method public java.time.Instant getPreviewReferenceInstant();
+    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();
+    method @UiThread public boolean isCommitChangesOnClose();
+    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.watchface.complications.data.ComplicationData>? slotIdToComplicationData);
+    method @UiThread public void setCommitChangesOnClose(boolean commitChangesOnClose);
+    property public abstract Integer? backgroundComplicationSlotId;
+    property @UiThread public abstract boolean commitChangesOnClose;
+    property public abstract kotlinx.coroutines.flow.StateFlow<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.complications.ComplicationDataSourceInfo>> complicationsDataSourceInfo;
+    property public abstract kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData>> complicationsPreviewData;
+    property public abstract java.time.Instant previewReferenceInstant;
+    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;
+    field public static final androidx.wear.watchface.editor.EditorSession.Companion Companion;
+    field public static final java.time.Instant DEFAULT_PREVIEW_INSTANT;
+    field public static final java.time.Duration EDITING_SESSION_TIMEOUT;
+  }
+
+  public static final class EditorSession.Companion {
+    method @RequiresApi(27) @UiThread public androidx.wear.watchface.editor.EditorSession createHeadlessEditorSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent, androidx.wear.watchface.client.HeadlessWatchFaceClient headlessWatchFaceClient);
+    method @UiThread @kotlin.jvm.Throws(exceptionClasses=TimeoutCancellationException::class) public suspend Object? createOnWatchEditorSession(androidx.activity.ComponentActivity activity, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.EditorSession> p) throws kotlinx.coroutines.TimeoutCancellationException;
+  }
+
+  public final class EditorSessionKt {
+  }
+
+  public final class PreviewScreenshotParams {
+    ctor public PreviewScreenshotParams(androidx.wear.watchface.RenderParameters renderParameters, java.time.Instant instant);
+    method public java.time.Instant getInstant();
+    method public androidx.wear.watchface.RenderParameters getRenderParameters();
+    property public final java.time.Instant instant;
+    property public final androidx.wear.watchface.RenderParameters renderParameters;
+  }
+
+  public class WatchFaceEditorContract extends androidx.activity.result.contract.ActivityResultContract<androidx.wear.watchface.editor.EditorRequest,kotlin.Unit> {
+    ctor public WatchFaceEditorContract();
+    method public android.content.Intent createIntent(android.content.Context context, androidx.wear.watchface.editor.EditorRequest input);
+    method public void parseResult(int resultCode, android.content.Intent? intent);
+    field public static final String ACTION_WATCH_FACE_EDITOR = "androidx.wear.watchface.editor.action.WATCH_FACE_EDITOR";
+    field public static final androidx.wear.watchface.editor.WatchFaceEditorContract.Companion Companion;
+  }
+
+  public static final class WatchFaceEditorContract.Companion {
+  }
+
+  public final class WatchFaceEditorContractKt {
+  }
+
+}
+
diff --git a/wear/watchface/watchface-editor/api/public_plus_experimental_current.txt b/wear/watchface/watchface-editor/api/public_plus_experimental_current.txt
index 29c54f0..406d86a 100644
--- a/wear/watchface/watchface-editor/api/public_plus_experimental_current.txt
+++ b/wear/watchface/watchface-editor/api/public_plus_experimental_current.txt
@@ -12,7 +12,7 @@
   }
 
   public final class EditorRequest {
-    ctor @RequiresApi(android.os.Build.VERSION_CODES.R) public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle, @RequiresApi androidx.wear.watchface.client.WatchFaceId watchFaceId, androidx.wear.watchface.client.DeviceConfig? headlessDeviceConfig, androidx.wear.watchface.editor.PreviewScreenshotParams? previewScreenshotParams);
+    ctor @RequiresApi(android.os.Build.VERSION_CODES.R) public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle, @RequiresApi(android.os.Build.VERSION_CODES.R) androidx.wear.watchface.client.WatchFaceId watchFaceId, androidx.wear.watchface.client.DeviceConfig? headlessDeviceConfig, androidx.wear.watchface.editor.PreviewScreenshotParams? previewScreenshotParams);
     ctor public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle);
     method @kotlin.jvm.Throws(exceptionClasses=TimeoutCancellationException::class) public static androidx.wear.watchface.editor.EditorRequest createFromIntent(android.content.Intent intent) throws kotlinx.coroutines.TimeoutCancellationException;
     method public String getEditorPackageName();
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/wear/watchface/watchface-editor/api/res-1.0.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to wear/watchface/watchface-editor/api/res-1.0.0-beta02.txt
diff --git a/wear/watchface/watchface-editor/api/restricted_1.0.0-beta01.txt b/wear/watchface/watchface-editor/api/restricted_1.0.0-beta01.txt
index 29c54f0..406d86a 100644
--- a/wear/watchface/watchface-editor/api/restricted_1.0.0-beta01.txt
+++ b/wear/watchface/watchface-editor/api/restricted_1.0.0-beta01.txt
@@ -12,7 +12,7 @@
   }
 
   public final class EditorRequest {
-    ctor @RequiresApi(android.os.Build.VERSION_CODES.R) public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle, @RequiresApi androidx.wear.watchface.client.WatchFaceId watchFaceId, androidx.wear.watchface.client.DeviceConfig? headlessDeviceConfig, androidx.wear.watchface.editor.PreviewScreenshotParams? previewScreenshotParams);
+    ctor @RequiresApi(android.os.Build.VERSION_CODES.R) public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle, @RequiresApi(android.os.Build.VERSION_CODES.R) androidx.wear.watchface.client.WatchFaceId watchFaceId, androidx.wear.watchface.client.DeviceConfig? headlessDeviceConfig, androidx.wear.watchface.editor.PreviewScreenshotParams? previewScreenshotParams);
     ctor public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle);
     method @kotlin.jvm.Throws(exceptionClasses=TimeoutCancellationException::class) public static androidx.wear.watchface.editor.EditorRequest createFromIntent(android.content.Intent intent) throws kotlinx.coroutines.TimeoutCancellationException;
     method public String getEditorPackageName();
diff --git a/wear/watchface/watchface-editor/api/restricted_1.0.0-beta02.txt b/wear/watchface/watchface-editor/api/restricted_1.0.0-beta02.txt
new file mode 100644
index 0000000..29c54f0
--- /dev/null
+++ b/wear/watchface/watchface-editor/api/restricted_1.0.0-beta02.txt
@@ -0,0 +1,100 @@
+// Signature format: 4.0
+package androidx.wear.watchface.editor {
+
+  public final class ChosenComplicationDataSource {
+    ctor public ChosenComplicationDataSource(int complicationSlotId, androidx.wear.watchface.complications.ComplicationDataSourceInfo? complicationDataSourceInfo, android.os.Bundle extras);
+    method public androidx.wear.watchface.complications.ComplicationDataSourceInfo? getComplicationDataSourceInfo();
+    method public int getComplicationSlotId();
+    method public android.os.Bundle getExtras();
+    property public final androidx.wear.watchface.complications.ComplicationDataSourceInfo? complicationDataSourceInfo;
+    property public final int complicationSlotId;
+    property public final android.os.Bundle extras;
+  }
+
+  public final class EditorRequest {
+    ctor @RequiresApi(android.os.Build.VERSION_CODES.R) public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle, @RequiresApi androidx.wear.watchface.client.WatchFaceId watchFaceId, androidx.wear.watchface.client.DeviceConfig? headlessDeviceConfig, androidx.wear.watchface.editor.PreviewScreenshotParams? previewScreenshotParams);
+    ctor public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle);
+    method @kotlin.jvm.Throws(exceptionClasses=TimeoutCancellationException::class) public static androidx.wear.watchface.editor.EditorRequest createFromIntent(android.content.Intent intent) throws kotlinx.coroutines.TimeoutCancellationException;
+    method public String getEditorPackageName();
+    method public androidx.wear.watchface.client.DeviceConfig? getHeadlessDeviceConfig();
+    method public androidx.wear.watchface.style.UserStyleData? getInitialUserStyle();
+    method public androidx.wear.watchface.editor.PreviewScreenshotParams? getPreviewScreenshotParams();
+    method public android.content.ComponentName getWatchFaceComponentName();
+    method @RequiresApi(android.os.Build.VERSION_CODES.R) public androidx.wear.watchface.client.WatchFaceId getWatchFaceId();
+    property public final String editorPackageName;
+    property public final androidx.wear.watchface.client.DeviceConfig? headlessDeviceConfig;
+    property public final androidx.wear.watchface.style.UserStyleData? initialUserStyle;
+    property public final androidx.wear.watchface.editor.PreviewScreenshotParams? previewScreenshotParams;
+    property public final android.content.ComponentName watchFaceComponentName;
+    property @RequiresApi(android.os.Build.VERSION_CODES.R) public final androidx.wear.watchface.client.WatchFaceId watchFaceId;
+    field public static final androidx.wear.watchface.editor.EditorRequest.Companion Companion;
+  }
+
+  public static final class EditorRequest.Companion {
+    method @kotlin.jvm.Throws(exceptionClasses=TimeoutCancellationException::class) public androidx.wear.watchface.editor.EditorRequest createFromIntent(android.content.Intent intent) throws kotlinx.coroutines.TimeoutCancellationException;
+  }
+
+  public interface EditorSession extends java.lang.AutoCloseable {
+    method @RequiresApi(27) @UiThread public default static androidx.wear.watchface.editor.EditorSession createHeadlessEditorSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent, androidx.wear.watchface.client.HeadlessWatchFaceClient headlessWatchFaceClient);
+    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 kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> getComplicationSlotsState();
+    method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.ComplicationDataSourceInfo>> getComplicationsDataSourceInfo();
+    method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData>> getComplicationsPreviewData();
+    method public java.time.Instant getPreviewReferenceInstant();
+    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();
+    method @UiThread public boolean isCommitChangesOnClose();
+    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.watchface.complications.data.ComplicationData>? slotIdToComplicationData);
+    method @UiThread public void setCommitChangesOnClose(boolean commitChangesOnClose);
+    property public abstract Integer? backgroundComplicationSlotId;
+    property @UiThread public abstract boolean commitChangesOnClose;
+    property public abstract kotlinx.coroutines.flow.StateFlow<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.complications.ComplicationDataSourceInfo>> complicationsDataSourceInfo;
+    property public abstract kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData>> complicationsPreviewData;
+    property public abstract java.time.Instant previewReferenceInstant;
+    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;
+    field public static final androidx.wear.watchface.editor.EditorSession.Companion Companion;
+    field public static final java.time.Instant DEFAULT_PREVIEW_INSTANT;
+    field public static final java.time.Duration EDITING_SESSION_TIMEOUT;
+  }
+
+  public static final class EditorSession.Companion {
+    method @RequiresApi(27) @UiThread public androidx.wear.watchface.editor.EditorSession createHeadlessEditorSession(androidx.activity.ComponentActivity activity, android.content.Intent editIntent, androidx.wear.watchface.client.HeadlessWatchFaceClient headlessWatchFaceClient);
+    method @UiThread @kotlin.jvm.Throws(exceptionClasses=TimeoutCancellationException::class) public suspend Object? createOnWatchEditorSession(androidx.activity.ComponentActivity activity, kotlin.coroutines.Continuation<? super androidx.wear.watchface.editor.EditorSession> p) throws kotlinx.coroutines.TimeoutCancellationException;
+  }
+
+  public final class EditorSessionKt {
+  }
+
+  public final class PreviewScreenshotParams {
+    ctor public PreviewScreenshotParams(androidx.wear.watchface.RenderParameters renderParameters, java.time.Instant instant);
+    method public java.time.Instant getInstant();
+    method public androidx.wear.watchface.RenderParameters getRenderParameters();
+    property public final java.time.Instant instant;
+    property public final androidx.wear.watchface.RenderParameters renderParameters;
+  }
+
+  public class WatchFaceEditorContract extends androidx.activity.result.contract.ActivityResultContract<androidx.wear.watchface.editor.EditorRequest,kotlin.Unit> {
+    ctor public WatchFaceEditorContract();
+    method public android.content.Intent createIntent(android.content.Context context, androidx.wear.watchface.editor.EditorRequest input);
+    method public void parseResult(int resultCode, android.content.Intent? intent);
+    field public static final String ACTION_WATCH_FACE_EDITOR = "androidx.wear.watchface.editor.action.WATCH_FACE_EDITOR";
+    field public static final androidx.wear.watchface.editor.WatchFaceEditorContract.Companion Companion;
+  }
+
+  public static final class WatchFaceEditorContract.Companion {
+  }
+
+  public final class WatchFaceEditorContractKt {
+  }
+
+}
+
diff --git a/wear/watchface/watchface-editor/api/restricted_current.txt b/wear/watchface/watchface-editor/api/restricted_current.txt
index 29c54f0..406d86a 100644
--- a/wear/watchface/watchface-editor/api/restricted_current.txt
+++ b/wear/watchface/watchface-editor/api/restricted_current.txt
@@ -12,7 +12,7 @@
   }
 
   public final class EditorRequest {
-    ctor @RequiresApi(android.os.Build.VERSION_CODES.R) public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle, @RequiresApi androidx.wear.watchface.client.WatchFaceId watchFaceId, androidx.wear.watchface.client.DeviceConfig? headlessDeviceConfig, androidx.wear.watchface.editor.PreviewScreenshotParams? previewScreenshotParams);
+    ctor @RequiresApi(android.os.Build.VERSION_CODES.R) public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle, @RequiresApi(android.os.Build.VERSION_CODES.R) androidx.wear.watchface.client.WatchFaceId watchFaceId, androidx.wear.watchface.client.DeviceConfig? headlessDeviceConfig, androidx.wear.watchface.editor.PreviewScreenshotParams? previewScreenshotParams);
     ctor public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle);
     method @kotlin.jvm.Throws(exceptionClasses=TimeoutCancellationException::class) public static androidx.wear.watchface.editor.EditorRequest createFromIntent(android.content.Intent intent) throws kotlinx.coroutines.TimeoutCancellationException;
     method public String getEditorPackageName();
diff --git a/wear/watchface/watchface-guava/api/1.0.0-beta02.txt b/wear/watchface/watchface-guava/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..a01ac28
--- /dev/null
+++ b/wear/watchface/watchface-guava/api/1.0.0-beta02.txt
@@ -0,0 +1,30 @@
+// 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);
+    method protected abstract com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.WatchFace> createWatchFaceFuture(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.WatchState watchState, androidx.wear.watchface.ComplicationSlotsManager complicationSlotsManager, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository);
+  }
+
+}
+
diff --git a/wear/watchface/watchface-guava/api/public_plus_experimental_1.0.0-beta02.txt b/wear/watchface/watchface-guava/api/public_plus_experimental_1.0.0-beta02.txt
new file mode 100644
index 0000000..a01ac28
--- /dev/null
+++ b/wear/watchface/watchface-guava/api/public_plus_experimental_1.0.0-beta02.txt
@@ -0,0 +1,30 @@
+// 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);
+    method protected abstract com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.WatchFace> createWatchFaceFuture(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.WatchState watchState, androidx.wear.watchface.ComplicationSlotsManager complicationSlotsManager, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository);
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/wear/watchface/watchface-guava/api/res-1.0.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to wear/watchface/watchface-guava/api/res-1.0.0-beta02.txt
diff --git a/wear/watchface/watchface-guava/api/restricted_1.0.0-beta02.txt b/wear/watchface/watchface-guava/api/restricted_1.0.0-beta02.txt
new file mode 100644
index 0000000..a01ac28
--- /dev/null
+++ b/wear/watchface/watchface-guava/api/restricted_1.0.0-beta02.txt
@@ -0,0 +1,30 @@
+// 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);
+    method protected abstract com.google.common.util.concurrent.ListenableFuture<androidx.wear.watchface.WatchFace> createWatchFaceFuture(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.WatchState watchState, androidx.wear.watchface.ComplicationSlotsManager complicationSlotsManager, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository);
+  }
+
+}
+
diff --git a/wear/watchface/watchface-style/api/1.0.0-beta02.txt b/wear/watchface/watchface-style/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..f689efb
--- /dev/null
+++ b/wear/watchface/watchface-style/api/1.0.0-beta02.txt
@@ -0,0 +1,236 @@
+// Signature format: 4.0
+package androidx.wear.watchface.style {
+
+  public final class CurrentUserStyleRepository {
+    ctor public CurrentUserStyleRepository(androidx.wear.watchface.style.UserStyleSchema schema);
+    method public androidx.wear.watchface.style.UserStyleSchema getSchema();
+    method public kotlinx.coroutines.flow.StateFlow<androidx.wear.watchface.style.UserStyle> getUserStyle();
+    property public final androidx.wear.watchface.style.UserStyleSchema schema;
+    property public final kotlinx.coroutines.flow.StateFlow<androidx.wear.watchface.style.UserStyle> userStyle;
+  }
+
+  public final class MutableUserStyle implements java.lang.Iterable<java.util.Map.Entry<? extends androidx.wear.watchface.style.UserStyleSetting,? extends androidx.wear.watchface.style.UserStyleSetting.Option>> kotlin.jvm.internal.markers.KMappedMarker {
+    method public operator androidx.wear.watchface.style.UserStyleSetting.Option? get(androidx.wear.watchface.style.UserStyleSetting setting);
+    method public operator androidx.wear.watchface.style.UserStyleSetting.Option? get(androidx.wear.watchface.style.UserStyleSetting.Id settingId);
+    method public int getSize();
+    method public java.util.Iterator<java.util.Map.Entry<androidx.wear.watchface.style.UserStyleSetting,androidx.wear.watchface.style.UserStyleSetting.Option>> iterator();
+    method public operator void set(androidx.wear.watchface.style.UserStyleSetting setting, androidx.wear.watchface.style.UserStyleSetting.Option option);
+    method public operator void set(androidx.wear.watchface.style.UserStyleSetting.Id settingId, androidx.wear.watchface.style.UserStyleSetting.Option option);
+    method public operator void set(androidx.wear.watchface.style.UserStyleSetting setting, androidx.wear.watchface.style.UserStyleSetting.Option.Id optionId);
+    method public operator void set(androidx.wear.watchface.style.UserStyleSetting.Id settingId, androidx.wear.watchface.style.UserStyleSetting.Option.Id optionId);
+    method public androidx.wear.watchface.style.UserStyle toUserStyle();
+    property public final int size;
+  }
+
+  public final class UserStyle implements kotlin.jvm.internal.markers.KMappedMarker java.util.Map<androidx.wear.watchface.style.UserStyleSetting,androidx.wear.watchface.style.UserStyleSetting.Option> {
+    ctor public UserStyle(androidx.wear.watchface.style.UserStyle userStyle);
+    ctor public UserStyle(java.util.Map<androidx.wear.watchface.style.UserStyleSetting,? extends androidx.wear.watchface.style.UserStyleSetting.Option> selectedOptions);
+    ctor public UserStyle(androidx.wear.watchface.style.UserStyleData userStyle, androidx.wear.watchface.style.UserStyleSchema styleSchema);
+    method public boolean containsKey(androidx.wear.watchface.style.UserStyleSetting key);
+    method public boolean containsValue(androidx.wear.watchface.style.UserStyleSetting.Option value);
+    method public operator androidx.wear.watchface.style.UserStyleSetting.Option? get(androidx.wear.watchface.style.UserStyleSetting key);
+    method public operator androidx.wear.watchface.style.UserStyleSetting.Option? get(androidx.wear.watchface.style.UserStyleSetting.Id settingId);
+    method public java.util.Set<java.util.Map.Entry<androidx.wear.watchface.style.UserStyleSetting,androidx.wear.watchface.style.UserStyleSetting.Option>> getEntries();
+    method public java.util.Set<androidx.wear.watchface.style.UserStyleSetting> getKeys();
+    method public int getSize();
+    method public java.util.Collection<androidx.wear.watchface.style.UserStyleSetting.Option> getValues();
+    method public boolean isEmpty();
+    method public androidx.wear.watchface.style.MutableUserStyle toMutableUserStyle();
+    method public androidx.wear.watchface.style.UserStyleData toUserStyleData();
+    property public java.util.Set<java.util.Map.Entry<androidx.wear.watchface.style.UserStyleSetting,androidx.wear.watchface.style.UserStyleSetting.Option>> entries;
+    property public java.util.Set<androidx.wear.watchface.style.UserStyleSetting> keys;
+    property public int size;
+    property public java.util.Collection<androidx.wear.watchface.style.UserStyleSetting.Option> values;
+  }
+
+  public final class UserStyleData {
+    ctor public UserStyleData(java.util.Map<java.lang.String,byte[]> userStyleMap);
+    method public java.util.Map<java.lang.String,byte[]> getUserStyleMap();
+    property public final java.util.Map<java.lang.String,byte[]> userStyleMap;
+  }
+
+  public final class UserStyleSchema {
+    ctor public UserStyleSchema(java.util.List<? extends androidx.wear.watchface.style.UserStyleSetting> userStyleSettings);
+    method public java.util.List<androidx.wear.watchface.style.UserStyleSetting> getUserStyleSettings();
+    property public final java.util.List<androidx.wear.watchface.style.UserStyleSetting> userStyleSettings;
+  }
+
+  public abstract sealed class UserStyleSetting {
+    method public final java.util.Collection<androidx.wear.watchface.style.WatchFaceLayer> getAffectedWatchFaceLayers();
+    method public final androidx.wear.watchface.style.UserStyleSetting.Option getDefaultOption();
+    method public final int getDefaultOptionIndex();
+    method public final CharSequence getDescription();
+    method public final CharSequence getDisplayName();
+    method public final android.graphics.drawable.Icon? getIcon();
+    method public final androidx.wear.watchface.style.UserStyleSetting.Id getId();
+    method public androidx.wear.watchface.style.UserStyleSetting.Option getOptionForId(androidx.wear.watchface.style.UserStyleSetting.Option.Id optionId);
+    method public final java.util.List<androidx.wear.watchface.style.UserStyleSetting.Option> getOptions();
+    property public final java.util.Collection<androidx.wear.watchface.style.WatchFaceLayer> affectedWatchFaceLayers;
+    property public final androidx.wear.watchface.style.UserStyleSetting.Option defaultOption;
+    property public final int defaultOptionIndex;
+    property public final CharSequence description;
+    property public final CharSequence displayName;
+    property public final android.graphics.drawable.Icon? icon;
+    property public final androidx.wear.watchface.style.UserStyleSetting.Id id;
+    property public final java.util.List<androidx.wear.watchface.style.UserStyleSetting.Option> options;
+    field public static final androidx.wear.watchface.style.UserStyleSetting.Companion Companion;
+  }
+
+  public static final class UserStyleSetting.BooleanUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
+    ctor public UserStyleSetting.BooleanUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, boolean defaultValue);
+    method public boolean getDefaultValue();
+  }
+
+  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 boolean getValue();
+    property public final boolean value;
+    field public static final androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting.BooleanOption.Companion Companion;
+    field public static final androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting.BooleanOption FALSE;
+    field public static final androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting.BooleanOption TRUE;
+  }
+
+  public static final class UserStyleSetting.BooleanUserStyleSetting.BooleanOption.Companion {
+    method public androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting.BooleanOption from(boolean value);
+  }
+
+  public static final class UserStyleSetting.Companion {
+  }
+
+  public static final class UserStyleSetting.ComplicationSlotsUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
+    ctor public UserStyleSetting.ComplicationSlotsUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption> complicationConfig, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, optional androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption defaultOption);
+  }
+
+  public static final class UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay {
+    ctor public UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay(int complicationSlotId, optional Boolean? enabled, optional androidx.wear.watchface.complications.ComplicationSlotBounds? complicationSlotBounds, optional Integer? accessibilityTraversalIndex);
+    method public Integer? getAccessibilityTraversalIndex();
+    method public androidx.wear.watchface.complications.ComplicationSlotBounds? getComplicationSlotBounds();
+    method public int getComplicationSlotId();
+    method public Boolean? getEnabled();
+    property public final Integer? accessibilityTraversalIndex;
+    property public final androidx.wear.watchface.complications.ComplicationSlotBounds? complicationSlotBounds;
+    property public final int complicationSlotId;
+    property public final Boolean? enabled;
+  }
+
+  public static final class UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay.Builder {
+    ctor public UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay.Builder(int complicationSlotId);
+    method public androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay build();
+    method public androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay.Builder setAccessibilityTraversalIndex(int accessibilityTraversalIndex);
+    method public androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay.Builder setComplicationSlotBounds(androidx.wear.watchface.complications.ComplicationSlotBounds complicationSlotBounds);
+    method public androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay.Builder setEnabled(boolean enabled);
+  }
+
+  public static final class UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
+    ctor public UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(androidx.wear.watchface.style.UserStyleSetting.Option.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, android.graphics.drawable.Icon? icon, java.util.Collection<androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay> complicationSlotOverlays);
+    method public java.util.Collection<androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay> getComplicationSlotOverlays();
+    method public CharSequence getDisplayName();
+    method public android.graphics.drawable.Icon? getIcon();
+    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;
+  }
+
+  public static final class UserStyleSetting.CustomValueUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
+    ctor public UserStyleSetting.CustomValueUserStyleSetting(java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, byte[] defaultValue);
+  }
+
+  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();
+    property public final byte[] customValue;
+  }
+
+  public static final class UserStyleSetting.DoubleRangeUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
+    ctor public UserStyleSetting.DoubleRangeUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, double minimumValue, double maximumValue, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, double defaultValue);
+    method public double getDefaultValue();
+    method public double getMaximumValue();
+    method public double getMinimumValue();
+    property public final double defaultValue;
+    property public final double maximumValue;
+    property public final double minimumValue;
+  }
+
+  public static final class UserStyleSetting.DoubleRangeUserStyleSetting.DoubleRangeOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
+    ctor public UserStyleSetting.DoubleRangeUserStyleSetting.DoubleRangeOption(double value);
+    method public double getValue();
+    property public final double value;
+  }
+
+  public static final class UserStyleSetting.Id {
+    ctor public UserStyleSetting.Id(String value);
+    method public String getValue();
+    property public final String value;
+    field public static final androidx.wear.watchface.style.UserStyleSetting.Id.Companion Companion;
+    field public static final int MAX_LENGTH = 40; // 0x28
+  }
+
+  public static final class UserStyleSetting.Id.Companion {
+  }
+
+  public static class UserStyleSetting.ListUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
+    ctor public UserStyleSetting.ListUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption> options, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, optional androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption defaultOption);
+  }
+
+  public static final class UserStyleSetting.ListUserStyleSetting.ListOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
+    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();
+    property public final CharSequence displayName;
+    property public final android.graphics.drawable.Icon? icon;
+  }
+
+  public static final class UserStyleSetting.LongRangeUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
+    ctor public UserStyleSetting.LongRangeUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, long minimumValue, long maximumValue, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, long defaultValue);
+    method public long getDefaultValue();
+    method public long getMaximumValue();
+    method public long getMinimumValue();
+    property public final long defaultValue;
+    property public final long maximumValue;
+    property public final long minimumValue;
+  }
+
+  public static final class UserStyleSetting.LongRangeUserStyleSetting.LongRangeOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
+    ctor public UserStyleSetting.LongRangeUserStyleSetting.LongRangeOption(long value);
+    method public long getValue();
+    property public final long value;
+  }
+
+  public abstract static class UserStyleSetting.Option {
+    ctor public UserStyleSetting.Option(androidx.wear.watchface.style.UserStyleSetting.Option.Id id);
+    method public final androidx.wear.watchface.style.UserStyleSetting.Option.Id getId();
+    property public final androidx.wear.watchface.style.UserStyleSetting.Option.Id id;
+    field public static final androidx.wear.watchface.style.UserStyleSetting.Option.Companion Companion;
+  }
+
+  public static final class UserStyleSetting.Option.Companion {
+  }
+
+  public static final class UserStyleSetting.Option.Id {
+    ctor public UserStyleSetting.Option.Id(byte[] value);
+    ctor public UserStyleSetting.Option.Id(String value);
+    method public byte[] getValue();
+    property public final byte[] value;
+    field public static final androidx.wear.watchface.style.UserStyleSetting.Option.Id.Companion Companion;
+    field public static final int MAX_LENGTH = 1024; // 0x400
+  }
+
+  public static final class UserStyleSetting.Option.Id.Companion {
+  }
+
+  public final class UserStyleSettingKt {
+  }
+
+  public enum WatchFaceLayer {
+    enum_constant public static final androidx.wear.watchface.style.WatchFaceLayer BASE;
+    enum_constant public static final androidx.wear.watchface.style.WatchFaceLayer COMPLICATIONS;
+    enum_constant public static final androidx.wear.watchface.style.WatchFaceLayer COMPLICATIONS_OVERLAY;
+    field public static final java.util.Set<androidx.wear.watchface.style.WatchFaceLayer> ALL_WATCH_FACE_LAYERS;
+    field public static final androidx.wear.watchface.style.WatchFaceLayer.Companion Companion;
+  }
+
+  public static final class WatchFaceLayer.Companion {
+  }
+
+}
+
diff --git a/wear/watchface/watchface-style/api/public_plus_experimental_1.0.0-beta02.txt b/wear/watchface/watchface-style/api/public_plus_experimental_1.0.0-beta02.txt
new file mode 100644
index 0000000..f689efb
--- /dev/null
+++ b/wear/watchface/watchface-style/api/public_plus_experimental_1.0.0-beta02.txt
@@ -0,0 +1,236 @@
+// Signature format: 4.0
+package androidx.wear.watchface.style {
+
+  public final class CurrentUserStyleRepository {
+    ctor public CurrentUserStyleRepository(androidx.wear.watchface.style.UserStyleSchema schema);
+    method public androidx.wear.watchface.style.UserStyleSchema getSchema();
+    method public kotlinx.coroutines.flow.StateFlow<androidx.wear.watchface.style.UserStyle> getUserStyle();
+    property public final androidx.wear.watchface.style.UserStyleSchema schema;
+    property public final kotlinx.coroutines.flow.StateFlow<androidx.wear.watchface.style.UserStyle> userStyle;
+  }
+
+  public final class MutableUserStyle implements java.lang.Iterable<java.util.Map.Entry<? extends androidx.wear.watchface.style.UserStyleSetting,? extends androidx.wear.watchface.style.UserStyleSetting.Option>> kotlin.jvm.internal.markers.KMappedMarker {
+    method public operator androidx.wear.watchface.style.UserStyleSetting.Option? get(androidx.wear.watchface.style.UserStyleSetting setting);
+    method public operator androidx.wear.watchface.style.UserStyleSetting.Option? get(androidx.wear.watchface.style.UserStyleSetting.Id settingId);
+    method public int getSize();
+    method public java.util.Iterator<java.util.Map.Entry<androidx.wear.watchface.style.UserStyleSetting,androidx.wear.watchface.style.UserStyleSetting.Option>> iterator();
+    method public operator void set(androidx.wear.watchface.style.UserStyleSetting setting, androidx.wear.watchface.style.UserStyleSetting.Option option);
+    method public operator void set(androidx.wear.watchface.style.UserStyleSetting.Id settingId, androidx.wear.watchface.style.UserStyleSetting.Option option);
+    method public operator void set(androidx.wear.watchface.style.UserStyleSetting setting, androidx.wear.watchface.style.UserStyleSetting.Option.Id optionId);
+    method public operator void set(androidx.wear.watchface.style.UserStyleSetting.Id settingId, androidx.wear.watchface.style.UserStyleSetting.Option.Id optionId);
+    method public androidx.wear.watchface.style.UserStyle toUserStyle();
+    property public final int size;
+  }
+
+  public final class UserStyle implements kotlin.jvm.internal.markers.KMappedMarker java.util.Map<androidx.wear.watchface.style.UserStyleSetting,androidx.wear.watchface.style.UserStyleSetting.Option> {
+    ctor public UserStyle(androidx.wear.watchface.style.UserStyle userStyle);
+    ctor public UserStyle(java.util.Map<androidx.wear.watchface.style.UserStyleSetting,? extends androidx.wear.watchface.style.UserStyleSetting.Option> selectedOptions);
+    ctor public UserStyle(androidx.wear.watchface.style.UserStyleData userStyle, androidx.wear.watchface.style.UserStyleSchema styleSchema);
+    method public boolean containsKey(androidx.wear.watchface.style.UserStyleSetting key);
+    method public boolean containsValue(androidx.wear.watchface.style.UserStyleSetting.Option value);
+    method public operator androidx.wear.watchface.style.UserStyleSetting.Option? get(androidx.wear.watchface.style.UserStyleSetting key);
+    method public operator androidx.wear.watchface.style.UserStyleSetting.Option? get(androidx.wear.watchface.style.UserStyleSetting.Id settingId);
+    method public java.util.Set<java.util.Map.Entry<androidx.wear.watchface.style.UserStyleSetting,androidx.wear.watchface.style.UserStyleSetting.Option>> getEntries();
+    method public java.util.Set<androidx.wear.watchface.style.UserStyleSetting> getKeys();
+    method public int getSize();
+    method public java.util.Collection<androidx.wear.watchface.style.UserStyleSetting.Option> getValues();
+    method public boolean isEmpty();
+    method public androidx.wear.watchface.style.MutableUserStyle toMutableUserStyle();
+    method public androidx.wear.watchface.style.UserStyleData toUserStyleData();
+    property public java.util.Set<java.util.Map.Entry<androidx.wear.watchface.style.UserStyleSetting,androidx.wear.watchface.style.UserStyleSetting.Option>> entries;
+    property public java.util.Set<androidx.wear.watchface.style.UserStyleSetting> keys;
+    property public int size;
+    property public java.util.Collection<androidx.wear.watchface.style.UserStyleSetting.Option> values;
+  }
+
+  public final class UserStyleData {
+    ctor public UserStyleData(java.util.Map<java.lang.String,byte[]> userStyleMap);
+    method public java.util.Map<java.lang.String,byte[]> getUserStyleMap();
+    property public final java.util.Map<java.lang.String,byte[]> userStyleMap;
+  }
+
+  public final class UserStyleSchema {
+    ctor public UserStyleSchema(java.util.List<? extends androidx.wear.watchface.style.UserStyleSetting> userStyleSettings);
+    method public java.util.List<androidx.wear.watchface.style.UserStyleSetting> getUserStyleSettings();
+    property public final java.util.List<androidx.wear.watchface.style.UserStyleSetting> userStyleSettings;
+  }
+
+  public abstract sealed class UserStyleSetting {
+    method public final java.util.Collection<androidx.wear.watchface.style.WatchFaceLayer> getAffectedWatchFaceLayers();
+    method public final androidx.wear.watchface.style.UserStyleSetting.Option getDefaultOption();
+    method public final int getDefaultOptionIndex();
+    method public final CharSequence getDescription();
+    method public final CharSequence getDisplayName();
+    method public final android.graphics.drawable.Icon? getIcon();
+    method public final androidx.wear.watchface.style.UserStyleSetting.Id getId();
+    method public androidx.wear.watchface.style.UserStyleSetting.Option getOptionForId(androidx.wear.watchface.style.UserStyleSetting.Option.Id optionId);
+    method public final java.util.List<androidx.wear.watchface.style.UserStyleSetting.Option> getOptions();
+    property public final java.util.Collection<androidx.wear.watchface.style.WatchFaceLayer> affectedWatchFaceLayers;
+    property public final androidx.wear.watchface.style.UserStyleSetting.Option defaultOption;
+    property public final int defaultOptionIndex;
+    property public final CharSequence description;
+    property public final CharSequence displayName;
+    property public final android.graphics.drawable.Icon? icon;
+    property public final androidx.wear.watchface.style.UserStyleSetting.Id id;
+    property public final java.util.List<androidx.wear.watchface.style.UserStyleSetting.Option> options;
+    field public static final androidx.wear.watchface.style.UserStyleSetting.Companion Companion;
+  }
+
+  public static final class UserStyleSetting.BooleanUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
+    ctor public UserStyleSetting.BooleanUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, boolean defaultValue);
+    method public boolean getDefaultValue();
+  }
+
+  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 boolean getValue();
+    property public final boolean value;
+    field public static final androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting.BooleanOption.Companion Companion;
+    field public static final androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting.BooleanOption FALSE;
+    field public static final androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting.BooleanOption TRUE;
+  }
+
+  public static final class UserStyleSetting.BooleanUserStyleSetting.BooleanOption.Companion {
+    method public androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting.BooleanOption from(boolean value);
+  }
+
+  public static final class UserStyleSetting.Companion {
+  }
+
+  public static final class UserStyleSetting.ComplicationSlotsUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
+    ctor public UserStyleSetting.ComplicationSlotsUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption> complicationConfig, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, optional androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption defaultOption);
+  }
+
+  public static final class UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay {
+    ctor public UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay(int complicationSlotId, optional Boolean? enabled, optional androidx.wear.watchface.complications.ComplicationSlotBounds? complicationSlotBounds, optional Integer? accessibilityTraversalIndex);
+    method public Integer? getAccessibilityTraversalIndex();
+    method public androidx.wear.watchface.complications.ComplicationSlotBounds? getComplicationSlotBounds();
+    method public int getComplicationSlotId();
+    method public Boolean? getEnabled();
+    property public final Integer? accessibilityTraversalIndex;
+    property public final androidx.wear.watchface.complications.ComplicationSlotBounds? complicationSlotBounds;
+    property public final int complicationSlotId;
+    property public final Boolean? enabled;
+  }
+
+  public static final class UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay.Builder {
+    ctor public UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay.Builder(int complicationSlotId);
+    method public androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay build();
+    method public androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay.Builder setAccessibilityTraversalIndex(int accessibilityTraversalIndex);
+    method public androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay.Builder setComplicationSlotBounds(androidx.wear.watchface.complications.ComplicationSlotBounds complicationSlotBounds);
+    method public androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay.Builder setEnabled(boolean enabled);
+  }
+
+  public static final class UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
+    ctor public UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(androidx.wear.watchface.style.UserStyleSetting.Option.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, android.graphics.drawable.Icon? icon, java.util.Collection<androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay> complicationSlotOverlays);
+    method public java.util.Collection<androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay> getComplicationSlotOverlays();
+    method public CharSequence getDisplayName();
+    method public android.graphics.drawable.Icon? getIcon();
+    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;
+  }
+
+  public static final class UserStyleSetting.CustomValueUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
+    ctor public UserStyleSetting.CustomValueUserStyleSetting(java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, byte[] defaultValue);
+  }
+
+  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();
+    property public final byte[] customValue;
+  }
+
+  public static final class UserStyleSetting.DoubleRangeUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
+    ctor public UserStyleSetting.DoubleRangeUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, double minimumValue, double maximumValue, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, double defaultValue);
+    method public double getDefaultValue();
+    method public double getMaximumValue();
+    method public double getMinimumValue();
+    property public final double defaultValue;
+    property public final double maximumValue;
+    property public final double minimumValue;
+  }
+
+  public static final class UserStyleSetting.DoubleRangeUserStyleSetting.DoubleRangeOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
+    ctor public UserStyleSetting.DoubleRangeUserStyleSetting.DoubleRangeOption(double value);
+    method public double getValue();
+    property public final double value;
+  }
+
+  public static final class UserStyleSetting.Id {
+    ctor public UserStyleSetting.Id(String value);
+    method public String getValue();
+    property public final String value;
+    field public static final androidx.wear.watchface.style.UserStyleSetting.Id.Companion Companion;
+    field public static final int MAX_LENGTH = 40; // 0x28
+  }
+
+  public static final class UserStyleSetting.Id.Companion {
+  }
+
+  public static class UserStyleSetting.ListUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
+    ctor public UserStyleSetting.ListUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption> options, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, optional androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption defaultOption);
+  }
+
+  public static final class UserStyleSetting.ListUserStyleSetting.ListOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
+    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();
+    property public final CharSequence displayName;
+    property public final android.graphics.drawable.Icon? icon;
+  }
+
+  public static final class UserStyleSetting.LongRangeUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
+    ctor public UserStyleSetting.LongRangeUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, long minimumValue, long maximumValue, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, long defaultValue);
+    method public long getDefaultValue();
+    method public long getMaximumValue();
+    method public long getMinimumValue();
+    property public final long defaultValue;
+    property public final long maximumValue;
+    property public final long minimumValue;
+  }
+
+  public static final class UserStyleSetting.LongRangeUserStyleSetting.LongRangeOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
+    ctor public UserStyleSetting.LongRangeUserStyleSetting.LongRangeOption(long value);
+    method public long getValue();
+    property public final long value;
+  }
+
+  public abstract static class UserStyleSetting.Option {
+    ctor public UserStyleSetting.Option(androidx.wear.watchface.style.UserStyleSetting.Option.Id id);
+    method public final androidx.wear.watchface.style.UserStyleSetting.Option.Id getId();
+    property public final androidx.wear.watchface.style.UserStyleSetting.Option.Id id;
+    field public static final androidx.wear.watchface.style.UserStyleSetting.Option.Companion Companion;
+  }
+
+  public static final class UserStyleSetting.Option.Companion {
+  }
+
+  public static final class UserStyleSetting.Option.Id {
+    ctor public UserStyleSetting.Option.Id(byte[] value);
+    ctor public UserStyleSetting.Option.Id(String value);
+    method public byte[] getValue();
+    property public final byte[] value;
+    field public static final androidx.wear.watchface.style.UserStyleSetting.Option.Id.Companion Companion;
+    field public static final int MAX_LENGTH = 1024; // 0x400
+  }
+
+  public static final class UserStyleSetting.Option.Id.Companion {
+  }
+
+  public final class UserStyleSettingKt {
+  }
+
+  public enum WatchFaceLayer {
+    enum_constant public static final androidx.wear.watchface.style.WatchFaceLayer BASE;
+    enum_constant public static final androidx.wear.watchface.style.WatchFaceLayer COMPLICATIONS;
+    enum_constant public static final androidx.wear.watchface.style.WatchFaceLayer COMPLICATIONS_OVERLAY;
+    field public static final java.util.Set<androidx.wear.watchface.style.WatchFaceLayer> ALL_WATCH_FACE_LAYERS;
+    field public static final androidx.wear.watchface.style.WatchFaceLayer.Companion Companion;
+  }
+
+  public static final class WatchFaceLayer.Companion {
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/wear/watchface/watchface-style/api/res-1.0.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to wear/watchface/watchface-style/api/res-1.0.0-beta02.txt
diff --git a/wear/watchface/watchface-style/api/restricted_1.0.0-beta02.txt b/wear/watchface/watchface-style/api/restricted_1.0.0-beta02.txt
new file mode 100644
index 0000000..028cc3d
--- /dev/null
+++ b/wear/watchface/watchface-style/api/restricted_1.0.0-beta02.txt
@@ -0,0 +1,257 @@
+// Signature format: 4.0
+package androidx.wear.watchface.style {
+
+  public final class CurrentUserStyleRepository {
+    ctor public CurrentUserStyleRepository(androidx.wear.watchface.style.UserStyleSchema schema);
+    method public androidx.wear.watchface.style.UserStyleSchema getSchema();
+    method public kotlinx.coroutines.flow.StateFlow<androidx.wear.watchface.style.UserStyle> getUserStyle();
+    property public final androidx.wear.watchface.style.UserStyleSchema schema;
+    property public final kotlinx.coroutines.flow.StateFlow<androidx.wear.watchface.style.UserStyle> userStyle;
+  }
+
+  public final class MutableUserStyle implements java.lang.Iterable<java.util.Map.Entry<? extends androidx.wear.watchface.style.UserStyleSetting,? extends androidx.wear.watchface.style.UserStyleSetting.Option>> kotlin.jvm.internal.markers.KMappedMarker {
+    method public operator androidx.wear.watchface.style.UserStyleSetting.Option? get(androidx.wear.watchface.style.UserStyleSetting setting);
+    method public operator androidx.wear.watchface.style.UserStyleSetting.Option? get(androidx.wear.watchface.style.UserStyleSetting.Id settingId);
+    method public int getSize();
+    method public java.util.Iterator<java.util.Map.Entry<androidx.wear.watchface.style.UserStyleSetting,androidx.wear.watchface.style.UserStyleSetting.Option>> iterator();
+    method public operator void set(androidx.wear.watchface.style.UserStyleSetting setting, androidx.wear.watchface.style.UserStyleSetting.Option option);
+    method public operator void set(androidx.wear.watchface.style.UserStyleSetting.Id settingId, androidx.wear.watchface.style.UserStyleSetting.Option option);
+    method public operator void set(androidx.wear.watchface.style.UserStyleSetting setting, androidx.wear.watchface.style.UserStyleSetting.Option.Id optionId);
+    method public operator void set(androidx.wear.watchface.style.UserStyleSetting.Id settingId, androidx.wear.watchface.style.UserStyleSetting.Option.Id optionId);
+    method public androidx.wear.watchface.style.UserStyle toUserStyle();
+    property public final int size;
+  }
+
+  public final class UserStyle implements kotlin.jvm.internal.markers.KMappedMarker java.util.Map<androidx.wear.watchface.style.UserStyleSetting,androidx.wear.watchface.style.UserStyleSetting.Option> {
+    ctor public UserStyle(androidx.wear.watchface.style.UserStyle userStyle);
+    ctor public UserStyle(java.util.Map<androidx.wear.watchface.style.UserStyleSetting,? extends androidx.wear.watchface.style.UserStyleSetting.Option> selectedOptions);
+    ctor public UserStyle(androidx.wear.watchface.style.UserStyleData userStyle, androidx.wear.watchface.style.UserStyleSchema styleSchema);
+    method public boolean containsKey(androidx.wear.watchface.style.UserStyleSetting key);
+    method public boolean containsValue(androidx.wear.watchface.style.UserStyleSetting.Option value);
+    method public operator androidx.wear.watchface.style.UserStyleSetting.Option? get(androidx.wear.watchface.style.UserStyleSetting key);
+    method public operator androidx.wear.watchface.style.UserStyleSetting.Option? get(androidx.wear.watchface.style.UserStyleSetting.Id settingId);
+    method public java.util.Set<java.util.Map.Entry<androidx.wear.watchface.style.UserStyleSetting,androidx.wear.watchface.style.UserStyleSetting.Option>> getEntries();
+    method public java.util.Set<androidx.wear.watchface.style.UserStyleSetting> getKeys();
+    method public int getSize();
+    method public java.util.Collection<androidx.wear.watchface.style.UserStyleSetting.Option> getValues();
+    method public boolean isEmpty();
+    method public androidx.wear.watchface.style.MutableUserStyle toMutableUserStyle();
+    method public androidx.wear.watchface.style.UserStyleData toUserStyleData();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.UserStyleWireFormat toWireFormat();
+    property public java.util.Set<java.util.Map.Entry<androidx.wear.watchface.style.UserStyleSetting,androidx.wear.watchface.style.UserStyleSetting.Option>> entries;
+    property public java.util.Set<androidx.wear.watchface.style.UserStyleSetting> keys;
+    property public int size;
+    property public java.util.Collection<androidx.wear.watchface.style.UserStyleSetting.Option> values;
+  }
+
+  public final class UserStyleData {
+    ctor public UserStyleData(java.util.Map<java.lang.String,byte[]> userStyleMap);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public UserStyleData(androidx.wear.watchface.style.data.UserStyleWireFormat userStyle);
+    method public java.util.Map<java.lang.String,byte[]> getUserStyleMap();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.UserStyleWireFormat toWireFormat();
+    property public final java.util.Map<java.lang.String,byte[]> userStyleMap;
+  }
+
+  public final class UserStyleSchema {
+    ctor public UserStyleSchema(java.util.List<? extends androidx.wear.watchface.style.UserStyleSetting> userStyleSettings);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public UserStyleSchema(androidx.wear.watchface.style.data.UserStyleSchemaWireFormat wireFormat);
+    method public java.util.List<androidx.wear.watchface.style.UserStyleSetting> getUserStyleSettings();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.UserStyleSchemaWireFormat toWireFormat();
+    property public final java.util.List<androidx.wear.watchface.style.UserStyleSetting> userStyleSettings;
+  }
+
+  public abstract sealed class UserStyleSetting {
+    method public final java.util.Collection<androidx.wear.watchface.style.WatchFaceLayer> getAffectedWatchFaceLayers();
+    method public final androidx.wear.watchface.style.UserStyleSetting.Option getDefaultOption();
+    method public final int getDefaultOptionIndex();
+    method public final CharSequence getDescription();
+    method public final CharSequence getDisplayName();
+    method public final android.graphics.drawable.Icon? getIcon();
+    method public final androidx.wear.watchface.style.UserStyleSetting.Id getId();
+    method public androidx.wear.watchface.style.UserStyleSetting.Option getOptionForId(androidx.wear.watchface.style.UserStyleSetting.Option.Id optionId);
+    method public final java.util.List<androidx.wear.watchface.style.UserStyleSetting.Option> getOptions();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final java.util.List<androidx.wear.watchface.style.data.OptionWireFormat> getWireFormatOptionsList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract androidx.wear.watchface.style.data.UserStyleSettingWireFormat toWireFormat();
+    property public final java.util.Collection<androidx.wear.watchface.style.WatchFaceLayer> affectedWatchFaceLayers;
+    property public final androidx.wear.watchface.style.UserStyleSetting.Option defaultOption;
+    property public final int defaultOptionIndex;
+    property public final CharSequence description;
+    property public final CharSequence displayName;
+    property public final android.graphics.drawable.Icon? icon;
+    property public final androidx.wear.watchface.style.UserStyleSetting.Id id;
+    property public final java.util.List<androidx.wear.watchface.style.UserStyleSetting.Option> options;
+    field public static final androidx.wear.watchface.style.UserStyleSetting.Companion Companion;
+  }
+
+  public static final class UserStyleSetting.BooleanUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
+    ctor public UserStyleSetting.BooleanUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, boolean defaultValue);
+    method public boolean getDefaultValue();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.BooleanUserStyleSettingWireFormat toWireFormat();
+  }
+
+  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 boolean getValue();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.BooleanOptionWireFormat toWireFormat();
+    property public final boolean value;
+    field public static final androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting.BooleanOption.Companion Companion;
+    field public static final androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting.BooleanOption FALSE;
+    field public static final androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting.BooleanOption TRUE;
+  }
+
+  public static final class UserStyleSetting.BooleanUserStyleSetting.BooleanOption.Companion {
+    method public androidx.wear.watchface.style.UserStyleSetting.BooleanUserStyleSetting.BooleanOption from(boolean value);
+  }
+
+  public static final class UserStyleSetting.Companion {
+  }
+
+  public static final class UserStyleSetting.ComplicationSlotsUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
+    ctor public UserStyleSetting.ComplicationSlotsUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption> complicationConfig, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, optional androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption defaultOption);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.ComplicationsUserStyleSettingWireFormat toWireFormat();
+  }
+
+  public static final class UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay {
+    ctor public UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay(int complicationSlotId, optional Boolean? enabled, optional androidx.wear.watchface.complications.ComplicationSlotBounds? complicationSlotBounds, optional Integer? accessibilityTraversalIndex);
+    method public Integer? getAccessibilityTraversalIndex();
+    method public androidx.wear.watchface.complications.ComplicationSlotBounds? getComplicationSlotBounds();
+    method public int getComplicationSlotId();
+    method public Boolean? getEnabled();
+    property public final Integer? accessibilityTraversalIndex;
+    property public final androidx.wear.watchface.complications.ComplicationSlotBounds? complicationSlotBounds;
+    property public final int complicationSlotId;
+    property public final Boolean? enabled;
+  }
+
+  public static final class UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay.Builder {
+    ctor public UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay.Builder(int complicationSlotId);
+    method public androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay build();
+    method public androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay.Builder setAccessibilityTraversalIndex(int accessibilityTraversalIndex);
+    method public androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay.Builder setComplicationSlotBounds(androidx.wear.watchface.complications.ComplicationSlotBounds complicationSlotBounds);
+    method public androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay.Builder setEnabled(boolean enabled);
+  }
+
+  public static final class UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
+    ctor public UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotsOption(androidx.wear.watchface.style.UserStyleSetting.Option.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, android.graphics.drawable.Icon? icon, java.util.Collection<androidx.wear.watchface.style.UserStyleSetting.ComplicationSlotsUserStyleSetting.ComplicationSlotOverlay> complicationSlotOverlays);
+    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 @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;
+    property public final android.graphics.drawable.Icon? icon;
+  }
+
+  public static final class UserStyleSetting.CustomValueUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
+    ctor public UserStyleSetting.CustomValueUserStyleSetting(java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, byte[] defaultValue);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.CustomValueUserStyleSettingWireFormat toWireFormat();
+  }
+
+  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 @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.CustomValueOptionWireFormat toWireFormat();
+    property public final byte[] customValue;
+  }
+
+  public static final class UserStyleSetting.DoubleRangeUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
+    ctor public UserStyleSetting.DoubleRangeUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, double minimumValue, double maximumValue, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, double defaultValue);
+    method public double getDefaultValue();
+    method public double getMaximumValue();
+    method public double getMinimumValue();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.DoubleRangeUserStyleSettingWireFormat toWireFormat();
+    property public final double defaultValue;
+    property public final double maximumValue;
+    property public final double minimumValue;
+  }
+
+  public static final class UserStyleSetting.DoubleRangeUserStyleSetting.DoubleRangeOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
+    ctor public UserStyleSetting.DoubleRangeUserStyleSetting.DoubleRangeOption(double value);
+    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;
+  }
+
+  public static final class UserStyleSetting.Id {
+    ctor public UserStyleSetting.Id(String value);
+    method public String getValue();
+    property public final String value;
+    field public static final androidx.wear.watchface.style.UserStyleSetting.Id.Companion Companion;
+    field public static final int MAX_LENGTH = 40; // 0x28
+  }
+
+  public static final class UserStyleSetting.Id.Companion {
+  }
+
+  public static class UserStyleSetting.ListUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
+    ctor public UserStyleSetting.ListUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, java.util.List<androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption> options, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, optional androidx.wear.watchface.style.UserStyleSetting.ListUserStyleSetting.ListOption defaultOption);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.ListUserStyleSettingWireFormat toWireFormat();
+  }
+
+  public static final class UserStyleSetting.ListUserStyleSetting.ListOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
+    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 @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;
+  }
+
+  public static final class UserStyleSetting.LongRangeUserStyleSetting extends androidx.wear.watchface.style.UserStyleSetting {
+    ctor public UserStyleSetting.LongRangeUserStyleSetting(androidx.wear.watchface.style.UserStyleSetting.Id id, android.content.res.Resources resources, @StringRes int displayNameResourceId, @StringRes int descriptionResourceId, android.graphics.drawable.Icon? icon, long minimumValue, long maximumValue, java.util.Collection<? extends androidx.wear.watchface.style.WatchFaceLayer> affectsWatchFaceLayers, long defaultValue);
+    method public long getDefaultValue();
+    method public long getMaximumValue();
+    method public long getMinimumValue();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.data.LongRangeUserStyleSettingWireFormat toWireFormat();
+    property public final long defaultValue;
+    property public final long maximumValue;
+    property public final long minimumValue;
+  }
+
+  public static final class UserStyleSetting.LongRangeUserStyleSetting.LongRangeOption extends androidx.wear.watchface.style.UserStyleSetting.Option {
+    ctor public UserStyleSetting.LongRangeUserStyleSetting.LongRangeOption(long value);
+    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;
+  }
+
+  public abstract static class UserStyleSetting.Option {
+    ctor public UserStyleSetting.Option(androidx.wear.watchface.style.UserStyleSetting.Option.Id id);
+    method public final androidx.wear.watchface.style.UserStyleSetting.Option.Id getId();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract androidx.wear.watchface.style.data.OptionWireFormat toWireFormat();
+    property public final androidx.wear.watchface.style.UserStyleSetting.Option.Id id;
+    field public static final androidx.wear.watchface.style.UserStyleSetting.Option.Companion Companion;
+  }
+
+  public static final class UserStyleSetting.Option.Companion {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.style.UserStyleSetting.Option createFromWireFormat(androidx.wear.watchface.style.data.OptionWireFormat wireFormat);
+  }
+
+  public static final class UserStyleSetting.Option.Id {
+    ctor public UserStyleSetting.Option.Id(byte[] value);
+    ctor public UserStyleSetting.Option.Id(String value);
+    method public byte[] getValue();
+    property public final byte[] value;
+    field public static final androidx.wear.watchface.style.UserStyleSetting.Option.Id.Companion Companion;
+    field public static final int MAX_LENGTH = 1024; // 0x400
+  }
+
+  public static final class UserStyleSetting.Option.Id.Companion {
+  }
+
+  public final class UserStyleSettingKt {
+  }
+
+  public enum WatchFaceLayer {
+    enum_constant public static final androidx.wear.watchface.style.WatchFaceLayer BASE;
+    enum_constant public static final androidx.wear.watchface.style.WatchFaceLayer COMPLICATIONS;
+    enum_constant public static final androidx.wear.watchface.style.WatchFaceLayer COMPLICATIONS_OVERLAY;
+    field public static final java.util.Set<androidx.wear.watchface.style.WatchFaceLayer> ALL_WATCH_FACE_LAYERS;
+    field public static final androidx.wear.watchface.style.WatchFaceLayer.Companion Companion;
+  }
+
+  public static final class WatchFaceLayer.Companion {
+  }
+
+}
+
diff --git a/wear/watchface/watchface/api/1.0.0-beta02.txt b/wear/watchface/watchface/api/1.0.0-beta02.txt
new file mode 100644
index 0000000..6f3baa0
--- /dev/null
+++ b/wear/watchface/watchface/api/1.0.0-beta02.txt
@@ -0,0 +1,336 @@
+// Signature format: 4.0
+package androidx.wear.watchface {
+
+  public final class BackgroundComplicationTapFilter implements androidx.wear.watchface.ComplicationTapFilter {
+    ctor public BackgroundComplicationTapFilter();
+    method public boolean hitTest(androidx.wear.watchface.ComplicationSlot complicationSlot, android.graphics.Rect screenBounds, @Px int x, @Px int y);
+  }
+
+  public interface CanvasComplication {
+    method public void drawHighlight(android.graphics.Canvas canvas, android.graphics.Rect bounds, int boundsType, java.time.ZonedDateTime zonedDateTime, @ColorInt int color);
+    method public androidx.wear.watchface.complications.data.ComplicationData getData();
+    method public void loadData(androidx.wear.watchface.complications.data.ComplicationData complicationData, boolean loadDrawablesAsynchronous);
+    method @WorkerThread public default void onRendererCreated(androidx.wear.watchface.Renderer renderer);
+    method @UiThread public void render(android.graphics.Canvas canvas, android.graphics.Rect bounds, java.time.ZonedDateTime zonedDateTime, androidx.wear.watchface.RenderParameters renderParameters, int slotId);
+  }
+
+  public static interface CanvasComplication.InvalidateCallback {
+    method public void onInvalidate();
+  }
+
+  public interface CanvasComplicationFactory {
+    method @WorkerThread public androidx.wear.watchface.CanvasComplication create(androidx.wear.watchface.WatchState, androidx.wear.watchface.CanvasComplication.InvalidateCallback);
+  }
+
+  public final class ComplicationSlot {
+    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.watchface.complications.data.ComplicationType> supportedTypes, androidx.wear.watchface.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.watchface.complications.data.ComplicationType> supportedTypes, androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy, androidx.wear.watchface.complications.ComplicationSlotBounds bounds, androidx.wear.watchface.ComplicationTapFilter complicationTapFilter);
+    method public static androidx.wear.watchface.ComplicationSlot.Builder createRoundRectComplicationSlotBuilder(int id, androidx.wear.watchface.CanvasComplicationFactory canvasComplicationFactory, java.util.List<? extends androidx.wear.watchface.complications.data.ComplicationType> supportedTypes, androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy, androidx.wear.watchface.complications.ComplicationSlotBounds bounds);
+    method @UiThread public int getAccessibilityTraversalIndex();
+    method public int getBoundsType();
+    method public androidx.wear.watchface.CanvasComplicationFactory getCanvasComplicationFactory();
+    method public kotlinx.coroutines.flow.StateFlow<androidx.wear.watchface.complications.data.ComplicationData> getComplicationData();
+    method @UiThread public androidx.wear.watchface.complications.ComplicationSlotBounds getComplicationSlotBounds();
+    method public android.os.Bundle getConfigExtras();
+    method @UiThread public androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy getDefaultDataSourcePolicy();
+    method @UiThread public androidx.wear.watchface.complications.data.ComplicationType getDefaultDataSourceType();
+    method public boolean getFixedComplicationDataSource();
+    method public int getId();
+    method public boolean getInitiallyEnabled();
+    method public androidx.wear.watchface.CanvasComplication getRenderer();
+    method @UiThread public java.util.List<androidx.wear.watchface.complications.data.ComplicationType> getSupportedTypes();
+    method public androidx.wear.watchface.ComplicationTapFilter getTapFilter();
+    method public boolean isActiveAt(java.time.Instant instant);
+    method @UiThread public boolean isEnabled();
+    method @UiThread public void render(android.graphics.Canvas canvas, java.time.ZonedDateTime zonedDateTime, androidx.wear.watchface.RenderParameters renderParameters);
+    method @UiThread public void renderHighlightLayer(android.graphics.Canvas canvas, java.time.ZonedDateTime zonedDateTime, androidx.wear.watchface.RenderParameters renderParameters);
+    property @UiThread public final int accessibilityTraversalIndex;
+    property public final int boundsType;
+    property public final androidx.wear.watchface.CanvasComplicationFactory canvasComplicationFactory;
+    property public final kotlinx.coroutines.flow.StateFlow<androidx.wear.watchface.complications.data.ComplicationData> complicationData;
+    property @UiThread public final androidx.wear.watchface.complications.ComplicationSlotBounds complicationSlotBounds;
+    property public final android.os.Bundle configExtras;
+    property @UiThread public final androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy;
+    property @UiThread public final androidx.wear.watchface.complications.data.ComplicationType defaultDataSourceType;
+    property @UiThread public final boolean enabled;
+    property public final boolean fixedComplicationDataSource;
+    property public final int id;
+    property public final boolean initiallyEnabled;
+    property public final androidx.wear.watchface.CanvasComplication renderer;
+    property @UiThread public final java.util.List<androidx.wear.watchface.complications.data.ComplicationType> supportedTypes;
+    property public final androidx.wear.watchface.ComplicationTapFilter tapFilter;
+    field public static final androidx.wear.watchface.ComplicationSlot.Companion Companion;
+  }
+
+  public static final class ComplicationSlot.Builder {
+    method public androidx.wear.watchface.ComplicationSlot build();
+    method public androidx.wear.watchface.ComplicationSlot.Builder setAccessibilityTraversalIndex(int accessibilityTraversalIndex);
+    method public androidx.wear.watchface.ComplicationSlot.Builder setConfigExtras(android.os.Bundle extras);
+    method public androidx.wear.watchface.ComplicationSlot.Builder setDefaultDataSourceType(androidx.wear.watchface.complications.data.ComplicationType defaultDataSourceType);
+    method public androidx.wear.watchface.ComplicationSlot.Builder setEnabled(boolean enabled);
+    method public androidx.wear.watchface.ComplicationSlot.Builder setFixedComplicationDataSource(boolean fixedComplicationDataSource);
+  }
+
+  public static final class ComplicationSlot.Companion {
+    method public androidx.wear.watchface.ComplicationSlot.Builder createBackgroundComplicationSlotBuilder(int id, androidx.wear.watchface.CanvasComplicationFactory canvasComplicationFactory, java.util.List<? extends androidx.wear.watchface.complications.data.ComplicationType> supportedTypes, androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy);
+    method public androidx.wear.watchface.ComplicationSlot.Builder createEdgeComplicationSlotBuilder(int id, androidx.wear.watchface.CanvasComplicationFactory canvasComplicationFactory, java.util.List<? extends androidx.wear.watchface.complications.data.ComplicationType> supportedTypes, androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy, androidx.wear.watchface.complications.ComplicationSlotBounds bounds, androidx.wear.watchface.ComplicationTapFilter complicationTapFilter);
+    method public androidx.wear.watchface.ComplicationSlot.Builder createRoundRectComplicationSlotBuilder(int id, androidx.wear.watchface.CanvasComplicationFactory canvasComplicationFactory, java.util.List<? extends androidx.wear.watchface.complications.data.ComplicationType> supportedTypes, androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy, androidx.wear.watchface.complications.ComplicationSlotBounds bounds);
+  }
+
+  public final class ComplicationSlotsManager {
+    ctor public ComplicationSlotsManager(java.util.Collection<androidx.wear.watchface.ComplicationSlot> complicationSlotCollection, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository);
+    method @UiThread public void addTapListener(androidx.wear.watchface.ComplicationSlotsManager.TapCallback tapCallback);
+    method public operator androidx.wear.watchface.ComplicationSlot? get(int id);
+    method public androidx.wear.watchface.ComplicationSlot? getBackgroundComplicationSlot();
+    method public androidx.wear.watchface.ComplicationSlot? getComplicationSlotAt(@Px int x, @Px int y);
+    method public java.util.Map<java.lang.Integer,androidx.wear.watchface.ComplicationSlot> getComplicationSlots();
+    method public java.util.Map<java.lang.Integer,androidx.wear.watchface.TapEvent> getLastComplicationTapDownEvents();
+    method @UiThread public void removeTapListener(androidx.wear.watchface.ComplicationSlotsManager.TapCallback tapCallback);
+    property public final java.util.Map<java.lang.Integer,androidx.wear.watchface.ComplicationSlot> complicationSlots;
+    property public final java.util.Map<java.lang.Integer,androidx.wear.watchface.TapEvent> lastComplicationTapDownEvents;
+  }
+
+  public static interface ComplicationSlotsManager.TapCallback {
+    method public default void onComplicationSlotTapped(int complicationSlotId);
+  }
+
+  public final class ComplicationSlotsManagerKt {
+  }
+
+  public interface ComplicationTapFilter {
+    method public boolean hitTest(androidx.wear.watchface.ComplicationSlot complicationSlot, android.graphics.Rect screenBounds, @Px int x, @Px int y);
+  }
+
+  public final class ContentDescriptionLabel {
+    ctor public ContentDescriptionLabel(androidx.wear.watchface.complications.data.ComplicationText text, android.graphics.Rect bounds, android.app.PendingIntent? tapAction);
+    method public android.graphics.Rect getBounds();
+    method public android.app.PendingIntent? getTapAction();
+    method public androidx.wear.watchface.complications.data.ComplicationText getText();
+    method public CharSequence getTextAt(android.content.res.Resources resources, java.time.Instant instant);
+    property public final android.graphics.Rect bounds;
+    property public final android.app.PendingIntent? tapAction;
+    property public final androidx.wear.watchface.complications.data.ComplicationText text;
+  }
+
+  public enum DrawMode {
+    enum_constant public static final androidx.wear.watchface.DrawMode AMBIENT;
+    enum_constant public static final androidx.wear.watchface.DrawMode INTERACTIVE;
+    enum_constant public static final androidx.wear.watchface.DrawMode LOW_BATTERY_INTERACTIVE;
+    enum_constant public static final androidx.wear.watchface.DrawMode MUTE;
+  }
+
+  public final class RenderBufferTextureKt {
+  }
+
+  public final class RenderParameters {
+    ctor public RenderParameters(androidx.wear.watchface.DrawMode drawMode, java.util.Set<? extends androidx.wear.watchface.style.WatchFaceLayer> watchFaceLayers, optional androidx.wear.watchface.RenderParameters.HighlightLayer? highlightLayer, optional java.util.Map<java.lang.Integer,androidx.wear.watchface.TapEvent> lastComplicationTapDownEvents);
+    ctor public RenderParameters(androidx.wear.watchface.DrawMode drawMode, java.util.Set<? extends androidx.wear.watchface.style.WatchFaceLayer> watchFaceLayers, optional androidx.wear.watchface.RenderParameters.HighlightLayer? highlightLayer);
+    ctor public RenderParameters(androidx.wear.watchface.DrawMode drawMode, java.util.Set<? extends androidx.wear.watchface.style.WatchFaceLayer> watchFaceLayers);
+    method public androidx.wear.watchface.DrawMode getDrawMode();
+    method public androidx.wear.watchface.RenderParameters.HighlightLayer? getHighlightLayer();
+    method public java.util.Map<java.lang.Integer,androidx.wear.watchface.TapEvent> getLastComplicationTapDownEvents();
+    method public java.util.Set<androidx.wear.watchface.style.WatchFaceLayer> getWatchFaceLayers();
+    property public final androidx.wear.watchface.DrawMode drawMode;
+    property public final androidx.wear.watchface.RenderParameters.HighlightLayer? highlightLayer;
+    property public final java.util.Map<java.lang.Integer,androidx.wear.watchface.TapEvent> lastComplicationTapDownEvents;
+    property public final java.util.Set<androidx.wear.watchface.style.WatchFaceLayer> watchFaceLayers;
+    field public static final androidx.wear.watchface.RenderParameters.Companion Companion;
+    field public static final androidx.wear.watchface.RenderParameters DEFAULT_INTERACTIVE;
+  }
+
+  public static final class RenderParameters.Companion {
+  }
+
+  public static final class RenderParameters.HighlightLayer {
+    ctor public RenderParameters.HighlightLayer(androidx.wear.watchface.RenderParameters.HighlightedElement highlightedElement, @ColorInt int highlightTint, @ColorInt int backgroundTint);
+    method @ColorInt public int getBackgroundTint();
+    method @ColorInt public int getHighlightTint();
+    method public androidx.wear.watchface.RenderParameters.HighlightedElement getHighlightedElement();
+    property @ColorInt public final int backgroundTint;
+    property @ColorInt public final int highlightTint;
+    property public final androidx.wear.watchface.RenderParameters.HighlightedElement highlightedElement;
+  }
+
+  public abstract static sealed class RenderParameters.HighlightedElement {
+  }
+
+  public static final class RenderParameters.HighlightedElement.AllComplicationSlots extends androidx.wear.watchface.RenderParameters.HighlightedElement {
+    field public static final androidx.wear.watchface.RenderParameters.HighlightedElement.AllComplicationSlots INSTANCE;
+  }
+
+  public static final class RenderParameters.HighlightedElement.ComplicationSlot extends androidx.wear.watchface.RenderParameters.HighlightedElement {
+    ctor public RenderParameters.HighlightedElement.ComplicationSlot(int id);
+    method public int getId();
+    property public final int id;
+  }
+
+  public static final class RenderParameters.HighlightedElement.UserStyle extends androidx.wear.watchface.RenderParameters.HighlightedElement {
+    ctor public RenderParameters.HighlightedElement.UserStyle(androidx.wear.watchface.style.UserStyleSetting.Id id);
+    method public androidx.wear.watchface.style.UserStyleSetting.Id getId();
+    property public final androidx.wear.watchface.style.UserStyleSetting.Id id;
+  }
+
+  public abstract sealed class Renderer {
+    method public final java.util.Collection<kotlin.Pair<java.lang.Integer,androidx.wear.watchface.ContentDescriptionLabel>> getAdditionalContentDescriptionLabels();
+    method public final float getCenterX();
+    method public final float getCenterY();
+    method public final long getInteractiveDrawModeUpdateDelayMillis();
+    method @UiThread public android.graphics.Rect getMainClockElementBounds();
+    method public final androidx.wear.watchface.RenderParameters getRenderParameters();
+    method public final android.graphics.Rect getScreenBounds();
+    method public final android.view.SurfaceHolder getSurfaceHolder();
+    method @UiThread public final void invalidate();
+    method @UiThread public void onDestroy();
+    method @UiThread public abstract void onDump(java.io.PrintWriter writer);
+    method @UiThread protected void onRenderParametersChanged(androidx.wear.watchface.RenderParameters renderParameters);
+    method public final void postInvalidate();
+    method public final void setAdditionalContentDescriptionLabels(java.util.Collection<kotlin.Pair<java.lang.Integer,androidx.wear.watchface.ContentDescriptionLabel>> value);
+    method public final void setInteractiveDrawModeUpdateDelayMillis(long interactiveDrawModeUpdateDelayMillis);
+    method @UiThread public boolean shouldAnimate();
+    property public final java.util.Collection<kotlin.Pair<java.lang.Integer,androidx.wear.watchface.ContentDescriptionLabel>> additionalContentDescriptionLabels;
+    property public final float centerX;
+    property public final float centerY;
+    property public final long interactiveDrawModeUpdateDelayMillis;
+    property public final androidx.wear.watchface.RenderParameters renderParameters;
+    property public final android.graphics.Rect screenBounds;
+    property public final android.view.SurfaceHolder surfaceHolder;
+  }
+
+  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 suspend Object? init(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public void onDump(java.io.PrintWriter writer);
+    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);
+  }
+
+  public abstract static class Renderer.GlesRenderer extends androidx.wear.watchface.Renderer {
+    ctor @WorkerThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(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) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
+    ctor @WorkerThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(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) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
+    ctor @WorkerThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
+    method public final android.opengl.EGLContext getEglBackgroundThreadContext();
+    method public final android.opengl.EGLConfig getEglConfig();
+    method public final android.opengl.EGLDisplay getEglDisplay();
+    method public final android.opengl.EGLContext getEglUiThreadContext();
+    method @WorkerThread public suspend Object? onBackgroundThreadGlContextCreated(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public void onDump(java.io.PrintWriter writer);
+    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 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;
+    property public final android.opengl.EGLConfig eglConfig;
+    property public final android.opengl.EGLDisplay eglDisplay;
+    property public final android.opengl.EGLContext eglUiThreadContext;
+  }
+
+  public static final class Renderer.GlesRenderer.GlesException extends java.lang.Exception {
+    ctor public Renderer.GlesRenderer.GlesException(String message);
+  }
+
+  public final class RendererKt {
+  }
+
+  public final class RoundRectComplicationTapFilter implements androidx.wear.watchface.ComplicationTapFilter {
+    ctor public RoundRectComplicationTapFilter();
+    method public boolean hitTest(androidx.wear.watchface.ComplicationSlot complicationSlot, android.graphics.Rect screenBounds, @Px int x, @Px int y);
+  }
+
+  public final class TapEvent {
+    ctor public TapEvent(@Px int xPos, @Px int yPos, java.time.Instant tapTime);
+    method public java.time.Instant getTapTime();
+    method public int getXPos();
+    method public int getYPos();
+    property public final java.time.Instant tapTime;
+    property public final int xPos;
+    property public final int yPos;
+  }
+
+  public final class WatchFace {
+    ctor public WatchFace(int watchFaceType, androidx.wear.watchface.Renderer renderer);
+    method public androidx.wear.watchface.WatchFace.LegacyWatchFaceOverlayStyle getLegacyWatchFaceStyle();
+    method public java.time.Instant? getOverridePreviewReferenceInstant();
+    method public androidx.wear.watchface.Renderer getRenderer();
+    method public int getWatchFaceType();
+    method public static boolean isLegacyWatchFaceOverlayStyleSupported();
+    method public androidx.wear.watchface.WatchFace setLegacyWatchFaceStyle(androidx.wear.watchface.WatchFace.LegacyWatchFaceOverlayStyle legacyWatchFaceStyle);
+    method public androidx.wear.watchface.WatchFace setOverridePreviewReferenceInstant(java.time.Instant previewReferenceTimeMillis);
+    method public androidx.wear.watchface.WatchFace setTapListener(androidx.wear.watchface.WatchFace.TapListener? tapListener);
+    method public void setWatchFaceType(int watchFaceType);
+    property public final androidx.wear.watchface.WatchFace.LegacyWatchFaceOverlayStyle legacyWatchFaceStyle;
+    property public final java.time.Instant? overridePreviewReferenceInstant;
+    property public final androidx.wear.watchface.Renderer renderer;
+    property public final int watchFaceType;
+    field public static final androidx.wear.watchface.WatchFace.Companion Companion;
+  }
+
+  public static final class WatchFace.Companion {
+    method public boolean isLegacyWatchFaceOverlayStyleSupported();
+  }
+
+  public static final class WatchFace.LegacyWatchFaceOverlayStyle {
+    ctor public WatchFace.LegacyWatchFaceOverlayStyle(int viewProtectionMode, int statusBarGravity, boolean tapEventsAccepted, optional @ColorInt int accentColor);
+    ctor public WatchFace.LegacyWatchFaceOverlayStyle(int viewProtectionMode, int statusBarGravity, boolean tapEventsAccepted);
+    method public int getAccentColor();
+    method public int getStatusBarGravity();
+    method public boolean getTapEventsAccepted();
+    method public int getViewProtectionMode();
+    property public final int accentColor;
+    property public final int statusBarGravity;
+    property public final boolean tapEventsAccepted;
+    property public final int viewProtectionMode;
+  }
+
+  public static interface WatchFace.TapListener {
+    method @UiThread public void onTapEvent(int tapType, androidx.wear.watchface.TapEvent tapEvent, androidx.wear.watchface.ComplicationSlot? complicationSlot);
+  }
+
+  public final class WatchFaceKt {
+  }
+
+  public abstract class WatchFaceService extends android.service.wallpaper.WallpaperService {
+    ctor public WatchFaceService();
+    method @WorkerThread protected androidx.wear.watchface.ComplicationSlotsManager createComplicationSlotsManager(androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository);
+    method @WorkerThread protected androidx.wear.watchface.style.UserStyleSchema createUserStyleSchema();
+    method @WorkerThread protected abstract 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);
+    method public final android.os.Handler getBackgroundThreadHandler();
+    method public final android.os.Handler getUiThreadHandler();
+    method public final android.service.wallpaper.WallpaperService.Engine onCreateEngine();
+    field public static final androidx.wear.watchface.WatchFaceService.Companion Companion;
+    field public static final int MAX_CREATE_WATCHFACE_TIME_MILLIS = 5000; // 0x1388
+  }
+
+  public static final class WatchFaceService.Companion {
+  }
+
+  public final class WatchFaceServiceKt {
+  }
+
+  public final class WatchState {
+    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 kotlinx.coroutines.flow.StateFlow<java.lang.Integer> getInterruptionFilter();
+    method public kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isAmbient();
+    method public boolean isHeadless();
+    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 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 kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isVisible;
+  }
+
+}
+
diff --git a/wear/watchface/watchface/api/api_lint.ignore b/wear/watchface/watchface/api/api_lint.ignore
deleted file mode 100644
index d7bd2f0..0000000
--- a/wear/watchface/watchface/api/api_lint.ignore
+++ /dev/null
@@ -1,5 +0,0 @@
-// Baseline format: 1.0
-GetterSetterNames: androidx.wear.watchface.CanvasComplication#setIsHighlighted(boolean):
-    Symmetric method for `isHighlighted` must be named `setHighlighted`; was `setIsHighlighted`
-GetterSetterNames: androidx.wear.watchface.ObservableWatchData#setValue(T):
-    Symmetric method for `hasValue` must be named `setHasValue`; was `setValue`
diff --git a/wear/watchface/watchface/api/public_plus_experimental_1.0.0-beta02.txt b/wear/watchface/watchface/api/public_plus_experimental_1.0.0-beta02.txt
new file mode 100644
index 0000000..6f3baa0
--- /dev/null
+++ b/wear/watchface/watchface/api/public_plus_experimental_1.0.0-beta02.txt
@@ -0,0 +1,336 @@
+// Signature format: 4.0
+package androidx.wear.watchface {
+
+  public final class BackgroundComplicationTapFilter implements androidx.wear.watchface.ComplicationTapFilter {
+    ctor public BackgroundComplicationTapFilter();
+    method public boolean hitTest(androidx.wear.watchface.ComplicationSlot complicationSlot, android.graphics.Rect screenBounds, @Px int x, @Px int y);
+  }
+
+  public interface CanvasComplication {
+    method public void drawHighlight(android.graphics.Canvas canvas, android.graphics.Rect bounds, int boundsType, java.time.ZonedDateTime zonedDateTime, @ColorInt int color);
+    method public androidx.wear.watchface.complications.data.ComplicationData getData();
+    method public void loadData(androidx.wear.watchface.complications.data.ComplicationData complicationData, boolean loadDrawablesAsynchronous);
+    method @WorkerThread public default void onRendererCreated(androidx.wear.watchface.Renderer renderer);
+    method @UiThread public void render(android.graphics.Canvas canvas, android.graphics.Rect bounds, java.time.ZonedDateTime zonedDateTime, androidx.wear.watchface.RenderParameters renderParameters, int slotId);
+  }
+
+  public static interface CanvasComplication.InvalidateCallback {
+    method public void onInvalidate();
+  }
+
+  public interface CanvasComplicationFactory {
+    method @WorkerThread public androidx.wear.watchface.CanvasComplication create(androidx.wear.watchface.WatchState, androidx.wear.watchface.CanvasComplication.InvalidateCallback);
+  }
+
+  public final class ComplicationSlot {
+    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.watchface.complications.data.ComplicationType> supportedTypes, androidx.wear.watchface.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.watchface.complications.data.ComplicationType> supportedTypes, androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy, androidx.wear.watchface.complications.ComplicationSlotBounds bounds, androidx.wear.watchface.ComplicationTapFilter complicationTapFilter);
+    method public static androidx.wear.watchface.ComplicationSlot.Builder createRoundRectComplicationSlotBuilder(int id, androidx.wear.watchface.CanvasComplicationFactory canvasComplicationFactory, java.util.List<? extends androidx.wear.watchface.complications.data.ComplicationType> supportedTypes, androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy, androidx.wear.watchface.complications.ComplicationSlotBounds bounds);
+    method @UiThread public int getAccessibilityTraversalIndex();
+    method public int getBoundsType();
+    method public androidx.wear.watchface.CanvasComplicationFactory getCanvasComplicationFactory();
+    method public kotlinx.coroutines.flow.StateFlow<androidx.wear.watchface.complications.data.ComplicationData> getComplicationData();
+    method @UiThread public androidx.wear.watchface.complications.ComplicationSlotBounds getComplicationSlotBounds();
+    method public android.os.Bundle getConfigExtras();
+    method @UiThread public androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy getDefaultDataSourcePolicy();
+    method @UiThread public androidx.wear.watchface.complications.data.ComplicationType getDefaultDataSourceType();
+    method public boolean getFixedComplicationDataSource();
+    method public int getId();
+    method public boolean getInitiallyEnabled();
+    method public androidx.wear.watchface.CanvasComplication getRenderer();
+    method @UiThread public java.util.List<androidx.wear.watchface.complications.data.ComplicationType> getSupportedTypes();
+    method public androidx.wear.watchface.ComplicationTapFilter getTapFilter();
+    method public boolean isActiveAt(java.time.Instant instant);
+    method @UiThread public boolean isEnabled();
+    method @UiThread public void render(android.graphics.Canvas canvas, java.time.ZonedDateTime zonedDateTime, androidx.wear.watchface.RenderParameters renderParameters);
+    method @UiThread public void renderHighlightLayer(android.graphics.Canvas canvas, java.time.ZonedDateTime zonedDateTime, androidx.wear.watchface.RenderParameters renderParameters);
+    property @UiThread public final int accessibilityTraversalIndex;
+    property public final int boundsType;
+    property public final androidx.wear.watchface.CanvasComplicationFactory canvasComplicationFactory;
+    property public final kotlinx.coroutines.flow.StateFlow<androidx.wear.watchface.complications.data.ComplicationData> complicationData;
+    property @UiThread public final androidx.wear.watchface.complications.ComplicationSlotBounds complicationSlotBounds;
+    property public final android.os.Bundle configExtras;
+    property @UiThread public final androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy;
+    property @UiThread public final androidx.wear.watchface.complications.data.ComplicationType defaultDataSourceType;
+    property @UiThread public final boolean enabled;
+    property public final boolean fixedComplicationDataSource;
+    property public final int id;
+    property public final boolean initiallyEnabled;
+    property public final androidx.wear.watchface.CanvasComplication renderer;
+    property @UiThread public final java.util.List<androidx.wear.watchface.complications.data.ComplicationType> supportedTypes;
+    property public final androidx.wear.watchface.ComplicationTapFilter tapFilter;
+    field public static final androidx.wear.watchface.ComplicationSlot.Companion Companion;
+  }
+
+  public static final class ComplicationSlot.Builder {
+    method public androidx.wear.watchface.ComplicationSlot build();
+    method public androidx.wear.watchface.ComplicationSlot.Builder setAccessibilityTraversalIndex(int accessibilityTraversalIndex);
+    method public androidx.wear.watchface.ComplicationSlot.Builder setConfigExtras(android.os.Bundle extras);
+    method public androidx.wear.watchface.ComplicationSlot.Builder setDefaultDataSourceType(androidx.wear.watchface.complications.data.ComplicationType defaultDataSourceType);
+    method public androidx.wear.watchface.ComplicationSlot.Builder setEnabled(boolean enabled);
+    method public androidx.wear.watchface.ComplicationSlot.Builder setFixedComplicationDataSource(boolean fixedComplicationDataSource);
+  }
+
+  public static final class ComplicationSlot.Companion {
+    method public androidx.wear.watchface.ComplicationSlot.Builder createBackgroundComplicationSlotBuilder(int id, androidx.wear.watchface.CanvasComplicationFactory canvasComplicationFactory, java.util.List<? extends androidx.wear.watchface.complications.data.ComplicationType> supportedTypes, androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy);
+    method public androidx.wear.watchface.ComplicationSlot.Builder createEdgeComplicationSlotBuilder(int id, androidx.wear.watchface.CanvasComplicationFactory canvasComplicationFactory, java.util.List<? extends androidx.wear.watchface.complications.data.ComplicationType> supportedTypes, androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy, androidx.wear.watchface.complications.ComplicationSlotBounds bounds, androidx.wear.watchface.ComplicationTapFilter complicationTapFilter);
+    method public androidx.wear.watchface.ComplicationSlot.Builder createRoundRectComplicationSlotBuilder(int id, androidx.wear.watchface.CanvasComplicationFactory canvasComplicationFactory, java.util.List<? extends androidx.wear.watchface.complications.data.ComplicationType> supportedTypes, androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy, androidx.wear.watchface.complications.ComplicationSlotBounds bounds);
+  }
+
+  public final class ComplicationSlotsManager {
+    ctor public ComplicationSlotsManager(java.util.Collection<androidx.wear.watchface.ComplicationSlot> complicationSlotCollection, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository);
+    method @UiThread public void addTapListener(androidx.wear.watchface.ComplicationSlotsManager.TapCallback tapCallback);
+    method public operator androidx.wear.watchface.ComplicationSlot? get(int id);
+    method public androidx.wear.watchface.ComplicationSlot? getBackgroundComplicationSlot();
+    method public androidx.wear.watchface.ComplicationSlot? getComplicationSlotAt(@Px int x, @Px int y);
+    method public java.util.Map<java.lang.Integer,androidx.wear.watchface.ComplicationSlot> getComplicationSlots();
+    method public java.util.Map<java.lang.Integer,androidx.wear.watchface.TapEvent> getLastComplicationTapDownEvents();
+    method @UiThread public void removeTapListener(androidx.wear.watchface.ComplicationSlotsManager.TapCallback tapCallback);
+    property public final java.util.Map<java.lang.Integer,androidx.wear.watchface.ComplicationSlot> complicationSlots;
+    property public final java.util.Map<java.lang.Integer,androidx.wear.watchface.TapEvent> lastComplicationTapDownEvents;
+  }
+
+  public static interface ComplicationSlotsManager.TapCallback {
+    method public default void onComplicationSlotTapped(int complicationSlotId);
+  }
+
+  public final class ComplicationSlotsManagerKt {
+  }
+
+  public interface ComplicationTapFilter {
+    method public boolean hitTest(androidx.wear.watchface.ComplicationSlot complicationSlot, android.graphics.Rect screenBounds, @Px int x, @Px int y);
+  }
+
+  public final class ContentDescriptionLabel {
+    ctor public ContentDescriptionLabel(androidx.wear.watchface.complications.data.ComplicationText text, android.graphics.Rect bounds, android.app.PendingIntent? tapAction);
+    method public android.graphics.Rect getBounds();
+    method public android.app.PendingIntent? getTapAction();
+    method public androidx.wear.watchface.complications.data.ComplicationText getText();
+    method public CharSequence getTextAt(android.content.res.Resources resources, java.time.Instant instant);
+    property public final android.graphics.Rect bounds;
+    property public final android.app.PendingIntent? tapAction;
+    property public final androidx.wear.watchface.complications.data.ComplicationText text;
+  }
+
+  public enum DrawMode {
+    enum_constant public static final androidx.wear.watchface.DrawMode AMBIENT;
+    enum_constant public static final androidx.wear.watchface.DrawMode INTERACTIVE;
+    enum_constant public static final androidx.wear.watchface.DrawMode LOW_BATTERY_INTERACTIVE;
+    enum_constant public static final androidx.wear.watchface.DrawMode MUTE;
+  }
+
+  public final class RenderBufferTextureKt {
+  }
+
+  public final class RenderParameters {
+    ctor public RenderParameters(androidx.wear.watchface.DrawMode drawMode, java.util.Set<? extends androidx.wear.watchface.style.WatchFaceLayer> watchFaceLayers, optional androidx.wear.watchface.RenderParameters.HighlightLayer? highlightLayer, optional java.util.Map<java.lang.Integer,androidx.wear.watchface.TapEvent> lastComplicationTapDownEvents);
+    ctor public RenderParameters(androidx.wear.watchface.DrawMode drawMode, java.util.Set<? extends androidx.wear.watchface.style.WatchFaceLayer> watchFaceLayers, optional androidx.wear.watchface.RenderParameters.HighlightLayer? highlightLayer);
+    ctor public RenderParameters(androidx.wear.watchface.DrawMode drawMode, java.util.Set<? extends androidx.wear.watchface.style.WatchFaceLayer> watchFaceLayers);
+    method public androidx.wear.watchface.DrawMode getDrawMode();
+    method public androidx.wear.watchface.RenderParameters.HighlightLayer? getHighlightLayer();
+    method public java.util.Map<java.lang.Integer,androidx.wear.watchface.TapEvent> getLastComplicationTapDownEvents();
+    method public java.util.Set<androidx.wear.watchface.style.WatchFaceLayer> getWatchFaceLayers();
+    property public final androidx.wear.watchface.DrawMode drawMode;
+    property public final androidx.wear.watchface.RenderParameters.HighlightLayer? highlightLayer;
+    property public final java.util.Map<java.lang.Integer,androidx.wear.watchface.TapEvent> lastComplicationTapDownEvents;
+    property public final java.util.Set<androidx.wear.watchface.style.WatchFaceLayer> watchFaceLayers;
+    field public static final androidx.wear.watchface.RenderParameters.Companion Companion;
+    field public static final androidx.wear.watchface.RenderParameters DEFAULT_INTERACTIVE;
+  }
+
+  public static final class RenderParameters.Companion {
+  }
+
+  public static final class RenderParameters.HighlightLayer {
+    ctor public RenderParameters.HighlightLayer(androidx.wear.watchface.RenderParameters.HighlightedElement highlightedElement, @ColorInt int highlightTint, @ColorInt int backgroundTint);
+    method @ColorInt public int getBackgroundTint();
+    method @ColorInt public int getHighlightTint();
+    method public androidx.wear.watchface.RenderParameters.HighlightedElement getHighlightedElement();
+    property @ColorInt public final int backgroundTint;
+    property @ColorInt public final int highlightTint;
+    property public final androidx.wear.watchface.RenderParameters.HighlightedElement highlightedElement;
+  }
+
+  public abstract static sealed class RenderParameters.HighlightedElement {
+  }
+
+  public static final class RenderParameters.HighlightedElement.AllComplicationSlots extends androidx.wear.watchface.RenderParameters.HighlightedElement {
+    field public static final androidx.wear.watchface.RenderParameters.HighlightedElement.AllComplicationSlots INSTANCE;
+  }
+
+  public static final class RenderParameters.HighlightedElement.ComplicationSlot extends androidx.wear.watchface.RenderParameters.HighlightedElement {
+    ctor public RenderParameters.HighlightedElement.ComplicationSlot(int id);
+    method public int getId();
+    property public final int id;
+  }
+
+  public static final class RenderParameters.HighlightedElement.UserStyle extends androidx.wear.watchface.RenderParameters.HighlightedElement {
+    ctor public RenderParameters.HighlightedElement.UserStyle(androidx.wear.watchface.style.UserStyleSetting.Id id);
+    method public androidx.wear.watchface.style.UserStyleSetting.Id getId();
+    property public final androidx.wear.watchface.style.UserStyleSetting.Id id;
+  }
+
+  public abstract sealed class Renderer {
+    method public final java.util.Collection<kotlin.Pair<java.lang.Integer,androidx.wear.watchface.ContentDescriptionLabel>> getAdditionalContentDescriptionLabels();
+    method public final float getCenterX();
+    method public final float getCenterY();
+    method public final long getInteractiveDrawModeUpdateDelayMillis();
+    method @UiThread public android.graphics.Rect getMainClockElementBounds();
+    method public final androidx.wear.watchface.RenderParameters getRenderParameters();
+    method public final android.graphics.Rect getScreenBounds();
+    method public final android.view.SurfaceHolder getSurfaceHolder();
+    method @UiThread public final void invalidate();
+    method @UiThread public void onDestroy();
+    method @UiThread public abstract void onDump(java.io.PrintWriter writer);
+    method @UiThread protected void onRenderParametersChanged(androidx.wear.watchface.RenderParameters renderParameters);
+    method public final void postInvalidate();
+    method public final void setAdditionalContentDescriptionLabels(java.util.Collection<kotlin.Pair<java.lang.Integer,androidx.wear.watchface.ContentDescriptionLabel>> value);
+    method public final void setInteractiveDrawModeUpdateDelayMillis(long interactiveDrawModeUpdateDelayMillis);
+    method @UiThread public boolean shouldAnimate();
+    property public final java.util.Collection<kotlin.Pair<java.lang.Integer,androidx.wear.watchface.ContentDescriptionLabel>> additionalContentDescriptionLabels;
+    property public final float centerX;
+    property public final float centerY;
+    property public final long interactiveDrawModeUpdateDelayMillis;
+    property public final androidx.wear.watchface.RenderParameters renderParameters;
+    property public final android.graphics.Rect screenBounds;
+    property public final android.view.SurfaceHolder surfaceHolder;
+  }
+
+  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 suspend Object? init(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public void onDump(java.io.PrintWriter writer);
+    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);
+  }
+
+  public abstract static class Renderer.GlesRenderer extends androidx.wear.watchface.Renderer {
+    ctor @WorkerThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(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) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
+    ctor @WorkerThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(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) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
+    ctor @WorkerThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
+    method public final android.opengl.EGLContext getEglBackgroundThreadContext();
+    method public final android.opengl.EGLConfig getEglConfig();
+    method public final android.opengl.EGLDisplay getEglDisplay();
+    method public final android.opengl.EGLContext getEglUiThreadContext();
+    method @WorkerThread public suspend Object? onBackgroundThreadGlContextCreated(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public void onDump(java.io.PrintWriter writer);
+    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 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;
+    property public final android.opengl.EGLConfig eglConfig;
+    property public final android.opengl.EGLDisplay eglDisplay;
+    property public final android.opengl.EGLContext eglUiThreadContext;
+  }
+
+  public static final class Renderer.GlesRenderer.GlesException extends java.lang.Exception {
+    ctor public Renderer.GlesRenderer.GlesException(String message);
+  }
+
+  public final class RendererKt {
+  }
+
+  public final class RoundRectComplicationTapFilter implements androidx.wear.watchface.ComplicationTapFilter {
+    ctor public RoundRectComplicationTapFilter();
+    method public boolean hitTest(androidx.wear.watchface.ComplicationSlot complicationSlot, android.graphics.Rect screenBounds, @Px int x, @Px int y);
+  }
+
+  public final class TapEvent {
+    ctor public TapEvent(@Px int xPos, @Px int yPos, java.time.Instant tapTime);
+    method public java.time.Instant getTapTime();
+    method public int getXPos();
+    method public int getYPos();
+    property public final java.time.Instant tapTime;
+    property public final int xPos;
+    property public final int yPos;
+  }
+
+  public final class WatchFace {
+    ctor public WatchFace(int watchFaceType, androidx.wear.watchface.Renderer renderer);
+    method public androidx.wear.watchface.WatchFace.LegacyWatchFaceOverlayStyle getLegacyWatchFaceStyle();
+    method public java.time.Instant? getOverridePreviewReferenceInstant();
+    method public androidx.wear.watchface.Renderer getRenderer();
+    method public int getWatchFaceType();
+    method public static boolean isLegacyWatchFaceOverlayStyleSupported();
+    method public androidx.wear.watchface.WatchFace setLegacyWatchFaceStyle(androidx.wear.watchface.WatchFace.LegacyWatchFaceOverlayStyle legacyWatchFaceStyle);
+    method public androidx.wear.watchface.WatchFace setOverridePreviewReferenceInstant(java.time.Instant previewReferenceTimeMillis);
+    method public androidx.wear.watchface.WatchFace setTapListener(androidx.wear.watchface.WatchFace.TapListener? tapListener);
+    method public void setWatchFaceType(int watchFaceType);
+    property public final androidx.wear.watchface.WatchFace.LegacyWatchFaceOverlayStyle legacyWatchFaceStyle;
+    property public final java.time.Instant? overridePreviewReferenceInstant;
+    property public final androidx.wear.watchface.Renderer renderer;
+    property public final int watchFaceType;
+    field public static final androidx.wear.watchface.WatchFace.Companion Companion;
+  }
+
+  public static final class WatchFace.Companion {
+    method public boolean isLegacyWatchFaceOverlayStyleSupported();
+  }
+
+  public static final class WatchFace.LegacyWatchFaceOverlayStyle {
+    ctor public WatchFace.LegacyWatchFaceOverlayStyle(int viewProtectionMode, int statusBarGravity, boolean tapEventsAccepted, optional @ColorInt int accentColor);
+    ctor public WatchFace.LegacyWatchFaceOverlayStyle(int viewProtectionMode, int statusBarGravity, boolean tapEventsAccepted);
+    method public int getAccentColor();
+    method public int getStatusBarGravity();
+    method public boolean getTapEventsAccepted();
+    method public int getViewProtectionMode();
+    property public final int accentColor;
+    property public final int statusBarGravity;
+    property public final boolean tapEventsAccepted;
+    property public final int viewProtectionMode;
+  }
+
+  public static interface WatchFace.TapListener {
+    method @UiThread public void onTapEvent(int tapType, androidx.wear.watchface.TapEvent tapEvent, androidx.wear.watchface.ComplicationSlot? complicationSlot);
+  }
+
+  public final class WatchFaceKt {
+  }
+
+  public abstract class WatchFaceService extends android.service.wallpaper.WallpaperService {
+    ctor public WatchFaceService();
+    method @WorkerThread protected androidx.wear.watchface.ComplicationSlotsManager createComplicationSlotsManager(androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository);
+    method @WorkerThread protected androidx.wear.watchface.style.UserStyleSchema createUserStyleSchema();
+    method @WorkerThread protected abstract 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);
+    method public final android.os.Handler getBackgroundThreadHandler();
+    method public final android.os.Handler getUiThreadHandler();
+    method public final android.service.wallpaper.WallpaperService.Engine onCreateEngine();
+    field public static final androidx.wear.watchface.WatchFaceService.Companion Companion;
+    field public static final int MAX_CREATE_WATCHFACE_TIME_MILLIS = 5000; // 0x1388
+  }
+
+  public static final class WatchFaceService.Companion {
+  }
+
+  public final class WatchFaceServiceKt {
+  }
+
+  public final class WatchState {
+    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 kotlinx.coroutines.flow.StateFlow<java.lang.Integer> getInterruptionFilter();
+    method public kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isAmbient();
+    method public boolean isHeadless();
+    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 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 kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isVisible;
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/wear/watchface/watchface/api/res-1.0.0-beta02.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to wear/watchface/watchface/api/res-1.0.0-beta02.txt
diff --git a/wear/watchface/watchface/api/restricted_1.0.0-beta02.txt b/wear/watchface/watchface/api/restricted_1.0.0-beta02.txt
new file mode 100644
index 0000000..d6a7a5c
--- /dev/null
+++ b/wear/watchface/watchface/api/restricted_1.0.0-beta02.txt
@@ -0,0 +1,338 @@
+// Signature format: 4.0
+package androidx.wear.watchface {
+
+  public final class BackgroundComplicationTapFilter implements androidx.wear.watchface.ComplicationTapFilter {
+    ctor public BackgroundComplicationTapFilter();
+    method public boolean hitTest(androidx.wear.watchface.ComplicationSlot complicationSlot, android.graphics.Rect screenBounds, @Px int x, @Px int y);
+  }
+
+  public interface CanvasComplication {
+    method public void drawHighlight(android.graphics.Canvas canvas, android.graphics.Rect bounds, int boundsType, java.time.ZonedDateTime zonedDateTime, @ColorInt int color);
+    method public androidx.wear.watchface.complications.data.ComplicationData getData();
+    method public void loadData(androidx.wear.watchface.complications.data.ComplicationData complicationData, boolean loadDrawablesAsynchronous);
+    method @WorkerThread public default void onRendererCreated(androidx.wear.watchface.Renderer renderer);
+    method @UiThread public void render(android.graphics.Canvas canvas, android.graphics.Rect bounds, java.time.ZonedDateTime zonedDateTime, androidx.wear.watchface.RenderParameters renderParameters, int slotId);
+  }
+
+  public static interface CanvasComplication.InvalidateCallback {
+    method public void onInvalidate();
+  }
+
+  public interface CanvasComplicationFactory {
+    method @WorkerThread public androidx.wear.watchface.CanvasComplication create(androidx.wear.watchface.WatchState, androidx.wear.watchface.CanvasComplication.InvalidateCallback);
+  }
+
+  public final class ComplicationSlot {
+    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.watchface.complications.data.ComplicationType> supportedTypes, androidx.wear.watchface.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.watchface.complications.data.ComplicationType> supportedTypes, androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy, androidx.wear.watchface.complications.ComplicationSlotBounds bounds, androidx.wear.watchface.ComplicationTapFilter complicationTapFilter);
+    method public static androidx.wear.watchface.ComplicationSlot.Builder createRoundRectComplicationSlotBuilder(int id, androidx.wear.watchface.CanvasComplicationFactory canvasComplicationFactory, java.util.List<? extends androidx.wear.watchface.complications.data.ComplicationType> supportedTypes, androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy, androidx.wear.watchface.complications.ComplicationSlotBounds bounds);
+    method @UiThread public int getAccessibilityTraversalIndex();
+    method public int getBoundsType();
+    method public androidx.wear.watchface.CanvasComplicationFactory getCanvasComplicationFactory();
+    method public kotlinx.coroutines.flow.StateFlow<androidx.wear.watchface.complications.data.ComplicationData> getComplicationData();
+    method @UiThread public androidx.wear.watchface.complications.ComplicationSlotBounds getComplicationSlotBounds();
+    method public android.os.Bundle getConfigExtras();
+    method @UiThread public androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy getDefaultDataSourcePolicy();
+    method @UiThread public androidx.wear.watchface.complications.data.ComplicationType getDefaultDataSourceType();
+    method public boolean getFixedComplicationDataSource();
+    method public int getId();
+    method public boolean getInitiallyEnabled();
+    method public androidx.wear.watchface.CanvasComplication getRenderer();
+    method @UiThread public java.util.List<androidx.wear.watchface.complications.data.ComplicationType> getSupportedTypes();
+    method public androidx.wear.watchface.ComplicationTapFilter getTapFilter();
+    method public boolean isActiveAt(java.time.Instant instant);
+    method @UiThread public boolean isEnabled();
+    method @UiThread public void render(android.graphics.Canvas canvas, java.time.ZonedDateTime zonedDateTime, androidx.wear.watchface.RenderParameters renderParameters);
+    method @UiThread public void renderHighlightLayer(android.graphics.Canvas canvas, java.time.ZonedDateTime zonedDateTime, androidx.wear.watchface.RenderParameters renderParameters);
+    property @UiThread public final int accessibilityTraversalIndex;
+    property public final int boundsType;
+    property public final androidx.wear.watchface.CanvasComplicationFactory canvasComplicationFactory;
+    property public final kotlinx.coroutines.flow.StateFlow<androidx.wear.watchface.complications.data.ComplicationData> complicationData;
+    property @UiThread public final androidx.wear.watchface.complications.ComplicationSlotBounds complicationSlotBounds;
+    property public final android.os.Bundle configExtras;
+    property @UiThread public final androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy;
+    property @UiThread public final androidx.wear.watchface.complications.data.ComplicationType defaultDataSourceType;
+    property @UiThread public final boolean enabled;
+    property public final boolean fixedComplicationDataSource;
+    property public final int id;
+    property public final boolean initiallyEnabled;
+    property public final androidx.wear.watchface.CanvasComplication renderer;
+    property @UiThread public final java.util.List<androidx.wear.watchface.complications.data.ComplicationType> supportedTypes;
+    property public final androidx.wear.watchface.ComplicationTapFilter tapFilter;
+    field public static final androidx.wear.watchface.ComplicationSlot.Companion Companion;
+  }
+
+  public static final class ComplicationSlot.Builder {
+    method public androidx.wear.watchface.ComplicationSlot build();
+    method public androidx.wear.watchface.ComplicationSlot.Builder setAccessibilityTraversalIndex(int accessibilityTraversalIndex);
+    method public androidx.wear.watchface.ComplicationSlot.Builder setConfigExtras(android.os.Bundle extras);
+    method public androidx.wear.watchface.ComplicationSlot.Builder setDefaultDataSourceType(androidx.wear.watchface.complications.data.ComplicationType defaultDataSourceType);
+    method public androidx.wear.watchface.ComplicationSlot.Builder setEnabled(boolean enabled);
+    method public androidx.wear.watchface.ComplicationSlot.Builder setFixedComplicationDataSource(boolean fixedComplicationDataSource);
+  }
+
+  public static final class ComplicationSlot.Companion {
+    method public androidx.wear.watchface.ComplicationSlot.Builder createBackgroundComplicationSlotBuilder(int id, androidx.wear.watchface.CanvasComplicationFactory canvasComplicationFactory, java.util.List<? extends androidx.wear.watchface.complications.data.ComplicationType> supportedTypes, androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy);
+    method public androidx.wear.watchface.ComplicationSlot.Builder createEdgeComplicationSlotBuilder(int id, androidx.wear.watchface.CanvasComplicationFactory canvasComplicationFactory, java.util.List<? extends androidx.wear.watchface.complications.data.ComplicationType> supportedTypes, androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy, androidx.wear.watchface.complications.ComplicationSlotBounds bounds, androidx.wear.watchface.ComplicationTapFilter complicationTapFilter);
+    method public androidx.wear.watchface.ComplicationSlot.Builder createRoundRectComplicationSlotBuilder(int id, androidx.wear.watchface.CanvasComplicationFactory canvasComplicationFactory, java.util.List<? extends androidx.wear.watchface.complications.data.ComplicationType> supportedTypes, androidx.wear.watchface.complications.DefaultComplicationDataSourcePolicy defaultDataSourcePolicy, androidx.wear.watchface.complications.ComplicationSlotBounds bounds);
+  }
+
+  public final class ComplicationSlotsManager {
+    ctor public ComplicationSlotsManager(java.util.Collection<androidx.wear.watchface.ComplicationSlot> complicationSlotCollection, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository);
+    method @UiThread public void addTapListener(androidx.wear.watchface.ComplicationSlotsManager.TapCallback tapCallback);
+    method public operator androidx.wear.watchface.ComplicationSlot? get(int id);
+    method public androidx.wear.watchface.ComplicationSlot? getBackgroundComplicationSlot();
+    method public androidx.wear.watchface.ComplicationSlot? getComplicationSlotAt(@Px int x, @Px int y);
+    method public java.util.Map<java.lang.Integer,androidx.wear.watchface.ComplicationSlot> getComplicationSlots();
+    method public java.util.Map<java.lang.Integer,androidx.wear.watchface.TapEvent> getLastComplicationTapDownEvents();
+    method @UiThread public void removeTapListener(androidx.wear.watchface.ComplicationSlotsManager.TapCallback tapCallback);
+    property public final java.util.Map<java.lang.Integer,androidx.wear.watchface.ComplicationSlot> complicationSlots;
+    property public final java.util.Map<java.lang.Integer,androidx.wear.watchface.TapEvent> lastComplicationTapDownEvents;
+  }
+
+  public static interface ComplicationSlotsManager.TapCallback {
+    method public default void onComplicationSlotTapped(int complicationSlotId);
+  }
+
+  public final class ComplicationSlotsManagerKt {
+  }
+
+  public interface ComplicationTapFilter {
+    method public boolean hitTest(androidx.wear.watchface.ComplicationSlot complicationSlot, android.graphics.Rect screenBounds, @Px int x, @Px int y);
+  }
+
+  public final class ContentDescriptionLabel {
+    ctor public ContentDescriptionLabel(androidx.wear.watchface.complications.data.ComplicationText text, android.graphics.Rect bounds, android.app.PendingIntent? tapAction);
+    method public android.graphics.Rect getBounds();
+    method public android.app.PendingIntent? getTapAction();
+    method public androidx.wear.watchface.complications.data.ComplicationText getText();
+    method public CharSequence getTextAt(android.content.res.Resources resources, java.time.Instant instant);
+    property public final android.graphics.Rect bounds;
+    property public final android.app.PendingIntent? tapAction;
+    property public final androidx.wear.watchface.complications.data.ComplicationText text;
+  }
+
+  public enum DrawMode {
+    enum_constant public static final androidx.wear.watchface.DrawMode AMBIENT;
+    enum_constant public static final androidx.wear.watchface.DrawMode INTERACTIVE;
+    enum_constant public static final androidx.wear.watchface.DrawMode LOW_BATTERY_INTERACTIVE;
+    enum_constant public static final androidx.wear.watchface.DrawMode MUTE;
+  }
+
+  public final class RenderBufferTextureKt {
+  }
+
+  public final class RenderParameters {
+    ctor public RenderParameters(androidx.wear.watchface.DrawMode drawMode, java.util.Set<? extends androidx.wear.watchface.style.WatchFaceLayer> watchFaceLayers, optional androidx.wear.watchface.RenderParameters.HighlightLayer? highlightLayer, optional java.util.Map<java.lang.Integer,androidx.wear.watchface.TapEvent> lastComplicationTapDownEvents);
+    ctor public RenderParameters(androidx.wear.watchface.DrawMode drawMode, java.util.Set<? extends androidx.wear.watchface.style.WatchFaceLayer> watchFaceLayers, optional androidx.wear.watchface.RenderParameters.HighlightLayer? highlightLayer);
+    ctor public RenderParameters(androidx.wear.watchface.DrawMode drawMode, java.util.Set<? extends androidx.wear.watchface.style.WatchFaceLayer> watchFaceLayers);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public RenderParameters(androidx.wear.watchface.data.RenderParametersWireFormat wireFormat);
+    method public androidx.wear.watchface.DrawMode getDrawMode();
+    method public androidx.wear.watchface.RenderParameters.HighlightLayer? getHighlightLayer();
+    method public java.util.Map<java.lang.Integer,androidx.wear.watchface.TapEvent> getLastComplicationTapDownEvents();
+    method public java.util.Set<androidx.wear.watchface.style.WatchFaceLayer> getWatchFaceLayers();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.wear.watchface.data.RenderParametersWireFormat toWireFormat();
+    property public final androidx.wear.watchface.DrawMode drawMode;
+    property public final androidx.wear.watchface.RenderParameters.HighlightLayer? highlightLayer;
+    property public final java.util.Map<java.lang.Integer,androidx.wear.watchface.TapEvent> lastComplicationTapDownEvents;
+    property public final java.util.Set<androidx.wear.watchface.style.WatchFaceLayer> watchFaceLayers;
+    field public static final androidx.wear.watchface.RenderParameters.Companion Companion;
+    field public static final androidx.wear.watchface.RenderParameters DEFAULT_INTERACTIVE;
+  }
+
+  public static final class RenderParameters.Companion {
+  }
+
+  public static final class RenderParameters.HighlightLayer {
+    ctor public RenderParameters.HighlightLayer(androidx.wear.watchface.RenderParameters.HighlightedElement highlightedElement, @ColorInt int highlightTint, @ColorInt int backgroundTint);
+    method @ColorInt public int getBackgroundTint();
+    method @ColorInt public int getHighlightTint();
+    method public androidx.wear.watchface.RenderParameters.HighlightedElement getHighlightedElement();
+    property @ColorInt public final int backgroundTint;
+    property @ColorInt public final int highlightTint;
+    property public final androidx.wear.watchface.RenderParameters.HighlightedElement highlightedElement;
+  }
+
+  public abstract static sealed class RenderParameters.HighlightedElement {
+  }
+
+  public static final class RenderParameters.HighlightedElement.AllComplicationSlots extends androidx.wear.watchface.RenderParameters.HighlightedElement {
+    field public static final androidx.wear.watchface.RenderParameters.HighlightedElement.AllComplicationSlots INSTANCE;
+  }
+
+  public static final class RenderParameters.HighlightedElement.ComplicationSlot extends androidx.wear.watchface.RenderParameters.HighlightedElement {
+    ctor public RenderParameters.HighlightedElement.ComplicationSlot(int id);
+    method public int getId();
+    property public final int id;
+  }
+
+  public static final class RenderParameters.HighlightedElement.UserStyle extends androidx.wear.watchface.RenderParameters.HighlightedElement {
+    ctor public RenderParameters.HighlightedElement.UserStyle(androidx.wear.watchface.style.UserStyleSetting.Id id);
+    method public androidx.wear.watchface.style.UserStyleSetting.Id getId();
+    property public final androidx.wear.watchface.style.UserStyleSetting.Id id;
+  }
+
+  public abstract sealed class Renderer {
+    method public final java.util.Collection<kotlin.Pair<java.lang.Integer,androidx.wear.watchface.ContentDescriptionLabel>> getAdditionalContentDescriptionLabels();
+    method public final float getCenterX();
+    method public final float getCenterY();
+    method public final long getInteractiveDrawModeUpdateDelayMillis();
+    method @UiThread public android.graphics.Rect getMainClockElementBounds();
+    method public final androidx.wear.watchface.RenderParameters getRenderParameters();
+    method public final android.graphics.Rect getScreenBounds();
+    method public final android.view.SurfaceHolder getSurfaceHolder();
+    method @UiThread public final void invalidate();
+    method @UiThread public void onDestroy();
+    method @UiThread public abstract void onDump(java.io.PrintWriter writer);
+    method @UiThread protected void onRenderParametersChanged(androidx.wear.watchface.RenderParameters renderParameters);
+    method public final void postInvalidate();
+    method public final void setAdditionalContentDescriptionLabels(java.util.Collection<kotlin.Pair<java.lang.Integer,androidx.wear.watchface.ContentDescriptionLabel>> value);
+    method public final void setInteractiveDrawModeUpdateDelayMillis(long interactiveDrawModeUpdateDelayMillis);
+    method @UiThread public boolean shouldAnimate();
+    property public final java.util.Collection<kotlin.Pair<java.lang.Integer,androidx.wear.watchface.ContentDescriptionLabel>> additionalContentDescriptionLabels;
+    property public final float centerX;
+    property public final float centerY;
+    property public final long interactiveDrawModeUpdateDelayMillis;
+    property public final androidx.wear.watchface.RenderParameters renderParameters;
+    property public final android.graphics.Rect screenBounds;
+    property public final android.view.SurfaceHolder surfaceHolder;
+  }
+
+  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 suspend Object? init(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public void onDump(java.io.PrintWriter writer);
+    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);
+  }
+
+  public abstract static class Renderer.GlesRenderer extends androidx.wear.watchface.Renderer {
+    ctor @WorkerThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(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) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
+    ctor @WorkerThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(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) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
+    ctor @WorkerThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
+    method public final android.opengl.EGLContext getEglBackgroundThreadContext();
+    method public final android.opengl.EGLConfig getEglConfig();
+    method public final android.opengl.EGLDisplay getEglDisplay();
+    method public final android.opengl.EGLContext getEglUiThreadContext();
+    method @WorkerThread public suspend Object? onBackgroundThreadGlContextCreated(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public void onDump(java.io.PrintWriter writer);
+    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 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;
+    property public final android.opengl.EGLConfig eglConfig;
+    property public final android.opengl.EGLDisplay eglDisplay;
+    property public final android.opengl.EGLContext eglUiThreadContext;
+  }
+
+  public static final class Renderer.GlesRenderer.GlesException extends java.lang.Exception {
+    ctor public Renderer.GlesRenderer.GlesException(String message);
+  }
+
+  public final class RendererKt {
+  }
+
+  public final class RoundRectComplicationTapFilter implements androidx.wear.watchface.ComplicationTapFilter {
+    ctor public RoundRectComplicationTapFilter();
+    method public boolean hitTest(androidx.wear.watchface.ComplicationSlot complicationSlot, android.graphics.Rect screenBounds, @Px int x, @Px int y);
+  }
+
+  public final class TapEvent {
+    ctor public TapEvent(@Px int xPos, @Px int yPos, java.time.Instant tapTime);
+    method public java.time.Instant getTapTime();
+    method public int getXPos();
+    method public int getYPos();
+    property public final java.time.Instant tapTime;
+    property public final int xPos;
+    property public final int yPos;
+  }
+
+  public final class WatchFace {
+    ctor public WatchFace(int watchFaceType, androidx.wear.watchface.Renderer renderer);
+    method public androidx.wear.watchface.WatchFace.LegacyWatchFaceOverlayStyle getLegacyWatchFaceStyle();
+    method public java.time.Instant? getOverridePreviewReferenceInstant();
+    method public androidx.wear.watchface.Renderer getRenderer();
+    method public int getWatchFaceType();
+    method public static boolean isLegacyWatchFaceOverlayStyleSupported();
+    method public androidx.wear.watchface.WatchFace setLegacyWatchFaceStyle(androidx.wear.watchface.WatchFace.LegacyWatchFaceOverlayStyle legacyWatchFaceStyle);
+    method public androidx.wear.watchface.WatchFace setOverridePreviewReferenceInstant(java.time.Instant previewReferenceTimeMillis);
+    method public androidx.wear.watchface.WatchFace setTapListener(androidx.wear.watchface.WatchFace.TapListener? tapListener);
+    method public void setWatchFaceType(int watchFaceType);
+    property public final androidx.wear.watchface.WatchFace.LegacyWatchFaceOverlayStyle legacyWatchFaceStyle;
+    property public final java.time.Instant? overridePreviewReferenceInstant;
+    property public final androidx.wear.watchface.Renderer renderer;
+    property public final int watchFaceType;
+    field public static final androidx.wear.watchface.WatchFace.Companion Companion;
+  }
+
+  public static final class WatchFace.Companion {
+    method public boolean isLegacyWatchFaceOverlayStyleSupported();
+  }
+
+  public static final class WatchFace.LegacyWatchFaceOverlayStyle {
+    ctor public WatchFace.LegacyWatchFaceOverlayStyle(int viewProtectionMode, int statusBarGravity, boolean tapEventsAccepted, optional @ColorInt int accentColor);
+    ctor public WatchFace.LegacyWatchFaceOverlayStyle(int viewProtectionMode, int statusBarGravity, boolean tapEventsAccepted);
+    method public int getAccentColor();
+    method public int getStatusBarGravity();
+    method public boolean getTapEventsAccepted();
+    method public int getViewProtectionMode();
+    property public final int accentColor;
+    property public final int statusBarGravity;
+    property public final boolean tapEventsAccepted;
+    property public final int viewProtectionMode;
+  }
+
+  public static interface WatchFace.TapListener {
+    method @UiThread public void onTapEvent(int tapType, androidx.wear.watchface.TapEvent tapEvent, androidx.wear.watchface.ComplicationSlot? complicationSlot);
+  }
+
+  public final class WatchFaceKt {
+  }
+
+  public abstract class WatchFaceService extends android.service.wallpaper.WallpaperService {
+    ctor public WatchFaceService();
+    method @WorkerThread protected androidx.wear.watchface.ComplicationSlotsManager createComplicationSlotsManager(androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository);
+    method @WorkerThread protected androidx.wear.watchface.style.UserStyleSchema createUserStyleSchema();
+    method @WorkerThread protected abstract 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);
+    method public final android.os.Handler getBackgroundThreadHandler();
+    method public final android.os.Handler getUiThreadHandler();
+    method public final android.service.wallpaper.WallpaperService.Engine onCreateEngine();
+    field public static final androidx.wear.watchface.WatchFaceService.Companion Companion;
+    field public static final int MAX_CREATE_WATCHFACE_TIME_MILLIS = 5000; // 0x1388
+  }
+
+  public static final class WatchFaceService.Companion {
+  }
+
+  public final class WatchFaceServiceKt {
+  }
+
+  public final class WatchState {
+    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 kotlinx.coroutines.flow.StateFlow<java.lang.Integer> getInterruptionFilter();
+    method public kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isAmbient();
+    method public boolean isHeadless();
+    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 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 kotlinx.coroutines.flow.StateFlow<java.lang.Boolean> isVisible;
+  }
+
+}
+
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/BroadcastsObserver.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/BroadcastsObserver.kt
index eead284..34e1442 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/BroadcastsObserver.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/BroadcastsObserver.kt
@@ -31,6 +31,8 @@
     private val deferredWatchFaceImpl: Deferred<WatchFaceImpl>,
     private val uiThreadCoroutineScope: CoroutineScope
 ) : BroadcastsReceiver.BroadcastEventObserver {
+    private var batteryLow: Boolean? = null
+    private var charging: Boolean? = null
 
     override fun onActionTimeTick() {
         if (!watchState.isAmbient.value!!) {
@@ -51,17 +53,29 @@
     }
 
     override fun onActionBatteryLow() {
-        updateBatteryLowAndNotChargingStatus(true)
+        batteryLow = true
+        if (charging == false) {
+            updateBatteryLowAndNotChargingStatus(true)
+        }
     }
 
     override fun onActionBatteryOkay() {
+        batteryLow = false
         updateBatteryLowAndNotChargingStatus(false)
     }
 
     override fun onActionPowerConnected() {
+        charging = true
         updateBatteryLowAndNotChargingStatus(false)
     }
 
+    override fun onActionPowerDisconnected() {
+        charging = false
+        if (batteryLow == true) {
+            updateBatteryLowAndNotChargingStatus(true)
+        }
+    }
+
     override fun onMockTime(intent: Intent) {
         uiThreadCoroutineScope.launch {
             deferredWatchFaceImpl.await().onMockTime(intent)
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/BroadcastsReceiver.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/BroadcastsReceiver.kt
index 38d60a5..6411050 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/BroadcastsReceiver.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/BroadcastsReceiver.kt
@@ -20,8 +20,10 @@
 import android.content.Context
 import android.content.Intent
 import android.content.IntentFilter
+import android.os.BatteryManager
 import androidx.annotation.RestrictTo
 import androidx.annotation.UiThread
+import androidx.wear.watchface.BroadcastsReceiver.BroadcastEventObserver
 
 /**
  * This class decouples [BroadcastEventObserver]s from the actual broadcast event receivers to make
@@ -59,11 +61,23 @@
         @UiThread
         public fun onActionPowerConnected()
 
+        /** Called when we receive [Intent.ACTION_POWER_DISCONNECTED]. */
+        @UiThread
+        public fun onActionPowerDisconnected()
+
         /** Called when we receive [WatchFaceImpl.MOCK_TIME_INTENT]. */
         @UiThread
         public fun onMockTime(intent: Intent)
     }
 
+    companion object {
+        // The threshold used to judge whether the battery is low during initialization.  Ideally
+        // we would use the threshold for Intent.ACTION_BATTERY_LOW but it's not documented or
+        // available programmatically. The value below is the default but it could be overridden
+        // by OEMs.
+        internal const val INITIAL_LOW_BATTERY_THRESHOLD = 15f
+    }
+
     internal val actionTimeTickReceiver: BroadcastReceiver = object : BroadcastReceiver() {
         @SuppressWarnings("SyntheticAccessor")
         override fun onReceive(context: Context, intent: Intent) {
@@ -104,6 +118,13 @@
         }
     }
 
+    internal val actionPowerDisconnectedReceiver: BroadcastReceiver = object : BroadcastReceiver() {
+        @SuppressWarnings("SyntheticAccessor")
+        override fun onReceive(context: Context, intent: Intent) {
+            observer.onActionPowerDisconnected()
+        }
+    }
+
     internal val mockTimeReceiver: BroadcastReceiver = object : BroadcastReceiver() {
         @SuppressWarnings("SyntheticAccessor")
         override fun onReceive(context: Context, intent: Intent) {
@@ -127,9 +148,35 @@
             actionPowerConnectedReceiver,
             IntentFilter(Intent.ACTION_POWER_CONNECTED)
         )
+        context.registerReceiver(
+            actionPowerDisconnectedReceiver,
+            IntentFilter(Intent.ACTION_POWER_DISCONNECTED)
+        )
         context.registerReceiver(mockTimeReceiver, IntentFilter(WatchFaceImpl.MOCK_TIME_INTENT))
     }
 
+    /** Called to send observers initial battery state in advance of receiving any broadcasts. */
+    internal fun processBatteryStatus(batteryStatus: Intent?) {
+        val status = batteryStatus?.getIntExtra(BatteryManager.EXTRA_STATUS, -1) ?: -1
+        if (status == BatteryManager.BATTERY_STATUS_CHARGING ||
+            status == BatteryManager.BATTERY_STATUS_FULL) {
+            observer.onActionPowerConnected()
+        } else {
+            observer.onActionPowerDisconnected()
+        }
+
+        val batteryPercent: Float = batteryStatus?.let { intent ->
+            val level: Int = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
+            val scale: Int = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1)
+            level * 100 / scale.toFloat()
+        } ?: 100.0f
+        if (batteryPercent < INITIAL_LOW_BATTERY_THRESHOLD) {
+            observer.onActionBatteryLow()
+        } else {
+            observer.onActionBatteryOkay()
+        }
+    }
+
     public fun onDestroy() {
         context.unregisterReceiver(actionTimeTickReceiver)
         context.unregisterReceiver(actionTimeZoneReceiver)
@@ -139,4 +186,4 @@
         context.unregisterReceiver(actionPowerConnectedReceiver)
         context.unregisterReceiver(mockTimeReceiver)
     }
-}
\ No newline at end of file
+}
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFace.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFace.kt
index c3b16a6..f3f9d7f 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFace.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFace.kt
@@ -21,11 +21,9 @@
 import android.content.ComponentName
 import android.content.Context
 import android.content.Intent
-import android.content.IntentFilter
 import android.graphics.Bitmap
 import android.graphics.Canvas
 import android.graphics.Rect
-import android.os.BatteryManager
 import android.os.Build
 import android.os.Bundle
 import android.os.Handler
@@ -57,7 +55,6 @@
 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
@@ -417,7 +414,7 @@
     @get:VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
     public var complicationSlotsManager: ComplicationSlotsManager,
 
-    private val broadcastsObserver: BroadcastsObserver,
+    internal val broadcastsObserver: BroadcastsObserver,
     internal var broadcastsReceiver: BroadcastsReceiver?
 ) {
     internal companion object {
@@ -446,12 +443,6 @@
         // clamp the framerate to a maximum of 10fps to conserve power.
         internal const val MAX_LOW_POWER_INTERACTIVE_UPDATE_RATE_MS = 100L
 
-        // The threshold used to judge whether the battery is low during initialization.  Ideally
-        // we would use the threshold for Intent.ACTION_BATTERY_LOW but it's not documented or
-        // available programmatically. The value below is the default but it could be overridden
-        // by OEMs.
-        internal const val INITIAL_LOW_BATTERY_THRESHOLD = 15.0f
-
         // Number of milliseconds before the target draw time for the delayed task to run and post a
         // choreographer frame. This is necessary when rendering at less than 60 fps to make sure we
         // post the choreographer frame in time to for us to render in the desired frame.
@@ -502,6 +493,7 @@
 
     // True if 'Do Not Disturb' mode is on.
     private var muteMode = false
+    internal var lastDrawTimeMillis: Long = 0
     internal var nextDrawTimeMillis: Long = 0
 
     private val pendingUpdateTime: CancellableUniqueTask =
@@ -616,12 +608,6 @@
             watchFaceHostApi.updateContentDescriptionLabels()
         }
 
-        setIsBatteryLowAndNotChargingFromBatteryStatus(
-            IntentFilter(Intent.ACTION_BATTERY_CHANGED).let { iFilter ->
-                watchFaceHostApi.getContext().registerReceiver(null, iFilter)
-            }
-        )
-
         if (!watchState.isHeadless) {
             WatchFace.registerEditorDelegate(componentName, WFEditorDelegate())
         }
@@ -735,20 +721,6 @@
         }
     }
 
-    internal fun setIsBatteryLowAndNotChargingFromBatteryStatus(batteryStatus: Intent?) {
-        val status = batteryStatus?.getIntExtra(BatteryManager.EXTRA_STATUS, -1) ?: -1
-        val isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
-            status == BatteryManager.BATTERY_STATUS_FULL
-        val batteryPercent: Float = batteryStatus?.let { intent ->
-            val level: Int = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
-            val scale: Int = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1)
-            level * 100 / scale.toFloat()
-        } ?: 100.0f
-        val isBatteryLowAndNotCharging = watchState.isBatteryLowAndNotCharging as MutableStateFlow
-        isBatteryLowAndNotCharging.value =
-            (batteryPercent < INITIAL_LOW_BATTERY_THRESHOLD) && !isCharging
-    }
-
     /** Called by the system in response to remote configuration. */
     @UiThread
     internal fun onSetStyleInternal(style: UserStyle) {
@@ -838,6 +810,7 @@
         val startTimeMillis = startTime.toInstant().toEpochMilli()
         maybeUpdateDrawMode()
         renderer.renderInternal(startTime)
+        lastDrawTimeMillis = startTimeMillis
 
         if (renderer.shouldAnimate()) {
             val currentTimeMillis = systemTimeProvider.getSystemTimeMillis()
@@ -1092,12 +1065,13 @@
         writer.println("mockTime.maxTime=${mockTime.maxTime}")
         writer.println("mockTime.minTime=${mockTime.minTime}")
         writer.println("mockTime.speed=${mockTime.speed}")
+        writer.println("lastDrawTimeMillis=$lastDrawTimeMillis")
         writer.println("nextDrawTimeMillis=$nextDrawTimeMillis")
         writer.println("muteMode=$muteMode")
         writer.println("pendingUpdateTime=${pendingUpdateTime.isPending()}")
         writer.println("lastTappedComplicationId=$lastTappedComplicationId")
         writer.println(
-            "currentUserStyleRepository.userStyle=${currentUserStyleRepository.userStyle}"
+            "currentUserStyleRepository.userStyle=${currentUserStyleRepository.userStyle.value}"
         )
         writer.println("currentUserStyleRepository.schema=${currentUserStyleRepository.schema}")
         watchState.dump(writer)
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt
index 5be8275..8871cb0 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt
@@ -20,6 +20,7 @@
 import android.content.ComponentName
 import android.content.Context
 import android.content.Intent
+import android.content.IntentFilter
 import android.graphics.Canvas
 import android.graphics.Rect
 import android.os.Build
@@ -326,8 +327,24 @@
      */
     internal open fun expectPreRInitFlow() = Build.VERSION.SDK_INT < Build.VERSION_CODES.R
 
+    /** [Choreographer] isn't supposed to be mocked, so we use a thin wrapper. */
+    internal interface ChoreographerWrapper {
+        fun postFrameCallback(callback: Choreographer.FrameCallback)
+        fun removeFrameCallback(callback: Choreographer.FrameCallback)
+    }
+
     /** This is open to allow mocking. */
-    internal open fun getChoreographer(): Choreographer = Choreographer.getInstance()
+    internal open fun getChoreographer(): ChoreographerWrapper = object : ChoreographerWrapper {
+        private val choreographer = Choreographer.getInstance()
+
+        override fun postFrameCallback(callback: Choreographer.FrameCallback) {
+            choreographer.postFrameCallback(callback)
+        }
+
+        override fun removeFrameCallback(callback: Choreographer.FrameCallback) {
+            choreographer.removeFrameCallback(callback)
+        }
+    }
 
     /**
      * This is open for use by tests, it allows them to inject a custom [SurfaceHolder].
@@ -711,7 +728,7 @@
 
         internal lateinit var ambientUpdateWakelock: PowerManager.WakeLock
 
-        private lateinit var choreographer: Choreographer
+        private lateinit var choreographer: ChoreographerWrapper
 
         /**
          * Whether we already have a [frameCallback] posted and waiting in the [Choreographer]
@@ -849,32 +866,38 @@
             if (pendingWallpaperInstance != null) {
                 val asyncTraceEvent =
                     AsyncTraceEvent("Create PendingWallpaperInteractiveWatchFaceInstance")
-                try {
-                    pendingWallpaperInstance.callback.onInteractiveWatchFaceCreated(
-                        createInteractiveInstance(
-                            pendingWallpaperInstance.params,
-                            "Boot with pendingWallpaperInstance"
-                        )
+                val instance: InteractiveWatchFaceImpl? = try {
+                    val instance = createInteractiveInstance(
+                        pendingWallpaperInstance.params,
+                        "Boot with pendingWallpaperInstance"
                     )
+                    pendingWallpaperInstance.callback.onInteractiveWatchFaceCreated(instance)
+                    instance
                 } catch (e: Exception) {
                     pendingWallpaperInstance.callback.onInteractiveWatchFaceCrashed(
                         CrashInfoParcel(e)
                     )
+                    null
                 }
                 asyncTraceEvent.close()
                 val params = pendingWallpaperInstance.params
                 directBootParams = params
-                // We don't want to display complications in direct boot mode so replace with an
-                // empty list. NB we can't actually serialise complications anyway so that's just as
-                // well...
-                params.idAndComplicationDataWireFormats = emptyList()
 
                 // Writing even small amounts of data to storage is quite slow and if we did
                 // that immediately, we'd delay the first frame which is rendered via
                 // onSurfaceRedrawNeeded. By posting this task we expedite first frame
                 // rendering. There is a small window where the direct boot could be stale if
                 // the watchface crashed but this seems unlikely in practice.
-                backgroundThreadHandler.post {
+                backgroundThreadCoroutineScope.launch {
+                    // Wait for init to complete before writing the direct boot prefs, or we might
+                    // sneak in before higher priority init tasks.
+                    instance?.engine?.deferredWatchFaceImpl?.await()
+
+                    // We don't want to display complications in direct boot mode so replace with an
+                    // empty list. NB we can't actually serialise complications anyway so that's
+                    // just as well...
+                    params.idAndComplicationDataWireFormats = emptyList()
+
                     writeDirectBootPrefs(_context, DIRECT_BOOT_PREFS, params)
                 }
             }
@@ -934,7 +957,7 @@
             // list. NB we can't actually serialise complications anyway so that's just as well...
             params.idAndComplicationDataWireFormats = emptyList()
 
-            backgroundThreadHandler.post {
+            backgroundThreadCoroutineScope.launch {
                 writeDirectBootPrefs(_context, DIRECT_BOOT_PREFS, params)
             }
         }
@@ -1093,6 +1116,8 @@
 
         @UiThread
         override fun onDestroy(): Unit = TraceEvent("EngineWrapper.onDestroy").use {
+            super.onDestroy()
+
             destroyed = true
             backgroundThreadCoroutineScope.cancel()
             quitBackgroundThreadIfCreated()
@@ -1100,14 +1125,31 @@
             if (this::choreographer.isInitialized) {
                 choreographer.removeFrameCallback(frameCallback)
             }
-            // The WatchFaceImpl is created on the UiThread so if we get here and it's not crated we
-            // can be sure it'll never be created hence we don't need to destroy.
-            getWatchFaceImplOrNull()?.onDestroy()
             if (this::interactiveInstanceId.isInitialized) {
                 InteractiveInstanceManager.deleteInstance(interactiveInstanceId)
             }
 
-            super.onDestroy()
+            // NB user code could throw an exception so do this last.
+            runBlocking {
+                try {
+                    // The WatchFaceImpl is created on the UiThread so if we get here and it's not
+                    // created we can be sure it'll never be created hence we don't need to destroy
+                    // it.
+                    if (deferredWatchFaceImpl.isCompleted) {
+                        deferredWatchFaceImpl.await().onDestroy()
+                    } else if (deferredRendererAndComplicationManager.isCompleted) {
+                        // However we should destroy the renderer if its been created.
+                        deferredRendererAndComplicationManager.await().renderer.onDestroy()
+                    }
+                } catch (e: Exception) {
+                    // Throwing an exception here leads to a cascade of errors, log instead.
+                    Log.e(
+                        TAG,
+                        "WatchFace exception observed in onDestroy (may have occurred during init)",
+                        e
+                    )
+                }
+            }
         }
 
         override fun onSurfaceDestroyed(holder: SurfaceHolder) {
@@ -1496,7 +1538,13 @@
                 if (watchState.isHeadless) {
                     null
                 } else {
-                    BroadcastsReceiver(_context, broadcastsObserver)
+                    BroadcastsReceiver(_context, broadcastsObserver).apply {
+                        processBatteryStatus(
+                            IntentFilter(Intent.ACTION_BATTERY_CHANGED).let { iFilter ->
+                                _context.registerReceiver(null, iFilter)
+                            }
+                        )
+                    }
                 }
             }
 
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchState.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchState.kt
index 50e9400..e92e399 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchState.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchState.kt
@@ -76,10 +76,10 @@
     internal fun dump(writer: IndentingPrintWriter) {
         writer.println("WatchState:")
         writer.increaseIndent()
-        writer.println("interruptionFilter=$interruptionFilter")
-        writer.println("isAmbient=$isAmbient")
-        writer.println("isBatteryLowAndNotCharging=$isBatteryLowAndNotCharging")
-        writer.println("isVisible=$isVisible")
+        writer.println("interruptionFilter=${interruptionFilter.value}")
+        writer.println("isAmbient=${isAmbient.value}")
+        writer.println("isBatteryLowAndNotCharging=${isBatteryLowAndNotCharging.value}")
+        writer.println("isVisible=${isVisible.value}")
         writer.println("hasLowBitAmbient=$hasLowBitAmbient")
         writer.println("hasBurnInProtection=$hasBurnInProtection")
         writer.println("analogPreviewReferenceTimeMillis=$analogPreviewReferenceTimeMillis")
diff --git a/wear/watchface/watchface/src/test/java/androidx/wear/watchface/TestCommon.kt b/wear/watchface/watchface/src/test/java/androidx/wear/watchface/TestCommon.kt
index 4007607..4641ee1 100644
--- a/wear/watchface/watchface/src/test/java/androidx/wear/watchface/TestCommon.kt
+++ b/wear/watchface/watchface/src/test/java/androidx/wear/watchface/TestCommon.kt
@@ -28,7 +28,6 @@
 import android.support.wearable.watchface.IWatchFaceService
 import android.support.wearable.watchface.WatchFaceStyle
 import android.support.wearable.watchface.accessibility.ContentDescriptionLabel
-import android.view.Choreographer
 import android.view.SurfaceHolder
 import androidx.test.core.app.ApplicationProvider
 import androidx.wear.watchface.complications.data.toApiComplicationData
@@ -55,13 +54,13 @@
     private val tapListener: WatchFace.TapListener?,
     private val preAndroidR: Boolean,
     private val directBootParams: WallpaperInteractiveWatchFaceInstanceParams?,
-    private val choreographer: Choreographer
+    private val choreographer: ChoreographerWrapper,
+    var mockSystemTimeMillis: Long = 0L
 ) : WatchFaceService() {
     /** The ids of the [ComplicationSlot]s that have been tapped. */
     val tappedComplicationSlotIds: List<Int>
         get() = mutableTappedComplicationIds
     var complicationSelected: Int? = null
-    var mockSystemTimeMillis = 0L
     var mockZoneId: ZoneId = ZoneId.of("UTC")
     var renderer: TestRenderer? = null
 
diff --git a/wear/watchface/watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt b/wear/watchface/watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt
index b7acfd5..997edc1 100644
--- a/wear/watchface/watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt
+++ b/wear/watchface/watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt
@@ -78,6 +78,7 @@
 import androidx.wear.watchface.style.WatchFaceLayer
 import com.google.common.truth.Truth.assertThat
 import com.nhaarman.mockitokotlin2.mock
+import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.android.asCoroutineDispatcher
@@ -105,6 +106,7 @@
 import org.mockito.Mockito.validateMockitoUsage
 import org.mockito.Mockito.verify
 import org.robolectric.annotation.Config
+import java.io.StringWriter
 import java.time.Instant
 import java.util.ArrayDeque
 import java.util.PriorityQueue
@@ -130,7 +132,6 @@
     private val iWatchFaceService = mock<IWatchFaceService>()
     private val surfaceHolder = mock<SurfaceHolder>()
     private val tapListener = mock<WatchFace.TapListener>()
-    private val choreographer = mock<Choreographer>()
     private val watchState = MutableWatchState()
 
     init {
@@ -349,6 +350,29 @@
 
     private var looperTimeMillis = 0L
     private val pendingTasks = PriorityQueue<Task>()
+    private val choreographer = object : WatchFaceService.ChoreographerWrapper {
+        override fun postFrameCallback(callback: Choreographer.FrameCallback) {
+            // Simulate waiting for the next frame.
+            val nextFrameTimeMillis = looperTimeMillis + (16 - looperTimeMillis % 16)
+            pendingTasks.add(Task(nextFrameTimeMillis) { callback.doFrame(0) })
+        }
+
+        override fun removeFrameCallback(callback: Choreographer.FrameCallback) {
+            // Remove task from the priority queue.  There's no good way of doing this quickly.
+            val queue = ArrayDeque<Task>()
+            while (pendingTasks.isNotEmpty()) {
+                val task = pendingTasks.remove()
+                if (task.runnable != callback) {
+                    queue.add(task)
+                }
+            }
+
+            // Push filtered tasks back on the queue.
+            while (queue.isNotEmpty()) {
+                pendingTasks.add(queue.remove())
+            }
+        }
+    }
 
     private fun runPostedTasksFor(durationMillis: Long) {
         val stopTime = looperTimeMillis + durationMillis
@@ -481,7 +505,8 @@
             null,
             false,
             null,
-            choreographer
+            choreographer,
+            mockSystemTimeMillis = looperTimeMillis
         )
 
         InteractiveInstanceManager
@@ -587,29 +612,6 @@
                 Task(looperTimeMillis + it.arguments[1] as Long, it.arguments[0] as Runnable)
             )
         }.`when`(handler).postDelayed(any(), anyLong())
-
-        doAnswer {
-            // Simulate waiting for the next frame.
-            val nextFrameTimeMillis = looperTimeMillis + (16 - looperTimeMillis % 16)
-            val callback = it.arguments[0] as Choreographer.FrameCallback
-            pendingTasks.add(Task(nextFrameTimeMillis, { callback.doFrame(0) }))
-        }.`when`(choreographer).postFrameCallback(any())
-
-        doAnswer {
-            // Remove task from the priority queue.  There's no good way of doing this quickly.
-            val queue = ArrayDeque<Task>()
-            while (pendingTasks.isNotEmpty()) {
-                val task = pendingTasks.remove()
-                if (task.runnable != it.arguments[0]) {
-                    queue.add(task)
-                }
-            }
-
-            // Push filtered tasks back on the queue.
-            while (queue.isNotEmpty()) {
-                pendingTasks.add(queue.remove())
-            }
-        }.`when`(handler).removeCallbacks(any())
     }
 
     @After
@@ -2432,7 +2434,7 @@
     }
 
     @Test
-    public fun setIsBatteryLowAndNotChargingFromBatteryStatus() {
+    public fun isBatteryLowAndNotCharging_modified_by_broadcasts() {
         initWallpaperInteractiveWatchFaceInstance(
             WatchFaceType.ANALOG,
             emptyList(),
@@ -2451,7 +2453,41 @@
             )
         )
 
-        watchFaceImpl.setIsBatteryLowAndNotChargingFromBatteryStatus(
+        watchFaceImpl.broadcastsObserver.onActionPowerConnected()
+        watchFaceImpl.broadcastsObserver.onActionBatteryOkay()
+        assertFalse(watchState.isBatteryLowAndNotCharging.value!!)
+
+        watchFaceImpl.broadcastsObserver.onActionBatteryLow()
+        assertFalse(watchState.isBatteryLowAndNotCharging.value!!)
+
+        watchFaceImpl.broadcastsObserver.onActionPowerDisconnected()
+        assertTrue(watchState.isBatteryLowAndNotCharging.value!!)
+
+        watchFaceImpl.broadcastsObserver.onActionBatteryOkay()
+        assertFalse(watchState.isBatteryLowAndNotCharging.value!!)
+    }
+
+    @Test
+    public fun processBatteryStatus() {
+        initWallpaperInteractiveWatchFaceInstance(
+            WatchFaceType.ANALOG,
+            emptyList(),
+            UserStyleSchema(emptyList()),
+            WallpaperInteractiveWatchFaceInstanceParams(
+                "interactiveInstanceId",
+                DeviceConfig(
+                    false,
+                    false,
+                    0,
+                    0
+                ),
+                WatchUiState(false, 0),
+                UserStyle(emptyMap()).toWireFormat(),
+                null
+            )
+        )
+
+        watchFaceImpl.broadcastsReceiver!!.processBatteryStatus(
             Intent().apply {
                 putExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_DISCHARGING)
                 putExtra(BatteryManager.EXTRA_LEVEL, 0)
@@ -2460,7 +2496,7 @@
         )
         assertTrue(watchState.isBatteryLowAndNotCharging.value!!)
 
-        watchFaceImpl.setIsBatteryLowAndNotChargingFromBatteryStatus(
+        watchFaceImpl.broadcastsReceiver!!.processBatteryStatus(
             Intent().apply {
                 putExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_CHARGING)
                 putExtra(BatteryManager.EXTRA_LEVEL, 0)
@@ -2469,7 +2505,7 @@
         )
         assertFalse(watchState.isBatteryLowAndNotCharging.value!!)
 
-        watchFaceImpl.setIsBatteryLowAndNotChargingFromBatteryStatus(
+        watchFaceImpl.broadcastsReceiver!!.processBatteryStatus(
             Intent().apply {
                 putExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_DISCHARGING)
                 putExtra(BatteryManager.EXTRA_LEVEL, 80)
@@ -2478,10 +2514,10 @@
         )
         assertFalse(watchState.isBatteryLowAndNotCharging.value!!)
 
-        watchFaceImpl.setIsBatteryLowAndNotChargingFromBatteryStatus(Intent())
+        watchFaceImpl.broadcastsReceiver!!.processBatteryStatus(Intent())
         assertFalse(watchState.isBatteryLowAndNotCharging.value!!)
 
-        watchFaceImpl.setIsBatteryLowAndNotChargingFromBatteryStatus(null)
+        watchFaceImpl.broadcastsReceiver!!.processBatteryStatus(null)
         assertFalse(watchState.isBatteryLowAndNotCharging.value!!)
     }
 
@@ -3271,6 +3307,135 @@
         assertThat(unparceled.isInitiallyEnabled).isTrue()
     }
 
+    @Test
+    public fun renderer_onDestroy_called_even_if_init_not_complete() {
+        val initDeferred = CompletableDeferred<Unit>()
+        var onDestroyCalled = false
+        testWatchFaceService = TestWatchFaceService(
+            WatchFaceType.DIGITAL,
+            emptyList(),
+            { _, currentUserStyleRepository, watchState ->
+                renderer = object : TestRenderer(
+                    surfaceHolder,
+                    currentUserStyleRepository,
+                    watchState,
+                    INTERACTIVE_UPDATE_RATE_MS
+                ) {
+                    // Prevent initialization until initDeferred completes.
+                    override suspend fun init() {
+                        super.init()
+                        initDeferred.await()
+                    }
+
+                    override fun onDestroy() {
+                        super.onDestroy()
+                        onDestroyCalled = true
+                    }
+                }
+                renderer
+            },
+            UserStyleSchema(emptyList()),
+            watchState,
+            handler,
+            null,
+            false,
+            null,
+            choreographer
+        )
+
+        InteractiveInstanceManager
+            .getExistingInstanceOrSetPendingWallpaperInteractiveWatchFaceInstance(
+                InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
+                    WallpaperInteractiveWatchFaceInstanceParams(
+                        "TestID",
+                        DeviceConfig(
+                            false,
+                            false,
+                            0,
+                            0
+                        ),
+                        WatchUiState(false, 0),
+                        UserStyle(emptyMap()).toWireFormat(),
+                        emptyList()
+                    ),
+                    object : IPendingInteractiveWatchFace.Stub() {
+                        override fun getApiVersion() =
+                            IPendingInteractiveWatchFace.API_VERSION
+
+                        override fun onInteractiveWatchFaceCreated(
+                            iInteractiveWatchFace: IInteractiveWatchFace
+                        ) {
+                            interactiveWatchFaceInstance = iInteractiveWatchFace
+                        }
+
+                        override fun onInteractiveWatchFaceCrashed(exception: CrashInfoParcel?) {
+                            fail("WatchFace crashed: $exception")
+                        }
+                    }
+                )
+            )
+
+        engineWrapper = testWatchFaceService.onCreateEngine() as WatchFaceService.EngineWrapper
+        engineWrapper.onCreate(surfaceHolder)
+        engineWrapper.onSurfaceChanged(surfaceHolder, 0, 100, 100)
+        assertThat(engineWrapper.deferredWatchFaceImpl.isCompleted).isFalse()
+
+        engineWrapper.onDestroy()
+        assertThat(onDestroyCalled).isTrue()
+    }
+
+    @Test
+    public fun dump() {
+        // Advance time a little so timestamps are not zero
+        looperTimeMillis = 1000
+
+        initWallpaperInteractiveWatchFaceInstance(
+            WatchFaceType.ANALOG,
+            listOf(leftComplication, rightComplication),
+            UserStyleSchema(listOf(colorStyleSetting, watchHandStyleSetting)),
+            WallpaperInteractiveWatchFaceInstanceParams(
+                "TestID",
+                DeviceConfig(
+                    false,
+                    false,
+                    0,
+                    0
+                ),
+                WatchUiState(false, 0),
+                UserStyle(emptyMap()).toWireFormat(),
+                emptyList()
+            )
+        )
+
+        val writer = StringWriter()
+        val indentingPrintWriter = IndentingPrintWriter(writer)
+
+        engineWrapper.dump(indentingPrintWriter)
+
+        val dump = writer.toString()
+        // The full dump contains addresses that change from run to run, however these are a
+        // collection of sub strings we expect.
+        assertThat(dump).contains("Androidx style init flow")
+        assertThat(dump).contains("createdBy=Boot with pendingWallpaperInstanc")
+        assertThat(dump).contains("lastDrawTimeMillis=1000")
+        assertThat(dump).contains("nextDrawTimeMillis=1016")
+        assertThat(dump).contains("isHeadless=false")
+        assertThat(dump).contains(
+            "currentUserStyleRepository.userStyle=UserStyle[color_style_setting -> red_style, " +
+                "hand_style_setting -> classic_style]")
+        assertThat(dump).contains(
+            "currentUserStyleRepository.schema=[{color_style_setting : red_style, green_style, " +
+                "blue_style}, {hand_style_setting : classic_style, modern_style, gothic_style}]")
+        assertThat(dump).contains("ComplicationSlot 1000:")
+        assertThat(dump).contains("ComplicationSlot 1001:")
+        assertThat(dump).contains("screenBounds=Rect(0, 0 - 100, 100)")
+        assertThat(dump).contains("interactiveDrawModeUpdateDelayMillis=16")
+        assertThat(dump).contains("CanvasRenderer:")
+        assertThat(dump).contains("screenBounds=Rect(0, 0 - 100, 100)")
+        assertThat(dump).contains("interactiveDrawModeUpdateDelayMillis=16")
+        assertThat(dump).contains("watchFaceLayers=BASE, COMPLICATIONS, COMPLICATIONS_OVERLAY")
+    }
+
     @SuppressLint("NewApi")
     @Suppress("DEPRECATION")
     private fun getChinWindowInsetsApi25(@Px chinHeight: Int): WindowInsets =
diff --git a/wear/wear-phone-interactions/api/current.txt b/wear/wear-phone-interactions/api/current.txt
index 954d01a..787f956 100644
--- a/wear/wear-phone-interactions/api/current.txt
+++ b/wear/wear-phone-interactions/api/current.txt
@@ -26,6 +26,7 @@
 
   @RequiresApi(android.os.Build.VERSION_CODES.O) public final class CodeVerifier {
     ctor public CodeVerifier(optional int byteLength);
+    ctor public CodeVerifier();
     ctor public CodeVerifier(String value);
     method public String getValue();
     property public final String value;
diff --git a/wear/wear-phone-interactions/api/public_plus_experimental_current.txt b/wear/wear-phone-interactions/api/public_plus_experimental_current.txt
index 954d01a..787f956 100644
--- a/wear/wear-phone-interactions/api/public_plus_experimental_current.txt
+++ b/wear/wear-phone-interactions/api/public_plus_experimental_current.txt
@@ -26,6 +26,7 @@
 
   @RequiresApi(android.os.Build.VERSION_CODES.O) public final class CodeVerifier {
     ctor public CodeVerifier(optional int byteLength);
+    ctor public CodeVerifier();
     ctor public CodeVerifier(String value);
     method public String getValue();
     property public final String value;
diff --git a/wear/wear-phone-interactions/api/restricted_current.txt b/wear/wear-phone-interactions/api/restricted_current.txt
index 954d01a..787f956 100644
--- a/wear/wear-phone-interactions/api/restricted_current.txt
+++ b/wear/wear-phone-interactions/api/restricted_current.txt
@@ -26,6 +26,7 @@
 
   @RequiresApi(android.os.Build.VERSION_CODES.O) public final class CodeVerifier {
     ctor public CodeVerifier(optional int byteLength);
+    ctor public CodeVerifier();
     ctor public CodeVerifier(String value);
     method public String getValue();
     property public final String value;
diff --git a/wear/wear/src/androidTest/java/androidx/wear/widget/ConfirmationOverlayTest.java b/wear/wear/src/androidTest/java/androidx/wear/widget/ConfirmationOverlayTest.java
index 2063f3f..b732229 100644
--- a/wear/wear/src/androidTest/java/androidx/wear/widget/ConfirmationOverlayTest.java
+++ b/wear/wear/src/androidTest/java/androidx/wear/widget/ConfirmationOverlayTest.java
@@ -84,7 +84,7 @@
                 final Activity activity = setupActivity();
                 overlay.showOn(activity);
                 getOverlayViews(getContentView(activity));
-                assertEquals(View.GONE, mActualTextView.getVisibility());
+                assertEquals(View.VISIBLE, mActualTextView.getVisibility());
                 ConfirmationOverlay.OnAnimationFinishedListener onAnimationFinishedListener =
                         new ConfirmationOverlay.OnAnimationFinishedListener() {
                             @Override
@@ -109,7 +109,7 @@
 
         overlay.showAbove(mLinearLayout);
         getOverlayViews(mLinearLayout.getRootView());
-        assertEquals(View.GONE, mActualTextView.getVisibility());
+        assertEquals(View.VISIBLE, mActualTextView.getVisibility());
 
         overlay.hide();
         assertEquals(0, mLinearLayout.getChildCount());
diff --git a/wear/wear/src/main/java/androidx/wear/widget/ConfirmationOverlay.java b/wear/wear/src/main/java/androidx/wear/widget/ConfirmationOverlay.java
index 3c3b1d8..941344d 100644
--- a/wear/wear/src/main/java/androidx/wear/widget/ConfirmationOverlay.java
+++ b/wear/wear/src/main/java/androidx/wear/widget/ConfirmationOverlay.java
@@ -343,37 +343,33 @@
         TextView messageView =
                 overlayView.findViewById(R.id.wearable_support_confirmation_overlay_message);
 
-        if (!mMessage.toString().isEmpty()) {
-            int screenWidthPx = ResourcesUtil.getScreenWidthPx(context);
-            int screenHeightPx = ResourcesUtil.getScreenHeightPx(context);
-            int topMarginPx = ResourcesUtil.getFractionOfScreenPx(
-                    context, screenWidthPx, R.fraction.confirmation_overlay_margin_above_text);
-            int insetMarginPx = ResourcesUtil.getFractionOfScreenPx(
-                    context, screenWidthPx, R.fraction.confirmation_overlay_text_inset_margin);
+        int screenWidthPx = ResourcesUtil.getScreenWidthPx(context);
+        int screenHeightPx = ResourcesUtil.getScreenHeightPx(context);
+        int topMarginPx = ResourcesUtil.getFractionOfScreenPx(
+                context, screenWidthPx, R.fraction.confirmation_overlay_margin_above_text);
+        int insetMarginPx = ResourcesUtil.getFractionOfScreenPx(
+                context, screenWidthPx, R.fraction.confirmation_overlay_text_inset_margin);
 
-            MarginLayoutParams layoutParams = (MarginLayoutParams) messageView.getLayoutParams();
-            layoutParams.topMargin = topMarginPx;
-            layoutParams.leftMargin = insetMarginPx;
-            layoutParams.rightMargin = insetMarginPx;
-            layoutParams.bottomMargin = insetMarginPx;
+        MarginLayoutParams layoutParams = (MarginLayoutParams) messageView.getLayoutParams();
+        layoutParams.topMargin = topMarginPx;
+        layoutParams.leftMargin = insetMarginPx;
+        layoutParams.rightMargin = insetMarginPx;
+        layoutParams.bottomMargin = insetMarginPx;
 
-            messageView.setLayoutParams(layoutParams);
-            messageView.setText(mMessage);
-            messageView.setVisibility(View.VISIBLE);
+        messageView.setLayoutParams(layoutParams);
+        messageView.setText(mMessage);
+        messageView.setVisibility(View.VISIBLE);
 
-            // The icon should be centered in the screen where possible. If there's too much text
-            // though (which would overflow off the screen), it should push the icon up to make
-            // more space. We can do this by setting the minHeight of the text element such that it
-            // places the icon in the correct location. Since the LinearLayout has the gravity set
-            // to "bottom", this will cause the TextView to push the icon up to the correct place on
-            // screen.
-            int iconHeightPx = context.getResources().getDimensionPixelSize(
-                    R.dimen.confirmation_overlay_image_size);
-            messageView.setMinHeight(
-                    screenHeightPx / 2 - (iconHeightPx / 2) - insetMarginPx - topMarginPx);
-        } else {
-            messageView.setVisibility(View.GONE);
-        }
+        // The icon should be centered in the screen where possible. If there's too much text
+        // though (which would overflow off the screen), it should push the icon up to make
+        // more space. We can do this by setting the minHeight of the text element such that it
+        // places the icon in the correct location. Since the LinearLayout has the gravity set
+        // to "bottom", this will cause the TextView to push the icon up to the correct place on
+        // screen.
+        int iconHeightPx = context.getResources().getDimensionPixelSize(
+                R.dimen.confirmation_overlay_image_size);
+        messageView.setMinHeight(
+                screenHeightPx / 2 - (iconHeightPx / 2) - insetMarginPx - topMarginPx);
     }
 
     @MainThread
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/ServiceWorkerClientCompatTest.java b/webkit/webkit/src/androidTest/java/androidx/webkit/ServiceWorkerClientCompatTest.java
index 89ebf3e..9862fb9 100644
--- a/webkit/webkit/src/androidTest/java/androidx/webkit/ServiceWorkerClientCompatTest.java
+++ b/webkit/webkit/src/androidTest/java/androidx/webkit/ServiceWorkerClientCompatTest.java
@@ -25,6 +25,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.FlakyTest;
 import androidx.test.filters.MediumTest;
 
 import org.junit.After;
@@ -146,6 +147,7 @@
      * http://go/modifying-webview-cts.
      */
     // Test correct invocation of shouldInterceptRequest for Service Workers.
+    @FlakyTest(bugId = 203702777)
     @Test
     public void testServiceWorkerClientInterceptCallback() throws Exception {
         WebkitUtils.checkFeature(WebViewFeature.SERVICE_WORKER_BASIC_USAGE);
diff --git a/window/window-java/api/1.0.0-beta04.txt b/window/window-java/api/1.0.0-beta04.txt
new file mode 100644
index 0000000..8a28c39
--- /dev/null
+++ b/window/window-java/api/1.0.0-beta04.txt
@@ -0,0 +1,11 @@
+// Signature format: 4.0
+package androidx.window.java.layout {
+
+  public final class WindowInfoRepositoryCallbackAdapter implements androidx.window.layout.WindowInfoRepository {
+    ctor public WindowInfoRepositoryCallbackAdapter(androidx.window.layout.WindowInfoRepository repository);
+    method public void addWindowLayoutInfoListener(java.util.concurrent.Executor executor, androidx.core.util.Consumer<androidx.window.layout.WindowLayoutInfo> consumer);
+    method public void removeWindowLayoutInfoListener(androidx.core.util.Consumer<androidx.window.layout.WindowLayoutInfo> consumer);
+  }
+
+}
+
diff --git a/window/window-java/api/public_plus_experimental_1.0.0-beta04.txt b/window/window-java/api/public_plus_experimental_1.0.0-beta04.txt
new file mode 100644
index 0000000..8a28c39
--- /dev/null
+++ b/window/window-java/api/public_plus_experimental_1.0.0-beta04.txt
@@ -0,0 +1,11 @@
+// Signature format: 4.0
+package androidx.window.java.layout {
+
+  public final class WindowInfoRepositoryCallbackAdapter implements androidx.window.layout.WindowInfoRepository {
+    ctor public WindowInfoRepositoryCallbackAdapter(androidx.window.layout.WindowInfoRepository repository);
+    method public void addWindowLayoutInfoListener(java.util.concurrent.Executor executor, androidx.core.util.Consumer<androidx.window.layout.WindowLayoutInfo> consumer);
+    method public void removeWindowLayoutInfoListener(androidx.core.util.Consumer<androidx.window.layout.WindowLayoutInfo> consumer);
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/window/window-java/api/res-1.0.0-beta04.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to window/window-java/api/res-1.0.0-beta04.txt
diff --git a/window/window-java/api/restricted_1.0.0-beta04.txt b/window/window-java/api/restricted_1.0.0-beta04.txt
new file mode 100644
index 0000000..8a28c39
--- /dev/null
+++ b/window/window-java/api/restricted_1.0.0-beta04.txt
@@ -0,0 +1,11 @@
+// Signature format: 4.0
+package androidx.window.java.layout {
+
+  public final class WindowInfoRepositoryCallbackAdapter implements androidx.window.layout.WindowInfoRepository {
+    ctor public WindowInfoRepositoryCallbackAdapter(androidx.window.layout.WindowInfoRepository repository);
+    method public void addWindowLayoutInfoListener(java.util.concurrent.Executor executor, androidx.core.util.Consumer<androidx.window.layout.WindowLayoutInfo> consumer);
+    method public void removeWindowLayoutInfoListener(androidx.core.util.Consumer<androidx.window.layout.WindowLayoutInfo> consumer);
+  }
+
+}
+
diff --git a/window/window-rxjava2/api/1.0.0-beta04.txt b/window/window-rxjava2/api/1.0.0-beta04.txt
new file mode 100644
index 0000000..d8a00a0
--- /dev/null
+++ b/window/window-rxjava2/api/1.0.0-beta04.txt
@@ -0,0 +1,10 @@
+// Signature format: 4.0
+package androidx.window.rxjava2.layout {
+
+  public final class WindowInfoRepositoryRx {
+    method public static io.reactivex.Flowable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoFlowable(androidx.window.layout.WindowInfoRepository);
+    method public static io.reactivex.Observable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoObservable(androidx.window.layout.WindowInfoRepository);
+  }
+
+}
+
diff --git a/window/window-rxjava2/api/public_plus_experimental_1.0.0-beta04.txt b/window/window-rxjava2/api/public_plus_experimental_1.0.0-beta04.txt
new file mode 100644
index 0000000..d8a00a0
--- /dev/null
+++ b/window/window-rxjava2/api/public_plus_experimental_1.0.0-beta04.txt
@@ -0,0 +1,10 @@
+// Signature format: 4.0
+package androidx.window.rxjava2.layout {
+
+  public final class WindowInfoRepositoryRx {
+    method public static io.reactivex.Flowable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoFlowable(androidx.window.layout.WindowInfoRepository);
+    method public static io.reactivex.Observable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoObservable(androidx.window.layout.WindowInfoRepository);
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/window/window-rxjava2/api/res-1.0.0-beta04.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to window/window-rxjava2/api/res-1.0.0-beta04.txt
diff --git a/window/window-rxjava2/api/restricted_1.0.0-beta04.txt b/window/window-rxjava2/api/restricted_1.0.0-beta04.txt
new file mode 100644
index 0000000..d8a00a0
--- /dev/null
+++ b/window/window-rxjava2/api/restricted_1.0.0-beta04.txt
@@ -0,0 +1,10 @@
+// Signature format: 4.0
+package androidx.window.rxjava2.layout {
+
+  public final class WindowInfoRepositoryRx {
+    method public static io.reactivex.Flowable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoFlowable(androidx.window.layout.WindowInfoRepository);
+    method public static io.reactivex.Observable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoObservable(androidx.window.layout.WindowInfoRepository);
+  }
+
+}
+
diff --git a/window/window-rxjava3/api/1.0.0-beta04.txt b/window/window-rxjava3/api/1.0.0-beta04.txt
new file mode 100644
index 0000000..aafca43
--- /dev/null
+++ b/window/window-rxjava3/api/1.0.0-beta04.txt
@@ -0,0 +1,10 @@
+// Signature format: 4.0
+package androidx.window.rxjava3.layout {
+
+  public final class WindowInfoRepositoryRx {
+    method public static io.reactivex.rxjava3.core.Flowable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoFlowable(androidx.window.layout.WindowInfoRepository);
+    method public static io.reactivex.rxjava3.core.Observable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoObservable(androidx.window.layout.WindowInfoRepository);
+  }
+
+}
+
diff --git a/window/window-rxjava3/api/public_plus_experimental_1.0.0-beta04.txt b/window/window-rxjava3/api/public_plus_experimental_1.0.0-beta04.txt
new file mode 100644
index 0000000..aafca43
--- /dev/null
+++ b/window/window-rxjava3/api/public_plus_experimental_1.0.0-beta04.txt
@@ -0,0 +1,10 @@
+// Signature format: 4.0
+package androidx.window.rxjava3.layout {
+
+  public final class WindowInfoRepositoryRx {
+    method public static io.reactivex.rxjava3.core.Flowable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoFlowable(androidx.window.layout.WindowInfoRepository);
+    method public static io.reactivex.rxjava3.core.Observable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoObservable(androidx.window.layout.WindowInfoRepository);
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/window/window-rxjava3/api/res-1.0.0-beta04.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to window/window-rxjava3/api/res-1.0.0-beta04.txt
diff --git a/window/window-rxjava3/api/restricted_1.0.0-beta04.txt b/window/window-rxjava3/api/restricted_1.0.0-beta04.txt
new file mode 100644
index 0000000..aafca43
--- /dev/null
+++ b/window/window-rxjava3/api/restricted_1.0.0-beta04.txt
@@ -0,0 +1,10 @@
+// Signature format: 4.0
+package androidx.window.rxjava3.layout {
+
+  public final class WindowInfoRepositoryRx {
+    method public static io.reactivex.rxjava3.core.Flowable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoFlowable(androidx.window.layout.WindowInfoRepository);
+    method public static io.reactivex.rxjava3.core.Observable<androidx.window.layout.WindowLayoutInfo> windowLayoutInfoObservable(androidx.window.layout.WindowInfoRepository);
+  }
+
+}
+
diff --git a/window/window-samples/build.gradle b/window/window-samples/build.gradle
index 1a91038..5255f64 100644
--- a/window/window-samples/build.gradle
+++ b/window/window-samples/build.gradle
@@ -17,6 +17,7 @@
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
 import androidx.build.Publish
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
 plugins {
     id("AndroidXPlugin")
@@ -29,6 +30,9 @@
         applicationId "androidx.window.sample"
         minSdkVersion 23
     }
+    buildFeatures {
+        viewBinding true
+    }
 }
 
 dependencies {
@@ -40,8 +44,11 @@
     // TODO(b/152245564) Conflicting dependencies cause IDE errors.
     implementation("androidx.lifecycle:lifecycle-viewmodel:2.4.0-alpha02")
     implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.4.0-alpha02")
+    implementation "androidx.browser:browser:1.3.0"
+    implementation("androidx.startup:startup-runtime:1.1.0")
 
     implementation(project(":window:window"))
+    debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'
 }
 
 androidx {
@@ -52,3 +59,10 @@
     inceptionYear = "2020"
     description = "Demo of Jetpack WindowManager library APIs"
 }
+
+// Allow usage of Kotlin's @OptIn.
+tasks.withType(KotlinCompile).configureEach {
+    kotlinOptions {
+        freeCompilerArgs += ["-Xopt-in=kotlin.RequiresOptIn"]
+    }
+}
diff --git a/window/window-samples/src/main/AndroidManifest.xml b/window/window-samples/src/main/AndroidManifest.xml
index 12b0911..23b38e8 100644
--- a/window/window-samples/src/main/AndroidManifest.xml
+++ b/window/window-samples/src/main/AndroidManifest.xml
@@ -1,23 +1,19 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
   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.
   -->
-
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
     package="androidx.window.sample">
-
     <application
         android:allowBackup="true"
         android:label="@string/app_name"
@@ -35,11 +31,15 @@
             android:exported="false"
             android:label="@string/presentation" />
         <activity
-            android:name=".DisplayFeaturesActivity"
+            android:name=".DisplayFeaturesConfigChangeActivity"
             android:exported="false"
             android:configChanges=
                 "orientation|screenSize|screenLayout|screenSize|layoutDirection|smallestScreenSize"
-            android:label="@string/display_features" />
+            android:label="@string/display_features_config_change" />
+        <activity
+            android:name=".DisplayFeaturesNoConfigChangeActivity"
+            android:exported="false"
+            android:label="@string/display_features_no_config_change" />
         <activity
             android:name=".SplitLayoutActivity"
             android:exported="false"
@@ -48,6 +48,98 @@
             android:exported="false"
             android:configChanges="orientation|screenSize|screenLayout|screenSize"
             android:label="@string/window_metrics"/>
+        <activity
+            android:name=".embedding.SplitActivityA"
+            android:exported="true"
+            android:label="Split Main"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:taskAffinity="androidx.window.sample.manual_split_affinity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity
+            android:name=".embedding.SplitActivityB"
+            android:exported="false"
+            android:label="B"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:taskAffinity="androidx.window.sample.manual_split_affinity"/>
+        <activity
+            android:name=".embedding.SplitActivityC"
+            android:exported="false"
+            android:label="C"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:taskAffinity="androidx.window.sample.manual_split_affinity"/>
+        <activity
+            android:name=".embedding.SplitActivityD"
+            android:exported="false"
+            android:label="D"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:taskAffinity="androidx.window.sample.manual_split_affinity"/>
+        <activity
+            android:name=".embedding.SplitActivityE"
+            android:exported="false"
+            android:label="E"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:taskAffinity="androidx.window.sample.manual_split_affinity"/>
+        <activity
+            android:name=".embedding.SplitActivityF"
+            android:exported="false"
+            android:label="F"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:taskAffinity="androidx.window.sample.manual_split_affinity"/>
+        <activity
+            android:name=".embedding.SplitActivityPlaceholder"
+            android:exported="false"
+            android:label="Placeholder"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:taskAffinity="androidx.window.sample.manual_split_affinity"/>
+        <activity
+            android:name=".embedding.SplitActivityTrampoline"
+            android:exported="true"
+            android:label="Split Trampoline"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:taskAffinity="androidx.window.sample.trampoline_affinity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity-alias
+            android:name=".embedding.SplitActivityTrampolineTarget"
+            android:targetActivity=".embedding.SplitActivityA"/>
+        <activity
+            android:name=".embedding.SplitActivityList"
+            android:exported="true"
+            android:label="Split List"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:taskAffinity="androidx.window.sample.list_detail_split_affinity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity
+            android:name=".embedding.SplitActivityDetail"
+            android:exported="false"
+            android:label="Item detail"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:launchMode="singleTop"
+            android:taskAffinity="androidx.window.sample.list_detail_split_affinity"/>
+        <activity
+            android:name=".embedding.SplitActivityListPlaceholder"
+            android:exported="false"
+            android:label="Placeholder"
+            android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|colorMode|density|touchscreen"
+            android:taskAffinity="androidx.window.sample.list_detail_split_affinity" />
+        <provider android:name="androidx.startup.InitializationProvider"
+            android:authorities="${applicationId}.androidx-startup"
+            android:exported="false"
+            tools:node="merge">
+            <!-- This entry makes ExampleWindowInitializer discoverable. -->
+            <meta-data  android:name="androidx.window.sample.embedding.ExampleWindowInitializer"
+                android:value="androidx.startup" />
+        </provider>
     </application>
-
-</manifest>
\ No newline at end of file
+</manifest>
diff --git a/window/window-samples/src/main/java/androidx/window/sample/DisplayFeaturesActivity.kt b/window/window-samples/src/main/java/androidx/window/sample/DisplayFeaturesConfigChangeActivity.kt
similarity index 96%
rename from window/window-samples/src/main/java/androidx/window/sample/DisplayFeaturesActivity.kt
rename to window/window-samples/src/main/java/androidx/window/sample/DisplayFeaturesConfigChangeActivity.kt
index 2621e0c8..14b55b5 100644
--- a/window/window-samples/src/main/java/androidx/window/sample/DisplayFeaturesActivity.kt
+++ b/window/window-samples/src/main/java/androidx/window/sample/DisplayFeaturesConfigChangeActivity.kt
@@ -36,14 +36,14 @@
 import java.util.Locale
 
 /** Demo activity that shows all display features and current device state on the screen. */
-class DisplayFeaturesActivity : AppCompatActivity() {
+class DisplayFeaturesConfigChangeActivity : AppCompatActivity() {
 
     private val infoLogAdapter = InfoLogAdapter()
     private val displayFeatureViews = ArrayList<View>()
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_display_features)
+        setContentView(R.layout.activity_display_features_config_change)
         val recyclerView = findViewById<RecyclerView>(R.id.infoLogRecyclerView)
         recyclerView.adapter = infoLogAdapter
 
diff --git a/window/window-samples/src/main/java/androidx/window/sample/DisplayFeaturesActivity.kt b/window/window-samples/src/main/java/androidx/window/sample/DisplayFeaturesNoConfigChangeActivity.kt
similarity index 93%
copy from window/window-samples/src/main/java/androidx/window/sample/DisplayFeaturesActivity.kt
copy to window/window-samples/src/main/java/androidx/window/sample/DisplayFeaturesNoConfigChangeActivity.kt
index 2621e0c8..96da16f 100644
--- a/window/window-samples/src/main/java/androidx/window/sample/DisplayFeaturesActivity.kt
+++ b/window/window-samples/src/main/java/androidx/window/sample/DisplayFeaturesNoConfigChangeActivity.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 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.
@@ -35,15 +35,14 @@
 import java.util.Date
 import java.util.Locale
 
-/** Demo activity that shows all display features and current device state on the screen. */
-class DisplayFeaturesActivity : AppCompatActivity() {
+class DisplayFeaturesNoConfigChangeActivity : AppCompatActivity() {
 
     private val infoLogAdapter = InfoLogAdapter()
     private val displayFeatureViews = ArrayList<View>()
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_display_features)
+        setContentView(R.layout.activity_display_features_no_config_change)
         val recyclerView = findViewById<RecyclerView>(R.id.infoLogRecyclerView)
         recyclerView.adapter = infoLogAdapter
 
diff --git a/window/window-samples/src/main/java/androidx/window/sample/demos/WindowDemosActivity.kt b/window/window-samples/src/main/java/androidx/window/sample/demos/WindowDemosActivity.kt
index 84183a7..6b39067 100644
--- a/window/window-samples/src/main/java/androidx/window/sample/demos/WindowDemosActivity.kt
+++ b/window/window-samples/src/main/java/androidx/window/sample/demos/WindowDemosActivity.kt
@@ -19,9 +19,14 @@
 import android.os.Bundle
 import androidx.appcompat.app.AppCompatActivity
 import androidx.recyclerview.widget.RecyclerView
-import androidx.window.sample.DisplayFeaturesActivity
+import androidx.window.sample.DisplayFeaturesConfigChangeActivity
+import androidx.window.sample.DisplayFeaturesNoConfigChangeActivity
 import androidx.window.sample.PresentationActivity
 import androidx.window.sample.R
+import androidx.window.sample.R.string.display_features_config_change
+import androidx.window.sample.R.string.display_features_no_config_change
+import androidx.window.sample.R.string.show_all_display_features_config_change_description
+import androidx.window.sample.R.string.show_all_display_features_no_config_change_description
 import androidx.window.sample.SplitLayoutActivity
 import androidx.window.sample.WindowMetricsActivity
 
@@ -35,9 +40,14 @@
         setContentView(R.layout.activity_window_demos)
         val demoItems = listOf(
             DemoItem(
-                buttonTitle = getString(R.string.display_features),
-                description = getString(R.string.show_all_display_features_description),
-                clazz = DisplayFeaturesActivity::class.java
+                buttonTitle = getString(display_features_config_change),
+                description = getString(show_all_display_features_config_change_description),
+                clazz = DisplayFeaturesConfigChangeActivity::class.java
+            ),
+            DemoItem(
+                buttonTitle = getString(display_features_no_config_change),
+                description = getString(show_all_display_features_no_config_change_description),
+                clazz = DisplayFeaturesNoConfigChangeActivity::class.java
             ),
             DemoItem(
                 buttonTitle = getString(R.string.window_metrics),
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/ExampleWindowInitializer.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/ExampleWindowInitializer.kt
new file mode 100644
index 0000000..85b23b9
--- /dev/null
+++ b/window/window-samples/src/main/java/androidx/window/sample/embedding/ExampleWindowInitializer.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.window.sample.embedding
+
+import android.content.Context
+import androidx.startup.Initializer
+import androidx.window.core.ExperimentalWindowApi
+import androidx.window.embedding.SplitController
+import androidx.window.sample.R
+
+/**
+ * Initializes SplitController with a set of statically defined rules.
+ */
+@OptIn(ExperimentalWindowApi::class)
+class ExampleWindowInitializer : Initializer<SplitController> {
+    override fun create(context: Context): SplitController {
+        SplitController.initialize(context, R.xml.main_split_config)
+        return SplitController.getInstance()
+    }
+
+    override fun dependencies(): List<Class<out Initializer<*>>> {
+        return emptyList()
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityA.kt
similarity index 66%
copy from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt
copy to window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityA.kt
index e5bb607..20a8056 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt
+++ b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityA.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 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,13 +14,6 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.platform
+package androidx.window.sample.embedding
 
-import java.awt.Desktop
-import java.net.URI
-
-internal class DesktopUriHandler : UriHandler {
-    override fun openUri(uri: String) {
-        Desktop.getDesktop().browse(URI(uri))
-    }
-}
\ No newline at end of file
+open class SplitActivityA : SplitActivityBase()
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityB.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityB.kt
new file mode 100644
index 0000000..6791b5c
--- /dev/null
+++ b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityB.kt
@@ -0,0 +1,39 @@
+/*
+ * 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.sample.embedding
+
+import android.content.Intent
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import androidx.window.sample.R
+
+open class SplitActivityB : SplitActivityBase() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        findViewById<View>(R.id.root_split_activity_layout)
+            .setBackgroundColor(Color.parseColor("#fff3e0"))
+
+        if (intent.getBooleanExtra(EXTRA_LAUNCH_C_TO_SIDE, false)) {
+            startActivity(Intent(this, SplitActivityC::class.java))
+            // Make sure that the side activity is only launched once, as the activity may be
+            // recreated when the split bounds change and we need to avoid launching another
+            // instance.
+            intent.removeExtra(EXTRA_LAUNCH_C_TO_SIDE)
+        }
+    }
+}
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityBase.java b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityBase.java
new file mode 100644
index 0000000..4723567
--- /dev/null
+++ b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityBase.java
@@ -0,0 +1,306 @@
+/*
+ * 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.sample.embedding;
+
+import static android.app.PendingIntent.FLAG_IMMUTABLE;
+
+import android.app.Activity;
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.DisplayMetrics;
+import android.util.LayoutDirection;
+import android.util.Log;
+import android.util.TypedValue;
+import android.view.View;
+import android.widget.CompoundButton;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.util.Consumer;
+import androidx.window.core.ExperimentalWindowApi;
+import androidx.window.embedding.ActivityFilter;
+import androidx.window.embedding.ActivityRule;
+import androidx.window.embedding.EmbeddingRule;
+import androidx.window.embedding.SplitController;
+import androidx.window.embedding.SplitInfo;
+import androidx.window.embedding.SplitPairFilter;
+import androidx.window.embedding.SplitPairRule;
+import androidx.window.embedding.SplitPlaceholderRule;
+import androidx.window.sample.databinding.ActivitySplitActivityLayoutBinding;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import kotlin.OptIn;
+
+/**
+ * Sample showcase of split activity rules. Allows the user to select some split configuration
+ * options with checkboxes and launch activities with those options applied.
+ */
+@OptIn(markerClass = ExperimentalWindowApi.class)
+public class SplitActivityBase extends AppCompatActivity
+        implements CompoundButton.OnCheckedChangeListener {
+
+    private static final String TAG = "SplitActivityTest";
+    private static final float MIN_SPLIT_WIDTH_DP = 600f;
+    static final float SPLIT_RATIO = 0.3f;
+    static final String EXTRA_LAUNCH_C_TO_SIDE = "launch_c_to_side";
+
+    private SplitController mSplitController;
+    private SplitInfoCallback mCallback;
+
+    private ActivitySplitActivityLayoutBinding mViewBinding;
+
+    /**
+     * Flag indicating that the config is being updated from checkboxes changes in a loop.
+     */
+    private boolean mUpdatingConfigs;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mViewBinding = ActivitySplitActivityLayoutBinding.inflate(getLayoutInflater());
+        setContentView(mViewBinding.getRoot());
+
+        // Setup activity launch buttons.
+        mViewBinding.launchB.setOnClickListener((View v) ->
+                startActivity(new Intent(this, SplitActivityB.class)));
+        mViewBinding.launchBAndC.setOnClickListener((View v) -> {
+            Intent bStartIntent = new Intent(this, SplitActivityB.class);
+            bStartIntent.putExtra(EXTRA_LAUNCH_C_TO_SIDE, true);
+            startActivity(bStartIntent);
+        });
+        mViewBinding.launchE.setOnClickListener((View v) ->
+                startActivity(new Intent(this, SplitActivityE.class)));
+        mViewBinding.launchF.setOnClickListener((View v) ->
+                startActivity(new Intent(this, SplitActivityF.class)));
+        mViewBinding.launchFPendingIntent.setOnClickListener((View v) -> {
+            try {
+                PendingIntent.getActivity(this, 0, new Intent(this, SplitActivityF.class),
+                        FLAG_IMMUTABLE).send();
+            } catch (PendingIntent.CanceledException e) {
+                Log.e(TAG, e.getMessage());
+            }
+        });
+
+        // Listen for split configuration checkboxes to update the rules before launching
+        // activities.
+        mViewBinding.splitMainCheckBox.setOnCheckedChangeListener(this);
+        mViewBinding.usePlaceholderCheckBox.setOnCheckedChangeListener(this);
+        mViewBinding.splitBCCheckBox.setOnCheckedChangeListener(this);
+        mViewBinding.finishBCCheckBox.setOnCheckedChangeListener(this);
+        mViewBinding.fullscreenECheckBox.setOnCheckedChangeListener(this);
+        mViewBinding.splitWithFCheckBox.setOnCheckedChangeListener(this);
+
+        mSplitController = SplitController.Companion.getInstance();
+    }
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+        mCallback = new SplitInfoCallback();
+        mSplitController.addSplitListener(this, Runnable::run, mCallback);
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        mSplitController.removeSplitListener(mCallback);
+        mCallback = null;
+    }
+
+    class SplitInfoCallback implements Consumer<List<SplitInfo>> {
+        @Override
+        public void accept(List<SplitInfo> splitInfoList) {
+            updateCheckboxesFromCurrentConfig();
+        }
+    }
+
+    @Override
+    public void onCheckedChanged(@NonNull CompoundButton c, boolean isChecked) {
+        if (mUpdatingConfigs) {
+            return;
+        }
+        if (c.getId() == mViewBinding.splitBCCheckBox.getId()) {
+            if (isChecked) {
+                mViewBinding.finishBCCheckBox.setEnabled(true);
+            } else {
+                mViewBinding.finishBCCheckBox.setEnabled(false);
+                mViewBinding.finishBCCheckBox.setChecked(false);
+            }
+        }
+        updateRulesFromCheckboxes();
+    }
+
+    void updateCheckboxesFromCurrentConfig() {
+        mUpdatingConfigs = true;
+
+        SplitPairRule splitMainConfig = getRuleFor(SplitActivityA.class, null);
+        mViewBinding.splitMainCheckBox.setChecked(splitMainConfig != null);
+
+        SplitPlaceholderRule placeholderForBConfig = getPlaceholderRule(SplitActivityB.class);
+        mViewBinding.usePlaceholderCheckBox.setChecked(placeholderForBConfig != null);
+
+        SplitPairRule bAndCPairConfig = getRuleFor(SplitActivityB.class,
+                SplitActivityC.class);
+        mViewBinding.splitBCCheckBox.setChecked(bAndCPairConfig != null);
+        mViewBinding.finishBCCheckBox.setEnabled(bAndCPairConfig != null);
+        mViewBinding.finishBCCheckBox.setChecked(bAndCPairConfig != null
+                && bAndCPairConfig.getFinishPrimaryWithSecondary()
+                && bAndCPairConfig.getFinishSecondaryWithPrimary());
+
+        SplitPairRule fConfig = getRuleFor(null, SplitActivityF.class);
+        mViewBinding.splitWithFCheckBox.setChecked(fConfig != null);
+
+        ActivityRule configE = getRuleFor(SplitActivityE.class);
+        mViewBinding.fullscreenECheckBox.setChecked(configE != null && configE.getAlwaysExpand());
+
+        mUpdatingConfigs = false;
+    }
+
+    private SplitPairRule getRuleFor(Class<? extends Activity> a, Class<? extends Activity> b) {
+        Set<EmbeddingRule> currentRules = mSplitController.getSplitRules();
+        for (EmbeddingRule rule : currentRules) {
+            if (rule instanceof SplitPairRule && isRuleFor(a, b, (SplitPairRule) rule)) {
+                return (SplitPairRule) rule;
+            }
+        }
+        return null;
+    }
+
+    SplitPlaceholderRule getPlaceholderRule(Class<? extends Activity> a) {
+        Set<EmbeddingRule> currentRules = mSplitController.getSplitRules();
+        for (EmbeddingRule rule : currentRules) {
+            if (rule instanceof SplitPlaceholderRule
+                    && ((SplitPlaceholderRule) rule).getPlaceholderIntent().getComponent()
+                    .getClassName().equals(a.getName())) {
+                return (SplitPlaceholderRule) rule;
+            }
+        }
+        return null;
+    }
+
+    private ActivityRule getRuleFor(Class<? extends Activity> a) {
+        Set<EmbeddingRule> currentRules = mSplitController.getSplitRules();
+        for (EmbeddingRule rule : currentRules) {
+            if (rule instanceof ActivityRule && isRuleFor(a, (ActivityRule) rule)) {
+                return (ActivityRule) rule;
+            }
+        }
+        return null;
+    }
+
+    private boolean isRuleFor(Class<? extends Activity> a, Class<? extends Activity> b,
+            SplitPairRule pairConfig) {
+        return isRuleFor(a != null ? a.getName() : "*", b != null ? b.getName() : "*",
+                pairConfig);
+    }
+
+    private boolean isRuleFor(String primaryActivityName, String secondaryActivityName,
+            SplitPairRule pairConfig) {
+        for (SplitPairFilter filter : pairConfig.getFilters()) {
+            if (filter.getPrimaryActivityName().getClassName().contains(primaryActivityName)
+                    && filter.getSecondaryActivityName().getClassName()
+                    .contains(secondaryActivityName)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean isRuleFor(Class<? extends Activity> a, ActivityRule config) {
+        return isRuleFor(a != null ? a.getName() : "*", config);
+    }
+
+    private boolean isRuleFor(String activityName, ActivityRule config) {
+        for (ActivityFilter filter : config.getFilters()) {
+            if (filter.getComponentName().getClassName().contains(activityName)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private void updateRulesFromCheckboxes() {
+        int minSplitWidth = minSplitWidth();
+        mSplitController.clearRegisteredRules();
+
+        Set<SplitPairFilter> pairFilters = new HashSet<>();
+        pairFilters.add(new SplitPairFilter(componentName(SplitActivityA.class),
+                componentName("*"), null));
+        SplitPairRule rule = new SplitPairRule(pairFilters, false, false, true, minSplitWidth,
+                minSplitWidth, SPLIT_RATIO, LayoutDirection.LOCALE);
+        if (mViewBinding.splitMainCheckBox.isChecked()) {
+            mSplitController.registerRule(rule);
+        }
+
+        Set<ActivityFilter> activityFilters = new HashSet<>();
+        activityFilters.add(new ActivityFilter(componentName(SplitActivityB.class), null));
+        Intent intent = new Intent();
+        intent.setComponent(
+                componentName("androidx.window.sample.embedding.SplitActivityPlaceholder"));
+        SplitPlaceholderRule placeholderRule = new SplitPlaceholderRule(activityFilters, intent,
+                minSplitWidth, minSplitWidth, SPLIT_RATIO, LayoutDirection.LOCALE);
+        if (mViewBinding.usePlaceholderCheckBox.isChecked()) {
+            mSplitController.registerRule(placeholderRule);
+        }
+
+        pairFilters = new HashSet<>();
+        pairFilters.add(new SplitPairFilter(componentName(SplitActivityB.class),
+                componentName(SplitActivityC.class), null));
+        rule = new SplitPairRule(pairFilters, mViewBinding.finishBCCheckBox.isChecked(),
+                mViewBinding.finishBCCheckBox.isChecked(), true, minSplitWidth, minSplitWidth,
+                SPLIT_RATIO, LayoutDirection.LOCALE);
+        if (mViewBinding.splitBCCheckBox.isChecked()) {
+            mSplitController.registerRule(rule);
+        }
+
+        pairFilters = new HashSet<>();
+        pairFilters.add(new SplitPairFilter(componentName("androidx.window.*"),
+                componentName(SplitActivityF.class), null));
+        rule = new SplitPairRule(pairFilters, false, false, true, minSplitWidth, minSplitWidth,
+                SPLIT_RATIO, LayoutDirection.LOCALE);
+        if (mViewBinding.splitWithFCheckBox.isChecked()) {
+            mSplitController.registerRule(rule);
+        }
+
+        activityFilters = new HashSet<>();
+        activityFilters.add(new ActivityFilter(componentName(SplitActivityE.class), null));
+        ActivityRule activityRule = new ActivityRule(activityFilters, true);
+        if (mViewBinding.fullscreenECheckBox.isChecked()) {
+            mSplitController.registerRule(activityRule);
+        }
+    }
+
+    ComponentName componentName(Class<? extends Activity> activityClass) {
+        return new ComponentName(getPackageName(),
+                activityClass != null ? activityClass.getName() : "*");
+    }
+
+    ComponentName componentName(String className) {
+        return new ComponentName(getPackageName(), className);
+    }
+
+    int minSplitWidth() {
+        DisplayMetrics dm = getResources().getDisplayMetrics();
+        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, MIN_SPLIT_WIDTH_DP, dm);
+    }
+}
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityC.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityC.kt
new file mode 100644
index 0000000..413c6c3
--- /dev/null
+++ b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityC.kt
@@ -0,0 +1,30 @@
+/*
+ * 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.sample.embedding
+
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import androidx.window.sample.R
+
+open class SplitActivityC : SplitActivityBase() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        findViewById<View>(R.id.root_split_activity_layout)
+            .setBackgroundColor(Color.parseColor("#e8f5e9"))
+    }
+}
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityD.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityD.kt
new file mode 100644
index 0000000..9f919f0
--- /dev/null
+++ b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityD.kt
@@ -0,0 +1,30 @@
+/*
+ * 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.sample.embedding
+
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import androidx.window.sample.R
+
+open class SplitActivityD : SplitActivityBase() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        findViewById<View>(R.id.root_split_activity_layout)
+            .setBackgroundColor(Color.parseColor("#eeeeee"))
+    }
+}
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityDetail.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityDetail.kt
new file mode 100644
index 0000000..6c4897e
--- /dev/null
+++ b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityDetail.kt
@@ -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.window.sample.embedding
+
+import android.content.Intent
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import android.widget.TextView
+import androidx.appcompat.app.AppCompatActivity
+import androidx.window.sample.R
+
+open class SplitActivityDetail : AppCompatActivity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_split_activity_list_detail_layout)
+        findViewById<View>(R.id.root_split_activity_layout)
+            .setBackgroundColor(Color.parseColor("#fff3e0"))
+
+        findViewById<TextView>(R.id.item_detail_text)
+            .setText(intent.getStringExtra(EXTRA_SELECTED_ITEM))
+    }
+
+    override fun onNewIntent(intent: Intent?) {
+        super.onNewIntent(intent)
+
+        findViewById<TextView>(R.id.item_detail_text)
+            .setText(intent?.getStringExtra(EXTRA_SELECTED_ITEM))
+    }
+
+    companion object {
+        const val EXTRA_SELECTED_ITEM = "selected_item"
+    }
+}
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityE.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityE.kt
new file mode 100644
index 0000000..9960ef2
--- /dev/null
+++ b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityE.kt
@@ -0,0 +1,30 @@
+/*
+ * 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.sample.embedding
+
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import androidx.window.sample.R
+
+open class SplitActivityE : SplitActivityBase() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        findViewById<View>(R.id.root_split_activity_layout)
+            .setBackgroundColor(Color.parseColor("#ede7f6"))
+    }
+}
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityF.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityF.kt
new file mode 100644
index 0000000..3243e5d
--- /dev/null
+++ b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityF.kt
@@ -0,0 +1,30 @@
+/*
+ * 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.sample.embedding
+
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import androidx.window.sample.R
+
+open class SplitActivityF : SplitActivityBase() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        findViewById<View>(R.id.root_split_activity_layout)
+            .setBackgroundColor(Color.parseColor("#ffebee"))
+    }
+}
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityList.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityList.kt
new file mode 100644
index 0000000..ee11d63
--- /dev/null
+++ b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityList.kt
@@ -0,0 +1,76 @@
+/*
+ * 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.sample.embedding
+
+import android.content.Intent
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import android.widget.TextView
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.content.ContextCompat
+import androidx.core.util.Consumer
+import androidx.window.core.ExperimentalWindowApi
+import androidx.window.embedding.SplitController
+import androidx.window.embedding.SplitInfo
+import androidx.window.sample.R
+import androidx.window.sample.embedding.SplitActivityDetail.Companion.EXTRA_SELECTED_ITEM
+
+@OptIn(ExperimentalWindowApi::class)
+open class SplitActivityList : AppCompatActivity() {
+    lateinit var splitController: SplitController
+    val splitChangeListener = SplitStateChangeListener()
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_split_activity_list_layout)
+        findViewById<View>(R.id.root_split_activity_layout)
+            .setBackgroundColor(Color.parseColor("#e0f7fa"))
+
+        splitController = SplitController.getInstance()
+    }
+
+    open fun onItemClick(view: View) {
+        val text = (view as TextView).text ?: throw IllegalArgumentException()
+        val startIntent = Intent(this, SplitActivityDetail::class.java)
+        startIntent.putExtra(EXTRA_SELECTED_ITEM, text)
+        startActivity(startIntent)
+    }
+
+    override fun onStart() {
+        super.onStart()
+        splitController.addSplitListener(
+            this,
+            ContextCompat.getMainExecutor(this),
+            splitChangeListener
+        )
+    }
+
+    override fun onStop() {
+        super.onStop()
+        splitController.removeSplitListener(
+            splitChangeListener
+        )
+    }
+
+    inner class SplitStateChangeListener : Consumer<List<SplitInfo>> {
+        override fun accept(newSplitInfos: List<SplitInfo>) {
+            findViewById<View>(R.id.infoButton).visibility =
+                if (newSplitInfos.isEmpty()) View.VISIBLE else View.GONE
+        }
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityListPlaceholder.kt
similarity index 66%
copy from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt
copy to window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityListPlaceholder.kt
index e5bb607..754e11d8 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopUriHandler.desktop.kt
+++ b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityListPlaceholder.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 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,13 +14,6 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.platform
+package androidx.window.sample.embedding
 
-import java.awt.Desktop
-import java.net.URI
-
-internal class DesktopUriHandler : UriHandler {
-    override fun openUri(uri: String) {
-        Desktop.getDesktop().browse(URI(uri))
-    }
-}
\ No newline at end of file
+open class SplitActivityListPlaceholder : SplitActivityPlaceholder()
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityPlaceholder.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityPlaceholder.kt
new file mode 100644
index 0000000..6ac913e
--- /dev/null
+++ b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityPlaceholder.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.window.sample.embedding
+
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import androidx.appcompat.app.AppCompatActivity
+import androidx.window.sample.R
+
+open class SplitActivityPlaceholder : AppCompatActivity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_split_activity_list_placeholder_layout)
+
+        findViewById<View>(R.id.root_split_activity_layout)
+            .setBackgroundColor(Color.parseColor("#eeeeee"))
+    }
+}
\ No newline at end of file
diff --git a/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityTrampoline.kt b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityTrampoline.kt
new file mode 100644
index 0000000..c3893ab
--- /dev/null
+++ b/window/window-samples/src/main/java/androidx/window/sample/embedding/SplitActivityTrampoline.kt
@@ -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.
+ */
+
+package androidx.window.sample.embedding
+
+import android.content.Intent
+import android.os.Bundle
+import android.util.LayoutDirection
+import androidx.window.core.ExperimentalWindowApi
+import androidx.window.embedding.ActivityFilter
+import androidx.window.embedding.SplitController
+import androidx.window.embedding.SplitPlaceholderRule
+
+/**
+ * Example trampoline activity that launches a split and finishes itself.
+ */
+@ExperimentalWindowApi
+class SplitActivityTrampoline : SplitActivityBase() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        val activityFilters = setOf(ActivityFilter(componentName(
+            "androidx.window.sample.embedding.SplitActivityTrampolineTarget"), null))
+        val placeholderIntent = Intent()
+        placeholderIntent.component =
+            componentName("androidx.window.sample.embedding.SplitActivityPlaceholder")
+        val placeholderRule = SplitPlaceholderRule(
+            activityFilters, placeholderIntent,
+            minSplitWidth(), minSplitWidth(), SPLIT_RATIO, LayoutDirection.LOCALE
+        )
+        SplitController.getInstance().registerRule(placeholderRule)
+        val activityIntent = Intent()
+        activityIntent.component = componentName(
+            "androidx.window.sample.embedding.SplitActivityTrampolineTarget")
+        startActivity(activityIntent)
+
+        finish()
+    }
+}
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/layoutTemplates/list1.xml b/window/window-samples/src/main/res/drawable/border.xml
similarity index 63%
copy from glance/glance-appwidget/src/androidMain/layoutTemplates/list1.xml
copy to window/window-samples/src/main/res/drawable/border.xml
index d228e836..25aa92e 100644
--- a/glance/glance-appwidget/src/androidMain/layoutTemplates/list1.xml
+++ b/window/window-samples/src/main/res/drawable/border.xml
@@ -1,4 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?><!--
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
   Copyright 2021 The Android Open Source Project
 
   Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,6 +15,8 @@
   limitations under the License.
   -->
 
-<ListView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@id/glanceListView1"
-    android:divider="@null" />
+<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
+    <corners android:radius="15dp"/>
+    <padding android:left="10dp" android:right="10dp" android:top="10dp" android:bottom="10dp"/>
+    <stroke android:width="1dp" android:color="#CCCCCC"/>
+</shape>
\ No newline at end of file
diff --git a/window/window-samples/src/main/res/layout/activity_display_features.xml b/window/window-samples/src/main/res/layout/activity_display_features_config_change.xml
similarity index 96%
rename from window/window-samples/src/main/res/layout/activity_display_features.xml
rename to window/window-samples/src/main/res/layout/activity_display_features_config_change.xml
index 3cd059d..0e877e4 100644
--- a/window/window-samples/src/main/res/layout/activity_display_features.xml
+++ b/window/window-samples/src/main/res/layout/activity_display_features_config_change.xml
@@ -22,7 +22,7 @@
     android:id="@+id/rootLayout"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    tools:context="androidx.window.sample.DisplayFeaturesActivity">
+    tools:context="androidx.window.sample.DisplayFeaturesConfigChangeActivity">
 
     <FrameLayout
         android:id="@+id/featureContainerLayout"
diff --git a/window/window-samples/src/main/res/layout/activity_display_features.xml b/window/window-samples/src/main/res/layout/activity_display_features_no_config_change.xml
similarity index 95%
copy from window/window-samples/src/main/res/layout/activity_display_features.xml
copy to window/window-samples/src/main/res/layout/activity_display_features_no_config_change.xml
index 3cd059d..3df64a9 100644
--- a/window/window-samples/src/main/res/layout/activity_display_features.xml
+++ b/window/window-samples/src/main/res/layout/activity_display_features_no_config_change.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  Copyright 2020 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.
@@ -22,7 +22,7 @@
     android:id="@+id/rootLayout"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    tools:context="androidx.window.sample.DisplayFeaturesActivity">
+    tools:context="androidx.window.sample.DisplayFeaturesNoConfigChangeActivity">
 
     <FrameLayout
         android:id="@+id/featureContainerLayout"
diff --git a/window/window-samples/src/main/res/layout/activity_organized_test_layout.xml b/window/window-samples/src/main/res/layout/activity_organized_test_layout.xml
new file mode 100644
index 0000000..fb2c762
--- /dev/null
+++ b/window/window-samples/src/main/res/layout/activity_organized_test_layout.xml
@@ -0,0 +1,84 @@
+<?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.
+  -->
+
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:layout_margin="10dp"
+    android:background="@drawable/border">
+
+    <Button
+        android:id="@+id/test_bounds_1"
+        style="@style/Widget.AppCompat.Button.Borderless.Colored"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:onClick="onItemClick"
+        android:padding="15dp"
+        android:text="500x500"
+        android:textColor="#00ACC1"
+        android:textSize="20sp" />
+
+    <Button
+        android:id="@+id/test_bounds_2"
+        style="@style/Widget.AppCompat.Button.Borderless.Colored"
+        android:layout_below="@id/test_bounds_1"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:onClick="onItemClick"
+        android:padding="15dp"
+        android:text="2000x2000"
+        android:textColor="#00ACC1"
+        android:textSize="20sp" />
+
+    <Button
+        android:id="@+id/test_bounds_3"
+        style="@style/Widget.AppCompat.Button.Borderless.Colored"
+        android:layout_below="@id/test_bounds_2"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:onClick="onItemClick"
+        android:padding="15dp"
+        android:text="1000x2000"
+        android:textColor="#00ACC1"
+        android:textSize="20sp" />
+
+    <Button
+        android:id="@+id/test_bounds_4"
+        style="@style/Widget.AppCompat.Button.Borderless.Colored"
+        android:layout_below="@id/test_bounds_3"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:onClick="onItemClick"
+        android:padding="15dp"
+        android:text="2000x1000"
+        android:textColor="#00ACC1"
+        android:textSize="20sp" />
+
+    <Button
+        android:id="@+id/test_bounds_5"
+        style="@style/Widget.AppCompat.Button.Borderless.Colored"
+        android:layout_below="@id/test_bounds_4"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:onClick="onItemClick"
+        android:padding="15dp"
+        android:text="reset"
+        android:textColor="#00ACC1"
+        android:textSize="20sp" />
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/window/window-samples/src/main/res/layout/activity_split_activity_layout.xml b/window/window-samples/src/main/res/layout/activity_split_activity_layout.xml
new file mode 100644
index 0000000..378edfc
--- /dev/null
+++ b/window/window-samples/src/main/res/layout/activity_split_activity_layout.xml
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  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.
+  -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/root_split_activity_layout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:padding="10dp">
+
+    <CheckBox
+        android:id="@+id/splitMainCheckBox"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="Split Main with other activities" />
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:layout_marginTop="10dp"
+        android:layout_marginBottom="10dp"
+        android:background="#AAAAAA" />
+
+    <Button
+        android:id="@+id/launch_b"
+        android:layout_width="wrap_content"
+        android:layout_height="48dp"
+        android:layout_centerHorizontal="true"
+        android:text="Launch B" />
+
+    <CheckBox
+        android:id="@+id/usePlaceholderCheckBox"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="Use a placeholder for B" />
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:layout_marginTop="10dp"
+        android:layout_marginBottom="10dp"
+        android:background="#AAAAAA" />
+
+    <Button
+        android:id="@+id/launch_b_and_C"
+        android:layout_width="wrap_content"
+        android:layout_height="48dp"
+        android:layout_centerHorizontal="true"
+        android:text="Launch B and C" />
+
+    <CheckBox
+        android:id="@+id/splitBCCheckBox"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="Split B with C" />
+
+    <CheckBox
+        android:id="@+id/finishBCCheckBox"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="Finish B and C together"
+        android:enabled="false" />
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:layout_marginTop="10dp"
+        android:layout_marginBottom="10dp"
+        android:background="#AAAAAA" />
+
+    <Button
+        android:id="@+id/launch_e"
+        android:layout_width="wrap_content"
+        android:layout_height="48dp"
+        android:layout_centerHorizontal="true"
+        android:text="Launch E" />
+
+    <CheckBox
+        android:id="@+id/fullscreenECheckBox"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="Always launch E in fullscreen" />
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:layout_marginTop="10dp"
+        android:layout_marginBottom="10dp"
+        android:background="#AAAAAA" />
+
+    <Button
+        android:id="@+id/launch_f"
+        android:layout_width="wrap_content"
+        android:layout_height="48dp"
+        android:layout_centerHorizontal="true"
+        android:text="Launch f" />
+
+    <Button
+        android:id="@+id/launch_f_pending_intent"
+        android:layout_width="wrap_content"
+        android:layout_height="48dp"
+        android:layout_centerHorizontal="true"
+        android:text="Launch F via Pending Intent" />
+
+    <CheckBox
+        android:id="@+id/splitWithFCheckBox"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="Split everything with F" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/window/window-samples/src/main/res/layout/activity_split_activity_list_detail_layout.xml b/window/window-samples/src/main/res/layout/activity_split_activity_list_detail_layout.xml
new file mode 100644
index 0000000..70c33c12
--- /dev/null
+++ b/window/window-samples/src/main/res/layout/activity_split_activity_list_detail_layout.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  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.
+  -->
+
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/root_split_activity_layout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:padding="10dp">
+
+    <TextView
+        android:id="@+id/item_detail_text"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:gravity="center"
+        android:text="Item detail"
+        android:textAppearance="@style/TextAppearance.AppCompat.Display2" />
+
+    <Button
+        android:id="@+id/infoButton"
+        style="@style/Widget.AppCompat.Button.Borderless"
+        android:layout_margin="8dp"
+        android:layout_width="50dp"
+        android:layout_height="50dp"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentTop="true"
+        android:background="@android:drawable/ic_menu_info_details" />
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/window/window-samples/src/main/res/layout/activity_split_activity_list_layout.xml b/window/window-samples/src/main/res/layout/activity_split_activity_list_layout.xml
new file mode 100644
index 0000000..888d570
--- /dev/null
+++ b/window/window-samples/src/main/res/layout/activity_split_activity_list_layout.xml
@@ -0,0 +1,95 @@
+<?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.
+  -->
+
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/root_split_activity_layout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:padding="10dp">
+
+    <Button
+        android:id="@+id/list_item_1"
+        style="@style/Widget.AppCompat.Button.Borderless.Colored"
+        android:layout_below="@+id/infoButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:onClick="onItemClick"
+        android:padding="15dp"
+        android:text="First"
+        android:textColor="#00ACC1"
+        android:textSize="20sp" />
+
+    <Button
+        android:id="@+id/list_item_2"
+        style="@style/Widget.AppCompat.Button.Borderless.Colored"
+        android:layout_below="@id/list_item_1"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:onClick="onItemClick"
+        android:padding="15dp"
+        android:text="Second"
+        android:textColor="#00ACC1"
+        android:textSize="20sp" />
+
+    <Button
+        android:id="@+id/list_item_3"
+        style="@style/Widget.AppCompat.Button.Borderless.Colored"
+        android:layout_below="@id/list_item_2"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:onClick="onItemClick"
+        android:padding="15dp"
+        android:text="Third"
+        android:textColor="#00ACC1"
+        android:textSize="20sp" />
+
+    <Button
+        android:id="@+id/list_item_4"
+        style="@style/Widget.AppCompat.Button.Borderless.Colored"
+        android:layout_below="@id/list_item_3"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:onClick="onItemClick"
+        android:padding="15dp"
+        android:text="Fourth"
+        android:textColor="#00ACC1"
+        android:textSize="20sp" />
+
+    <Button
+        android:id="@+id/list_item_5"
+        style="@style/Widget.AppCompat.Button.Borderless.Colored"
+        android:layout_below="@id/list_item_4"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:onClick="onItemClick"
+        android:padding="15dp"
+        android:text="Fifth"
+        android:textColor="#00ACC1"
+        android:textSize="20sp" />
+
+    <Button
+        android:id="@+id/infoButton"
+        style="@style/Widget.AppCompat.Button.Borderless"
+        android:layout_margin="8dp"
+        android:layout_width="50dp"
+        android:layout_height="50dp"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentTop="true"
+        android:background="@android:drawable/ic_menu_info_details" />
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/window/window-samples/src/main/res/layout/activity_split_activity_list_placeholder_layout.xml b/window/window-samples/src/main/res/layout/activity_split_activity_list_placeholder_layout.xml
new file mode 100644
index 0000000..f9c66df
--- /dev/null
+++ b/window/window-samples/src/main/res/layout/activity_split_activity_list_placeholder_layout.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  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.
+  -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/root_split_activity_layout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:padding="10dp">
+
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:gravity="center"
+        android:text="Placeholder"
+        android:textAppearance="@style/TextAppearance.AppCompat.Display2" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/window/window-samples/src/main/res/values/strings.xml b/window/window-samples/src/main/res/values/strings.xml
index ff0b4c0..a6e8aa3 100644
--- a/window/window-samples/src/main/res/values/strings.xml
+++ b/window/window-samples/src/main/res/values/strings.xml
@@ -24,7 +24,8 @@
     <string name="legend">Legend:</string>
     <string name="content_title">Content title</string>
     <string name="green_droid">Green droid</string>
-    <string name="display_features">Display features</string>
+    <string name="display_features_config_change">Display features handle config change</string>
+    <string name="display_features_no_config_change">Display features no config change</string>
     <string name="split_layout">Split layout</string>
     <string name="presentation">Presentation</string>
     <string name="start_presentation">Start presentation</string>
@@ -39,7 +40,8 @@
     <string name="long_dimension_fold">Fold in the middle of the window along long
         dimension</string>
     <string name="test_activity">Test activity</string>
-    <string name="show_all_display_features_description">Show all display features of the device on the screen</string>
+    <string name="show_all_display_features_config_change_description">Show all display features of the device on the screen and handle config changes</string>
+    <string name="show_all_display_features_no_config_change_description">Show all display features of the device on the screen and do not handle config changes.  The activity is recreated instead on rotation or resize</string>
     <string name="split_layout_demo_description">Demo of a layout that splits the content to sides of a fold or a hinge. If not present or minimal size requirements are not meant, it behave like a FrameLayout.</string>
     <string name="presentation_demo_description">Demo of using Presentation API to show content on secondary display.</string>
     <string name="window_metrics">Window metrics</string>
diff --git a/window/window-samples/src/main/res/xml/main_split_config.xml b/window/window-samples/src/main/res/xml/main_split_config.xml
new file mode 100644
index 0000000..22e491e
--- /dev/null
+++ b/window/window-samples/src/main/res/xml/main_split_config.xml
@@ -0,0 +1,35 @@
+<?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.
+  -->
+<resources
+    xmlns:window="http://schemas.android.com/apk/res-auto">
+    <SplitPairRule
+        window:splitRatio="0.3"
+        window:splitMinWidth="600dp"
+        window:finishPrimaryWithSecondary="true"
+        window:finishSecondaryWithPrimary="true">
+        <SplitPairFilter
+            window:primaryActivityName="androidx.window.sample.embedding.SplitActivityList"
+            window:secondaryActivityName="androidx.window.sample.embedding.SplitActivityDetail"/>
+    </SplitPairRule>
+    <SplitPlaceholderRule
+        window:placeholderActivityName="androidx.window.sample.embedding.SplitActivityListPlaceholder"
+        window:splitRatio="0.3"
+        window:splitMinWidth="600dp">
+        <ActivityFilter
+            window:activityName="androidx.window.sample.embedding.SplitActivityList"/>
+    </SplitPlaceholderRule>
+</resources>
\ No newline at end of file
diff --git a/window/window-testing/api/1.0.0-beta04.txt b/window/window-testing/api/1.0.0-beta04.txt
new file mode 100644
index 0000000..12a7d20
--- /dev/null
+++ b/window/window-testing/api/1.0.0-beta04.txt
@@ -0,0 +1,24 @@
+// Signature format: 4.0
+package androidx.window.testing.layout {
+
+  public final class DisplayFeatureTesting {
+    method public static androidx.window.layout.FoldingFeature createFoldingFeature(android.app.Activity activity, optional int center, optional int size, optional androidx.window.layout.FoldingFeature.State state, optional androidx.window.layout.FoldingFeature.Orientation orientation);
+    method public static androidx.window.layout.FoldingFeature createFoldingFeature(android.app.Activity activity, optional int center, optional int size, optional androidx.window.layout.FoldingFeature.State state);
+    method public static androidx.window.layout.FoldingFeature createFoldingFeature(android.app.Activity activity, optional int center, optional int size);
+    method public static androidx.window.layout.FoldingFeature createFoldingFeature(android.app.Activity activity, optional int center);
+    method public static androidx.window.layout.FoldingFeature createFoldingFeature(android.app.Activity activity);
+  }
+
+  public final class WindowLayoutInfoPublisherRule implements org.junit.rules.TestRule {
+    ctor public WindowLayoutInfoPublisherRule();
+    method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
+    method public void overrideWindowLayoutInfo(androidx.window.layout.WindowLayoutInfo info);
+  }
+
+  public final class WindowLayoutInfoTesting {
+    method public static androidx.window.layout.WindowLayoutInfo createWindowLayoutInfo(optional java.util.List<? extends androidx.window.layout.DisplayFeature> displayFeatures);
+    method public static androidx.window.layout.WindowLayoutInfo createWindowLayoutInfo();
+  }
+
+}
+
diff --git a/window/window-testing/api/public_plus_experimental_1.0.0-beta04.txt b/window/window-testing/api/public_plus_experimental_1.0.0-beta04.txt
new file mode 100644
index 0000000..56856b4
--- /dev/null
+++ b/window/window-testing/api/public_plus_experimental_1.0.0-beta04.txt
@@ -0,0 +1,34 @@
+// Signature format: 4.0
+package androidx.window.testing.layout {
+
+  public final class DisplayFeatureTesting {
+    method public static androidx.window.layout.FoldingFeature createFoldingFeature(android.app.Activity activity, optional int center, optional int size, optional androidx.window.layout.FoldingFeature.State state, optional androidx.window.layout.FoldingFeature.Orientation orientation);
+    method public static androidx.window.layout.FoldingFeature createFoldingFeature(android.app.Activity activity, optional int center, optional int size, optional androidx.window.layout.FoldingFeature.State state);
+    method public static androidx.window.layout.FoldingFeature createFoldingFeature(android.app.Activity activity, optional int center, optional int size);
+    method public static androidx.window.layout.FoldingFeature createFoldingFeature(android.app.Activity activity, optional int center);
+    method public static androidx.window.layout.FoldingFeature createFoldingFeature(android.app.Activity activity);
+    method @androidx.window.core.ExperimentalWindowApi public static androidx.window.layout.FoldingFeature createFoldingFeature(android.graphics.Rect windowBounds, optional int center, optional int size, optional androidx.window.layout.FoldingFeature.State state, optional androidx.window.layout.FoldingFeature.Orientation orientation);
+    method @androidx.window.core.ExperimentalWindowApi public static androidx.window.layout.FoldingFeature createFoldingFeature(android.graphics.Rect windowBounds, optional int center, optional int size, optional androidx.window.layout.FoldingFeature.State state);
+    method @androidx.window.core.ExperimentalWindowApi public static androidx.window.layout.FoldingFeature createFoldingFeature(android.graphics.Rect windowBounds, optional int center, optional int size);
+    method @androidx.window.core.ExperimentalWindowApi public static androidx.window.layout.FoldingFeature createFoldingFeature(android.graphics.Rect windowBounds, optional int center);
+    method @androidx.window.core.ExperimentalWindowApi public static androidx.window.layout.FoldingFeature createFoldingFeature(android.graphics.Rect windowBounds);
+  }
+
+  @androidx.window.core.ExperimentalWindowApi public final class StubWindowMetricsCalculatorRule implements org.junit.rules.TestRule {
+    ctor public StubWindowMetricsCalculatorRule();
+    method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
+  }
+
+  public final class WindowLayoutInfoPublisherRule implements org.junit.rules.TestRule {
+    ctor public WindowLayoutInfoPublisherRule();
+    method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
+    method public void overrideWindowLayoutInfo(androidx.window.layout.WindowLayoutInfo info);
+  }
+
+  public final class WindowLayoutInfoTesting {
+    method public static androidx.window.layout.WindowLayoutInfo createWindowLayoutInfo(optional java.util.List<? extends androidx.window.layout.DisplayFeature> displayFeatures);
+    method public static androidx.window.layout.WindowLayoutInfo createWindowLayoutInfo();
+  }
+
+}
+
diff --git a/window/window-testing/api/public_plus_experimental_current.txt b/window/window-testing/api/public_plus_experimental_current.txt
index d4cacac..56856b4 100644
--- a/window/window-testing/api/public_plus_experimental_current.txt
+++ b/window/window-testing/api/public_plus_experimental_current.txt
@@ -14,6 +14,11 @@
     method @androidx.window.core.ExperimentalWindowApi public static androidx.window.layout.FoldingFeature createFoldingFeature(android.graphics.Rect windowBounds);
   }
 
+  @androidx.window.core.ExperimentalWindowApi public final class StubWindowMetricsCalculatorRule implements org.junit.rules.TestRule {
+    ctor public StubWindowMetricsCalculatorRule();
+    method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
+  }
+
   public final class WindowLayoutInfoPublisherRule implements org.junit.rules.TestRule {
     ctor public WindowLayoutInfoPublisherRule();
     method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/window/window-testing/api/res-1.0.0-beta04.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to window/window-testing/api/res-1.0.0-beta04.txt
diff --git a/window/window-testing/api/restricted_1.0.0-beta04.txt b/window/window-testing/api/restricted_1.0.0-beta04.txt
new file mode 100644
index 0000000..12a7d20
--- /dev/null
+++ b/window/window-testing/api/restricted_1.0.0-beta04.txt
@@ -0,0 +1,24 @@
+// Signature format: 4.0
+package androidx.window.testing.layout {
+
+  public final class DisplayFeatureTesting {
+    method public static androidx.window.layout.FoldingFeature createFoldingFeature(android.app.Activity activity, optional int center, optional int size, optional androidx.window.layout.FoldingFeature.State state, optional androidx.window.layout.FoldingFeature.Orientation orientation);
+    method public static androidx.window.layout.FoldingFeature createFoldingFeature(android.app.Activity activity, optional int center, optional int size, optional androidx.window.layout.FoldingFeature.State state);
+    method public static androidx.window.layout.FoldingFeature createFoldingFeature(android.app.Activity activity, optional int center, optional int size);
+    method public static androidx.window.layout.FoldingFeature createFoldingFeature(android.app.Activity activity, optional int center);
+    method public static androidx.window.layout.FoldingFeature createFoldingFeature(android.app.Activity activity);
+  }
+
+  public final class WindowLayoutInfoPublisherRule implements org.junit.rules.TestRule {
+    ctor public WindowLayoutInfoPublisherRule();
+    method public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base, org.junit.runner.Description description);
+    method public void overrideWindowLayoutInfo(androidx.window.layout.WindowLayoutInfo info);
+  }
+
+  public final class WindowLayoutInfoTesting {
+    method public static androidx.window.layout.WindowLayoutInfo createWindowLayoutInfo(optional java.util.List<? extends androidx.window.layout.DisplayFeature> displayFeatures);
+    method public static androidx.window.layout.WindowLayoutInfo createWindowLayoutInfo();
+  }
+
+}
+
diff --git a/window/window-testing/src/androidTest/java/androidx/window/testing/layout/StubWindowMetricsCalculatorRuleTest.kt b/window/window-testing/src/androidTest/java/androidx/window/testing/layout/StubWindowMetricsCalculatorRuleTest.kt
new file mode 100644
index 0000000..2118436
--- /dev/null
+++ b/window/window-testing/src/androidTest/java/androidx/window/testing/layout/StubWindowMetricsCalculatorRuleTest.kt
@@ -0,0 +1,105 @@
+/*
+ * 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.testing.layout
+
+import androidx.test.core.app.ActivityScenario
+import androidx.test.ext.junit.rules.ActivityScenarioRule
+import androidx.window.core.ExperimentalWindowApi
+import androidx.window.layout.WindowMetricsCalculator
+import androidx.window.testing.TestActivity
+import org.junit.Assert.assertEquals
+import org.junit.Rule
+import org.junit.Test
+import org.junit.rules.RuleChain
+import org.junit.rules.TestRule
+import org.junit.runner.Description
+import org.junit.runners.model.Statement
+
+/**
+ * A test class for [StubWindowMetricsCalculatorRule] that tests using
+ * [StubWindowMetricsCalculator] instead of the actual implementation.
+ */
+@OptIn(ExperimentalWindowApi::class)
+class StubWindowMetricsCalculatorRuleTest {
+    private val activityRule = ActivityScenarioRule(TestActivity::class.java)
+    private val stubWindowMetricsCalculatorRule = StubWindowMetricsCalculatorRule()
+
+    @get:Rule
+    val testRule: TestRule
+
+    init {
+        testRule = RuleChain.outerRule(stubWindowMetricsCalculatorRule).around(activityRule)
+    }
+
+    @Test
+    fun testCurrentWindowMetrics_matchesDisplayMetrics() {
+        activityRule.scenario.onActivity { activity ->
+            val calculator = WindowMetricsCalculator.getOrCreate()
+            val displayMetrics = activity.resources.displayMetrics
+
+            val actual = calculator.computeCurrentWindowMetrics(activity)
+
+            assertEquals(0, actual.bounds.left)
+            assertEquals(0, actual.bounds.top)
+            assertEquals(displayMetrics.widthPixels, actual.bounds.right)
+            assertEquals(displayMetrics.heightPixels, actual.bounds.bottom)
+        }
+    }
+
+    @Test
+    fun testCurrentWindowMetrics_matchesMaximumMetrics() {
+        activityRule.scenario.onActivity { activity ->
+            val calculator = WindowMetricsCalculator.getOrCreate()
+
+            val currentMetrics = calculator.computeCurrentWindowMetrics(activity)
+            val maximumMetrics = calculator.computeMaximumWindowMetrics(activity)
+
+            assertEquals(currentMetrics.bounds.left, maximumMetrics.bounds.left)
+            assertEquals(currentMetrics.bounds.top, maximumMetrics.bounds.top)
+            assertEquals(currentMetrics.bounds.right, maximumMetrics.bounds.right)
+            assertEquals(currentMetrics.bounds.bottom, maximumMetrics.bounds.bottom)
+        }
+    }
+
+    /**
+     * Tests that when applying a [Statement] then the decorator is removed. This is necessary to
+     * keep tests hermetic. If this fails on the last test run then the fake implementation of
+     * [WindowMetricsCalculator] might be retained for other test classes.
+     */
+    @Test
+    fun testException_resetsFactoryMethod() {
+        ActivityScenario.launch(TestActivity::class.java).onActivity {
+            WindowMetricsCalculator.reset()
+            val expected = WindowMetricsCalculator.getOrCreate()
+            try {
+                StubWindowMetricsCalculatorRule().apply(
+                    object : Statement() {
+                        override fun evaluate() {
+                            throw TestException
+                        }
+                    },
+                    Description.EMPTY
+                ).evaluate()
+            } catch (e: TestException) {
+                // Throw unexpected exceptions.
+            }
+            assertEquals(expected, WindowMetricsCalculator.getOrCreate())
+        }
+    }
+
+    private object TestException : Exception("TEST EXCEPTION")
+}
\ No newline at end of file
diff --git a/window/window-testing/src/main/java/androidx/window/testing/layout/DisplayFeatureTesting.kt b/window/window-testing/src/main/java/androidx/window/testing/layout/DisplayFeatureTesting.kt
index 61c160a1..b6aa95e 100644
--- a/window/window-testing/src/main/java/androidx/window/testing/layout/DisplayFeatureTesting.kt
+++ b/window/window-testing/src/main/java/androidx/window/testing/layout/DisplayFeatureTesting.kt
@@ -43,6 +43,8 @@
  * always cover the window in one dimension and that determines the other coordinates.
  *
  * @param activity that will house the [FoldingFeature].
+ * @param center the center of the fold complementary to the orientation. For a [HORIZONTAL] fold,
+ * this is the y-axis and for a [VERTICAL] fold this is the x-axis.
  * @param size the smaller dimension  of the fold. The larger dimension  always covers the entire
  * window.
  * @param state [State] of the fold. The default value is [HALF_OPENED]
@@ -50,7 +52,6 @@
  * @return [FoldingFeature] that is splitting if the width is not 0 and runs parallel to the
  * [Orientation] axis.
  */
-@Suppress("FunctionName")
 @JvmOverloads
 @JvmName("createFoldingFeature")
 fun FoldingFeature(
@@ -71,7 +72,28 @@
     )
 }
 
-@Suppress("FunctionName")
+/**
+ * A convenience method to get a test [FoldingFeature] with default values provided. With the
+ * default values it returns a [FoldingFeature.State.HALF_OPENED] feature that splits the screen
+ * along the [FoldingFeature.Orientation.HORIZONTAL] axis.
+ *
+ * The bounds of the feature are calculated based on [orientation] and [size]. If the
+ * feature is [VERTICAL] then the feature is centered horizontally. The top-left x-coordinate is
+ * center - ([size] / 2) and the top-right x-coordinate is center + ([size] / 2). If the feature is
+ * [HORIZONTAL] then the feature is centered vertically. The top-left y-coordinate is center -
+ * ([size] / 2) and the bottom-left y-coordinate is center - ([size] / 2). The folding features
+ * always cover the window in one dimension and that determines the other coordinates.
+ *
+ * @param windowBounds that will contain the [FoldingFeature].
+ * @param center the center of the fold complementary to the orientation. For a [HORIZONTAL] fold,
+ * this is the y-axis and for a [VERTICAL] fold this is the x-axis.
+ * @param size the smaller dimension  of the fold. The larger dimension  always covers the entire
+ * window.
+ * @param state [State] of the fold. The default value is [HALF_OPENED]
+ * @param orientation [Orientation] of the fold. The default value is [HORIZONTAL]
+ * @return [FoldingFeature] that is splitting if the width is not 0 and runs parallel to the
+ * [Orientation] axis.
+ */
 @JvmOverloads
 @JvmName("createFoldingFeature")
 @ExperimentalWindowApi
diff --git a/window/window-testing/src/main/java/androidx/window/testing/layout/StubMetricDecorator.kt b/window/window-testing/src/main/java/androidx/window/testing/layout/StubMetricDecorator.kt
new file mode 100644
index 0000000..d02349a
--- /dev/null
+++ b/window/window-testing/src/main/java/androidx/window/testing/layout/StubMetricDecorator.kt
@@ -0,0 +1,31 @@
+/*
+ * 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.testing.layout
+
+import androidx.window.core.ExperimentalWindowApi
+import androidx.window.layout.WindowMetricsCalculator
+import androidx.window.layout.WindowMetricsCalculatorDecorator
+
+/**
+ * A decorator to return [StubWindowMetricsCalculator] instead of the actual implementation.
+ */
+@ExperimentalWindowApi
+internal object StubMetricDecorator : WindowMetricsCalculatorDecorator {
+    override fun decorate(calculator: WindowMetricsCalculator): WindowMetricsCalculator {
+        return StubWindowMetricsCalculator
+    }
+}
\ No newline at end of file
diff --git a/window/window-testing/src/main/java/androidx/window/testing/layout/StubWindowMetricsCalculator.kt b/window/window-testing/src/main/java/androidx/window/testing/layout/StubWindowMetricsCalculator.kt
new file mode 100644
index 0000000..c9b994e
--- /dev/null
+++ b/window/window-testing/src/main/java/androidx/window/testing/layout/StubWindowMetricsCalculator.kt
@@ -0,0 +1,43 @@
+/*
+ * 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.testing.layout
+
+import android.app.Activity
+import android.graphics.Rect
+import androidx.window.layout.WindowMetrics
+import androidx.window.layout.WindowMetricsCalculator
+
+/**
+ * A stub implementation of [WindowMetricsCalculator] that returns the
+ * [android.util.DisplayMetrics] for the current and maximum [WindowMetrics]. This is not correct
+ * in general terms, as an application may be running in multi-window or otherwise adjusted to not
+ * occupy the entire display.
+ */
+internal object StubWindowMetricsCalculator : WindowMetricsCalculator {
+
+    override fun computeCurrentWindowMetrics(activity: Activity): WindowMetrics {
+        val displayMetrics = activity.resources.displayMetrics
+        val bounds = Rect(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels)
+        return WindowMetrics(bounds)
+    }
+
+    override fun computeMaximumWindowMetrics(activity: Activity): WindowMetrics {
+        val displayMetrics = activity.resources.displayMetrics
+        val bounds = Rect(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels)
+        return WindowMetrics(bounds)
+    }
+}
\ No newline at end of file
diff --git a/window/window-testing/src/main/java/androidx/window/testing/layout/StubWindowMetricsCalculatorRule.kt b/window/window-testing/src/main/java/androidx/window/testing/layout/StubWindowMetricsCalculatorRule.kt
new file mode 100644
index 0000000..bfb7c48
--- /dev/null
+++ b/window/window-testing/src/main/java/androidx/window/testing/layout/StubWindowMetricsCalculatorRule.kt
@@ -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.window.testing.layout
+
+import android.app.Activity
+import androidx.window.core.ExperimentalWindowApi
+import androidx.window.layout.WindowMetricsCalculator
+import org.junit.rules.TestRule
+import org.junit.runner.Description
+import org.junit.runners.model.Statement
+
+/**
+ * A [TestRule] that will sub out the actual [WindowMetricsCalculator] with a more simple one that
+ * will support testing independent of the current platform. The fake [WindowMetricsCalculator] that
+ * is used will return the width and height from the [android.util.DisplayMetrics] associated to
+ * an [Activity]. The result of [WindowMetricsCalculator.computeCurrentWindowMetrics] and
+ * [WindowMetricsCalculator.computeMaximumWindowMetrics] will be the same. For accurate results use
+ * the Espresso Test framework with an actual [Activity] and use the actual
+ * [WindowMetricsCalculator].
+ */
+@ExperimentalWindowApi
+class StubWindowMetricsCalculatorRule : TestRule {
+
+    override fun apply(base: Statement, description: Description): Statement {
+        return object : Statement() {
+            override fun evaluate() {
+                WindowMetricsCalculator.overrideDecorator(StubMetricDecorator)
+                try {
+                    base.evaluate()
+                } finally {
+                    WindowMetricsCalculator.reset()
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/window/window/api/1.0.0-beta04.txt b/window/window/api/1.0.0-beta04.txt
new file mode 100644
index 0000000..66fddf6
--- /dev/null
+++ b/window/window/api/1.0.0-beta04.txt
@@ -0,0 +1,80 @@
+// Signature format: 4.0
+package androidx.window.layout {
+
+  public interface DisplayFeature {
+    method public android.graphics.Rect getBounds();
+    property public abstract android.graphics.Rect bounds;
+  }
+
+  public interface FoldingFeature extends androidx.window.layout.DisplayFeature {
+    method public androidx.window.layout.FoldingFeature.OcclusionType getOcclusionType();
+    method public androidx.window.layout.FoldingFeature.Orientation getOrientation();
+    method public androidx.window.layout.FoldingFeature.State getState();
+    method public boolean isSeparating();
+    property public abstract boolean isSeparating;
+    property public abstract androidx.window.layout.FoldingFeature.OcclusionType occlusionType;
+    property public abstract androidx.window.layout.FoldingFeature.Orientation orientation;
+    property public abstract androidx.window.layout.FoldingFeature.State state;
+  }
+
+  public static final class FoldingFeature.OcclusionType {
+    field public static final androidx.window.layout.FoldingFeature.OcclusionType.Companion Companion;
+    field public static final androidx.window.layout.FoldingFeature.OcclusionType FULL;
+    field public static final androidx.window.layout.FoldingFeature.OcclusionType NONE;
+  }
+
+  public static final class FoldingFeature.OcclusionType.Companion {
+  }
+
+  public static final class FoldingFeature.Orientation {
+    field public static final androidx.window.layout.FoldingFeature.Orientation.Companion Companion;
+    field public static final androidx.window.layout.FoldingFeature.Orientation HORIZONTAL;
+    field public static final androidx.window.layout.FoldingFeature.Orientation VERTICAL;
+  }
+
+  public static final class FoldingFeature.Orientation.Companion {
+  }
+
+  public static final class FoldingFeature.State {
+    field public static final androidx.window.layout.FoldingFeature.State.Companion Companion;
+    field public static final androidx.window.layout.FoldingFeature.State FLAT;
+    field public static final androidx.window.layout.FoldingFeature.State HALF_OPENED;
+  }
+
+  public static final class FoldingFeature.State.Companion {
+  }
+
+  public interface WindowInfoRepository {
+    method public default static androidx.window.layout.WindowInfoRepository getOrCreate(android.app.Activity);
+    method public kotlinx.coroutines.flow.Flow<androidx.window.layout.WindowLayoutInfo> getWindowLayoutInfo();
+    property public abstract kotlinx.coroutines.flow.Flow<androidx.window.layout.WindowLayoutInfo> windowLayoutInfo;
+    field public static final androidx.window.layout.WindowInfoRepository.Companion Companion;
+  }
+
+  public static final class WindowInfoRepository.Companion {
+    method public androidx.window.layout.WindowInfoRepository getOrCreate(android.app.Activity);
+  }
+
+  public final class WindowLayoutInfo {
+    method public java.util.List<androidx.window.layout.DisplayFeature> getDisplayFeatures();
+    property public final java.util.List<androidx.window.layout.DisplayFeature> displayFeatures;
+  }
+
+  public final class WindowMetrics {
+    method public android.graphics.Rect getBounds();
+    property public final android.graphics.Rect bounds;
+  }
+
+  public interface WindowMetricsCalculator {
+    method public androidx.window.layout.WindowMetrics computeCurrentWindowMetrics(android.app.Activity activity);
+    method public androidx.window.layout.WindowMetrics computeMaximumWindowMetrics(android.app.Activity activity);
+    method public default static androidx.window.layout.WindowMetricsCalculator getOrCreate();
+    field public static final androidx.window.layout.WindowMetricsCalculator.Companion Companion;
+  }
+
+  public static final class WindowMetricsCalculator.Companion {
+    method public androidx.window.layout.WindowMetricsCalculator getOrCreate();
+  }
+
+}
+
diff --git a/window/window/api/public_plus_experimental_1.0.0-beta04.txt b/window/window/api/public_plus_experimental_1.0.0-beta04.txt
new file mode 100644
index 0000000..60bb59f
--- /dev/null
+++ b/window/window/api/public_plus_experimental_1.0.0-beta04.txt
@@ -0,0 +1,189 @@
+// Signature format: 4.0
+package androidx.window.core {
+
+  @kotlin.RequiresOptIn(level=kotlin.RequiresOptIn.Level) @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) public @interface ExperimentalWindowApi {
+  }
+
+}
+
+package androidx.window.embedding {
+
+  @androidx.window.core.ExperimentalWindowApi public final class ActivityFilter {
+    ctor public ActivityFilter(android.content.ComponentName componentName, String? intentAction);
+    method public android.content.ComponentName getComponentName();
+    method public String? getIntentAction();
+    method public boolean matchesActivity(android.app.Activity activity);
+    method public boolean matchesIntent(android.content.Intent intent);
+    property public final android.content.ComponentName componentName;
+    property public final String? intentAction;
+  }
+
+  @androidx.window.core.ExperimentalWindowApi public final class ActivityRule extends androidx.window.embedding.EmbeddingRule {
+    ctor public ActivityRule(java.util.Set<androidx.window.embedding.ActivityFilter> filters, optional boolean alwaysExpand);
+    method public boolean getAlwaysExpand();
+    method public java.util.Set<androidx.window.embedding.ActivityFilter> getFilters();
+    property public final boolean alwaysExpand;
+    property public final java.util.Set<androidx.window.embedding.ActivityFilter> filters;
+  }
+
+  @androidx.window.core.ExperimentalWindowApi public final class ActivityStack {
+    ctor public ActivityStack(java.util.List<? extends android.app.Activity> activities);
+    method public operator boolean contains(android.app.Activity activity);
+  }
+
+  @androidx.window.core.ExperimentalWindowApi public abstract class EmbeddingRule {
+  }
+
+  @androidx.window.core.ExperimentalWindowApi public final class SplitController {
+    method public void addSplitListener(android.app.Activity activity, java.util.concurrent.Executor executor, androidx.core.util.Consumer<java.util.List<androidx.window.embedding.SplitInfo>> consumer);
+    method public void clearRegisteredRules();
+    method public static androidx.window.embedding.SplitController getInstance();
+    method public java.util.Set<androidx.window.embedding.EmbeddingRule> getSplitRules();
+    method public static void initialize(android.content.Context context, int staticRuleResourceId);
+    method public boolean isSplitSupported();
+    method public void registerRule(androidx.window.embedding.EmbeddingRule rule);
+    method public void removeSplitListener(androidx.core.util.Consumer<java.util.List<androidx.window.embedding.SplitInfo>> consumer);
+    method public void unregisterRule(androidx.window.embedding.EmbeddingRule rule);
+    field public static final androidx.window.embedding.SplitController.Companion Companion;
+  }
+
+  public static final class SplitController.Companion {
+    method public androidx.window.embedding.SplitController getInstance();
+    method public void initialize(android.content.Context context, int staticRuleResourceId);
+  }
+
+  @androidx.window.core.ExperimentalWindowApi public final class SplitInfo {
+    method public operator boolean contains(android.app.Activity activity);
+    method public androidx.window.embedding.ActivityStack getPrimaryActivityStack();
+    method public androidx.window.embedding.ActivityStack getSecondaryActivityStack();
+    method public float getSplitRatio();
+    property public final androidx.window.embedding.ActivityStack primaryActivityStack;
+    property public final androidx.window.embedding.ActivityStack secondaryActivityStack;
+    property public final float splitRatio;
+  }
+
+  @androidx.window.core.ExperimentalWindowApi public final class SplitPairFilter {
+    ctor public SplitPairFilter(android.content.ComponentName primaryActivityName, android.content.ComponentName secondaryActivityName, String? secondaryActivityIntentAction);
+    method public android.content.ComponentName getPrimaryActivityName();
+    method public String? getSecondaryActivityIntentAction();
+    method public android.content.ComponentName getSecondaryActivityName();
+    method public boolean matchesActivityIntentPair(android.app.Activity primaryActivity, android.content.Intent secondaryActivityIntent);
+    method public boolean matchesActivityPair(android.app.Activity primaryActivity, android.app.Activity secondaryActivity);
+    property public final android.content.ComponentName primaryActivityName;
+    property public final String? secondaryActivityIntentAction;
+    property public final android.content.ComponentName secondaryActivityName;
+  }
+
+  @androidx.window.core.ExperimentalWindowApi public final class SplitPairRule extends androidx.window.embedding.SplitRule {
+    ctor public SplitPairRule(java.util.Set<androidx.window.embedding.SplitPairFilter> filters, optional boolean finishPrimaryWithSecondary, optional boolean finishSecondaryWithPrimary, optional boolean clearTop, optional int minWidth, optional int minSmallestWidth, optional float splitRatio, optional int layoutDir);
+    method public boolean getClearTop();
+    method public java.util.Set<androidx.window.embedding.SplitPairFilter> getFilters();
+    method public boolean getFinishPrimaryWithSecondary();
+    method public boolean getFinishSecondaryWithPrimary();
+    property public final boolean clearTop;
+    property public final java.util.Set<androidx.window.embedding.SplitPairFilter> filters;
+    property public final boolean finishPrimaryWithSecondary;
+    property public final boolean finishSecondaryWithPrimary;
+  }
+
+  @androidx.window.core.ExperimentalWindowApi public final class SplitPlaceholderRule extends androidx.window.embedding.SplitRule {
+    ctor public SplitPlaceholderRule(java.util.Set<androidx.window.embedding.ActivityFilter> filters, android.content.Intent placeholderIntent, optional int minWidth, optional int minSmallestWidth, optional float splitRatio, optional int layoutDirection);
+    method public java.util.Set<androidx.window.embedding.ActivityFilter> getFilters();
+    method public android.content.Intent getPlaceholderIntent();
+    property public final java.util.Set<androidx.window.embedding.ActivityFilter> filters;
+    property public final android.content.Intent placeholderIntent;
+  }
+
+  @androidx.window.core.ExperimentalWindowApi public class SplitRule extends androidx.window.embedding.EmbeddingRule {
+    method public final boolean checkParentMetrics(android.view.WindowMetrics parentMetrics);
+    method public final int getLayoutDirection();
+    method public final int getMinSmallestWidth();
+    method public final int getMinWidth();
+    method public final float getSplitRatio();
+    property public final int layoutDirection;
+    property public final int minSmallestWidth;
+    property public final int minWidth;
+    property public final float splitRatio;
+  }
+
+}
+
+package androidx.window.layout {
+
+  public interface DisplayFeature {
+    method public android.graphics.Rect getBounds();
+    property public abstract android.graphics.Rect bounds;
+  }
+
+  public interface FoldingFeature extends androidx.window.layout.DisplayFeature {
+    method public androidx.window.layout.FoldingFeature.OcclusionType getOcclusionType();
+    method public androidx.window.layout.FoldingFeature.Orientation getOrientation();
+    method public androidx.window.layout.FoldingFeature.State getState();
+    method public boolean isSeparating();
+    property public abstract boolean isSeparating;
+    property public abstract androidx.window.layout.FoldingFeature.OcclusionType occlusionType;
+    property public abstract androidx.window.layout.FoldingFeature.Orientation orientation;
+    property public abstract androidx.window.layout.FoldingFeature.State state;
+  }
+
+  public static final class FoldingFeature.OcclusionType {
+    field public static final androidx.window.layout.FoldingFeature.OcclusionType.Companion Companion;
+    field public static final androidx.window.layout.FoldingFeature.OcclusionType FULL;
+    field public static final androidx.window.layout.FoldingFeature.OcclusionType NONE;
+  }
+
+  public static final class FoldingFeature.OcclusionType.Companion {
+  }
+
+  public static final class FoldingFeature.Orientation {
+    field public static final androidx.window.layout.FoldingFeature.Orientation.Companion Companion;
+    field public static final androidx.window.layout.FoldingFeature.Orientation HORIZONTAL;
+    field public static final androidx.window.layout.FoldingFeature.Orientation VERTICAL;
+  }
+
+  public static final class FoldingFeature.Orientation.Companion {
+  }
+
+  public static final class FoldingFeature.State {
+    field public static final androidx.window.layout.FoldingFeature.State.Companion Companion;
+    field public static final androidx.window.layout.FoldingFeature.State FLAT;
+    field public static final androidx.window.layout.FoldingFeature.State HALF_OPENED;
+  }
+
+  public static final class FoldingFeature.State.Companion {
+  }
+
+  public interface WindowInfoRepository {
+    method public default static androidx.window.layout.WindowInfoRepository getOrCreate(android.app.Activity);
+    method public kotlinx.coroutines.flow.Flow<androidx.window.layout.WindowLayoutInfo> getWindowLayoutInfo();
+    property public abstract kotlinx.coroutines.flow.Flow<androidx.window.layout.WindowLayoutInfo> windowLayoutInfo;
+    field public static final androidx.window.layout.WindowInfoRepository.Companion Companion;
+  }
+
+  public static final class WindowInfoRepository.Companion {
+    method public androidx.window.layout.WindowInfoRepository getOrCreate(android.app.Activity);
+  }
+
+  public final class WindowLayoutInfo {
+    method public java.util.List<androidx.window.layout.DisplayFeature> getDisplayFeatures();
+    property public final java.util.List<androidx.window.layout.DisplayFeature> displayFeatures;
+  }
+
+  public final class WindowMetrics {
+    method public android.graphics.Rect getBounds();
+    property public final android.graphics.Rect bounds;
+  }
+
+  public interface WindowMetricsCalculator {
+    method public androidx.window.layout.WindowMetrics computeCurrentWindowMetrics(android.app.Activity activity);
+    method public androidx.window.layout.WindowMetrics computeMaximumWindowMetrics(android.app.Activity activity);
+    method public default static androidx.window.layout.WindowMetricsCalculator getOrCreate();
+    field public static final androidx.window.layout.WindowMetricsCalculator.Companion Companion;
+  }
+
+  public static final class WindowMetricsCalculator.Companion {
+    method public androidx.window.layout.WindowMetricsCalculator getOrCreate();
+  }
+
+}
+
diff --git a/benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt b/window/window/api/res-1.0.0-beta04.txt
similarity index 100%
copy from benchmark/benchmark-macro-junit4/api/res-1.1.0-beta01.txt
copy to window/window/api/res-1.0.0-beta04.txt
diff --git a/window/window/api/restricted_1.0.0-beta04.txt b/window/window/api/restricted_1.0.0-beta04.txt
new file mode 100644
index 0000000..514a8d31
--- /dev/null
+++ b/window/window/api/restricted_1.0.0-beta04.txt
@@ -0,0 +1,88 @@
+// Signature format: 4.0
+package androidx.window.layout {
+
+  public interface DisplayFeature {
+    method public android.graphics.Rect getBounds();
+    property public abstract android.graphics.Rect bounds;
+  }
+
+  public interface FoldingFeature extends androidx.window.layout.DisplayFeature {
+    method public androidx.window.layout.FoldingFeature.OcclusionType getOcclusionType();
+    method public androidx.window.layout.FoldingFeature.Orientation getOrientation();
+    method public androidx.window.layout.FoldingFeature.State getState();
+    method public boolean isSeparating();
+    property public abstract boolean isSeparating;
+    property public abstract androidx.window.layout.FoldingFeature.OcclusionType occlusionType;
+    property public abstract androidx.window.layout.FoldingFeature.Orientation orientation;
+    property public abstract androidx.window.layout.FoldingFeature.State state;
+  }
+
+  public static final class FoldingFeature.OcclusionType {
+    field public static final androidx.window.layout.FoldingFeature.OcclusionType.Companion Companion;
+    field public static final androidx.window.layout.FoldingFeature.OcclusionType FULL;
+    field public static final androidx.window.layout.FoldingFeature.OcclusionType NONE;
+  }
+
+  public static final class FoldingFeature.OcclusionType.Companion {
+  }
+
+  public static final class FoldingFeature.Orientation {
+    field public static final androidx.window.layout.FoldingFeature.Orientation.Companion Companion;
+    field public static final androidx.window.layout.FoldingFeature.Orientation HORIZONTAL;
+    field public static final androidx.window.layout.FoldingFeature.Orientation VERTICAL;
+  }
+
+  public static final class FoldingFeature.Orientation.Companion {
+  }
+
+  public static final class FoldingFeature.State {
+    field public static final androidx.window.layout.FoldingFeature.State.Companion Companion;
+    field public static final androidx.window.layout.FoldingFeature.State FLAT;
+    field public static final androidx.window.layout.FoldingFeature.State HALF_OPENED;
+  }
+
+  public static final class FoldingFeature.State.Companion {
+  }
+
+  public interface WindowInfoRepository {
+    method public default static androidx.window.layout.WindowInfoRepository getOrCreate(android.app.Activity);
+    method public kotlinx.coroutines.flow.Flow<androidx.window.layout.WindowLayoutInfo> getWindowLayoutInfo();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public default static void overrideDecorator(androidx.window.layout.WindowInfoRepositoryDecorator overridingDecorator);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public default static void reset();
+    property public abstract kotlinx.coroutines.flow.Flow<androidx.window.layout.WindowLayoutInfo> windowLayoutInfo;
+    field public static final androidx.window.layout.WindowInfoRepository.Companion Companion;
+  }
+
+  public static final class WindowInfoRepository.Companion {
+    method public androidx.window.layout.WindowInfoRepository getOrCreate(android.app.Activity);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void overrideDecorator(androidx.window.layout.WindowInfoRepositoryDecorator overridingDecorator);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void reset();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public interface WindowInfoRepositoryDecorator {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.window.layout.WindowInfoRepository decorate(androidx.window.layout.WindowInfoRepository repository);
+  }
+
+  public final class WindowLayoutInfo {
+    method public java.util.List<androidx.window.layout.DisplayFeature> getDisplayFeatures();
+    property public final java.util.List<androidx.window.layout.DisplayFeature> displayFeatures;
+  }
+
+  public final class WindowMetrics {
+    method public android.graphics.Rect getBounds();
+    property public final android.graphics.Rect bounds;
+  }
+
+  public interface WindowMetricsCalculator {
+    method public androidx.window.layout.WindowMetrics computeCurrentWindowMetrics(android.app.Activity activity);
+    method public androidx.window.layout.WindowMetrics computeMaximumWindowMetrics(android.app.Activity activity);
+    method public default static androidx.window.layout.WindowMetricsCalculator getOrCreate();
+    field public static final androidx.window.layout.WindowMetricsCalculator.Companion Companion;
+  }
+
+  public static final class WindowMetricsCalculator.Companion {
+    method public androidx.window.layout.WindowMetricsCalculator getOrCreate();
+  }
+
+}
+
diff --git a/window/window/src/androidTest/java/androidx/window/embedding/ActivityFilterTest.kt b/window/window/src/androidTest/java/androidx/window/embedding/ActivityFilterTest.kt
new file mode 100644
index 0000000..c389acf
--- /dev/null
+++ b/window/window/src/androidTest/java/androidx/window/embedding/ActivityFilterTest.kt
@@ -0,0 +1,97 @@
+/*
+ * 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.embedding
+
+import android.app.Activity
+import android.content.ComponentName
+import android.content.Intent
+import androidx.window.core.ExperimentalWindowApi
+import com.google.common.truth.Truth.assertWithMessage
+import com.nhaarman.mockitokotlin2.doReturn
+import com.nhaarman.mockitokotlin2.mock
+import com.nhaarman.mockitokotlin2.whenever
+import org.junit.Before
+import org.junit.Test
+
+private const val ACTION = "action.test"
+
+@OptIn(ExperimentalWindowApi::class)
+class ActivityFilterTest {
+    private val component1 = ComponentName("a.b.c", "a.b.c.TestActivity")
+    private val component2 = ComponentName("d.e.f", "d.e.f.TestActivity")
+    private val wildcard = ComponentName("*", "*")
+    private val intent = Intent()
+    private val activity = mock<Activity> {
+        on { intent } doReturn intent
+        on { componentName } doReturn component2
+    }
+
+    @Before
+    fun setUp() {
+        intent.component = component1
+    }
+
+    @Test
+    fun testMatchActivity_MatchIntentWithoutAction() {
+        val filter = ActivityFilter(component1, null /* intentAction */)
+
+        assertWithMessage("#matchActivity must be true because intent.component matches")
+            .that(filter.matchesActivity(activity)).isTrue()
+
+        intent.component = component2
+
+        assertWithMessage("#matchActivity must be false because component mismatches")
+            .that(filter.matchesActivity(activity)).isFalse()
+
+        doReturn(component1).whenever(activity).componentName
+
+        assertWithMessage("#matchActivity must be true because activity.componentName matches")
+            .that(filter.matchesActivity(activity)).isTrue()
+    }
+
+    @Test
+    fun testMatchActivity_MatchIntentWithAction() {
+        val filter = ActivityFilter(component1, ACTION)
+
+        assertWithMessage("#matchActivity must be false because intent has no action")
+            .that(filter.matchesActivity(activity)).isFalse()
+
+        intent.action = ACTION
+
+        assertWithMessage("#matchActivity must be true because intent matches")
+            .that(filter.matchesActivity(activity)).isTrue()
+    }
+
+    @Test
+    fun testMatchActivity_MatchWildcardWithAction() {
+        val filter = ActivityFilter(wildcard, ACTION)
+
+        assertWithMessage("#matchActivity must be false because intent has no action")
+            .that(filter.matchesActivity(activity)).isFalse()
+
+        intent.action = ACTION
+
+        assertWithMessage("#matchActivity must be true because intent.action matches")
+            .that(filter.matchesActivity(activity)).isTrue()
+
+        intent.component = null
+
+        assertWithMessage("#matchActivity must be true because intent.action matches regardless " +
+            "of null component")
+            .that(filter.matchesActivity(activity)).isTrue()
+    }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/ActivityFilter.kt b/window/window/src/main/java/androidx/window/embedding/ActivityFilter.kt
index f60a2b3..1f42252 100644
--- a/window/window/src/main/java/androidx/window/embedding/ActivityFilter.kt
+++ b/window/window/src/main/java/androidx/window/embedding/ActivityFilter.kt
@@ -85,12 +85,9 @@
     }
 
     fun matchesActivity(activity: Activity): Boolean {
-        // Check if the activity component names match
-        var match = MatcherUtils.areComponentsMatching(activity.componentName, componentName)
-        // If the intent is not empty - check that the rest of the filter fields match
-        if (activity.intent != null) {
-            match = match && matchesIntent(activity.intent)
-        }
+        val match =
+            MatcherUtils.areActivityOrIntentComponentsMatching(activity, componentName) &&
+                (intentAction == null || intentAction == activity.intent?.action)
         if (sDebugMatchers) {
             val matchString = if (match) "MATCH" else "NO MATCH"
             Log.w(
diff --git a/window/window/src/main/java/androidx/window/embedding/MatcherUtils.kt b/window/window/src/main/java/androidx/window/embedding/MatcherUtils.kt
index 3a239ca..712c94f 100644
--- a/window/window/src/main/java/androidx/window/embedding/MatcherUtils.kt
+++ b/window/window/src/main/java/androidx/window/embedding/MatcherUtils.kt
@@ -15,6 +15,7 @@
  */
 package androidx.window.embedding
 
+import android.app.Activity
 import android.content.ComponentName
 import android.util.Log
 import androidx.window.core.ExperimentalWindowApi
@@ -53,6 +54,23 @@
     }
 
     /**
+     * Returns `true` if [Activity.getComponentName] match or
+     * [Component][android.content.Intent.getComponent] of [Activity.getIntent] match allowing
+     * wildcard patterns.
+     */
+    internal fun areActivityOrIntentComponentsMatching(
+        activity: Activity,
+        ruleComponent: ComponentName
+    ): Boolean {
+        if (areComponentsMatching(activity.componentName, ruleComponent)) {
+            return true
+        }
+        // Returns false if activity's intent doesn't exist or its intent's Component doesn't match.
+        return activity.intent?.component ?.let {
+                component -> areComponentsMatching(component, ruleComponent) } ?: false
+    }
+
+    /**
      * Checks if the provided name matches the pattern with a wildcard.
      * @return {@code true} if the pattern contains a wildcard, and the pattern matches the
      * provided name.
diff --git a/window/window/src/main/java/androidx/window/layout/SidecarCompat.kt b/window/window/src/main/java/androidx/window/layout/SidecarCompat.kt
index d961d90..d7c58c6 100644
--- a/window/window/src/main/java/androidx/window/layout/SidecarCompat.kt
+++ b/window/window/src/main/java/androidx/window/layout/SidecarCompat.kt
@@ -60,7 +60,7 @@
     private var extensionCallback: ExtensionCallbackInterface? = null
 
     constructor(context: Context) : this(
-        SidecarProvider.getSidecarImpl(context),
+        SidecarProvider.getSidecarImpl(context.applicationContext),
         SidecarAdapter()
     )
 
diff --git a/window/window/src/main/java/androidx/window/layout/WindowMetricsCalculator.kt b/window/window/src/main/java/androidx/window/layout/WindowMetricsCalculator.kt
index ea76bc3..3da6ff5 100644
--- a/window/window/src/main/java/androidx/window/layout/WindowMetricsCalculator.kt
+++ b/window/window/src/main/java/androidx/window/layout/WindowMetricsCalculator.kt
@@ -19,6 +19,8 @@
 import android.app.Activity
 import android.os.Build
 import android.view.Display
+import androidx.annotation.RestrictTo
+import androidx.window.core.ExperimentalWindowApi
 
 /**
  * An interface to calculate the [WindowMetrics] for an [Activity].
@@ -75,9 +77,39 @@
     fun computeMaximumWindowMetrics(activity: Activity): WindowMetrics
 
     companion object {
+
+        private var decorator: (WindowMetricsCalculator) -> WindowMetricsCalculator =
+            { it }
+
         @JvmStatic
         fun getOrCreate(): WindowMetricsCalculator {
-            return WindowMetricsCalculatorCompat
+            return decorator(WindowMetricsCalculatorCompat)
+        }
+
+        @ExperimentalWindowApi
+        @JvmStatic
+        @RestrictTo(RestrictTo.Scope.TESTS)
+        public fun overrideDecorator(overridingDecorator: WindowMetricsCalculatorDecorator) {
+            decorator = overridingDecorator::decorate
+        }
+
+        @ExperimentalWindowApi
+        @JvmStatic
+        @RestrictTo(RestrictTo.Scope.TESTS)
+        public fun reset() {
+            decorator = { it }
         }
     }
 }
+
+@ExperimentalWindowApi
+@RestrictTo(RestrictTo.Scope.TESTS)
+public interface WindowMetricsCalculatorDecorator {
+
+    @ExperimentalWindowApi
+    /**
+     * Returns an instance of [WindowMetricsCalculator]
+     */
+    @RestrictTo(RestrictTo.Scope.TESTS)
+    public fun decorate(calculator: WindowMetricsCalculator): WindowMetricsCalculator
+}
\ No newline at end of file
diff --git a/work/README.md b/work/README.md
index 17860ca..7f104a2 100644
--- a/work/README.md
+++ b/work/README.md
@@ -1,7 +1,7 @@
 # androidx.work
 
-WorkManager is a library used to enqueue deferrable work that will execute sometime after its constraints are met.
-
+WorkManager the recommended library for persistent work.
+Scheduled work is is guaranteed to execute sometime after its {@link Constraints} are met.
 WorkManager allows observation of work status and the ability to create complex chains of work.
 
 [Library owners](OWNERS)
diff --git a/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/RetryActivity.java b/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/RetryActivity.java
index bff7669..8e9b849 100644
--- a/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/RetryActivity.java
+++ b/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/RetryActivity.java
@@ -128,22 +128,19 @@
             double errorRate = getInputData().getDouble(ERROR_RATE, 0.5);
 
             try {
-                Log.i(TAG,
-                        String.format("[%s] %s started (run attempt = %d)",
-                                name,
-                                getId(),
-                                getRunAttemptCount()));
+                Log.i(TAG, "[" + name + "] " + getId() +
+                        " started (run attempt = " + getRunAttemptCount() + ")");
                 for (int i = 0; i < timeTaken; i++) {
                     Thread.sleep(1000L);
-                    Log.v(TAG, String.format("[%s] %s completed stage = %d", name, getId(), i));
+                    Log.v(TAG, "[" + name + "] " + getId() + " completed stage = " + i);
                 }
                 if (Math.random() < errorRate) {
                     throw new RuntimeException("random failure");
                 }
-                Log.i(TAG, String.format("[%s] %s successful", name, getId()));
+                Log.i(TAG, "[" + name + "] " + getId() + " successful");
                 return Result.success();
             } catch (Exception e) {
-                Log.e(TAG, String.format("[%s] %s failed: %s", name, getId(), e.getMessage()));
+                Log.e(TAG, "[" + name + "] " + getId() + " failed: " + e.getMessage());
                 return Result.retry();
             }
         }
diff --git a/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/RetryWorker.java b/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/RetryWorker.java
index 3cf48e4..c9be7b4 100644
--- a/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/RetryWorker.java
+++ b/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/RetryWorker.java
@@ -54,7 +54,7 @@
     @NonNull
     @Override
     public Result doWork() {
-        Log.e(TAG, String.format("Requesting retry (%s)", getRunAttemptCount()));
+        Log.e(TAG, "Requesting retry (" + getRunAttemptCount() + ")");
         return Result.retry();
     }
 }
diff --git a/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/ToastWorker.java b/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/ToastWorker.java
index bf2d789..fb02bd2 100644
--- a/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/ToastWorker.java
+++ b/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/ToastWorker.java
@@ -59,7 +59,7 @@
             message = "completed!";
         }
         final Date now = new Date(System.currentTimeMillis());
-        Log.i(TAG, String.format("Run time [%s]: %s", message, now));
+        Log.i(TAG, "Run time [" + message + "]: " + now);
         final String displayMessage = message;
         new Handler(Looper.getMainLooper()).post(new Runnable() {
             @Override
diff --git a/work/work-gcm/src/main/java/androidx/work/impl/background/gcm/GcmScheduler.java b/work/work-gcm/src/main/java/androidx/work/impl/background/gcm/GcmScheduler.java
index 9031b57..9f29c18 100644
--- a/work/work-gcm/src/main/java/androidx/work/impl/background/gcm/GcmScheduler.java
+++ b/work/work-gcm/src/main/java/androidx/work/impl/background/gcm/GcmScheduler.java
@@ -54,14 +54,14 @@
     public void schedule(@NonNull WorkSpec... workSpecs) {
         for (WorkSpec workSpec : workSpecs) {
             Task task = mTaskConverter.convert(workSpec);
-            Logger.get().debug(TAG, String.format("Scheduling %s with %s", workSpec, task));
+            Logger.get().debug(TAG, "Scheduling " + workSpec + "with " + task);
             mNetworkManager.schedule(task);
         }
     }
 
     @Override
     public void cancel(@NonNull String workSpecId) {
-        Logger.get().debug(TAG, String.format("Cancelling %s", workSpecId));
+        Logger.get().debug(TAG, "Cancelling " + workSpecId);
         mNetworkManager.cancelTask(workSpecId, WorkManagerGcmService.class);
     }
 
diff --git a/work/work-gcm/src/main/java/androidx/work/impl/background/gcm/WorkManagerGcmDispatcher.java b/work/work-gcm/src/main/java/androidx/work/impl/background/gcm/WorkManagerGcmDispatcher.java
index f759de4..6f30c6a 100644
--- a/work/work-gcm/src/main/java/androidx/work/impl/background/gcm/WorkManagerGcmDispatcher.java
+++ b/work/work-gcm/src/main/java/androidx/work/impl/background/gcm/WorkManagerGcmDispatcher.java
@@ -89,7 +89,7 @@
         // per tag, which in our case is a workSpecId. Therefore its safe to block here with
         // a latch because there is 1 thread per workSpecId.
 
-        Logger.get().debug(TAG, String.format("Handling task %s", taskParams));
+        Logger.get().debug(TAG, "Handling task " + taskParams);
 
         String workSpecId = taskParams.getTag();
         if (workSpecId == null || workSpecId.isEmpty()) {
@@ -103,7 +103,7 @@
                 new WorkSpecTimeLimitExceededListener(mWorkManagerImpl);
         Processor processor = mWorkManagerImpl.getProcessor();
         processor.addExecutionListener(listener);
-        String wakeLockTag = String.format("WorkGcm-onRunTask (%s)", workSpecId);
+        String wakeLockTag = "WorkGcm-onRunTask (" + workSpecId + ")";
         PowerManager.WakeLock wakeLock = WakeLocks.newWakeLock(mContext, wakeLockTag);
         mWorkManagerImpl.startWork(workSpecId);
         mWorkTimer.startTimer(workSpecId, AWAIT_TIME_IN_MILLISECONDS, timeLimitExceededListener);
@@ -112,7 +112,7 @@
             wakeLock.acquire();
             listener.getLatch().await(AWAIT_TIME_IN_MINUTES, TimeUnit.MINUTES);
         } catch (InterruptedException exception) {
-            Logger.get().debug(TAG, String.format("Rescheduling WorkSpec %s", workSpecId));
+            Logger.get().debug(TAG, "Rescheduling WorkSpec" + workSpecId);
             return reschedule(workSpecId);
         } finally {
             processor.removeExecutionListener(listener);
@@ -121,7 +121,7 @@
         }
 
         if (listener.needsReschedule()) {
-            Logger.get().debug(TAG, String.format("Rescheduling WorkSpec %s", workSpecId));
+            Logger.get().debug(TAG, "Rescheduling WorkSpec" + workSpecId);
             return reschedule(workSpecId);
         }
 
@@ -130,18 +130,16 @@
         WorkInfo.State state = workSpec != null ? workSpec.state : null;
 
         if (state == null) {
-            Logger.get().debug(TAG, String.format("WorkSpec %s does not exist", workSpecId));
+            Logger.get().debug(TAG, "WorkSpec %s does not exist" + workSpecId);
             return GcmNetworkManager.RESULT_FAILURE;
         } else {
             switch (state) {
                 case SUCCEEDED:
                 case CANCELLED:
-                    Logger.get().debug(TAG,
-                            String.format("Returning RESULT_SUCCESS for WorkSpec %s", workSpecId));
+                    Logger.get().debug(TAG, "Returning RESULT_SUCCESS for WorkSpec " + workSpecId);
                     return GcmNetworkManager.RESULT_SUCCESS;
                 case FAILED:
-                    Logger.get().debug(TAG,
-                            String.format("Returning RESULT_FAILURE for WorkSpec %s", workSpecId));
+                    Logger.get().debug(TAG, "Returning RESULT_FAILURE for WorkSpec " +  workSpecId);
                     return GcmNetworkManager.RESULT_FAILURE;
                 default:
                     Logger.get().debug(TAG, "Rescheduling eligible work.");
@@ -175,8 +173,7 @@
             }
         });
 
-        Logger.get().debug(TAG,
-                String.format("Returning RESULT_SUCCESS for WorkSpec %s", workSpecId));
+        Logger.get().debug(TAG, "Returning RESULT_SUCCESS for WorkSpec " + workSpecId);
         return GcmNetworkManager.RESULT_SUCCESS;
     }
 
@@ -191,7 +188,7 @@
 
         @Override
         public void onTimeLimitExceeded(@NonNull String workSpecId) {
-            Logger.get().debug(TAG, String.format("WorkSpec time limit exceeded %s", workSpecId));
+            Logger.get().debug(TAG, "WorkSpec time limit exceeded " + workSpecId);
             mWorkManager.stopWork(workSpecId);
         }
     }
@@ -220,8 +217,7 @@
         public void onExecuted(@NonNull String workSpecId, boolean needsReschedule) {
             if (!mWorkSpecId.equals(workSpecId)) {
                 Logger.get().warning(TAG,
-                        String.format("Notified for %s, but was looking for %s", workSpecId,
-                                mWorkSpecId));
+                        "Notified for " + workSpecId + ", but was looking for " + mWorkSpecId);
             } else {
                 mNeedsReschedule = needsReschedule;
                 mLatch.countDown();
diff --git a/work/work-multiprocess/src/main/java/androidx/work/multiprocess/ListenableWorkerImpl.java b/work/work-multiprocess/src/main/java/androidx/work/multiprocess/ListenableWorkerImpl.java
index c4c1cca..39f3fa8 100644
--- a/work/work-multiprocess/src/main/java/androidx/work/multiprocess/ListenableWorkerImpl.java
+++ b/work/work-multiprocess/src/main/java/androidx/work/multiprocess/ListenableWorkerImpl.java
@@ -93,7 +93,7 @@
             final String workerClassName = parcelableRemoteWorkRequest.getWorkerClassName();
 
             Logger.get().debug(TAG,
-                    String.format("Executing work request (%s, %s)", id, workerClassName));
+                    "Executing work request (" + id + ", " + workerClassName + ")");
 
             final ListenableFuture<ListenableWorker.Result> futureResult =
                     executeWorkRequest(id, workerClassName, workerParameters);
@@ -109,7 +109,7 @@
                     } catch (ExecutionException | InterruptedException exception) {
                         reportFailure(callback, exception);
                     } catch (CancellationException cancellationException) {
-                        Logger.get().debug(TAG, String.format("Worker (%s) was cancelled", id));
+                        Logger.get().debug(TAG, "Worker (" + id + ") was cancelled");
                         reportFailure(callback, cancellationException);
                     } finally {
                         synchronized (sLock) {
@@ -131,7 +131,7 @@
             ParcelableWorkerParameters parcelableWorkerParameters =
                     ParcelConverters.unmarshall(request, ParcelableWorkerParameters.CREATOR);
             final String id = parcelableWorkerParameters.getId().toString();
-            Logger.get().debug(TAG, String.format("Interrupting work with id (%s)", id));
+            Logger.get().debug(TAG, "Interrupting work with id (" + id + ")");
 
             final ListenableFuture<ListenableWorker.Result> future;
             synchronized (sLock) {
@@ -162,9 +162,7 @@
             @NonNull WorkerParameters workerParameters) {
 
         final SettableFuture<ListenableWorker.Result> future = SettableFuture.create();
-
-        Logger.get().debug(TAG,
-                String.format("Tracking execution of %s (%s)", id, workerClassName));
+        Logger.get().debug(TAG, "Tracking execution of "  + id + " (" + workerClassName + ")");
 
         synchronized (sLock) {
             mFutureMap.put(id, future);
@@ -174,19 +172,15 @@
                 .createWorkerWithDefaultFallback(mContext, workerClassName, workerParameters);
 
         if (worker == null) {
-            String message = String.format(
-                    "Unable to create an instance of %s", workerClassName);
+            String message = "Unable to create an instance of " + workerClassName;
             Logger.get().error(TAG, message);
             future.setException(new IllegalStateException(message));
             return future;
         }
 
         if (!(worker instanceof RemoteListenableWorker)) {
-            String message = String.format(
-                    "%s does not extend %s",
-                    workerClassName,
-                    RemoteListenableWorker.class.getName()
-            );
+            String message =
+                    workerClassName + " does not extend " + RemoteListenableWorker.class.getName();
             Logger.get().error(TAG, message);
             future.setException(new IllegalStateException(message));
             return future;
diff --git a/work/work-multiprocess/src/main/java/androidx/work/multiprocess/ListenableWorkerImplClient.java b/work/work-multiprocess/src/main/java/androidx/work/multiprocess/ListenableWorkerImplClient.java
index 6dbd628..1b33980 100644
--- a/work/work-multiprocess/src/main/java/androidx/work/multiprocess/ListenableWorkerImplClient.java
+++ b/work/work-multiprocess/src/main/java/androidx/work/multiprocess/ListenableWorkerImplClient.java
@@ -77,8 +77,7 @@
         synchronized (mLock) {
             if (mConnection == null) {
                 Logger.get().debug(TAG,
-                        String.format("Binding to %s, %s", component.getPackageName(),
-                                component.getClassName()));
+                        "Binding to " + component.getPackageName() + ", " + component.getClassName());
 
                 mConnection = new Connection();
                 try {
@@ -210,7 +209,7 @@
         public void onNullBinding(@NonNull ComponentName name) {
             Logger.get().error(TAG, "Unable to bind to service");
             mFuture.setException(
-                    new RuntimeException(String.format("Cannot bind to service %s", name)));
+                    new RuntimeException("Cannot bind to service " + name));
         }
     }
 
diff --git a/work/work-multiprocess/src/main/java/androidx/work/multiprocess/RemoteWorkManagerClient.java b/work/work-multiprocess/src/main/java/androidx/work/multiprocess/RemoteWorkManagerClient.java
index ff89d80..8e59405 100644
--- a/work/work-multiprocess/src/main/java/androidx/work/multiprocess/RemoteWorkManagerClient.java
+++ b/work/work-multiprocess/src/main/java/androidx/work/multiprocess/RemoteWorkManagerClient.java
@@ -493,7 +493,7 @@
         public void onNullBinding(@NonNull ComponentName name) {
             Logger.get().error(TAG, "Unable to bind to service");
             mFuture.setException(
-                    new RuntimeException(String.format("Cannot bind to service %s", name)));
+                    new RuntimeException("Cannot bind to service " + name));
         }
     }
 
diff --git a/work/work-multiprocess/src/main/java/androidx/work/multiprocess/parcelable/ParcelableData.java b/work/work-multiprocess/src/main/java/androidx/work/multiprocess/parcelable/ParcelableData.java
index 46566ba..c22f99f 100644
--- a/work/work-multiprocess/src/main/java/androidx/work/multiprocess/parcelable/ParcelableData.java
+++ b/work/work-multiprocess/src/main/java/androidx/work/multiprocess/parcelable/ParcelableData.java
@@ -182,7 +182,7 @@
                 parcel.writeStringArray(stringArray);
             } else {
                 // Exhaustive check
-                String message = String.format("Unsupported value type %s", valueType.getName());
+                String message = "Unsupported value type " + valueType.getName();
                 throw new IllegalArgumentException(message);
             }
         }
@@ -240,7 +240,7 @@
                 value = parcel.createStringArray();
                 break;
             default:
-                String message = String.format("Unsupported type %s", type);
+                String message = "Unsupported type " + type;
                 throw new IllegalStateException(message);
         }
         String key = parcel.readString();
diff --git a/work/work-multiprocess/src/main/java/androidx/work/multiprocess/parcelable/ParcelableResult.java b/work/work-multiprocess/src/main/java/androidx/work/multiprocess/parcelable/ParcelableResult.java
index d24b96e..d4e0e3e 100644
--- a/work/work-multiprocess/src/main/java/androidx/work/multiprocess/parcelable/ParcelableResult.java
+++ b/work/work-multiprocess/src/main/java/androidx/work/multiprocess/parcelable/ParcelableResult.java
@@ -91,7 +91,7 @@
             return 3;
         } else {
             // Exhaustive check
-            throw new IllegalStateException(String.format("Unknown Result %s", result));
+            throw new IllegalStateException("Unknown Result " + result);
         }
     }
 
@@ -106,7 +106,7 @@
             result = ListenableWorker.Result.failure(data);
         } else {
             // Exhaustive check
-            throw new IllegalStateException(String.format("Unknown result type %s", resultType));
+            throw new IllegalStateException("Unknown result type " + resultType);
         }
         return result;
     }
diff --git a/work/work-runtime-ktx/src/androidTest/java/androidx/work/ListenableFutureTest.kt b/work/work-runtime-ktx/src/androidTest/java/androidx/work/ListenableFutureTest.kt
index 3774674..f350041 100644
--- a/work/work-runtime-ktx/src/androidTest/java/androidx/work/ListenableFutureTest.kt
+++ b/work/work-runtime-ktx/src/androidTest/java/androidx/work/ListenableFutureTest.kt
@@ -47,6 +47,7 @@
             job.join()
         }
     }
+
     @OptIn(DelicateCoroutinesApi::class)
     @Test
     fun testFutureWithException() {
@@ -65,6 +66,7 @@
             job.join()
         }
     }
+
     @OptIn(DelicateCoroutinesApi::class)
     @Test
     fun testFutureCancellation() {
@@ -78,4 +80,18 @@
             assertThat(job.isCancelled, `is`(true))
         }
     }
+
+    @OptIn(DelicateCoroutinesApi::class)
+    @Test
+    fun testCoroutineScopeCancellation() {
+        val future: ResolvableFuture<Int> = ResolvableFuture.create()
+        val job = GlobalScope.launch {
+            future.await()
+        }
+        job.cancel()
+        runBlocking {
+            job.join()
+            assertThat(future.isCancelled, `is`(true))
+        }
+    }
 }
diff --git a/work/work-runtime-ktx/src/main/java/androidx/work/ListenableFuture.kt b/work/work-runtime-ktx/src/main/java/androidx/work/ListenableFuture.kt
index 6ae7f33..75f231f 100644
--- a/work/work-runtime-ktx/src/main/java/androidx/work/ListenableFuture.kt
+++ b/work/work-runtime-ktx/src/main/java/androidx/work/ListenableFuture.kt
@@ -60,6 +60,10 @@
             },
             DirectExecutor.INSTANCE
         )
+
+        cancellableContinuation.invokeOnCancellation {
+            cancel(false)
+        }
     }
 }
 
diff --git a/work/work-runtime/api/current.ignore b/work/work-runtime/api/current.ignore
deleted file mode 100644
index ba1fe7e..0000000
--- a/work/work-runtime/api/current.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-AddedAbstractMethod: androidx.work.ListenableWorker.Result#getOutputData():
-    Added method androidx.work.ListenableWorker.Result.getOutputData()
diff --git a/work/work-runtime/api/restricted_current.ignore b/work/work-runtime/api/restricted_current.ignore
deleted file mode 100644
index ba1fe7e..0000000
--- a/work/work-runtime/api/restricted_current.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-AddedAbstractMethod: androidx.work.ListenableWorker.Result#getOutputData():
-    Added method androidx.work.ListenableWorker.Result.getOutputData()
diff --git a/work/work-runtime/build.gradle b/work/work-runtime/build.gradle
index f6c9f47..ca771f4 100644
--- a/work/work-runtime/build.gradle
+++ b/work/work-runtime/build.gradle
@@ -49,7 +49,7 @@
 }
 
 dependencies {
-    implementation("androidx.core:core:1.5.0-beta01")
+    implementation("androidx.core:core:1.6.0")
     annotationProcessor("androidx.room:room-compiler:2.2.5")
     implementation("androidx.room:room-runtime:2.2.5")
     androidTestImplementation("androidx.room:room-testing:2.2.5")
diff --git a/work/work-runtime/src/androidTest/AndroidManifest.xml b/work/work-runtime/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..787454f
--- /dev/null
+++ b/work/work-runtime/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,27 @@
+<!--
+  ~ 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.
+  -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="androidx.work.test">
+
+    <!--
+      ~ Adding this permission to the test-app's AndroidManifest.xml. This is because
+      ~ we don't want applications to implicitly add this permission on API 31 and above. We only
+      ~ need this permission for tests.
+    -->
+    <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
+
+</manifest>
diff --git a/work/work-runtime/src/main/java/androidx/work/Data.java b/work/work-runtime/src/main/java/androidx/work/Data.java
index 578e83e..3eb2d7e 100644
--- a/work/work-runtime/src/main/java/androidx/work/Data.java
+++ b/work/work-runtime/src/main/java/androidx/work/Data.java
@@ -937,7 +937,7 @@
                     mValues.put(key, convertPrimitiveDoubleArray((double[]) value));
                 } else {
                     throw new IllegalArgumentException(
-                            String.format("Key %s has invalid type %s", key, valueType));
+                            "Key " + key + "has invalid type " + valueType);
                 }
             }
             return this;
diff --git a/work/work-runtime/src/main/java/androidx/work/DelegatingWorkerFactory.java b/work/work-runtime/src/main/java/androidx/work/DelegatingWorkerFactory.java
index 83e1d10..1dad53b 100644
--- a/work/work-runtime/src/main/java/androidx/work/DelegatingWorkerFactory.java
+++ b/work/work-runtime/src/main/java/androidx/work/DelegatingWorkerFactory.java
@@ -75,8 +75,7 @@
                 }
             } catch (Throwable throwable) {
                 String message =
-                        String.format("Unable to instantiate a ListenableWorker (%s)",
-                                workerClassName);
+                        "Unable to instantiate a ListenableWorker (" + workerClassName + ")";
                 Logger.get().error(TAG, message, throwable);
                 throw throwable;
             }
diff --git a/work/work-runtime/src/main/java/androidx/work/Logger.java b/work/work-runtime/src/main/java/androidx/work/Logger.java
index a9fe640..fb01315 100644
--- a/work/work-runtime/src/main/java/androidx/work/Logger.java
+++ b/work/work-runtime/src/main/java/androidx/work/Logger.java
@@ -84,27 +84,57 @@
     /**
      * Equivalent to Log.v.
      */
-    public abstract void verbose(String tag, String message, Throwable... throwables);
+    public abstract void verbose(@NonNull String tag, @NonNull String message);
+
+    /**
+     * Equivalent to Log.v.
+     */
+    public abstract void verbose(@NonNull String tag, @NonNull String message,
+            @NonNull Throwable throwable);
 
     /**
      * Equivalent to Log.d.
      */
-    public abstract void debug(String tag, String message, Throwable... throwables);
+    public abstract void debug(@NonNull String tag, @NonNull String message);
+
+    /**
+     * Equivalent to Log.d.
+     */
+    public abstract void debug(@NonNull String tag, @NonNull String message,
+            @NonNull Throwable throwable);
 
     /**
      * Equivalent to Log.i.
      */
-    public abstract void info(String tag, String message, Throwable... throwables);
+    public abstract void info(@NonNull String tag, @NonNull String message);
+
+    /**
+     * Equivalent to Log.i.
+     */
+    public abstract void info(@NonNull String tag, @NonNull String message,
+            @NonNull Throwable throwable);
 
     /**
      * Equivalent to Log.w.
      */
-    public abstract void warning(String tag, String message, Throwable... throwables);
+    public abstract void warning(@NonNull String tag, @NonNull String message);
+
+    /**
+     * Equivalent to Log.w.
+     */
+    public abstract void warning(@NonNull String tag, @NonNull String message,
+            @NonNull Throwable throwable);
 
     /**
      * Equivalent to Log.e.
      */
-    public abstract void error(String tag, String message, Throwable... throwables);
+    public abstract void error(@NonNull String tag, @NonNull String message);
+
+    /**
+     * Equivalent to Log.e.
+     */
+    public abstract void error(@NonNull String tag, @NonNull String message,
+            @NonNull Throwable throwable);
 
     /**
      * The default {@link Logger} implementation that writes to logcat when the requests meet or
@@ -121,57 +151,77 @@
         }
 
         @Override
-        public void verbose(String tag, String message, Throwable... throwables) {
+        public void verbose(@NonNull String tag, @NonNull String message) {
             if (mLoggingLevel <= Log.VERBOSE) {
-                if (throwables != null && throwables.length >= 1) {
-                    Log.v(tag, message, throwables[0]);
-                } else {
-                    Log.v(tag, message);
-                }
+                Log.v(tag, message);
             }
         }
 
         @Override
-        public void debug(String tag, String message, Throwable... throwables) {
+        public void verbose(@NonNull String tag, @NonNull String message,
+                @NonNull Throwable throwable) {
+            if (mLoggingLevel <= Log.VERBOSE) {
+                Log.v(tag, message, throwable);
+            }
+        }
+
+        @Override
+        public void debug(@NonNull String tag, @NonNull String message) {
             if (mLoggingLevel <= Log.DEBUG) {
-                if (throwables != null && throwables.length >= 1) {
-                    Log.d(tag, message, throwables[0]);
-                } else {
-                    Log.d(tag, message);
-                }
+                Log.d(tag, message);
             }
         }
 
         @Override
-        public void info(String tag, String message, Throwable... throwables) {
+        public void debug(@NonNull String tag, @NonNull String message,
+                @NonNull Throwable throwable) {
+            if (mLoggingLevel <= Log.DEBUG) {
+                Log.d(tag, message, throwable);
+            }
+        }
+
+        @Override
+        public void info(@NonNull String tag, @NonNull String message) {
             if (mLoggingLevel <= Log.INFO) {
-                if (throwables != null && throwables.length >= 1) {
-                    Log.i(tag, message, throwables[0]);
-                } else {
-                    Log.i(tag, message);
-                }
+                Log.i(tag, message);
             }
         }
 
         @Override
-        public void warning(String tag, String message, Throwable... throwables) {
+        public void info(@NonNull String tag, @NonNull String message,
+                @NonNull Throwable throwable) {
+            if (mLoggingLevel <= Log.INFO) {
+                Log.i(tag, message, throwable);
+            }
+        }
+
+        @Override
+        public void warning(@NonNull String tag, @NonNull String message) {
             if (mLoggingLevel <= Log.WARN) {
-                if (throwables != null && throwables.length >= 1) {
-                    Log.w(tag, message, throwables[0]);
-                } else {
-                    Log.w(tag, message);
-                }
+                Log.w(tag, message);
             }
         }
 
         @Override
-        public void error(String tag, String message, Throwable... throwables) {
+        public void warning(@NonNull String tag, @NonNull String message,
+                @NonNull Throwable throwable) {
+            if (mLoggingLevel <= Log.WARN) {
+                Log.w(tag, message, throwable);
+            }
+        }
+
+        @Override
+        public void error(@NonNull String tag, @NonNull String message) {
             if (mLoggingLevel <= Log.ERROR) {
-                if (throwables != null && throwables.length >= 1) {
-                    Log.e(tag, message, throwables[0]);
-                } else {
-                    Log.e(tag, message);
-                }
+                Log.e(tag, message);
+            }
+        }
+
+        @Override
+        public void error(@NonNull String tag, @NonNull String message,
+                @NonNull Throwable throwable) {
+            if (mLoggingLevel <= Log.ERROR) {
+                Log.e(tag, message, throwable);
             }
         }
     }
diff --git a/work/work-runtime/src/main/java/androidx/work/Operation.java b/work/work-runtime/src/main/java/androidx/work/Operation.java
index bf9c999..e3d8dde 100644
--- a/work/work-runtime/src/main/java/androidx/work/Operation.java
+++ b/work/work-runtime/src/main/java/androidx/work/Operation.java
@@ -142,7 +142,7 @@
             @Override
             @NonNull
             public String toString() {
-                return String.format("FAILURE (%s)", mThrowable.getMessage());
+                return "FAILURE (" + mThrowable.getMessage() + ")";
             }
         }
     }
diff --git a/work/work-runtime/src/main/java/androidx/work/WorkManager.java b/work/work-runtime/src/main/java/androidx/work/WorkManager.java
index 3dae5e9..040a700 100644
--- a/work/work-runtime/src/main/java/androidx/work/WorkManager.java
+++ b/work/work-runtime/src/main/java/androidx/work/WorkManager.java
@@ -33,9 +33,9 @@
 import java.util.concurrent.TimeUnit;
 
 /**
- * WorkManager is a library used to enqueue deferrable work that is guaranteed to execute sometime
- * after its {@link Constraints} are met.  WorkManager allows observation of work status and the
- * ability to create complex chains of work.
+ * WorkManager the recommended library for persistent work.
+ * Scheduled work is is guaranteed to execute sometime after its {@link Constraints} are met.
+ * WorkManager allows observation of work status and the ability to create complex chains of work.
  * <p>
  * WorkManager uses an underlying job dispatching service when available based on the following
  * criteria:
diff --git a/work/work-runtime/src/main/java/androidx/work/WorkerFactory.java b/work/work-runtime/src/main/java/androidx/work/WorkerFactory.java
index ef9e223..180cd47 100644
--- a/work/work-runtime/src/main/java/androidx/work/WorkerFactory.java
+++ b/work/work-runtime/src/main/java/androidx/work/WorkerFactory.java
@@ -104,12 +104,10 @@
 
         if (worker != null && worker.isUsed()) {
             String factoryName = this.getClass().getName();
-            String message = String.format("WorkerFactory (%s) returned an instance of a "
-                            + "ListenableWorker (%s) which has already been invoked. "
-                            + "createWorker() must always return a new instance of a "
-                            + "ListenableWorker.",
-                    factoryName, workerClassName);
-
+            String message = "WorkerFactory (" + factoryName + ") returned an instance of a "
+                    + "ListenableWorker (" + workerClassName + ") which has already been invoked. "
+                    + "createWorker() must always return a new instance of a "
+                    + "ListenableWorker.";
             throw new IllegalStateException(message);
         }
 
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/Processor.java b/work/work-runtime/src/main/java/androidx/work/impl/Processor.java
index 10cf65e..d9c8262 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/Processor.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/Processor.java
@@ -115,9 +115,7 @@
             // Work may get triggered multiple times if they have passing constraints
             // and new work with those constraints are added.
             if (isEnqueued(id)) {
-                Logger.get().debug(
-                        TAG,
-                        String.format("Work %s is already enqueued for processing", id));
+                Logger.get().debug(TAG, "Work " + id + " is already enqueued for processing");
                 return false;
             }
 
@@ -139,7 +137,7 @@
             mEnqueuedWorkMap.put(id, workWrapper);
         }
         mWorkTaskExecutor.getBackgroundExecutor().execute(workWrapper);
-        Logger.get().debug(TAG, String.format("%s: processing %s", getClass().getSimpleName(), id));
+        Logger.get().debug(TAG, getClass().getSimpleName() + ": processing " + id);
         return true;
     }
 
@@ -147,8 +145,7 @@
     public void startForeground(@NonNull String workSpecId,
             @NonNull ForegroundInfo foregroundInfo) {
         synchronized (mLock) {
-            Logger.get().info(TAG, String.format("Moving WorkSpec (%s) to the foreground",
-                    workSpecId));
+            Logger.get().info(TAG, "Moving WorkSpec (" + workSpecId + ") to the foreground");
             WorkerWrapper wrapper = mEnqueuedWorkMap.remove(workSpecId);
             if (wrapper != null) {
                 if (mForegroundLock == null) {
@@ -171,7 +168,7 @@
      */
     public boolean stopForegroundWork(@NonNull String id) {
         synchronized (mLock) {
-            Logger.get().debug(TAG, String.format("Processor stopping foreground work %s", id));
+            Logger.get().debug(TAG, "Processor stopping foreground work " + id);
             WorkerWrapper wrapper = mForegroundWorkMap.remove(id);
             return interrupt(id, wrapper);
         }
@@ -185,7 +182,7 @@
      */
     public boolean stopWork(@NonNull String id) {
         synchronized (mLock) {
-            Logger.get().debug(TAG, String.format("Processor stopping background work %s", id));
+            Logger.get().debug(TAG, "Processor stopping background work " + id);
             WorkerWrapper wrapper = mEnqueuedWorkMap.remove(id);
             return interrupt(id, wrapper);
         }
@@ -199,7 +196,7 @@
      */
     public boolean stopAndCancelWork(@NonNull String id) {
         synchronized (mLock) {
-            Logger.get().debug(TAG, String.format("Processor cancelling %s", id));
+            Logger.get().debug(TAG, "Processor cancelling " + id);
             mCancelledIds.add(id);
             WorkerWrapper wrapper;
             // Check if running in the context of a foreground service
@@ -297,9 +294,9 @@
 
         synchronized (mLock) {
             mEnqueuedWorkMap.remove(workSpecId);
-            Logger.get().debug(TAG, String.format("%s %s executed; reschedule = %s",
-                    getClass().getSimpleName(), workSpecId, needsReschedule));
-
+            Logger.get().debug(TAG,
+                    getClass().getSimpleName() + " " + workSpecId +
+                            " executed; reschedule = " + needsReschedule);
             for (ExecutionListener executionListener : mOuterListeners) {
                 executionListener.onExecuted(workSpecId, needsReschedule);
             }
@@ -338,10 +335,10 @@
     private static boolean interrupt(@NonNull String id, @Nullable WorkerWrapper wrapper) {
         if (wrapper != null) {
             wrapper.interrupt();
-            Logger.get().debug(TAG, String.format("WorkerWrapper interrupted for %s", id));
+            Logger.get().debug(TAG, "WorkerWrapper interrupted for " + id);
             return true;
         } else {
-            Logger.get().debug(TAG, String.format("WorkerWrapper could not be found for %s", id));
+            Logger.get().debug(TAG, "WorkerWrapper could not be found for " + id);
             return false;
         }
     }
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/Schedulers.java b/work/work-runtime/src/main/java/androidx/work/impl/Schedulers.java
index b43c623..9569703 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/Schedulers.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/Schedulers.java
@@ -150,7 +150,7 @@
             Class<?> klass = Class.forName(GCM_SCHEDULER);
             Scheduler scheduler =
                     (Scheduler) klass.getConstructor(Context.class).newInstance(context);
-            Logger.get().debug(TAG, String.format("Created %s", GCM_SCHEDULER));
+            Logger.get().debug(TAG, "Created " + GCM_SCHEDULER);
             return scheduler;
         } catch (Throwable throwable) {
             Logger.get().debug(TAG, "Unable to create GCM Scheduler", throwable);
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/WorkContinuationImpl.java b/work/work-runtime/src/main/java/androidx/work/impl/WorkContinuationImpl.java
index 83762b4..525d7d0 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/WorkContinuationImpl.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/WorkContinuationImpl.java
@@ -188,7 +188,7 @@
             mOperation = runnable.getOperation();
         } else {
             Logger.get().warning(TAG,
-                    String.format("Already enqueued work ids (%s)", TextUtils.join(", ", mIds)));
+                    "Already enqueued work ids (" + TextUtils.join(", ", mIds) + ")");
         }
         return mOperation;
     }
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/WorkDatabasePathHelper.java b/work/work-runtime/src/main/java/androidx/work/impl/WorkDatabasePathHelper.java
index 0b4bf2b..6acbfaeb 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/WorkDatabasePathHelper.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/WorkDatabasePathHelper.java
@@ -68,15 +68,15 @@
                 File destination = paths.get(source);
                 if (source.exists() && destination != null) {
                     if (destination.exists()) {
-                        String message = String.format("Over-writing contents of %s", destination);
+                        String message = "Over-writing contents of " + destination;
                         Logger.get().warning(TAG, message);
                     }
                     boolean renamed = source.renameTo(destination);
                     String message;
                     if (renamed) {
-                        message = String.format("Migrated %s to %s", source, destination);
+                        message = "Migrated " + source + "to " + destination;
                     } else {
-                        message = String.format("Renaming %s to %s failed", source, destination);
+                        message = "Renaming " + source + " to " + destination + " failed";
                     }
                     Logger.get().debug(TAG, message);
                 }
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/WorkerWrapper.java b/work/work-runtime/src/main/java/androidx/work/impl/WorkerWrapper.java
index 12b8eee..eee1b9c 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/WorkerWrapper.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/WorkerWrapper.java
@@ -148,7 +148,7 @@
             if (mWorkSpec == null) {
                 Logger.get().error(
                         TAG,
-                        String.format("Didn't find WorkSpec for id %s", mWorkSpecId));
+                        "Didn't find WorkSpec for id " + mWorkSpecId);
                 resolve(false);
                 mWorkDatabase.setTransactionSuccessful();
                 return;
@@ -160,8 +160,8 @@
                 resolveIncorrectStatus();
                 mWorkDatabase.setTransactionSuccessful();
                 Logger.get().debug(TAG,
-                        String.format("%s is not in ENQUEUED state. Nothing more to do.",
-                                mWorkSpec.workerClassName));
+                        mWorkSpec.workerClassName
+                                + " is not in ENQUEUED state. Nothing more to do");
                 return;
             }
 
@@ -216,8 +216,7 @@
             InputMerger inputMerger =
                     inputMergerFactory.createInputMergerWithDefaultFallback(inputMergerClassName);
             if (inputMerger == null) {
-                Logger.get().error(TAG, String.format("Could not create Input Merger %s",
-                        mWorkSpec.inputMergerClassName));
+                Logger.get().error(TAG, "Could not create Input Merger " + mWorkSpec.inputMergerClassName);
                 setFailedAndResolve();
                 return;
             }
@@ -250,16 +249,14 @@
 
         if (mWorker == null) {
             Logger.get().error(TAG,
-                    String.format("Could not create Worker %s", mWorkSpec.workerClassName));
+                    "Could not create Worker " + mWorkSpec.workerClassName);
             setFailedAndResolve();
             return;
         }
 
         if (mWorker.isUsed()) {
-            Logger.get().error(TAG,
-                    String.format("Received an already-used Worker %s; WorkerFactory should return "
-                            + "new instances",
-                            mWorkSpec.workerClassName));
+            Logger.get().error(TAG, "Received an already-used Worker " + mWorkSpec.workerClassName
+                    + "; Worker Factory should return new instances");
             setFailedAndResolve();
             return;
         }
@@ -290,7 +287,7 @@
                     try {
                         runExpedited.get();
                         Logger.get().debug(TAG,
-                                String.format("Starting work for %s", mWorkSpec.workerClassName));
+                                "Starting work for " + mWorkSpec.workerClassName);
                         // Call mWorker.startWork() on the main thread.
                         mInnerFuture = mWorker.startWork();
                         future.setFuture(mInnerFuture);
@@ -310,23 +307,20 @@
                         // If the ListenableWorker returns a null result treat it as a failure.
                         ListenableWorker.Result result = future.get();
                         if (result == null) {
-                            Logger.get().error(TAG, String.format(
-                                    "%s returned a null result. Treating it as a failure.",
-                                    mWorkSpec.workerClassName));
+                            Logger.get().error(TAG, mWorkSpec.workerClassName
+                                    + " returned a null result. Treating it as a failure.");
                         } else {
-                            Logger.get().debug(TAG, String.format("%s returned a %s result.",
-                                    mWorkSpec.workerClassName, result));
+                            Logger.get().debug(TAG,
+                                    mWorkSpec.workerClassName + " returned a " + result + ".");
                             mResult = result;
                         }
                     } catch (CancellationException exception) {
                         // Cancellations need to be treated with care here because innerFuture
                         // cancellations will bubble up, and we need to gracefully handle that.
-                        Logger.get().info(TAG, String.format("%s was cancelled", workDescription),
-                                exception);
+                        Logger.get().info(TAG, workDescription + " was cancelled", exception);
                     } catch (InterruptedException | ExecutionException exception) {
                         Logger.get().error(TAG,
-                                String.format("%s failed because it threw an exception/error",
-                                        workDescription), exception);
+                                workDescription + " failed because it threw an exception/error");
                     } finally {
                         onWorkFinished();
                     }
@@ -396,8 +390,7 @@
         if (mWorker != null && !isDone) {
             mWorker.stop();
         } else {
-            String message =
-                    String.format("WorkSpec %s is already done. Not interrupting.", mWorkSpec);
+            String message = "WorkSpec " + mWorkSpec + " is already done. Not interrupting.";
             Logger.get().debug(TAG, message);
         }
     }
@@ -405,12 +398,12 @@
     private void resolveIncorrectStatus() {
         WorkInfo.State status = mWorkSpecDao.getState(mWorkSpecId);
         if (status == RUNNING) {
-            Logger.get().debug(TAG, String.format("Status for %s is RUNNING;"
-                    + "not doing any work and rescheduling for later execution", mWorkSpecId));
+            Logger.get().debug(TAG, "Status for " + mWorkSpecId
+                    + " is RUNNING; not doing any work and rescheduling for later execution");
             resolve(true);
         } else {
             Logger.get().debug(TAG,
-                    String.format("Status for %s is %s; not doing any work", mWorkSpecId, status));
+                    "Status for " + mWorkSpecId + " is " + status + " ; not doing any work");
             resolve(false);
         }
     }
@@ -422,7 +415,7 @@
         // Worker exceeding a 10 min execution window.
         // One scheduler completing a Worker, and telling other Schedulers to cleanup.
         if (mInterrupted) {
-            Logger.get().debug(TAG, String.format("Work interrupted for %s", mWorkDescription));
+            Logger.get().debug(TAG, "Work interrupted for " + mWorkDescription);
             WorkInfo.State currentState = mWorkSpecDao.getState(mWorkSpecId);
             if (currentState == null) {
                 // This can happen because of a beginUniqueWork(..., REPLACE, ...).  Notify the
@@ -470,7 +463,7 @@
         if (result instanceof ListenableWorker.Result.Success) {
             Logger.get().info(
                     TAG,
-                    String.format("Worker result SUCCESS for %s", mWorkDescription));
+                    "Worker result SUCCESS for " + mWorkDescription);
             if (mWorkSpec.isPeriodic()) {
                 resetPeriodicAndResolve();
             } else {
@@ -480,12 +473,12 @@
         } else if (result instanceof ListenableWorker.Result.Retry) {
             Logger.get().info(
                     TAG,
-                    String.format("Worker result RETRY for %s", mWorkDescription));
+                    "Worker result RETRY for " + mWorkDescription);
             rescheduleAndResolve();
         } else {
             Logger.get().info(
                     TAG,
-                    String.format("Worker result FAILURE for %s", mWorkDescription));
+                    "Worker result FAILURE for " + mWorkDescription);
             if (mWorkSpec.isPeriodic()) {
                 resetPeriodicAndResolve();
             } else {
@@ -588,7 +581,7 @@
                 if (mWorkSpecDao.getState(dependentWorkId) == BLOCKED
                         && mDependencyDao.hasCompletedAllPrerequisites(dependentWorkId)) {
                     Logger.get().info(TAG,
-                            String.format("Setting status to enqueued for %s", dependentWorkId));
+                            "Setting status to enqueued for " + dependentWorkId);
                     mWorkSpecDao.setState(ENQUEUED, dependentWorkId);
                     mWorkSpecDao.setPeriodStartTime(dependentWorkId, currentTimeMillis);
                 }
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/background/greedy/DelayedWorkTracker.java b/work/work-runtime/src/main/java/androidx/work/impl/background/greedy/DelayedWorkTracker.java
index ccc0c64..8d46d0a 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/background/greedy/DelayedWorkTracker.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/background/greedy/DelayedWorkTracker.java
@@ -71,7 +71,7 @@
         Runnable runnable = new Runnable() {
             @Override
             public void run() {
-                Logger.get().debug(TAG, String.format("Scheduling work %s", workSpec.id));
+                Logger.get().debug(TAG, "Scheduling work " + workSpec.id);
                 mGreedyScheduler.schedule(workSpec);
             }
         };
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/Alarms.java b/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/Alarms.java
index e98a2b8..d9555fd 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/Alarms.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/Alarms.java
@@ -90,7 +90,7 @@
         if (systemIdInfo != null) {
             cancelExactAlarm(context, workSpecId, systemIdInfo.systemId);
             Logger.get().debug(TAG,
-                    String.format("Removing SystemIdInfo for workSpecId (%s)", workSpecId));
+                    "Removing SystemIdInfo for workSpecId (" + workSpecId + ")");
             systemIdInfoDao.removeSystemIdInfo(workSpecId);
         }
     }
@@ -108,10 +108,7 @@
         }
         PendingIntent pendingIntent = PendingIntent.getService(context, alarmId, delayMet, flags);
         if (pendingIntent != null && alarmManager != null) {
-            Logger.get().debug(TAG, String.format(
-                    "Cancelling existing alarm with (workSpecId, systemId) (%s, %s)",
-                    workSpecId,
-                    alarmId));
+            Logger.get().debug(TAG, "Cancelling existing alarm with (workSpecId, systemId) (" + workSpecId + ", " + alarmId + ")");
             alarmManager.cancel(pendingIntent);
         }
     }
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/CommandHandler.java b/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/CommandHandler.java
index 736b79d..a3bcefa 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/CommandHandler.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/CommandHandler.java
@@ -161,9 +161,7 @@
             Bundle extras = intent.getExtras();
             if (!hasKeys(extras, KEY_WORKSPEC_ID)) {
                 Logger.get().error(TAG,
-                        String.format("Invalid request for %s, requires %s.",
-                                action,
-                                KEY_WORKSPEC_ID));
+                        "Invalid request for " + action + " , requires " + KEY_WORKSPEC_ID + " .");
             } else {
                 if (ACTION_SCHEDULE_WORK.equals(action)) {
                     handleScheduleWorkIntent(intent, startId, dispatcher);
@@ -174,7 +172,7 @@
                 } else if (ACTION_EXECUTION_COMPLETED.equals(action)) {
                     handleExecutionCompleted(intent, startId);
                 } else {
-                    Logger.get().warning(TAG, String.format("Ignoring intent %s", intent));
+                    Logger.get().warning(TAG, "Ignoring intent " + intent);
                 }
             }
         }
@@ -187,7 +185,7 @@
 
         Bundle extras = intent.getExtras();
         String workSpecId = extras.getString(KEY_WORKSPEC_ID);
-        Logger.get().debug(TAG, String.format("Handling schedule work for %s", workSpecId));
+        Logger.get().debug(TAG, "Handling schedule work for " + workSpecId);
 
         WorkManagerImpl workManager = dispatcher.getWorkManager();
         WorkDatabase workDatabase = workManager.getWorkDatabase();
@@ -224,13 +222,12 @@
 
             if (!workSpec.hasConstraints()) {
                 Logger.get().debug(TAG,
-                        String.format("Setting up Alarms for %s at %s", workSpecId, triggerAt));
+                        "Setting up Alarms for " + workSpecId + "at " + triggerAt);
                 Alarms.setAlarm(mContext, dispatcher.getWorkManager(), workSpecId, triggerAt);
             } else {
                 // Schedule an alarm irrespective of whether all constraints matched.
                 Logger.get().debug(TAG,
-                        String.format("Opportunistically setting an alarm for %s at %s", workSpecId,
-                                triggerAt));
+                        "Opportunistically setting an alarm for " + workSpecId + "at " + triggerAt);
                 Alarms.setAlarm(
                         mContext,
                         dispatcher.getWorkManager(),
@@ -261,7 +258,7 @@
         Bundle extras = intent.getExtras();
         synchronized (mLock) {
             String workSpecId = extras.getString(KEY_WORKSPEC_ID);
-            Logger.get().debug(TAG, String.format("Handing delay met for %s", workSpecId));
+            Logger.get().debug(TAG, "Handing delay met for " + workSpecId);
 
             // Check to see if we are already handling an ACTION_DELAY_MET for the WorkSpec.
             // If we are, then there is nothing for us to do.
@@ -271,9 +268,8 @@
                 mPendingDelayMet.put(workSpecId, delayMetCommandHandler);
                 delayMetCommandHandler.handleProcessWork();
             } else {
-                Logger.get().debug(TAG,
-                        String.format("WorkSpec %s is already being handled for ACTION_DELAY_MET",
-                                workSpecId));
+                Logger.get().debug(TAG, "WorkSpec " + workSpecId
+                        + " is is already being handled for ACTION_DELAY_MET");
             }
         }
     }
@@ -284,7 +280,7 @@
 
         Bundle extras = intent.getExtras();
         String workSpecId = extras.getString(KEY_WORKSPEC_ID);
-        Logger.get().debug(TAG, String.format("Handing stopWork work for %s", workSpecId));
+        Logger.get().debug(TAG, "Handing stopWork work for " + workSpecId);
 
         dispatcher.getWorkManager().stopWork(workSpecId);
         Alarms.cancelAlarm(mContext, dispatcher.getWorkManager(), workSpecId);
@@ -297,7 +293,7 @@
             @NonNull Intent intent, int startId,
             @NonNull SystemAlarmDispatcher dispatcher) {
 
-        Logger.get().debug(TAG, String.format("Handling constraints changed %s", intent));
+        Logger.get().debug(TAG, "Handling constraints changed " + intent);
         // Constraints changed command handler is synchronous. No cleanup
         // is necessary.
         ConstraintsCommandHandler changedCommandHandler =
@@ -310,7 +306,7 @@
             int startId,
             @NonNull SystemAlarmDispatcher dispatcher) {
 
-        Logger.get().debug(TAG, String.format("Handling reschedule %s, %s", intent, startId));
+        Logger.get().debug(TAG, "Handling reschedule " + intent + ", " + startId);
         dispatcher.getWorkManager().rescheduleEligibleWork();
     }
 
@@ -323,7 +319,7 @@
         boolean needsReschedule = extras.getBoolean(KEY_NEEDS_RESCHEDULE);
         Logger.get().debug(
                 TAG,
-                String.format("Handling onExecutionCompleted %s, %s", intent, startId));
+                "Handling onExecutionCompleted " + intent + ", " + startId);
         // Delegate onExecuted() to the command handler.
         onExecuted(workSpecId, needsReschedule);
     }
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/ConstraintProxy.java b/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/ConstraintProxy.java
index 69ec75e..31de7d7 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/ConstraintProxy.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/ConstraintProxy.java
@@ -32,7 +32,7 @@
 
     @Override
     public void onReceive(Context context, Intent intent) {
-        Logger.get().debug(TAG, String.format("onReceive : %s", intent));
+        Logger.get().debug(TAG, "onReceive : " + intent);
         Intent constraintChangedIntent = CommandHandler.createConstraintsChangedIntent(context);
         context.startService(constraintChangedIntent);
     }
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/ConstraintProxyUpdateReceiver.java b/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/ConstraintProxyUpdateReceiver.java
index 5b563aa..179b414 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/ConstraintProxyUpdateReceiver.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/ConstraintProxyUpdateReceiver.java
@@ -82,7 +82,7 @@
     public void onReceive(@NonNull final Context context, @Nullable final Intent intent) {
         String action = intent != null ? intent.getAction() : null;
         if (!ACTION.equals(action)) {
-            Logger.get().debug(TAG, String.format("Ignoring unknown action %s", action));
+            Logger.get().debug(TAG, "Ignoring unknown action " + action);
         } else {
             final PendingResult pendingResult = goAsync();
             WorkManagerImpl workManager = WorkManagerImpl.getInstance(context);
@@ -103,17 +103,13 @@
                         boolean networkStateProxyEnabled = intent.getBooleanExtra(
                                 KEY_NETWORK_STATE_PROXY_ENABLED, false);
 
-                        Logger.get().debug(
-                                TAG,
-                                String.format("Updating proxies: BatteryNotLowProxy enabled (%s), "
-                                                + "BatteryChargingProxy enabled (%s), "
-                                                + "StorageNotLowProxy (%s), "
-                                                + "NetworkStateProxy enabled (%s)",
-                                        batteryNotLowProxyEnabled,
-                                        batteryChargingProxyEnabled,
-                                        storageNotLowProxyEnabled,
-                                        networkStateProxyEnabled));
+                        String message = "Updating proxies: ("
+                                + "BatteryNotLowProxy (" + batteryNotLowProxyEnabled + "), "
+                                + "BatteryChargingProxy (" + batteryChargingProxyEnabled + "), "
+                                + "StorageNotLowProxy (" + storageNotLowProxyEnabled + "), "
+                                + "NetworkStateProxy (" + networkStateProxyEnabled + "), ";
 
+                        Logger.get().debug(TAG, message);
                         PackageManagerHelper.setComponentEnabled(context, BatteryNotLowProxy.class,
                                 batteryNotLowProxyEnabled);
                         PackageManagerHelper.setComponentEnabled(context,
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/ConstraintsCommandHandler.java b/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/ConstraintsCommandHandler.java
index 8b843e2..a78ea08 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/ConstraintsCommandHandler.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/ConstraintsCommandHandler.java
@@ -86,8 +86,7 @@
         for (WorkSpec workSpec : eligibleWorkSpecs) {
             String workSpecId = workSpec.id;
             Intent intent = CommandHandler.createDelayMetIntent(mContext, workSpecId);
-            Logger.get().debug(TAG, String.format(
-                    "Creating a delay_met command for workSpec with id (%s)", workSpecId));
+            Logger.get().debug(TAG, "Creating a delay_met command for workSpec with id (" + workSpecId + ")");
             mDispatcher.postOnMainThread(
                     new SystemAlarmDispatcher.AddRunnable(mDispatcher, intent, mStartId));
         }
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/DelayMetCommandHandler.java b/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/DelayMetCommandHandler.java
index 9435259..ed912dc 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/DelayMetCommandHandler.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/DelayMetCommandHandler.java
@@ -123,7 +123,7 @@
             if (mCurrentState == STATE_INITIAL) {
                 mCurrentState = STATE_START_REQUESTED;
 
-                Logger.get().debug(TAG, String.format("onAllConstraintsMet for %s", mWorkSpecId));
+                Logger.get().debug(TAG, "onAllConstraintsMet for " + mWorkSpecId);
                 // Constraints met, schedule execution
                 // Not using WorkManagerImpl#startWork() here because we need to know if the
                 // processor actually enqueued the work here.
@@ -140,14 +140,14 @@
                     cleanUp();
                 }
             } else {
-                Logger.get().debug(TAG, String.format("Already started work for %s", mWorkSpecId));
+                Logger.get().debug(TAG, "Already started work for " + mWorkSpecId);
             }
         }
     }
 
     @Override
     public void onExecuted(@NonNull String workSpecId, boolean needsReschedule) {
-        Logger.get().debug(TAG, String.format("onExecuted %s, %s", workSpecId, needsReschedule));
+        Logger.get().debug(TAG, "onExecuted " + workSpecId + ", " + needsReschedule);
         cleanUp();
 
         if (needsReschedule) {
@@ -172,7 +172,7 @@
     public void onTimeLimitExceeded(@NonNull String workSpecId) {
         Logger.get().debug(
                 TAG,
-                String.format("Exceeded time limits on execution for %s", workSpecId));
+                "Exceeded time limits on execution for " + workSpecId);
         stopWork();
     }
 
@@ -183,11 +183,9 @@
 
     @WorkerThread
     void handleProcessWork() {
-        mWakeLock = WakeLocks.newWakeLock(
-                mContext,
-                String.format("%s (%s)", mWorkSpecId, mStartId));
+        mWakeLock = WakeLocks.newWakeLock(mContext, mWorkSpecId + " (" + mStartId + ")");
         Logger.get().debug(TAG,
-                String.format("Acquiring wakelock %s for WorkSpec %s", mWakeLock, mWorkSpecId));
+                "Acquiring wakelock " + mWakeLock + "for WorkSpec " + mWorkSpecId);
         mWakeLock.acquire();
 
         WorkSpec workSpec = mDispatcher.getWorkManager()
@@ -208,7 +206,7 @@
         mHasConstraints = workSpec.hasConstraints();
 
         if (!mHasConstraints) {
-            Logger.get().debug(TAG, String.format("No constraints for %s", mWorkSpecId));
+            Logger.get().debug(TAG, "No constraints for " + mWorkSpecId);
             onAllConstraintsMet(Collections.singletonList(mWorkSpecId));
         } else {
             // Allow tracker to report constraint changes
@@ -228,7 +226,7 @@
                 mCurrentState = STATE_STOP_REQUESTED;
                 Logger.get().debug(
                         TAG,
-                        String.format("Stopping work for WorkSpec %s", mWorkSpecId));
+                        "Stopping work for WorkSpec " + mWorkSpecId);
                 Intent stopWork = CommandHandler.createStopWorkIntent(mContext, mWorkSpecId);
                 mDispatcher.postOnMainThread(
                         new SystemAlarmDispatcher.AddRunnable(mDispatcher, stopWork, mStartId));
@@ -237,20 +235,18 @@
                 // reschedule should not happen. For e.g. DELAY_MET when constraints are not met,
                 // should not result in a reschedule.
                 if (mDispatcher.getProcessor().isEnqueued(mWorkSpecId)) {
-                    Logger.get().debug(TAG,
-                            String.format("WorkSpec %s needs to be rescheduled", mWorkSpecId));
+                    Logger.get().debug(TAG, "WorkSpec " + mWorkSpecId + " needs to be rescheduled");
                     Intent reschedule = CommandHandler.createScheduleWorkIntent(mContext,
                             mWorkSpecId);
                     mDispatcher.postOnMainThread(
                             new SystemAlarmDispatcher.AddRunnable(mDispatcher, reschedule,
                                     mStartId));
                 } else {
-                    Logger.get().debug(TAG, String.format(
-                            "Processor does not have WorkSpec %s. No need to reschedule ",
-                            mWorkSpecId));
+                    Logger.get().debug(TAG, "Processor does not have WorkSpec " + mWorkSpecId
+                            + ". No need to reschedule");
                 }
             } else {
-                Logger.get().debug(TAG, String.format("Already stopped work for %s", mWorkSpecId));
+                Logger.get().debug(TAG, "Already stopped work for " + mWorkSpecId);
             }
         }
     }
@@ -270,8 +266,7 @@
 
             // release wake locks
             if (mWakeLock != null && mWakeLock.isHeld()) {
-                Logger.get().debug(TAG, String.format(
-                        "Releasing wakelock %s for WorkSpec %s", mWakeLock, mWorkSpecId));
+                Logger.get().debug(TAG, "Releasing wakelock " + mWakeLock + "for WorkSpec " + mWorkSpecId);
                 mWakeLock.release();
             }
         }
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/RescheduleReceiver.java b/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/RescheduleReceiver.java
index 8f84b5b..d91ef62 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/RescheduleReceiver.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/RescheduleReceiver.java
@@ -33,7 +33,7 @@
 
     @Override
     public void onReceive(Context context, Intent intent) {
-        Logger.get().debug(TAG, String.format("Received intent %s", intent));
+        Logger.get().debug(TAG, "Received intent " + intent);
         if (Build.VERSION.SDK_INT >= WorkManagerImpl.MIN_JOB_SCHEDULER_API_LEVEL) {
             try {
                 WorkManagerImpl workManager = WorkManagerImpl.getInstance(context);
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/SystemAlarmDispatcher.java b/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/SystemAlarmDispatcher.java
index 8c1b5e5..13c65df 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/SystemAlarmDispatcher.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/SystemAlarmDispatcher.java
@@ -133,7 +133,7 @@
      */
     @MainThread
     public boolean add(@NonNull final Intent intent, final int startId) {
-        Logger.get().debug(TAG, String.format("Adding command %s (%s)", intent, startId));
+        Logger.get().debug(TAG, "Adding command " + intent + " (" + startId + ")");
         assertMainThread();
         String action = intent.getAction();
         if (TextUtils.isEmpty(action)) {
@@ -217,7 +217,7 @@
             // ReentrantLock, and lock the queue while command processor processes
             // an intent. Synchronized to prevent ConcurrentModificationExceptions.
             if (mCurrentIntent != null) {
-                Logger.get().debug(TAG, String.format("Removing command %s", mCurrentIntent));
+                Logger.get().debug(TAG, "Removing command " + mCurrentIntent);
                 if (!mIntents.remove(0).equals(mCurrentIntent)) {
                     throw new IllegalStateException("Dequeue-d command is not the first.");
                 }
@@ -262,17 +262,13 @@
                         final int startId = mCurrentIntent.getIntExtra(KEY_START_ID,
                                 DEFAULT_START_ID);
                         Logger.get().debug(TAG,
-                                String.format("Processing command %s, %s", mCurrentIntent,
-                                        startId));
+                                "Processing command " + mCurrentIntent + ", " + startId);
                         final PowerManager.WakeLock wakeLock = WakeLocks.newWakeLock(
                                 mContext,
-                                String.format("%s (%s)", action, startId));
+                                action + " (" + startId + ")");
                         try {
-                            Logger.get().debug(TAG, String.format(
-                                    "Acquiring operation wake lock (%s) %s",
-                                    action,
-                                    wakeLock));
-
+                            Logger.get().debug(TAG,
+                                    "Acquiring operation wake lock (" + action + ") " + wakeLock);
                             wakeLock.acquire();
                             mCommandHandler.onHandleIntent(mCurrentIntent, startId,
                                     SystemAlarmDispatcher.this);
@@ -284,10 +280,7 @@
                         }  finally {
                             Logger.get().debug(
                                     TAG,
-                                    String.format(
-                                            "Releasing operation wake lock (%s) %s",
-                                            action,
-                                            wakeLock));
+                                    "Releasing operation wake lock (" + action + ") " + wakeLock);
                             wakeLock.release();
                             // Check if we have processed all commands
                             postOnMainThread(
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/SystemAlarmScheduler.java b/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/SystemAlarmScheduler.java
index 633121b..15a272a 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/SystemAlarmScheduler.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/background/systemalarm/SystemAlarmScheduler.java
@@ -64,7 +64,7 @@
      * times to drift to guarantee that the interval duration always elapses between alarms.
      */
     private void scheduleWorkSpec(@NonNull WorkSpec workSpec) {
-        Logger.get().debug(TAG, String.format("Scheduling work with workSpecId %s", workSpec.id));
+        Logger.get().debug(TAG, "Scheduling work with workSpecId " + workSpec.id);
         Intent scheduleIntent = CommandHandler.createScheduleWorkIntent(mContext, workSpec.id);
         mContext.startService(scheduleIntent);
     }
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/background/systemjob/SystemJobInfoConverter.java b/work/work-runtime/src/main/java/androidx/work/impl/background/systemjob/SystemJobInfoConverter.java
index 02df55e..1dd016c 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/background/systemjob/SystemJobInfoConverter.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/background/systemjob/SystemJobInfoConverter.java
@@ -187,8 +187,7 @@
                 }
                 break;
         }
-        Logger.get().debug(TAG, String.format(
-                "API version too low. Cannot convert network type value %s", networkType));
+        Logger.get().debug(TAG, "API version too low. Cannot convert network type value " + networkType);
         return JobInfo.NETWORK_TYPE_ANY;
     }
 }
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/background/systemjob/SystemJobScheduler.java b/work/work-runtime/src/main/java/androidx/work/impl/background/systemjob/SystemJobScheduler.java
index dcbb0d5e..754be5f 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/background/systemjob/SystemJobScheduler.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/background/systemjob/SystemJobScheduler.java
@@ -182,12 +182,12 @@
         JobInfo jobInfo = mSystemJobInfoConverter.convert(workSpec, jobId);
         Logger.get().debug(
                 TAG,
-                String.format("Scheduling work ID %s Job ID %s", workSpec.id, jobId));
+                "Scheduling work ID " + workSpec.id + "Job ID " + jobId);
         try {
             int result = mJobScheduler.schedule(jobInfo);
             if (result == JobScheduler.RESULT_FAILURE) {
                 Logger.get()
-                        .warning(TAG, String.format("Unable to schedule work ID %s", workSpec.id));
+                        .warning(TAG, "Unable to schedule work ID " + workSpec.id);
                 if (workSpec.expedited
                         && workSpec.outOfQuotaPolicy == RUN_AS_NON_EXPEDITED_WORK_REQUEST) {
                     // Falling back to a non-expedited job.
@@ -218,7 +218,7 @@
             throw new IllegalStateException(message, e);
         } catch (Throwable throwable) {
             // OEM implementation bugs in JobScheduler cause the app to crash. Avoid crashing.
-            Logger.get().error(TAG, String.format("Unable to schedule %s", workSpec), throwable);
+            Logger.get().error(TAG, "Unable to schedule " + workSpec, throwable);
         }
     }
 
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/background/systemjob/SystemJobService.java b/work/work-runtime/src/main/java/androidx/work/impl/background/systemjob/SystemJobService.java
index bbc87a0..d561dbf 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/background/systemjob/SystemJobService.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/background/systemjob/SystemJobService.java
@@ -106,8 +106,7 @@
             if (mJobParameters.containsKey(workSpecId)) {
                 // This condition may happen due to our workaround for an undesired behavior in API
                 // 23.  See the documentation in {@link SystemJobScheduler#schedule}.
-                Logger.get().debug(TAG, String.format(
-                        "Job is already being executed by SystemJobService: %s", workSpecId));
+                Logger.get().debug(TAG, "Job is already being executed by SystemJobService: " + workSpecId);
                 return false;
             }
 
@@ -115,7 +114,7 @@
             // returns true. This is because JobScheduler ensures that for PeriodicWork, constraints
             // are actually met irrespective.
 
-            Logger.get().debug(TAG, String.format("onStartJob for %s", workSpecId));
+            Logger.get().debug(TAG, "onStartJob for " + workSpecId);
             mJobParameters.put(workSpecId, params);
         }
 
@@ -159,7 +158,7 @@
             return false;
         }
 
-        Logger.get().debug(TAG, String.format("onStopJob for %s", workSpecId));
+        Logger.get().debug(TAG, "onStopJob for " + workSpecId);
 
         synchronized (mJobParameters) {
             mJobParameters.remove(workSpecId);
@@ -170,7 +169,7 @@
 
     @Override
     public void onExecuted(@NonNull String workSpecId, boolean needsReschedule) {
-        Logger.get().debug(TAG, String.format("%s executed on JobScheduler", workSpecId));
+        Logger.get().debug(TAG, workSpecId + " executed on JobScheduler");
         JobParameters parameters;
         synchronized (mJobParameters) {
             parameters = mJobParameters.remove(workSpecId);
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/constraints/NetworkState.java b/work/work-runtime/src/main/java/androidx/work/impl/constraints/NetworkState.java
index c7aa8e9..5f8b9e5 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/constraints/NetworkState.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/constraints/NetworkState.java
@@ -100,7 +100,9 @@
     @NonNull
     @Override
     public String toString() {
-        return String.format("[ Connected=%b Validated=%b Metered=%b NotRoaming=%b ]",
-                mIsConnected, mIsValidated, mIsMetered, mIsNotRoaming);
+        return "Connected : " + mIsConnected
+                + " Validated : " + mIsValidated
+                + " Metered : " + mIsMetered
+                + " NotRoaming : " + mIsNotRoaming;
     }
 }
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/constraints/WorkConstraintsTracker.java b/work/work-runtime/src/main/java/androidx/work/impl/constraints/WorkConstraintsTracker.java
index 2377a51..ec29a46 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/constraints/WorkConstraintsTracker.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/constraints/WorkConstraintsTracker.java
@@ -134,8 +134,7 @@
         synchronized (mLock) {
             for (ConstraintController<?> constraintController : mConstraintControllers) {
                 if (constraintController.isWorkSpecConstrained(workSpecId)) {
-                    Logger.get().debug(TAG, String.format("Work %s constrained by %s", workSpecId,
-                            constraintController.getClass().getSimpleName()));
+                    Logger.get().debug(TAG, "Work " + workSpecId + "constrained by " + constraintController.getClass().getSimpleName());
                     return false;
                 }
             }
@@ -149,7 +148,7 @@
             List<String> unconstrainedWorkSpecIds = new ArrayList<>();
             for (String workSpecId : workSpecIds) {
                 if (areAllConstraintsMet(workSpecId)) {
-                    Logger.get().debug(TAG, String.format("Constraints met for %s", workSpecId));
+                    Logger.get().debug(TAG, "Constraints met for " + workSpecId);
                     unconstrainedWorkSpecIds.add(workSpecId);
                 }
             }
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/constraints/trackers/BatteryChargingTracker.java b/work/work-runtime/src/main/java/androidx/work/impl/constraints/trackers/BatteryChargingTracker.java
index 1e26fc1..da8625f 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/constraints/trackers/BatteryChargingTracker.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/constraints/trackers/BatteryChargingTracker.java
@@ -77,7 +77,7 @@
             return;
         }
 
-        Logger.get().debug(TAG, String.format("Received %s", action));
+        Logger.get().debug(TAG, "Received " + action);
         switch (action) {
             case BatteryManager.ACTION_CHARGING:
                 setState(true);
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/constraints/trackers/BatteryNotLowTracker.java b/work/work-runtime/src/main/java/androidx/work/impl/constraints/trackers/BatteryNotLowTracker.java
index ba5db71..6f4d4dd 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/constraints/trackers/BatteryNotLowTracker.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/constraints/trackers/BatteryNotLowTracker.java
@@ -88,7 +88,7 @@
             return;
         }
 
-        Logger.get().debug(TAG, String.format("Received %s", intent.getAction()));
+        Logger.get().debug(TAG, "Received " + intent.getAction());
 
         switch (intent.getAction()) {
             case Intent.ACTION_BATTERY_OKAY:
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/constraints/trackers/BroadcastReceiverConstraintTracker.java b/work/work-runtime/src/main/java/androidx/work/impl/constraints/trackers/BroadcastReceiverConstraintTracker.java
index 2ae5dfa..ecfe937 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/constraints/trackers/BroadcastReceiverConstraintTracker.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/constraints/trackers/BroadcastReceiverConstraintTracker.java
@@ -67,9 +67,7 @@
 
     @Override
     public void startTracking() {
-        Logger.get().debug(
-                TAG,
-                String.format("%s: registering receiver", getClass().getSimpleName()));
+        Logger.get().debug(TAG, getClass().getSimpleName() + ": registering receiver");
         mAppContext.registerReceiver(mBroadcastReceiver, getIntentFilter());
     }
 
@@ -77,7 +75,7 @@
     public void stopTracking() {
         Logger.get().debug(
                 TAG,
-                String.format("%s: unregistering receiver", getClass().getSimpleName()));
+                getClass().getSimpleName() + ": unregistering receiver");
         mAppContext.unregisterReceiver(mBroadcastReceiver);
     }
 }
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/constraints/trackers/ConstraintTracker.java b/work/work-runtime/src/main/java/androidx/work/impl/constraints/trackers/ConstraintTracker.java
index 6d164d2..7d64637 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/constraints/trackers/ConstraintTracker.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/constraints/trackers/ConstraintTracker.java
@@ -65,9 +65,8 @@
             if (mListeners.add(listener)) {
                 if (mListeners.size() == 1) {
                     mCurrentState = getInitialState();
-                    Logger.get().debug(TAG, String.format("%s: initial state = %s",
-                            getClass().getSimpleName(),
-                            mCurrentState));
+                    Logger.get().debug(TAG,
+                            getClass().getSimpleName() + ": initial state = " + mCurrentState);
                     startTracking();
                 }
                 listener.onConstraintChanged(mCurrentState);
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/constraints/trackers/NetworkStateTracker.java b/work/work-runtime/src/main/java/androidx/work/impl/constraints/trackers/NetworkStateTracker.java
index 19e2777..467404f 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/constraints/trackers/NetworkStateTracker.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/constraints/trackers/NetworkStateTracker.java
@@ -170,7 +170,7 @@
             // The Network parameter is unreliable when a VPN app is running - use active network.
             Logger.get().debug(
                     TAG,
-                    String.format("Network capabilities changed: %s", capabilities));
+                    "Network capabilities changed: " + capabilities);
             setState(getActiveNetworkState());
         }
 
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/constraints/trackers/StorageNotLowTracker.java b/work/work-runtime/src/main/java/androidx/work/impl/constraints/trackers/StorageNotLowTracker.java
index cf97361..f913585 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/constraints/trackers/StorageNotLowTracker.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/constraints/trackers/StorageNotLowTracker.java
@@ -83,7 +83,7 @@
             return; // Should never happen since the IntentFilter was configured.
         }
 
-        Logger.get().debug(TAG, String.format("Received %s", intent.getAction()));
+        Logger.get().debug(TAG, "Received " + intent.getAction());
 
         switch (intent.getAction()) {
             case Intent.ACTION_DEVICE_STORAGE_OK:
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/foreground/SystemForegroundDispatcher.java b/work/work-runtime/src/main/java/androidx/work/impl/foreground/SystemForegroundDispatcher.java
index f763f24..673f3e2 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/foreground/SystemForegroundDispatcher.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/foreground/SystemForegroundDispatcher.java
@@ -189,12 +189,9 @@
             // thread, so there is a chance that handleStop() fires before onExecuted() is called
             // on the main thread.
             Logger.get().debug(TAG,
-                    String.format("Removing Notification (id: %s, workSpecId: %s ,"
-                                    + "notificationType: %s)",
-                            removedInfo.getNotificationId(),
-                            workSpecId,
-                            removedInfo.getForegroundServiceType())
-            );
+                    "Removing Notification (id: " + removedInfo.getNotificationId() +
+                            ", workSpecId: " + workSpecId +
+                            ", notificationType: " + removedInfo.getForegroundServiceType());
             callback.cancelNotification(removedInfo.getNotificationId());
         }
     }
@@ -239,7 +236,7 @@
 
     @MainThread
     private void handleStartForeground(@NonNull Intent intent) {
-        Logger.get().info(TAG, String.format("Started foreground service %s", intent));
+        Logger.get().info(TAG, "Started foreground service " + intent);
         final String workSpecId = intent.getStringExtra(KEY_WORKSPEC_ID);
         final WorkDatabase database = mWorkManagerImpl.getWorkDatabase();
         mTaskExecutor.executeOnBackgroundThread(new Runnable() {
@@ -265,9 +262,11 @@
         int notificationType = intent.getIntExtra(KEY_FOREGROUND_SERVICE_TYPE, 0);
         String workSpecId = intent.getStringExtra(KEY_WORKSPEC_ID);
         Notification notification = intent.getParcelableExtra(KEY_NOTIFICATION);
+
         Logger.get().debug(TAG,
-                String.format("Notifying with (id: %s, workSpecId: %s, notificationType: %s)",
-                        notificationId, workSpecId, notificationType));
+                "Notifying with (id:" + notificationId
+                        + ", workSpecId: " + workSpecId
+                        + ", notificationType :" + notificationType + ")");
 
         if (notification != null && mCallback != null) {
             // Keep track of this ForegroundInfo
@@ -315,7 +314,7 @@
 
     @MainThread
     private void handleCancelWork(@NonNull Intent intent) {
-        Logger.get().info(TAG, String.format("Stopping foreground work for %s", intent));
+        Logger.get().info(TAG, "Stopping foreground work for " + intent);
         String workSpecId = intent.getStringExtra(KEY_WORKSPEC_ID);
         if (workSpecId != null && !TextUtils.isEmpty(workSpecId)) {
             mWorkManagerImpl.cancelWorkById(UUID.fromString(workSpecId));
@@ -332,7 +331,7 @@
         if (!workSpecIds.isEmpty()) {
             for (String workSpecId : workSpecIds) {
                 Logger.get().debug(TAG,
-                        String.format("Constraints unmet for WorkSpec %s", workSpecId));
+                        "Constraints unmet for WorkSpec " + workSpecId);
                 mWorkManagerImpl.stopForegroundWork(workSpecId);
             }
         }
@@ -376,7 +375,7 @@
         Intent intent = new Intent(context, SystemForegroundService.class);
         intent.setAction(ACTION_CANCEL_WORK);
         // Set data to make it unique for filterEquals()
-        intent.setData(Uri.parse(String.format("workspec://%s", workSpecId)));
+        intent.setData(Uri.parse("workspec://" + workSpecId));
         intent.putExtra(KEY_WORKSPEC_ID, workSpecId);
         return intent;
     }
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/model/WorkSpec.java b/work/work-runtime/src/main/java/androidx/work/impl/model/WorkSpec.java
index 245f432..36700e1 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/model/WorkSpec.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/model/WorkSpec.java
@@ -200,9 +200,7 @@
      */
     public void setPeriodic(long intervalDuration) {
         if (intervalDuration < MIN_PERIODIC_INTERVAL_MILLIS) {
-            Logger.get().warning(TAG, String.format(
-                    "Interval duration lesser than minimum allowed value; Changed to %s",
-                    MIN_PERIODIC_INTERVAL_MILLIS));
+            Logger.get().warning(TAG, "Interval duration lesser than minimum allowed value; Changed to " + MIN_PERIODIC_INTERVAL_MILLIS);
             intervalDuration = MIN_PERIODIC_INTERVAL_MILLIS;
         }
         setPeriodic(intervalDuration, intervalDuration);
@@ -216,21 +214,17 @@
      */
     public void setPeriodic(long intervalDuration, long flexDuration) {
         if (intervalDuration < MIN_PERIODIC_INTERVAL_MILLIS) {
-            Logger.get().warning(TAG, String.format(
-                    "Interval duration lesser than minimum allowed value; Changed to %s",
-                    MIN_PERIODIC_INTERVAL_MILLIS));
+            Logger.get().warning(TAG, "Interval duration lesser than minimum allowed value; Changed to " + MIN_PERIODIC_INTERVAL_MILLIS);
             intervalDuration = MIN_PERIODIC_INTERVAL_MILLIS;
         }
         if (flexDuration < MIN_PERIODIC_FLEX_MILLIS) {
             Logger.get().warning(TAG,
-                    String.format("Flex duration lesser than minimum allowed value; Changed to %s",
-                            MIN_PERIODIC_FLEX_MILLIS));
+                    "Flex duration lesser than minimum allowed value; Changed to " + MIN_PERIODIC_FLEX_MILLIS);
             flexDuration = MIN_PERIODIC_FLEX_MILLIS;
         }
         if (flexDuration > intervalDuration) {
             Logger.get().warning(TAG,
-                    String.format("Flex duration greater than interval duration; Changed to %s",
-                            intervalDuration));
+                    "Flex duration greater than interval duration; Changed to " + intervalDuration);
             flexDuration = intervalDuration;
         }
         this.intervalDuration = intervalDuration;
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/utils/EnqueueRunnable.java b/work/work-runtime/src/main/java/androidx/work/impl/utils/EnqueueRunnable.java
index 29580d4..d878596 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/utils/EnqueueRunnable.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/utils/EnqueueRunnable.java
@@ -84,7 +84,7 @@
         try {
             if (mWorkContinuation.hasCycles()) {
                 throw new IllegalStateException(
-                        String.format("WorkContinuation has cycles (%s)", mWorkContinuation));
+                        "WorkContinuation has cycles (" + mWorkContinuation + ")");
             }
             boolean needsScheduling = addToDatabase();
             if (needsScheduling) {
@@ -148,8 +148,9 @@
                 if (!parent.isEnqueued()) {
                     needsScheduling |= processContinuation(parent);
                 } else {
-                    Logger.get().warning(TAG, String.format("Already enqueued work ids (%s).",
-                            TextUtils.join(", ", parent.getIds())));
+                    Logger.get().warning(TAG,
+                            "Already enqueued work ids (" +
+                                    TextUtils.join(", ", parent.getIds()) + ")");
                 }
             }
         }
@@ -200,8 +201,7 @@
             for (String id : prerequisiteIds) {
                 WorkSpec prerequisiteWorkSpec = workDatabase.workSpecDao().getWorkSpec(id);
                 if (prerequisiteWorkSpec == null) {
-                    Logger.get().error(TAG,
-                            String.format("Prerequisite %s doesn't exist; not enqueuing", id));
+                    Logger.get().error(TAG, "Prerequisite " + id + " doesn't exist; not enqueuing");
                     return false;
                 }
 
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/utils/ForceStopRunnable.java b/work/work-runtime/src/main/java/androidx/work/impl/utils/ForceStopRunnable.java
index fb6517f..4643fbf 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/utils/ForceStopRunnable.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/utils/ForceStopRunnable.java
@@ -141,7 +141,7 @@
                     } else {
                         long duration = mRetryCount * BACKOFF_DURATION_MS;
                         Logger.get()
-                                .debug(TAG, String.format("Retrying after %s", duration),
+                                .debug(TAG, "Retrying after " + duration,
                                         exception);
                         sleep(mRetryCount * BACKOFF_DURATION_MS);
                     }
@@ -304,7 +304,7 @@
             return true;
         }
         boolean isDefaultProcess = ProcessUtils.isDefaultProcess(mContext, configuration);
-        Logger.get().debug(TAG, String.format("Is default app process = %s", isDefaultProcess));
+        Logger.get().debug(TAG, "Is default app process = " + isDefaultProcess);
         return isDefaultProcess;
     }
 
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/utils/PackageManagerHelper.java b/work/work-runtime/src/main/java/androidx/work/impl/utils/PackageManagerHelper.java
index 8a9aaad..9c1d752 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/utils/PackageManagerHelper.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/utils/PackageManagerHelper.java
@@ -52,11 +52,11 @@
                             : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                     PackageManager.DONT_KILL_APP);
 
-            Logger.get().debug(TAG,
-                    String.format("%s %s", klazz.getName(), (enabled ? "enabled" : "disabled")));
+            Logger.get().debug(TAG, klazz.getName() + " " + (enabled ? "enabled" : "disabled"));
         } catch (Exception exception) {
-            Logger.get().debug(TAG, String.format("%s could not be %s", klazz.getName(),
-                    (enabled ? "enabled" : "disabled")), exception);
+            Logger.get().debug(TAG,
+                    klazz.getName() + "could not be " + (enabled ? "enabled" : "disabled"),
+                    exception);
         }
     }
 
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/utils/StopWorkRunnable.java b/work/work-runtime/src/main/java/androidx/work/impl/utils/StopWorkRunnable.java
index 9907a51..3d91efb 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/utils/StopWorkRunnable.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/utils/StopWorkRunnable.java
@@ -75,10 +75,7 @@
 
             Logger.get().debug(
                     TAG,
-                    String.format(
-                            "StopWorkRunnable for %s; Processor.stopWork = %s",
-                            mWorkSpecId,
-                            isStopped));
+                    "StopWorkRunnable for " + mWorkSpecId + "; Processor.stopWork = " + isStopped);
 
             workDatabase.setTransactionSuccessful();
         } finally {
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/utils/WakeLocks.java b/work/work-runtime/src/main/java/androidx/work/impl/utils/WakeLocks.java
index f82869d..652cef9 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/utils/WakeLocks.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/utils/WakeLocks.java
@@ -87,7 +87,7 @@
 
         for (PowerManager.WakeLock wakeLock : wakeLocksCopy.keySet()) {
             if (wakeLock != null && wakeLock.isHeld()) {
-                String message = String.format("WakeLock held for %s", wakeLocksCopy.get(wakeLock));
+                String message = "WakeLock held for " + wakeLocksCopy.get(wakeLock);
                 Logger.get().warning(TAG, message);
             }
         }
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/utils/WorkForegroundRunnable.java b/work/work-runtime/src/main/java/androidx/work/impl/utils/WorkForegroundRunnable.java
index dad9d9d..d8cd1a5 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/utils/WorkForegroundRunnable.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/utils/WorkForegroundRunnable.java
@@ -92,13 +92,13 @@
                 try {
                     ForegroundInfo foregroundInfo = foregroundFuture.get();
                     if (foregroundInfo == null) {
-                        String message =
-                                String.format("Worker was marked important (%s) but did not "
-                                        + "provide ForegroundInfo", mWorkSpec.workerClassName);
+                        String message = "Worker was marked important (" +
+                                mWorkSpec.workerClassName +
+                                ") but did not provide ForegroundInfo";
                         throw new IllegalStateException(message);
                     }
-                    Logger.get().debug(TAG, String.format("Updating notification for %s",
-                            mWorkSpec.workerClassName));
+                    Logger.get().debug(TAG,
+                            "Updating notification for " + mWorkSpec.workerClassName);
                     // Mark as running in the foreground
                     mWorker.setRunInForeground(true);
                     mFuture.setFuture(
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/utils/WorkProgressUpdater.java b/work/work-runtime/src/main/java/androidx/work/impl/utils/WorkProgressUpdater.java
index e15d7edbd..090af58 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/utils/WorkProgressUpdater.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/utils/WorkProgressUpdater.java
@@ -73,7 +73,7 @@
             @Override
             public void run() {
                 String workSpecId = id.toString();
-                Logger.get().debug(TAG, String.format("Updating progress for %s (%s)", id, data));
+                Logger.get().debug(TAG, "Updating progress for " + id + " (" + data + ")");
                 mWorkDatabase.beginTransaction();
                 try {
                     WorkSpecDao workSpecDao = mWorkDatabase.workSpecDao();
@@ -86,10 +86,9 @@
                             mWorkDatabase.workProgressDao().insert(progress);
                         } else {
                             Logger.get().warning(TAG,
-                                    String.format(
-                                            "Ignoring setProgressAsync(...). WorkSpec (%s) is not"
-                                                    + " in a RUNNING state.",
-                                            workSpecId));
+                                    "Ignoring setProgressAsync(...). WorkSpec (" +
+                                            workSpecId +
+                                            ") is not in a RUNNING state.");
                         }
                     } else {
                         String message =
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/utils/WorkTimer.java b/work/work-runtime/src/main/java/androidx/work/impl/utils/WorkTimer.java
index b6922cf..822c36e 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/utils/WorkTimer.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/utils/WorkTimer.java
@@ -83,7 +83,7 @@
             @NonNull TimeLimitExceededListener listener) {
 
         synchronized (mLock) {
-            Logger.get().debug(TAG, String.format("Starting timer for %s", workSpecId));
+            Logger.get().debug(TAG, "Starting timer for " + workSpecId);
             // clear existing timer's first
             stopTimer(workSpecId);
             WorkTimerRunnable runnable = new WorkTimerRunnable(this, workSpecId);
@@ -102,7 +102,7 @@
         synchronized (mLock) {
             WorkTimerRunnable removed = mTimerMap.remove(workSpecId);
             if (removed != null) {
-                Logger.get().debug(TAG, String.format("Stopping timer for %s", workSpecId));
+                Logger.get().debug(TAG, "Stopping timer for " + workSpecId);
                 mListeners.remove(workSpecId);
             }
         }
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/workers/ConstraintTrackingWorker.java b/work/work-runtime/src/main/java/androidx/work/impl/workers/ConstraintTrackingWorker.java
index ddb43b7..7e28494 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/workers/ConstraintTrackingWorker.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/workers/ConstraintTrackingWorker.java
@@ -123,7 +123,7 @@
         workConstraintsTracker.replace(Collections.singletonList(workSpec));
 
         if (workConstraintsTracker.areAllConstraintsMet(getId().toString())) {
-            Logger.get().debug(TAG, String.format("Constraints met for delegate %s", className));
+            Logger.get().debug(TAG, "Constraints met for delegate " + className);
 
             // Wrapping the call to mDelegate#doWork() in a try catch, because
             // changes in constraints can cause the worker to throw RuntimeExceptions, and
@@ -230,7 +230,7 @@
     @Override
     public void onAllConstraintsNotMet(@NonNull List<String> workSpecIds) {
         // If at any point, constraints are not met mark it so we can retry the work.
-        Logger.get().debug(TAG, String.format("Constraints changed for %s", workSpecIds));
+        Logger.get().debug(TAG, "Constraints changed for " + workSpecIds);
         synchronized (mLock) {
             mAreConstraintsUnmet = true;
         }
diff --git a/work/work-runtime/src/main/java/androidx/work/package-info.java b/work/work-runtime/src/main/java/androidx/work/package-info.java
index a28db24..ae4557b 100644
--- a/work/work-runtime/src/main/java/androidx/work/package-info.java
+++ b/work/work-runtime/src/main/java/androidx/work/package-info.java
@@ -15,9 +15,10 @@
  */
 
 /**
- * WorkManager is a library used to enqueue deferrable work that is guaranteed to execute sometime
- * after its {@link androidx.work.Constraints} are met.  WorkManager allows observation of work
- * status and the ability to create complex chains of work.
+ * WorkManager the recommended library for persistent work.
+ * Scheduled work is guaranteed to execute sometime after its {@link androidx.work.Constraints}
+ * are met.
+ * WorkManager allows observation of work status and the ability to create complex chains of work.
  * <p>
  * WorkManager uses an underlying job dispatching service when available based on the following
  * criteria:
diff --git a/work/work-testing/src/main/java/androidx/work/testing/TestForegroundUpdater.java b/work/work-testing/src/main/java/androidx/work/testing/TestForegroundUpdater.java
index b33e8f8..42b9b8c 100644
--- a/work/work-testing/src/main/java/androidx/work/testing/TestForegroundUpdater.java
+++ b/work/work-testing/src/main/java/androidx/work/testing/TestForegroundUpdater.java
@@ -46,7 +46,7 @@
             @NonNull UUID id,
             @NonNull ForegroundInfo foregroundInfo) {
 
-        Logger.get().info(TAG, String.format("setForegroundAsync for %s", id));
+        Logger.get().info(TAG, "setForegroundAsync for " + id);
         SettableFuture<Void> future = SettableFuture.create();
         future.set(null);
         return future;
diff --git a/work/work-testing/src/main/java/androidx/work/testing/TestListenableWorkerBuilder.java b/work/work-testing/src/main/java/androidx/work/testing/TestListenableWorkerBuilder.java
index 071d18e..73a49dc 100644
--- a/work/work-testing/src/main/java/androidx/work/testing/TestListenableWorkerBuilder.java
+++ b/work/work-testing/src/main/java/androidx/work/testing/TestListenableWorkerBuilder.java
@@ -358,8 +358,7 @@
 
         if (worker == null) {
             throw new IllegalStateException(
-                    String.format("Could not create an instance of ListenableWorker %s",
-                            getWorkerName()));
+                    "Could not create an instance of ListenableWorker " + getWorkerName());
         }
 
         // This won't do much for the case of the from(Context, WorkRequest) as we lose the
@@ -367,8 +366,7 @@
         // also carry over to Kotlin extensions.
         if (!getWorkerClass().isAssignableFrom(worker.getClass())) {
             throw new IllegalStateException(
-                    String.format("Unexpected worker type %s (expected %s)", worker.getClass(),
-                            getWorkerClass()));
+                    "Unexpected worker type " + worker.getClass() + " (expected " + getWorkerClass() + " )");
         }
         return (W) worker;
     }
diff --git a/work/work-testing/src/main/java/androidx/work/testing/TestProgressUpdater.java b/work/work-testing/src/main/java/androidx/work/testing/TestProgressUpdater.java
index 6c4e199..8cc61cd 100644
--- a/work/work-testing/src/main/java/androidx/work/testing/TestProgressUpdater.java
+++ b/work/work-testing/src/main/java/androidx/work/testing/TestProgressUpdater.java
@@ -44,7 +44,7 @@
             @NonNull Context context,
             @NonNull UUID id,
             @NonNull Data data) {
-        Logger.get().info(TAG, String.format("Updating progress for %s (%s)", id, data));
+        Logger.get().info(TAG, "Updating progress for " + id + " (" + data + ")");
         SettableFuture<Void> future = SettableFuture.create();
         future.set(null);
         return future;
diff --git a/work/work-testing/src/main/java/androidx/work/testing/TestWorkerBuilder.java b/work/work-testing/src/main/java/androidx/work/testing/TestWorkerBuilder.java
index dd41d211..cdb50af 100644
--- a/work/work-testing/src/main/java/androidx/work/testing/TestWorkerBuilder.java
+++ b/work/work-testing/src/main/java/androidx/work/testing/TestWorkerBuilder.java
@@ -66,8 +66,7 @@
         Class<Worker> workerClass = getWorkerClass(name);
         if (workerClass == null) {
             throw new IllegalArgumentException(
-                    String.format("Invalid worker class name or class does not extend Worker (%s)",
-                            name));
+                    "Invalid worker class name or class does not extend Worker (" + name + ")");
         }
 
         List<String> tags = new ArrayList<>(workRequest.getTags().size());